From e4e980bd92774f6ec5b273430d5c78fe814ddb5b Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 3 Nov 2025 14:37:37 +0000 Subject: [PATCH] 1.1.0 --- core/__pycache__/admin.cpython-311.pyc | Bin 365 -> 1249 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1505 bytes core/__pycache__/models.cpython-311.pyc | Bin 992 -> 2548 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 557 bytes core/__pycache__/views.cpython-311.pyc | Bin 663 -> 1577 bytes core/admin.py | 15 ++++- core/forms.py | 17 ++++++ core/migrations/0001_initial.py | 39 +++++++++++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2575 bytes core/models.py | 29 ++++++++- core/templates/core/index.html | 2 +- core/templates/core/proposal_success.html | 22 +++++++ core/templates/core/submit_proposal.html | 55 ++++++++++++++++++ core/urls.py | 7 ++- core/views.py | 24 +++++++- 15 files changed, 200 insertions(+), 10 deletions(-) create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/templates/core/proposal_success.html create mode 100644 core/templates/core/submit_proposal.html diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 31f41f5e03a3701edaffba23b978ae1f971e325e..adba13e6e8a3017ef3eeca55e758d1c414da6eb3 100644 GIT binary patch literal 1249 zcma)5%}x|S5bmCzW!Po;2L*u;V}f&#eE`vfgYlrCi3iPGCc}0EgFQQIPmj8{JrK{_ zcms^#89bSIhGY+$K9P9hwq!YRvTAk*K`^m<`kSh$>Zk3A1(yv%xEm zN)Al$fz=xa@H)&D;tl*2(YhsK0U{3kcSMIdZ-_g1iaA`W?SMsL?G$Tt4P9ETZioCM zk9bXK=e3OMaT18?Wj!F|r|HguvQIeiC?lT1sAn?6vzY1G%z_NI9=#H56|=xMTZKw+ zJ(Q@FK@PtbL|hjkV=j*ce=6_=7=*T1ptx(uG9;8k0In$qQO1_Z62Q7!(2k!4^L<_P z{U~Os;2;nA{)aRWmE`%i)k1E@7 z#4G7WT2pC-f9BOx#j^4#mhY2#Q00|sEO{lPaJk-)4iIUI6pI81@Rx29^uDoOh{DaYl_U*R$Sn*<-k`2Etd3I@g6n1u9LT z4e3S{D#e)}C}8y-)`NYOa{xejM)M5HH2bvf4#;7&k06X9j3JC8OaSN+$paSGM5E87 zoJ3Q0&}o$J=77yh?gLz<=p9n@1Swi>uC=F^ny+y7w&TuqcTf+rouIZAFIVH5lHrEL ztD_6haV`>xcTeKg(vIX?&~0dKaSd%5J-rTPHC(Uj!ddD4GfySfgg<%m1E6D4O50@d z==#$p?$K?}2_0!p?Jn$HGxmN1jSDM& delta 272 zcmaFJ`IaeeIWI340}!av7r-85vTTQkZj? za+#x;85vR;vshqS7O=utAbO&ogf37mOE7~b>r0S;CgUyE#FX63yqAm+9=Bt1MrLYR zYHn&?iJvChHt_6hD%pzU4S*m8NQhvPD{$Xf35EvIQv$7;Ysrh8sI5N(3P;ypv3uAL<$&OS zU0{0!Z#FEQLZN zx~qZTNP3zHCM5! zWCpTv?ezNF*=RkW5jJ(9M{eX%Q5&Rrr_2tpPep}L?l5-{xnVHf!=4>I8&FZkQG}f} zp9ayeDvLMogh9kYZ#dJ9N$eR@H>N6d$HSb9%D}@8T?;)znJhUlFg~m=VILb`2L!iQ zUBCSu^`GKCK9s#SG`kc|Zs5S+)WHlJ+zt90I5J%B8dUDBr!7v(kT4eSU^`S0i$DA4JAdoA>7JAN7mQQW3m)QO{zwKqey!3U7dwi7bi zmiOST!84JQ^<=VjWK{ewfS><+#FOvW<37D+_^itzt>70u1pZ3%CZVSUwnU#w;rlT z2mzj?IBuH2_4xIBd-KViZ#2Lj!3VN9t(1_y zVCCRL4oJ;`L!?wnD^)#EA~uFap*K6~H3dGpQl z%$qmg_}64IhCqJ&Ls0$-A@nzEv;^9o>@UOXIl>5YDk^aWj$?K}4V3r-&!GVN3}OBW z!a>3<2b*KiCXdiIJiZh{9x4Q=@c*E~I5LNF!X6ux;Y2XE6WHWnGVu7qCUXqIw;{qO5bZG{ClKv11P>8y{puzd z+pPvF#BlHlD#URJ794it=2&im4I^6f}tXz+fY?Z%0O#^b#4h7A(!QM#&>mv`n3jKGf-o zQI?Bjw5U@u>gRo=yyiwE$uOxTRWe6rIMQ^+A*8|Tr;6&GnWq(7IJ3{@kk2JtL6S7N zL?p?LNfN}fRAwh6={rkS{T|8|;6^8wWICk~71IQ3Ck)fVkOptK8-t{@?38?%BuLCE zQQhdIY!Yv<8^mBzmX4Q*rrpa-cAhH62nenxO$_W zIkz$9WX^3FcII*|bJ@vUu1?oeXE#nesk2*icIr|sb;(Ixs@|-35B(5!x`%cr?Cz_z z?yFAsRXcd99`9KnbK*UCq8?u@U=K^k|Of;-$i*97rH^A2+m&;UNC0N3`L9|M0yxGn!tYs&e3qYv@ z&;xnJQcc;Yh(~c#O)o&j1E{4btArW~L%(+vedn+P1_+calcGtmE8K2c;EfjbQduR; z9i3>I;18*KX+d^F)9l4?nyyKnuM*Ac+C|S#BajO!FvSjHWiT(7eUajlt`v#kMlg9GLoVnC zte2w~;Z=!2F1>skqw|&CNqxlv^2)ZH*`e9Vsp0J8%)~djT+oeLWmT84Wa@5cL6x-? zH>g>vN-sd9W4y*F!Q-_7Fpl%u3pfG5a|bN=0{z6p&Ij_9AlpD#k;flNe+q5?rfHBoUyrFyHL?%z1?r2A{>0Vh3B{j%P|1?+2I+4mQ0 zu~-v}j#vaJ#QoYy_HCtizkPMjPTs90?>fo5)v0=BkdgD?uJBvJ&Rnl$t~;6QN9cL_ z&)};o_WdOckPj#9tJEcX`*bLJ|~{4OlZ_nhCP*Os*;}F^lb3AC;9lzl**K@gHh52pO;DKpU&O>18M(-Fl?dR8u z@|LHuxP<$A+rGTfX)LmTT}p%*a%VU#w-PXmv&d7ZK6Gf8uja1QD{7dL1i7M5nZw^; zA&Ia&(b}#}wV)X|exT7FH3Q#eTGwUw+%rt7nJ$yCoLuo9m&ps;C4ogRSzd}Gr~FAi za|IzZg@X8*Q#cp@=R6K-YET{S4{t{Y0vE@)IKjm!P7bOfbvSB>)2hI=F|JK;ZSz|Y bM-_2)C2)O=>l0j`CvYw{$V7+j%00dTv&ENg delta 253 zcmZ3>a+}F%IWI340}vcY|CNyiq#uJgFu)3Be6|5HrZc24q%h_%qH5$j|R#()?;pa{r>VlN=^ftit!@dks;1yuBa sLHq(L`oPA(%Gu!3A=D8vgY5!~{6!Y|D=hLKn3?#Q8n{8QhzDpK0OYJZXaE2J diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 8cca099aaff34e3b3725c0d9a6a4326c24538fce..82f451afe2799666cdad528ef6c7a1bff2c4c963 100644 GIT binary patch literal 1577 zcmZ`(&uiR96rRyaE7@9G8>=-WHnr12!a{BJ(9S5cQAv{zkHJ{=}bBO29%e`K@P4W50|hfl_ZQD$;nhRo?MbWrKE_xT+MoF zNd;Ybib|T31v%iTAO{_72^9uTxXFSPWhtpSghm=Aj!TIhoZ#+-e#fr3WSw}V7DU>8 z>aY2%TrJ=zm*{tW>e(EfECmz@9i28nyhK5A4)4_z_bN%I=N3Ui2Y@(CQIMkavvfJd zY+@(V#4g^H0yRBEP2|W;=>U8la=&6ha>`;unR3bjImyCNlq;WS!WxF{Q)0Q0^u}~0 z@Tvuw3Y6-vtU~%M(tHX9SzdWUxy?c*QYrbdPFO&7ZcVlQT0k}e#&0JlC*Mt372hLP zeWhLt>K54`c0KT^_1LG6*jm{pmTV)?{?SJFb8$v8vfKCGW>IeB#r1IP^Vbhs`b=A&3FVnn zu!1gb1`q_A(L}2pB9?<6i6+qRgS2djBhuD@p57e5>0x@aiJSP9oLK68AHe1?J)oZf zjwkrR>c?Re44p$9shn3|dUk8~_TKFnNdsSWa{1?T&*paL_vUxzkIk`ge7a>?ZPN;KR;&Qvt%maB zyIXr(J93;w1I7#aeLl?`sV#lBtXl=1>cBKDu#3T4vtZe9LM;}7=0*2i2nhy Cj9D`P delta 272 zcmZ3%EiY3Vu1*-@c5@I|ySHz@ef#$9w|n}n zvopp)`RC7w_G6gi{$`C<2{x7Y8Bl)V5Qli3%kl6QbfFx`1ksEv{fBK{ed3LdiNLQ0^qvR1TIM>7qZhRPxjo3iE2xbE_|t1o{LgEb z+G6fT9sB1$jsUXQyI=X+kohijgd*+Kmt{aU3k3XZ)r!D?I zryX;J6%DW9GBzA4XedjCN12pJV~3Yqv)*Axb3(IX7F)`2mmw&lQs=hQcr?_A!}Ht zB7%wGtckwo(6WYgWYfr^WmZgE)oEwN*RbWg-1>Y$Evs?`Tc)KNMb(&+OISC{6|*!Y ztB&f*Ixgqcq6!|PD_E~64&HDqmTKC8uwAgU3Omm&x2mo+cb>uvg+#1X+pN6II>4OiD`)UD{IiWJ9O zNS&t<#ouT}p)o~)JJ;1Q=y65)!Bus}5om=qLvw(cG>$OKFg6Mrwk>v%(~fzc%1_yC zZLuqr#_wyzIUsqKQ41EgqFPNg1JrA(&w(ZlwUb$&YvpE72(1FqOd50@O$TB+(6eP4 zm<9}Uokp{o-UP->U}fWD@jLe(CgwiOrdP}|PP=*6aNIQBzy%1yO0Sz%$*!mcoGzFa zPM>^a($mw^*Ocbsu2wcJ_VMrqeDyf{I^3??$IsiY?(GM4k?#p@KdDE!=*Z78FLJ3S zU3x2BAbk@r*Sx-o1M$rm$tlFJNS|Hpv%Nl>B%GRbkqk`ijC%tUuM1@0R(0T(H*kw2 zZr7v{lDxLt>m{!pJR`}uYI4p?&XL6ZnlwyC(mQM3Nc!M98JVq)%z7iUB=KcU8YAO3 zcbC2Kn}1y<Kyl2cp|{-@>AiRFOPf)7HL7KN&RGSa_6QuI0=Rui(;G1i3Mh=h!%Sd z*&?_A2`)f_MRG(x$2VAxZyYTDp?mk9dH22}$)##?$xAMg#P_Fi{Th)hA|(?>zTh9S zsN_d1Dv;n3By;&#s7q0n*Eq{7h$ANI{r%mc?Z@n~GA$ORLi9p|&R2alUu}`ux(g5* zZT6wOf0X>w)1cry^WeMr3bYTAJB@>R&w2<=_MgPggQy31p09^Eewc7WjbDwsLeBct YLoy$#bDxTrF)uOpj&&TJ(d)Hq)$ literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 8e78a89..622ac9e 100644 --- a/core/models.py +++ b/core/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.utils import timezone class Achievement(models.Model): title = models.CharField(max_length=200) @@ -8,4 +9,30 @@ class Achievement(models.Model): date = models.DateField() def __str__(self): - return self.title \ No newline at end of file + return self.title + +class Proposal(models.Model): + STATUS_CHOICES = [ + ('pending', 'Pending'), + ('approved_dosen', 'Approved by Dosen'), + ('approved_fakultas', 'Approved by Fakultas'), + ('approved_universitas', 'Approved by Universitas'), + ('rejected', 'Rejected'), + ('completed', 'Completed'), + ] + + PROPOSAL_TYPE_CHOICES = [ + ('lomba', 'Lomba'), + ('non_lomba', 'Non-Lomba'), + ] + + title = models.CharField(max_length=200) + proposer_name = models.CharField(max_length=100, help_text="Nama perorangan, kelompok, atau lembaga") + description = models.TextField() + proposal_type = models.CharField(max_length=20, choices=PROPOSAL_TYPE_CHOICES, default='lomba') + status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending') + submitted_at = models.DateTimeField(default=timezone.now) + attachment = models.FileField(upload_to='proposals/', blank=True, null=True, help_text="Dokumen proposal (PDF, DOCX)") + + def __str__(self): + return f"{self.title} by {self.proposer_name}" diff --git a/core/templates/core/index.html b/core/templates/core/index.html index c6a1288..1d15bbd 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -9,7 +9,7 @@

Sistem Informasi Prestasi Mahasiswa

Wadah untuk mencatat, mengelola, dan mempublikasikan prestasi mahasiswa.

- Ajukan Proposal + Ajukan Proposal
diff --git a/core/templates/core/proposal_success.html b/core/templates/core/proposal_success.html new file mode 100644 index 0000000..8f447da --- /dev/null +++ b/core/templates/core/proposal_success.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Proposal Terkirim - {{ block.super }}{% endblock %} + +{% block content %} +
+
+
+
+
+

Terima Kasih!

+

Proposal Anda telah berhasil dikirim.

+
+

Tim kami akan segera meninjau pengajuan Anda. Anda akan menerima notifikasi lebih lanjut mengenai status proposal Anda.

+ Kembali ke Halaman Utama +
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/submit_proposal.html b/core/templates/core/submit_proposal.html new file mode 100644 index 0000000..e11bb6a --- /dev/null +++ b/core/templates/core/submit_proposal.html @@ -0,0 +1,55 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %}Ajukan Proposal - {{ block.super }}{% endblock %} + +{% block content %} +
+
+
+
+
+

Formulir Pengajuan Proposal

+

Silakan isi detail proposal Anda di bawah ini. Tim kami akan segera meninjaunya.

+ +
+ {% csrf_token %} + +
+ + {{ form.title }} +
+ +
+ + {{ form.proposer_name }} +
+ +
+ + {{ form.proposal_type }} +
+ +
+ + {{ form.description }} +
+ +
+ + {{ form.attachment }} + {% if form.attachment.help_text %} +
{{ form.attachment.help_text }}
+ {% endif %} +
+ +
+ +
+
+
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..31bad49 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,8 @@ from django.urls import path - -from .views import home +from .views import index, submit_proposal, proposal_success urlpatterns = [ - path("", home, name="home"), + path("", index, name="index"), + path("submit-proposal/", submit_proposal, name="submit_proposal"), + path("proposal-success/", proposal_success, name="proposal_success"), ] diff --git a/core/views.py b/core/views.py index 556b2cc..4f6dc75 100644 --- a/core/views.py +++ b/core/views.py @@ -1,9 +1,27 @@ -from django.shortcuts import render -from .models import Achievement +from django.shortcuts import render, redirect +from .models import Achievement, Proposal +from .forms import ProposalForm def index(request): achievements = Achievement.objects.order_by('-date')[:6] context = { 'achievements': achievements } - return render(request, "core/index.html", context) \ No newline at end of file + return render(request, "core/index.html", context) + +def submit_proposal(request): + if request.method == 'POST': + form = ProposalForm(request.POST, request.FILES) + if form.is_valid(): + form.save() + return redirect('proposal_success') + else: + form = ProposalForm() + + context = { + 'form': form + } + return render(request, 'core/submit_proposal.html', context) + +def proposal_success(request): + return render(request, 'core/proposal_success.html') \ No newline at end of file