From d7fc9ac96607531a2bf9b288260d86b26ecfeb98 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 28 Jan 2026 01:37:14 +0000 Subject: [PATCH] =?UTF-8?q?=D9=84=D9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1469 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 3361 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 461 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 2506 bytes core/forms.py | 14 ++ core/migrations/0001_initial.py | 49 ++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 3159 bytes core/models.py | 45 +++- core/templates/base.html | 160 +++++++++++- core/templates/core/index.html | 232 +++++++----------- core/templates/core/proposal_form.html | 50 ++++ core/urls.py | 8 +- core/views.py | 48 ++-- 13 files changed, 436 insertions(+), 170 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_form.html diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6485af40f263021d7170f2cfa1e0be4bc2a3c9be GIT binary patch literal 1469 zcmZ`(J8v6D5Z-(8B`FpRMu8NN%*zN7lT;koX$%7fY$hp01d-Al0w2z|OZt?1dG`*o z3D`=JLS>2oX2HsZlE5jP&SieW5nw@V5d=u3j)q*R%FZ2WM-jC*_hEKtZf17A-TP&E zxroGg+I#5SRuK9JCi9`ql;baj@&sXoB^P;;AxQ|!SaD@fF%(ZVR0+xG3xw4l5!Q&b zJO2(Hiipp|n+-$9`ZlWPj$m4sxYiA*$BrbJ$^7EiG_YezJmN<}4FhJmym*U*7L8!d z&Vpp9&L+nn3*`wS$dE8Hi$qpk<8OsCGE6`A?h?wi$cbFSOPDa5 zI$`7lK3^d$ay%;{*t7!{@gjcBTYm{?ZrFhz(ZKDml4h@YxwiFr3G@H%3LN5qAS81@v z=qk7_-}Hjmk7|xzyV>rf=6)%yi4m9BQK!Dd^QP%r9x+W`G)*tSu?zZ=Y2J@5H?vSU z)m#%s;&Q#~5EnBFXPXyx$b;xBKa3-u2i2m);-ya7t!!D}PBZb`o`ZWNV!xqd@gX{C zwC)8SX~lO%eQ}FCAa)!Dw6zz|?^!5X(XsFpT7Ose10d{!O15Cq}&~qyW?_q zvQZyg9o~4+OupGp@S|k&G04XLXk&l8u|KJ_24q}m{kf8uesV1Usf43SIIe_~^-F_~ zhL?ZsJ%5xmZYS&Q(RzEl-kz59i^VAtaFBzC);vf=-b zRdKqqll=AUq}-sFgg4xJMg&Y1Ns=b$o#eDk&}YdanW{xe?BOg7$S`;b>#r6V(|!C4 Dwcl%VyVZMxJa zkCYP|S!mIP7hQN!AOmy;2nK`HLACI*i!M6AEV`rsE(C6iF1&N#th$-GmlWk#Rx^}% zdEdLA_u)N<@B4T>!ogMB*inBCa@?=j@UB2dIoSv02}d}>Yh0OM<$2V7ny)OZ`gzXB zeasQzYmWFSzvabn&jgP90dDtN4LV){@Cv@hE97{Ez)O6Mmq@||E*m+*)LGsRmaBwn zI%u&CY8dp9A#2L+PN_4r^YC{XCyzmS!clIOC)}#f$5CO+v%&J3zGpm48*cYn4fJ>j z#NP}&^MMcC9UoX4WC?j~@Cf!~5eY15HB3a9cG!;OX-#29nO2M=0#VO-J5p92$r`O} z7@J4J-)%SksisSEcUMz=}HV@JRy16Yep$1yA>af%s*J@>i5H zg#r9J)z)jDDczvy2G3w*=5iQk?DjR=TWnbwvr9{U|RYu3%P0iJI?4T@{ zG+EwFp3XbxcHtCtoNt3`OM~C+nBv6~9Dg|*u|-+Nv1Qqg$TB3WYpBO$`9WRLTnod= z+u^xQg)OL5BTT}!zXY$-4j17)I=yz3P`$*|nxR%JY!F~>bRec z?ynuav^Qx*FFn=G==E0gx)r_N$ag#0;Z-v_)rwA8(JAOojqHzFsgZ*VW-8Z8<*Zb$ zap&022mW--ofqx|aO^W>=2id63~cpjnQcI6{gYo6pium$2q8WqH2r;w=~bV=xncs0 zKo${(cCKe2f9U8O6q#dnFpZrgM8syeXN;)h6Z3*-9P$l#t!AXhTk4s0lnNx)jQ8L> z;dmvzEU>bH9uTC?c}P7TgCqekxj>Roy(xR}Q&uh28AY6cTC3`cmJMWmc7QNt-LM0B zd_X&_*VoD_0H4_5f~P`%tX?6M$&7BR^xY4#ijVS;}xl(;7D}+G2=(W#aAED!5|0*bFvHu-Z z8*o9FDZbb}8fA9CPz{YTq!E`R9BA1gS=J2($iLL* zRR9Gz#V29>r z3v;vic{@V7d}{}FLow>Q9nV8#Q7uz9S)|0MlS+X^^&08uY#Ik2MsZ3wxL}3?0i^#1 z;*@ZXeZh3_nDazq`8dJ7@$UY*l^#7D`LSrGZ?)35tn{tMy>@JPZ^4QU9|&gbMk{v1 zirr|;dmPkCUA0nI8+Y16*Y@vQL)Q*({rtcjT51g~Swl;W<#uvpKW!yPo__FS`lq+d z-c?r@_0^ zd0?2yiB@vLN=`IxBjZgY`}w3Iun~S(oXh## zLY=>Il8E&1QILe1Vo%O<3~owzOLfsBxf zvH~E;cXw)c5DKoGxjQzMxz?p8FbQ{WPIhfKC&8%fIB{qzbZvz(v@KP(5&v0+gq?N2 z`Rvc2+hNifPlxUt_QV*~oVvu1C(A-t(Tj*X9~>ndZyUw9%@cGBam6I zvP@R6MVOIn?9`|&di>$Sw1+kv(Cj9>{qlHX3`W;4gK&7_+c8s`hyPRZud+2d=Qd1n zzQYu$UZ#i@zxZ^%4^P~Iglq57}mZ%Sh= zY0Q$wz_%ZW5w8n80=A!YL5oXRhJ$CAY$=tEYL2YAC$Ed0cHK}lJ!debqCl9y#E2t CWE%_s literal 209 zcmZ3^%ge<81k-=yXIcX3#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>OHV%|KQ~psG^sSNq*On(A~m_R zB)>?%JijQrxF9h(RX;huC{-U~j9x+IFAf_ZyEG@&u80Guoe_wOWr4&8W=2NF8w@fR Ku%RM0pb7xLi8T)Z diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..83f056849affa1e75d3e292ecee9bb908fb1a2a1 100644 GIT binary patch literal 461 zcmZ8cJ5R$f5I)CF`chO0HiX2Kp%SV$Cd7n9Cl)*Fni!chvt<@3#(0vHqOZKsnFAfS~|F|z84aKs4515!3J^V53403YgZ7_-c<>VHhva4lB5fL48>K`m5}*h_m0 zv zZzeSrS<$AZOwmwfH815dO5S0mQm{UxdKS&Dvnb6dzvq6I3Q31T-X^iC zJX%+eL&36upU9?a*0d9*%n~Dn=CGe{>l}9TZCzSm*2brgJCB!7?&KyX&XhPa;><}^ eWe+CKY>(zgXF2IiNoPhnOA|MZaYG+zt3f}!!FAdI delta 223 zcmX@he49yqIWI340}xbw%g@XL(vLwL7+{4mKHE%GS4~b~UBkAFnSo(75JNyZV-!mY zdoY70$4iiaCgUxZg2a-HmyA$OMt*MUErueHF(A3T#N1RrP1al7DOrhm>G^u4MLESq zAj594mSv`v7Z7fK6rQ!$f3XuUHn2uOSx8ELN^C$WKT%Uu6;eeZfi}>CFV@C0I8OG*ogF73 zaw;FF1PF=Vpc021TH1;pI8|IK^~iB;trTmeNR=uM+^ixlocd;y*f9jD9gp9>dGqGI znK$oy^K*B17lQUv;b!q!0HMG6V7vLYm{$fc4-iIJ&`@^sD`W*2`!t{K&-!&SD+*lh z*8+Ml8w6g&0WGA5vtd1wjp$w3E>9NJqIxVF^K?U6x89TO(c{@TjKjB3R>BdWd$2Hr z2D@Hz=hK5eH%N(r33bDi;36e?HYm7ZR@BLgX^@u!Xbt+^u8X9kQl=Awxyh^4%$F(Q z17J(0rD|^YBFMM|R?E96jGI&kXa1S8?gl=R43+SoOWfBV6~pjdizW zSnRaiIl_UqkCK3ctN!=+3AHV@IUM>e+-Yx($M~K0R`f)cXshgq{C`;+z>$hj@m2g4 zu@YeWcG!t-^PS#s*Q3yCkhPDADhNj_!N-sZPk1(X4U#psa{4PTNfkCnlrK$dPPqp8 zsC*9jMpaFjQVq4><)d;@wdQ6`mE!bDbU06m$_UP>Z2Bd?4Y!9_klCIrZ(5Mbo#R~2 zD(jSI8AroBV1Z!B=b*(@R<>3Sv^|d(4b{jK<+$=0){Dkq$c>e#$yekIRVQu~xA0=Q z5t#B&V!1J9GF8jXmT`eFS5ot=xJYvC`8_2#XVEC+@D`k431AH%%5oki<9U;kOc4;f zoStL4HrP%1{ktJ^mV38czp81JUzZy;Dd0Lcd((}mg#sl7I5*{2;fBa^UMpkb2J#$< zGy+2E1;}rhOO%HmP86c#n=%B5?&Z_`KIwi=WKL2*+)&;$7+Gc(--5E)-VA5vOr2!P zvtYTLA6%i`eZ^?ySgOR&4_*cLSaq4KM*%uv~r88R>ZDosf&d2 zIBe#=j~?ax01%5uSW##%eB5};{^kbh36LJ literal 1364 zcmZ`(&1)M+6ra_{dS%J>I&SM!uH%hUh$T{~CE!96oTjQ1oHkCdQ$lozPf-Q6#oM~=1-7}AYwoe=&3h>36z}rW~~)fO5P4{-h1=r&HMPV zzfVm~BA|nRhVUX&zZ=1NEJDd#(kRMro?7~GlVKiARAFbK7y={g8`rq_)Wa;XDEltUWCmB zkq~sth&3ZeP{;A878u54V{Oaty2i>_vx<&kIwj51DaMXgGg(=)ND+pj!HI^Q9g`Br z#tzdA%!;PvWg3a1>()Z2BR!#4DWHiJ1dw>FOuS)~xge&2p-9tZ06jh%7)=`o)~k%rY>m)oo?Fy$ z*3WOp#5FJD)_FvD(?z&0py>SutcBjF^RHFyMAbU#a#vk`t*)G?D;+i6Rnx7Fo|by~ z_(Z$b)~@ZR_tUQyT0itB&pp5LYvy^Tl^e+D)6aYJ%l+g^CzEdC%omzVp>MZ5DOS%5y(&3}_(r9}| z*pQ14Ipnyv<><hIH<=HMzINZ7v}XiY#0QbE$S9c)WvBqJa4R|5w=zyY^+Z7QfsSc0$K zg@V=4febcqdl%S*J8ZgPodg7SCgHwLaB2$SI^m86E;1qb#U+Yg%-cv)#jpYuCOgh;oYhTX)z|U__gB9-7md$}>csyYu?(85PIYE7 zALxu(Ud;`lX{hd7EVSCH>MRQ{;<8ShA}%>hG0`$p9xbMQETUH&OEU=89gJ9anV3bL z>}oIZE(_V1n0mq7!z{9c$%bWPt)v$*^Kp8NAQWjCI*0yRE8tSz*#}uz_dbm z(pjKVGQX~1){U@j5VOoX3{3KG6!g+dFzOXXnmQf*?V+6Kr*?NIpC^tE+ zR4Hy?a(s(V@jIqdz{mgLd@r^gKn?gc!?K-Y-V=`bHiW*`i?9K@f>ti*2DUx4$jqA# z^f}wnor<0IgPk7{ebZt7MgD+s$gXS@O^3%MwBBMt9;uWNCK|yzCVsUSdB#VnH8BEh zP%i`89heln-{iQI;B9R1rGjfsj$Gpy2RKHRbs1Zh$-#9Yys1|Tju*OcGbx(xK*YQ} zm8@5qjt~o1%1AgYbU~3r(6KOTCwcFJVG*49DBxaMB@J3Tb}&;Miv<@U++srnk!5Jk zZW*UlFjH3V?)5KQq?lTrxSP7sN<|t}>gx1NTQ@xeN`05FAav_(-TDOAJu2;R$3REE z09QS?LYrm*Yh~Tp0`bMRI9SAv4nFB=nM{C`1zUM%Apj>}+IyFUPoQaSla^6hCAayk z2*Cvr7`{cx9S}W9Ut~c|Y+OxaVNHY6tpW%%7SXh?D|&%j!l=tEnGS4s7J-mq$ZN?k zu}%1q$+{OreXR0xk?_NdMIM;>`%pQ{eCM*z!j?{&Y!<(EJT|iE?LBYQvk17dW)XYC zFvJ&|`O;%3v;f-HOL>baXoCesexOQN*TVhvh5L(3EVQ!zyC>c(A2JPxg{?Af9@hVq zJ^&o)r{7L)Sw%cq*{GD9$|Qb`4FE?bUs>d(U51@M$pbg}@sOXKnwpx{nl5L`yM!O! zg7B_w{~K!PP5bv_Z{M4T4WB#^c=Kf=D20-L3%kKYJvQ=V>>?c;|7OP>9DnEgVT|T9 zS|W7Nt_|AmpiQGrJvK<=>HSM?Jbk!MAzk8~$J@{9Xcb!bzj=Bb@7>0p}VWyYqJ09lLX+ z{BVbkJ*|yBb;q94=)q$vyVKNAFc&2@6>tkExCNBEl~?MqD>RYW-*gk1!|ahk6DzgEikn!W(Z}^zd)Y%o zN9JlHbMD9-jn1F)xHA+mBg27Y-d*}W?#@1PXV=`>95o$y+n$^iFrEn*&jgHT0tO)N z>Eb~M^B@2@;iNG=+821U!hdAFRSD?;i+h!sK^qzGqZs-rv`;8c@)*pZHHpdvy=WAo zH+ZGA##a$bWr6!CIPbNc-;ftD - + - {% block title %}Knowledge Base{% endblock %} + + {% block title %}Qosh Tepa Project{% endblock %} + {% if project_description %} - - - {% endif %} - {% if project_image_url %} - - {% endif %} + {% load static %} + + + + + + + + + {% block head %}{% endblock %} - {% block content %}{% endblock %} + + +
+
+ + + + +
+ {% block content %}{% endblock %} +
+
+
+ + + {% block scripts %}{% endblock %} - + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..ae2d10c 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,101 @@ {% extends "base.html" %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% block title %}Dashboard | Qosh Tepa Management{% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+
+
+

{{ total_budget }} AFN

+

Total Estimated Budget

-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
+
+
+
+

{{ active_proposals }}

+

Active Proposals

+
+
+
+
+
+

{{ pending_documents }}

+

Pending Documents

+
+
+ + +
+
+
+
+

Project Branches

+ New M-7 Proposal +
+
+ {% for dept in departments %} +
+
+
+
{{ dept.name }}
+ {{ dept.code }} +
+
+ {% endfor %} +
+
+
+
+ +
+
+
+

Recent Procurement Proposals

+
+ + + + + + + + + + + + {% for proposal in proposals %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
IDTitleBudgetStatusAction
{{ proposal.proposal_number }}{{ proposal.title }}{{ proposal.estimated_cost }} AFN + + {{ proposal.get_status_display }} + + View
No proposals found. Start by creating one!
+
+
+
+
+
+

Quick Actions

+
+ Create M-7 Proposal + + +
+
+
+
{% endblock %} \ No newline at end of file diff --git a/core/templates/core/proposal_form.html b/core/templates/core/proposal_form.html new file mode 100644 index 0000000..f7e2752 --- /dev/null +++ b/core/templates/core/proposal_form.html @@ -0,0 +1,50 @@ +{% extends "base.html" %} + +{% block title %}New Proposal | Qosh Tepa Management{% endblock %} + +{% block content %} +
+
+
+
+
+

Form M-7: Procurement Proposal

+
+ +
+ {% csrf_token %} +
+
+ + {{ form.proposal_number }} +
+
+ + {{ form.department }} +
+
+ +
+ + {{ form.title }} +
+ +
+ + {{ form.description }} +
+ +
+ + {{ form.estimated_cost }} +
+ +
+ + Cancel +
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..f4edc99 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,7 @@ from django.urls import path - -from .views import home +from . import views urlpatterns = [ - path("", home, name="home"), -] + path('', views.home, name='home'), + path('proposal/new/', views.proposal_create, name='proposal_create'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..78219fe 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,39 @@ import os import platform - -from django import get_version as django_version -from django.shortcuts import render +from django.shortcuts import render, redirect from django.utils import timezone - +from .models import Department, ProcurementProposal, Document +from .forms import ProcurementProposalForm +from django.db.models import Sum, Count def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() - + """Render the Qosh Tepa Central Management Dashboard.""" + departments = Department.objects.all() + proposals = ProcurementProposal.objects.all().order_by('-created_at')[:5] + + total_budget = ProcurementProposal.objects.aggregate(Sum('estimated_cost'))['estimated_cost__sum'] or 0 + active_proposals = ProcurementProposal.objects.exclude(status='rejected').count() + pending_documents = Document.objects.count() + context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + "project_name": "Qosh Tepa Finance & Admin", + "departments": departments, + "proposals": proposals, + "total_budget": total_budget, + "active_proposals": active_proposals, + "pending_documents": pending_documents, + "current_time": timezone.now(), } return render(request, "core/index.html", context) + +def proposal_create(request): + """View to create a new M-7 Procurement Proposal.""" + if request.method == 'POST': + form = ProcurementProposalForm(request.POST) + if form.is_valid(): + form.save() + return redirect('home') + else: + form = ProcurementProposalForm() + + return render(request, "core/proposal_form.html", {"form": form})