From 1824ee9a2659fd526a2e4bafcdfa987408c7c10d Mon Sep 17 00:00:00 2001 From: emile Date: Mon, 18 Sep 2023 23:17:11 +0300 Subject: [PATCH] Major fixes and imporvments --- .DS_Store | Bin 6148 -> 6148 bytes osinaweb/db.sqlite3 | Bin 319488 -> 331776 bytes .../__pycache__/admin.cpython-310.pyc | Bin 1251 -> 1273 bytes .../__pycache__/models.cpython-310.pyc | Bin 7119 -> 8073 bytes .../__pycache__/views.cpython-310.pyc | Bin 9368 -> 11443 bytes osinaweb/osinacore/admin.py | 2 + .../osinacore/migrations/0024_task_task_id.py | 18 + osinaweb/osinacore/migrations/0025_status.py | 26 ++ .../0026_remove_status_user_status_staff.py | 23 + .../migrations/0027_alter_status_staff.py | 19 + .../0024_task_task_id.cpython-310.pyc | Bin 0 -> 638 bytes .../__pycache__/0025_status.cpython-310.pyc | Bin 0 -> 1020 bytes ...e_status_user_status_staff.cpython-310.pyc | Bin 0 -> 823 bytes .../0027_alter_status_staff.cpython-310.pyc | Bin 0 -> 783 bytes osinaweb/osinacore/models.py | 31 +- osinaweb/osinacore/views.py | 113 ++++- .../osinaweb/__pycache__/urls.cpython-310.pyc | Bin 2986 -> 3302 bytes osinaweb/osinaweb/urls.py | 2 + osinaweb/templates/addpoint-modal.html | 2 +- osinaweb/templates/addstatus-modal.html | 11 +- osinaweb/templates/createtask-project.html | 7 +- osinaweb/templates/deletetask-modal.html | 4 +- osinaweb/templates/index.html | 410 +----------------- osinaweb/templates/main.html | 2 +- osinaweb/templates/project-details.html | 20 +- osinaweb/templates/task-details.html | 239 +--------- 26 files changed, 274 insertions(+), 655 deletions(-) create mode 100644 osinaweb/osinacore/migrations/0024_task_task_id.py create mode 100644 osinaweb/osinacore/migrations/0025_status.py create mode 100644 osinaweb/osinacore/migrations/0026_remove_status_user_status_staff.py create mode 100644 osinaweb/osinacore/migrations/0027_alter_status_staff.py create mode 100644 osinaweb/osinacore/migrations/__pycache__/0024_task_task_id.cpython-310.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0025_status.cpython-310.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0026_remove_status_user_status_staff.cpython-310.pyc create mode 100644 osinaweb/osinacore/migrations/__pycache__/0027_alter_status_staff.cpython-310.pyc diff --git a/.DS_Store b/.DS_Store index 722849003fd72aacadbcf40ab5b8c2339440bee7..684dd60e7dde9fd25bfe15b0048f64be79419334 100644 GIT binary patch delta 94 zcmZoMXffCj&BVBUatu?Un|O7#fsTT)p-HWdLbaiRiKUK$nUP^_EhmSlvc7dte0EN5 eUVbM77%(zIXa-&=4Wqg?i!gs?+04fAj~@Ucv=bfx delta 95 zcmZoMXffCj&BVB4atu?UyF_)hk)^4Qg0ZDpt&T#qrICS-f{C$NZ7nBHQ7}7$3X#qhsgefGGAJ7(Ps3@9Y3JG*zm{1@YD33w|ZD>nhObH#rgiNP*cm0y< zwEU@ebar+3eBU|u-gC}9@`01~14kV9RF>i{48w-zKLFkDzV{m5h(=wbJx>LXK%$8_ zpD~pTo5^R$Inqs>&jm{EA<`{P2CRBxYhpGU4@@Lx6qe<^{y;3L%=l-Mf#jZ9^%e^8 zEbne&X97BOi>&?hH)US?DhK>7iZoP(!mf-VCASWbGoS+SnhM( z1pb)uyKXOohp{rtO0CRSuB(7GQ`y|v&|O+g)GwonCz48^og^ATU{5mQ-=)kjQ7N^S`WOc<7t-gzn zT<3Mq0b&GP%$Tk}YQ`gY8(sx2q8R7_X=cQLf!an#DvD;S>u(Ok8TBipe_c0>H0qii zK_#Xn7xq=v(FYc^w&_|Ekw84WTuUFA*Scy5X*ug1fnZQK24__!^mSe#cSqZ|DPqL@ ze8x0*)NKCJ{IU78`FXS{w7J(tf?BZL(Gfcd>Oi4m!}?f(8{0}q-~>xXXNPi@8@@C; z=^Yql+Jr$r{gG)Cb)2$Vr;A@KUSD*xeShr-DIOFjx@d$R%0zO7?J)+rX;m-0hJw1`+z4~<2>d;~kaO;;fSIl75}c=UThp&IFl>Dj z-e+y0-lo2?eo5V(Yd8|3oKbe)UeBJWFcA((`zC{4VQ(-IiSLi3_65iHi@T?)a!)-m zTtke|RK|4rsF|*&D`-1Sp=BPU)))u?93z?>*5o!#4&~OL{qO~%o9@k;j)2=r=sk3T zj?xqK7(Gf4(Y+|{pQ2bzwOf_;E=_i7vO|;Yn%ttv&6;e>-~1#v1Q6@}S<^?vp(6S* z`WXE%{UCim;=4#WNWucTRneu2PE~Z|pZJt$0ogyD09O(Yn#-C_f;yb$5CG6+b_a=7 zS1e|{o;vxC*TFfb{Y~m=>H#W6jZzX-VZCU5pE{4G{D?LG{w2VGD>$}^2oxUKGn??rZ1r`xwP7L|O(_)bW?9x-1dm}R*n+_{ycd27``{Q% zz!rE+ztE05VYX!e4};$9qXT#+Ya{AFLC{%?;5o!_0)r>uZ{a)e415*71TUhGcI9jb zj>7B-KVB!5n+z!U%8hCW+6)Ae#iY6q6r%V9QM`;H=*#dc6lx#9w^8`bUx?x{n0+~c zuXo#32D?f?t9XmLBlGA}7(55h!uQ}?@C|qhv7FK`gnk@mPo;5Z*{bO89>AYDK#+q( zFNkGLr-?%}{wn@3K7)6Fi{NPx%LGbZPj~bgvEH?o){(??VrC|>mzfB}VoWlkFcUG9 zSY^(N(+-AE z8y(B0kGdk3^@*}emIY3d{9Oow4srw$Mo=S?-Pu5{&EE4HP~6^%&h&6x2{Oq<&Dbrs zjM{T+)`o&qY5 zMwR{=Ua>Aglvt18ZP%!5Xl~vDDsMgh&6U#;WS=Oaz(w7b=-sjilnQ`SeR>rn>e3`N zq#VKKcEmBl_feXYfctuM2bIh_Dl)^sfm}gC$+>& z7Tbtcc|C%`ij|jHY&u-4sVXiU{%4kZT#-)iY^Jsj0fqdEYJ&WXSRKKrYm_N2izH<5- zNks0n*!5LPs(+)2nJH9pvmd9)sjekbCIjO!Wz`=Qs}2rs-qzka($0*uw)M3$HLL1mTCHMs z?*qgYEx|xisbNxq8PxgCY!KLbrhj0B>EGVhcMVgMj80$vC2Cbdq3oFliMs4fhY5aj z{hU2+Dj#YBb7C|eRQ4_QH1j_X)LSUzj|Tk$tGESGlvipDWWhmvO^4nC{ik{jGtke} ztOV6C8)_DqYw8awimAN59vm{{V~>)pxJjLbT1%gw0Ok3g{)l8iD`rG1vrY3OErY-eK3oE}5X0H!`HAdad|HDdx`h4l*p52^3x@B70y(=j1 z=ok09{d@Mx?!Hu8a!TAk&fl0C?$+{f)&4U7y%NIfHLP* zD5|lKYmts?v5%Y71C&&SK@}D~ZO&ov61)Jx4>aoF~UrGZ-LLffEE~p|t!yfWbeb2JW1d)nQqTvK=!mZx&eK3-ZiYiwIba$Om%JEGi=E-70AhD0QEjj z8-@z~5+4U;81#sLhfnL;b_ FzX8BWs<;3E delta 1512 zcmah}TTB#J7@jk8c4udIW`5WO5tOp45=F~iS=hx!Tq;m6$Tp~GQ%YnVVU@keE_kci zHMT)x(^RL;BqpX1A8b=G*l9B_wLlYn&|V-Kt+BPX*0gEjg*L55Y|}F}xDP&b{+W}R zf4=XV@BIHclN~I`j@jNRv7)~yidsvqnIn7Td9RUVo!chPY#9Wm0#C_oUaK0iD_ET> zuvu_{Fo9*0eUa*M4+`=`r3>Ms&ezawxx+b7c#N9GB~sD&=18Jf>WK8E(utTPPdlGO z7P-XLv^Zq7Fcm0=h$qrggAFrF(B{5$cSlm{jYU(bXd)h#54&7OzKCIbNFL{H$R=NQ zEiqM?iBX%_B(v@XOcNYdJ;`EGZCZ8~F=6_k%q|~NcjVnf>cRTg1t!dKG8-Nu-Zz_6 zZqq|!86oqg0SY?Ao8m@cMBw?Dc`tXBbD0JRvdg3nbWa-aegh+@uf}&G(NpUu zXN}Y23HYnL@{fu61w1rUa0kX93Gc!L?1v6$R!fo&kh6IO^3qJ6+MfB`4sQuv{3STb z*9ljIY5t+QcyO!W2zvT^;=y!xv?uPb?%mVZ>kq~}JL5H-Rms?noz?wT^~`YVJSHrb z%k0DuDe^u+Ex+-@I1>{0D(oOSKvGkJw)ZqTgh=i)g&omzNw27l-z9Zaei=ojj7@A* z*fF$_yqGO&jbEc%4%_d-CE*j{J)vJ{69Pgp|A@a%Cj36HU4M-1XqG!z=?&UF)wNYM zweEn^?Fm-qoUDO#BoTAQrL+9THFnCuTy;&pJSWQJQrVU&VV_#UppBwU1ZxgZKdpp16V z3j?LBffy_@>NfKY3>ht$CZmCv_?1YUrwH{t`~=^@71H3RK_or^<$QuJ_s!N7Y`TD` z^EsW4pRg}ba0_n0HMk7lz=d28_9;*2}rl#Smq^R<#o%x^riLLAn+e26r&RMdv=GHo7at|6qbb{r(-M+Plaj>lF3ae&~W zZao4K%1PjVi; zomZUW`E*_=l8*LEUN`yF@%e>Zp~HdD+R(btnoag~q1M$cNh#h+ju{!RcTMir#1mF` znZuN?v+5;#!!EMl(`|{~?Zk?`CEnTj1RSXJ24-kJY@v!AoK2@t%47yF67^pIf=3iQ zf_rd}6!mAAn{WEBiADp15JzVG6mcK!6U1#;kjLu?vku6|g83`T#CB59E}j({`H$I7 zb3J#OR~#dFN)6jzF`D04DX~Qr73g5I7CwnXv^M-9o`-1Epkr?)gRL}N6Xr?01Zc^>-FL6I(L@-UkG@0!^V98o!D1`q7ub8fa diff --git a/osinaweb/osinacore/__pycache__/admin.cpython-310.pyc b/osinaweb/osinacore/__pycache__/admin.cpython-310.pyc index 0be67e8778577c4bcd6f7a3081b6f44a4892209d..168b2481a5fae104dbede8a30ee665240fbc7e24 100644 GIT binary patch delta 69 zcmaFN`ID13pO=@50SJs%aHJ|t9(--()__af>au YB(bElc=8+;Wk#jR2UrwYco+p30k9zxi2wiq delta 50 zcmey#`IwV8pO=@50SNdNm{VCN^2##any7tqvjF22CPvZ8Pni!--oT>Fs4)2oiz1T% FBLGYt4Q>Dc diff --git a/osinaweb/osinacore/__pycache__/models.cpython-310.pyc b/osinaweb/osinacore/__pycache__/models.cpython-310.pyc index dafa1b1a27b6530adb8adbd47cfbbb3eab73b1f2..6ee63c3d88868d7059baa04fe4e7fb0c17303eb1 100644 GIT binary patch literal 8073 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 Rc7L0{%g?WNc+J7u{{X-zNUQ(= diff --git a/osinaweb/osinacore/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/__pycache__/views.cpython-310.pyc index 24f8e9415151b24c33798bb86525e0393e4144f6..767e375a4bccf819031727971f0e0c38a6cef6f2 100644 GIT binary patch literal 11443 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 literal 9368 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 diff --git a/osinaweb/osinacore/admin.py b/osinaweb/osinacore/admin.py index 9f1a1161..491a4ec2 100644 --- a/osinaweb/osinacore/admin.py +++ b/osinaweb/osinacore/admin.py @@ -30,4 +30,6 @@ admin.site.register(Milestone) admin.site.register(Epic) admin.site.register(Note) admin.site.register(Task) +admin.site.register(Status) + diff --git a/osinaweb/osinacore/migrations/0024_task_task_id.py b/osinaweb/osinacore/migrations/0024_task_task_id.py new file mode 100644 index 00000000..ddca6f47 --- /dev/null +++ b/osinaweb/osinacore/migrations/0024_task_task_id.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2023-09-18 18:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('osinacore', '0023_task_assigned_to'), + ] + + operations = [ + migrations.AddField( + model_name='task', + name='task_id', + field=models.CharField(blank=True, max_length=20, null=True), + ), + ] diff --git a/osinaweb/osinacore/migrations/0025_status.py b/osinaweb/osinacore/migrations/0025_status.py new file mode 100644 index 00000000..d713c769 --- /dev/null +++ b/osinaweb/osinacore/migrations/0025_status.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.5 on 2023-09-18 19:42 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('osinacore', '0024_task_task_id'), + ] + + operations = [ + migrations.CreateModel( + name='Status', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.TextField(blank=True)), + ('date', models.CharField(max_length=40)), + ('time', models.CharField(max_length=40)), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/osinaweb/osinacore/migrations/0026_remove_status_user_status_staff.py b/osinaweb/osinacore/migrations/0026_remove_status_user_status_staff.py new file mode 100644 index 00000000..bb8bc393 --- /dev/null +++ b/osinaweb/osinacore/migrations/0026_remove_status_user_status_staff.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.5 on 2023-09-18 20:11 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('osinacore', '0025_status'), + ] + + operations = [ + migrations.RemoveField( + model_name='status', + name='user', + ), + migrations.AddField( + model_name='status', + name='staff', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='staff', to='osinacore.customerprofile'), + ), + ] diff --git a/osinaweb/osinacore/migrations/0027_alter_status_staff.py b/osinaweb/osinacore/migrations/0027_alter_status_staff.py new file mode 100644 index 00000000..d196b1dd --- /dev/null +++ b/osinaweb/osinacore/migrations/0027_alter_status_staff.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.5 on 2023-09-18 20:13 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('osinacore', '0026_remove_status_user_status_staff'), + ] + + operations = [ + migrations.AlterField( + model_name='status', + name='staff', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='staff', to='osinacore.staffprofile'), + ), + ] diff --git a/osinaweb/osinacore/migrations/__pycache__/0024_task_task_id.cpython-310.pyc b/osinaweb/osinacore/migrations/__pycache__/0024_task_task_id.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d785efcc28b2f7df3df4538389f25341c1a138d5 GIT binary patch literal 638 zcmYjPJ&)8d5cNm0n?xK!h_8|gX`9OmC=ogYf(DM_ph;tScZRHY9Vf(D!PU@SOTjSmA;RUYzp|2c>-Z@qDP-S!ynE|-s=s6qRk(%zfe zA*i7ZNvwqVSU2$D{0^}$WJp(5yB#g8zbcEa9yTFyduypxjEgI$8>Cu{=_i90j)^=| zV_m6GC`EI7ihoUPI2#dQhYrxK4fg)Zed>`wdm;4^Z6n?lBfOfHgCaKUf#%uq@+S{K?pUZEg<@kNPF>RwaHH1P5cO6hc;Y6 zh)e$i+~67n8NchRiC_)4`icUqfCwv~V1ILTv0u74yf?ZR!2+igdp+}HAG!B3e@}$Eg))|+psWhjcen@@sf!lTIQXwA{I|* zNP=atg!L@z+V(~ASV=8aGU1~%gJ5ZO_3;yyb2TZ26xto+JfA5|rP$ll^v!zP(G5P! zQ#Q(g=OA=_n#q`Fb2fpwt|`bQkK{+tjSr9wQw1#HF=!`;;~Y7x3?rUQv?K8D=>wz% zZGOy;Sp-R#AEKW$-ZOls?PM)<&`vUoB1|)3$TH-hX`W)88P18NSJV-oPWcee1xz6kkc{RTHAk)9{@!c0KiGK3ws+Sz zwshmtLxR%veo^$c>33%4OE+H1u!nSPnlyB6534*^`-eO$Reux7m0|K033A1lCt<3o z7;3Mm2S-R(`@KQGx4xnMbPDHV_0!58VuV8c9(MPU5!HoQMgUPH=g?gTHObRycYu7y zcenV|fL$f?Q5tuPrk3&uhNWV9+`XFHE_VAVQ$>F}(|K0GXdZ5LyHI?a66efuDOsTl z#C&%M{o|Z@e+$pHr|V@col%+`l=RikEn-+OT~c)G(%30~l+H!n**#OBiF;LQsXaoQ V_MVqrd_fQ?lUjo=5|7-p{{fAEC^P^7 literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/migrations/__pycache__/0026_remove_status_user_status_staff.cpython-310.pyc b/osinaweb/osinacore/migrations/__pycache__/0026_remove_status_user_status_staff.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a32ec84288e21d58c68055ea968389488cec57da GIT binary patch literal 823 zcmYjPO>fjN5VajAo6WX}6HW_m+XUP5e54+ z?Q;TT83&dL;7gtbC@ae7@3;`eBjOr*m z$Mgv8X{%T1v`}Sz|7EfA!E0N#b6uyMMLmANSx>y@>GeBE$^A#U>2z#XTL*tz;S>0jUEvUsyY dS-Z2>_4e!@Ex7n`--IXJD~Jegici$ztWs?@mdbIJI-2gAvyL zAx!)~UYYn8kWhI}xVBjG)B8T#@A>;|HJ!!;$Cn=w>@z}sI&gdV2##=?6oVjwN>bCD z)+}e#VJ5xYe?^2R{BK0~K&#-Zmj{B)NfP|RGbCX)uFJJ9x>7a9hP4tP&Dqke-5%~9 zM>x$P1|T^VBxi!IY3_kvVMXCVSdD~_U7~7Sg;iYL!M=eAF9R{U^l;}yMA&z1$8UEH zvHMt=vMH8IgMD&v@bnqiP^*u?O;>aq!#4)>E=Ov$vf;2|gC4&Bymwt7?U`1qRVg6} zY_O0;b8h`+BPI4}I7)*K>_mesIuN`mYOt(RiH9aQ;RECMe6T7(inC;DBi{3z+n96Q zw~>JPg!79{A>Cew1hmiyXqF`yjc-M4Jd+*hQ&&ZMJ#mUE%XRY_wl)-1(X5qaVqv5H zUg*Ca9na>+vy+!LRxSK{lkY@7#M6EF-DDro5R*ZT5<$vx3)u;n^G>zdypU!6_)XC| z@XnOoQq@^+&JaJrVo03X+0CP8X!~VWI_ygSw#1|zmTfr AY5)KL literal 0 HcmV?d00001 diff --git a/osinaweb/osinacore/models.py b/osinaweb/osinacore/models.py index f1cf7b41..3239a06c 100644 --- a/osinaweb/osinacore/models.py +++ b/osinaweb/osinacore/models.py @@ -2,6 +2,8 @@ from django.db import models from django.contrib.auth.models import User from colorfield.fields import ColorField from datetime import datetime +from django.db.models import Max + # Create your models here. @@ -191,4 +193,31 @@ class Task(models.Model): description = models.TextField() start_date = models.CharField(max_length=200) end_date = models.CharField(max_length=200) - assigned_to = models.ForeignKey(StaffProfile, on_delete=models.CASCADE, null=True) \ No newline at end of file + assigned_to = models.ForeignKey(StaffProfile, on_delete=models.CASCADE, null=True) + task_id = models.CharField(max_length=20, null=True, blank=True) + def save(self, *args, **kwargs): + if not self.task_id: + # Get the last two digits of the current year + current_year = str(datetime.now().year)[-2:] + # Find the maximum project ID in the database and increment it + max_id = Task.objects.aggregate(models.Max('task_id'))['task_id__max'] + new_id = str(int(max_id[-4:]) + 1).zfill(4) if max_id else '0001' # If no existing records, start with '0001' + self.task_id = 'T' + current_year + new_id # Add 'p' prefix + super(Task, self).save(*args, **kwargs) + + def formatted_start_date(self): + # Assuming start_date is stored as "day-month-year" + parts = self.start_date.split('-') + return f"{parts[2]}-{parts[1]}-{parts[0]}" + + def formatted_end_date(self): + # Assuming end_date is stored as "day-month-year" + parts = self.end_date.split('-') + return f"{parts[2]}-{parts[1]}-{parts[0]}" + + +class Status(models.Model): + text = models.TextField(blank=True) + date = models.CharField(max_length=40) + time = models.CharField(max_length=40) + staff = models.ForeignKey(StaffProfile, on_delete=models.CASCADE, null=True,blank=True, related_name='staff') diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index 67dc5fa7..fb5ff0c2 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -7,6 +7,7 @@ from .forms import * from django.utils import timezone from django.urls import reverse from django.http import HttpResponse +from django.db.models import Q # Pages views @@ -42,18 +43,34 @@ def signout(request): @login_required def home(request, *args, **kwargs): - notes = Note.objects.filter(user=request.user).order_by('-date')[:6] - - context = { + recent_note = Note.objects.last() + + if request.user.is_superuser: + # Superadmin can see the last 8 tasks for all users + tasks = Task.objects.filter(Q(status='Open') | Q(status='Working On')).order_by('-id')[:8] + open_task_count = Task.objects.filter(status='Open').count() + working_on_task_count = Task.objects.filter(status='Working On').count() + total_tasks = open_task_count + working_on_task_count + else: + # Non-superadmin user can only see their assigned tasks + tasks = Task.objects.filter(Q(assigned_to=request.user.staffprofile) & (Q(status='Open') | Q(status='Working On'))) + open_task_count = Task.objects.filter(assigned_to=request.user.staffprofile,status='Open').count() + working_on_task_count = Task.objects.filter(assigned_to=request.user.staffprofile, status='Working On').count() + total_tasks = open_task_count + working_on_task_count - 'notes' : notes, - + + context = { + 'notes': notes, + 'recent_note': recent_note, + 'tasks': tasks, + 'total_tasks' :total_tasks, } return render(request, 'index.html', context) + @login_required def my_projects(request, *args, **kwargs): user = request.user @@ -98,14 +115,23 @@ def customers(request, *args, **kwargs): def detailed_project(request, project_id): project = get_object_or_404(Project, project_id=project_id) epics = Epic.objects.filter(project=project) - - context = { - 'project' : project, - 'epics' : epics - + selected_epic_id = request.GET.get('epic_id') # Get the selected epic_id from the query parameters + if selected_epic_id: + selected_epic = get_object_or_404(Epic, id=selected_epic_id) + related_tasks = Task.objects.filter(epic=selected_epic) + else: + selected_epic = None + related_tasks = [] + + context = { + 'project': project, + 'epics': epics, + 'selected_epic': selected_epic, # Pass the selected epic to the template + 'related_tasks': related_tasks, # Pass the related tasks to the template } + return render(request, 'project-details.html', context) @@ -113,10 +139,12 @@ def detailed_project(request, project_id): def createtask_project(request, project_id): project = get_object_or_404(Project, project_id=project_id) epics_of_my_project = Epic.objects.filter(project=project) + staffs = StaffProfile.objects.all().order_by('-id') context = { 'project' : project, 'epics_of_my_project' : epics_of_my_project, + 'staffs' : staffs, } return render(request, 'createtask-project.html', context) @@ -234,6 +262,29 @@ def users(request): +@login_required +def detailed_task(request, task_id): + task = get_object_or_404(Task, task_id=task_id) + + context = { + 'task': task, + + } + + return render(request, 'task-details.html', context) + + + + + + + + + + + + + @@ -330,7 +381,6 @@ def save_note(request): return render(request, 'addnote-modal.html') - @login_required @@ -424,6 +474,7 @@ def save_task(request): status = request.POST.get('status') project_id = request.POST.get('project') epic_id = request.POST.get('epic') + assigned_to_id = request.POST.get('assigned_to') extra = request.POST.get('extra') description = request.POST.get('description') start_date = request.POST.get('start_date') @@ -443,6 +494,15 @@ def save_task(request): # You might want to display an error message or redirect to an appropriate page. pass + try: + + assigned_to = StaffProfile.objects.get(id=assigned_to_id) + except StaffProfile.DoesNotExist: + # Handle the case where the StaffProfile with the provided ID doesn't exist + # You might want to display an error message or redirect to an appropriate page. + pass + + # Create the Task object with the Project and Epic instances task = Task( name=name, @@ -452,7 +512,9 @@ def save_task(request): extra=extra, description=description, start_date=start_date, - end_date=end_date + end_date=end_date, + assigned_to = assigned_to + ) # Save the Task object to the database @@ -527,3 +589,30 @@ def save_customer(request): return redirect('customers') + +@login_required +def save_status(request): + if request.method == 'POST': + text = request.POST.get('text') + current_datetime = timezone.now() + date = current_datetime.date() + time = current_datetime.hour + + try: + staff_profile = StaffProfile.objects.get(user=request.user) + except StaffProfile.DoesNotExist: + # Handle the case where a StaffProfile does not exist for the user + staff_profile = None + + status = Status( + text=text, + staff=staff_profile, + date=date, + time = time, + ) + status.save() + + # Reload the parent page + return HttpResponse('') + + return render(request, 'addstatus-modal.html') diff --git a/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc b/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc index c61ce4f32f57a26047a6f85df38ed3ef17d63e7f..5d8843b5e5a266143c10acb6f61185c53b3fd46e 100644 GIT binary patch delta 529 zcmYk&OD{t~6bJCzgX;6dyIMt+gsLi5B4T6X{b(x^o8~ejDbjN1mgH{iB^GkmVv7}N z(!^J=^=`ahiQ+q$2`;nv&-~7roJ?ll_3Fly(`l3VvhP{whI0$OrtD!b3hT6x3{dkz zkPH&*X2F(;dx*P@3>zNd4v|sAW8Cdz-0%cwA@65g>2^5}v$tbrHw!ZX&w6V|~a*24q(;2s;` j4*hV8jc|iaaE;Ayg)MN20l2_cIL9EIVH=!c$a3-pJl&vJ delta 193 zcmaDRxk{WbpO=@50SIzj*i(ghCi2NJhHcaiX5xs_PVoq4(DdB=jAP%k4xpQ(QSJLEHTw9F=fLeBLD_+S^ zBny&|oqU};nQ_8oYn~8$F{W31;!H33B$!_CNisd>lVW7u0n@^4D7N0uDO#m@uGh_e& diff --git a/osinaweb/osinaweb/urls.py b/osinaweb/osinaweb/urls.py index 905ba1b0..f3e07a14 100644 --- a/osinaweb/osinaweb/urls.py +++ b/osinaweb/osinaweb/urls.py @@ -41,6 +41,7 @@ urlpatterns = [ path('createtask/', views.create_task, name='createtask'), path('createtask//', views.createtask_project, name='createtaskproject'), path('createtaskepic/', views.createtask_epic, name='createtaskepic'), + path('taskdetails//', views.detailed_task, name='detailed-task'), # Modals urls @@ -62,4 +63,5 @@ urlpatterns = [ path('save_task/', views.save_task, name='save_task'), path('save_business/', views.save_business, name='save_business'), path('save_customer/', views.save_customer, name='save_customer'), + path('save_status/', views.save_status, name='save_status'), ] diff --git a/osinaweb/templates/addpoint-modal.html b/osinaweb/templates/addpoint-modal.html index e02c11f8..39dc3795 100644 --- a/osinaweb/templates/addpoint-modal.html +++ b/osinaweb/templates/addpoint-modal.html @@ -36,7 +36,7 @@ + Point(s)
diff --git a/osinaweb/templates/addstatus-modal.html b/osinaweb/templates/addstatus-modal.html index 93eaf429..dd3f3776 100644 --- a/osinaweb/templates/addstatus-modal.html +++ b/osinaweb/templates/addstatus-modal.html @@ -14,11 +14,12 @@ -
+
+ {% csrf_token %}

Add Status

-
@@ -29,7 +30,7 @@