From a205ae3cc0d8cf5731ee628b0369f75663aab2ab Mon Sep 17 00:00:00 2001 From: Salim Elliye Date: Wed, 27 Aug 2025 17:41:50 +0300 Subject: [PATCH] new --- .../__pycache__/models.cpython-313.pyc | Bin 32193 -> 32193 bytes .../__pycache__/serializers.cpython-313.pyc | Bin 8429 -> 9520 bytes .../api/__pycache__/urls.cpython-313.pyc | Bin 930 -> 1021 bytes .../api/__pycache__/views.cpython-313.pyc | Bin 5704 -> 6261 bytes osinaweb/osinacore/api/serializers.py | 81 +++++++++++++----- osinaweb/osinacore/api/urls.py | 1 + osinaweb/osinacore/api/views.py | 15 ++++ 7 files changed, 77 insertions(+), 20 deletions(-) diff --git a/osinaweb/osinacore/__pycache__/models.cpython-313.pyc b/osinaweb/osinacore/__pycache__/models.cpython-313.pyc index 59f1929c34e1e91a085fb20e6abdf845e2e49ba5..2842d342a668d63da54638ce6e8dea5eb2c42f46 100644 GIT binary patch delta 22 ccmX^3oAKapM()qNyj%=Gpvbj;Blosi0AGOzW&i*H delta 22 ccmX^3oAKapM()qNyj%=G!0~$BM(%C30Av#gEdT%j diff --git a/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc index 810a0826289bf0915251a46549adc4772cf18b22..980664a1214f1351a8ab287ea47fe7c87f5bcb21 100644 GIT binary patch delta 2216 zcmd5-O>7fK6yEiE9smD3KTcw&PC}hlf~3JJ2@rxR5q{JtWW$e?P-EgvFmY^{-B5+L z!Y72vp@9)ndT5&pp(dpjLIQ*^)|;ZM;Ep&|O%{{w%P zeiG;ec`>lfl17I#{VfpZ)AWMvAngx6;tBPH_O|BHgfI$o-3f4odto*S^<@r#gqRtE z=J_%DH1uusV^CyKc@cq`YjA}-`^g0Dum$R-QGt-b#UuiAoQAXeXk*PH{~`UkCPF_A zb-UQvYv?>g#^_Pko@xT?wE}K(AQ*vF41B{PM$yWQ|9pPaW=$AYsRp>ht-7Q0Et-2r zq3?y0wz~(zH3RufPTfDMW-eybX-OuTR5o)-CTlk-@9k-Py>a{dvYJ|(rP~9oZr3XT z=u@%9ehrSAg-M2~#}exR4OocR&?>?#*G@SgoI?9#_aMncyc#<}QJVBNoax z2I+9EW5mkXAOagK36rsd*rcj3N9>Z7IL2*lcHP60s;K5ma2(Qo=dqsDMzKjnRu=@) z3ntw>naWL*eNgkBn&6hrMzy!FT8qeRSmk?I%`KRU!Il+o=&HEl3tzLmq{HY&e&7Y1 zhbh2Ze*$omJH`+4^m<*mdJ2^1n{(!2G_rBbl;G*nx^RQUCwN2U<|I>vgYa(-X2aof zWrR+#ge;7=X2k{1_c|p zz^%kuOR+93*0mhlty!a2#o4M~{h=9|zE$$aG=FTaW7*$Y^lh6#Na9CnX*nARkjB@w#8xE?Lg0acqF;FGM-0e;Cw0^{~JhwdIqDH9b9@I9OhR|}wS zV_kskCpVDr)qz)i4Zc4BzHc+5h4u7Z*!ch^*-gE5;lTfb%;a-O2x#mvXskl6Nu)6O z0u#l*i+lyJg`ea$==Az6HCK}IN8D6F%7hk6EXUp*`L9^{8d3(4lu7o2Wijst%+Zlj zl+1WePAAno*@+talp>R)0^&4#S#;ZECM$!SlL=lQWFBDw0r{p|*k7$w(E0KmG$J4) zl;Z%EufnPyh^_f|6^^X>@TKtWC>&n(HqWOuZ)f4qt2|$IHO#5^T9!W2Tt^BA;I;gl z_4b#n$AkLY0=k<(mdP=aqCL?Q2Uwl#HO_;bRl*(!mNZL_y>~|Ausg-NXEL9j%E~?D zA?(0QQIYOHi8}ZJuZ^#teY+G+XyHVe1EIW21kFS#(xpYZ${Yw~zk@%?&rFo6JGAPK XGKW$*;z8YTDb%io+MjbMvGe`{{E9t> delta 1728 zcmcIlOKcNY6rCCWZER1R@n>B5Q;d=r60>L>wX_k6A^}B?6?x)r63KNu6L*X=4sRxi zq>GqETU1J$=&2tSHkDYIO-qzjcVUkzPpxW_5n|s(g(yN@w)c%22oZ=)xss3H{k-$u z^_;oBbNLjD{o|+A?Nb9YG+n{hLKDt; zs73Sm*HDt4#}C7^cyjO;N1YJhfmjT8yb%V{C%GYKja1g~95+JO@I%ize2?3qFXHRr z38z9*3hsuJv;rh8TEbhl_wkL0;{60tO_E;0-5^Id@Lks+f0+ab$Yf!q!&V4*&*B@= zE&39kjwR`v_)$ED)2S3wis0!~!f|BY+h2|QW7JVfu*WIEk!N5p*&Yy_aS8Ay4k9%d8qp)xJd@6sjLe#x_Mfyu*mVkHm0nU0SrOqm(!N2uyFMa@}{%qn;R zFC*Aq!fSt?cU`fSZBKcjt+K5|nmc62s5*7qQOwe&XGN8esvzZ$%0FeXnuJVu3yBh{EUcRAjzt;hO#cia znXGB@C0ScFz0X)~+fBPFH5W}Au$Z1^RRwm!>a~{E;VSvj(_kn93o}%gv`Vd|0QHh2 zR>Z0%nL}l`w?OVKNJy?WeBk*!cT!fT?S}V_qo`2h0TJ&4eQ+SolKV-?sDS> zcUtF8?>Ktg8G|e6T%pGmuX-N%xcmH&!RK^7XYhHQ&+lZre7?&U48E-MCZzB2kVCmX_7f?O6^Gx!4O_iX^v zT@^*>Y+=8&+Y{i9lIVJYoFU=GaXT9-)eub8%`VH@!!JZz3@Bj;`83$cE<6>BMRUz zx6{ErVF4_y7qcwRWvZ;zi}hDw9ef%8lu3AR!Kq{ds{Hov86O=9@ih1S2_v4@Vk=23&Mwx!#R{hVGO=u qW@etOc$0~(p<;scbwQPjf-08<)mDUGWHSB0&%w{s$Xz4}R0jatD<)z9 delta 101 zcmey%zKC7@GcPX}0}!PAU6=8Qk%8echyw%MP{wDejq2iz9QtfUThGc|G-i35cIM7|Wx diff --git a/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc index 43fe06ce1b72fc1afb4d426504a39c611849c172..811e60c7d663d2575b75e574ba531a7fac87e09d 100644 GIT binary patch delta 349 zcmX@1^VNXwGcPX}0}veMT%RGrJCRR<@x?^-%Tf{yN({jwQVhYOF-)e+AO#EzMS|&K zn&KP(W%4n8-kibzn@KVXBnl#8K@49Ip#~P3tiWxxd7F>{lVl2r4)d?5bh4}4~VB|t{;Efx@U zixWgnKF=d9$q$l;8l{(>T2cej8380FKj2c3&jay5L^X(ka0W=oPg7_ztLO?Nuy4Tb z1*=vEsRVmR8OXZDVUwGmQks)$S5yn+G6HdN(d1jADPmt3co;3e$N`B7>R&-@uqFU& CFI0m7 delta 176 zcmexra6*UgGcPX}0}!G7H_WO|IH*B2~<-A zB4R-dUl5@N7Md(5V7>XQkUo=qGKdc%azG4(5|EIerr=~n@fEsYW55d4L5jdeC<9ry iIBatBQ%ZAE?TU(kTt*-+PMiE&Jca8k0}rDmSRnw~rYDvF diff --git a/osinaweb/osinacore/api/serializers.py b/osinaweb/osinacore/api/serializers.py index 6c3fcfd5..e76bb5dd 100644 --- a/osinaweb/osinacore/api/serializers.py +++ b/osinaweb/osinacore/api/serializers.py @@ -118,30 +118,71 @@ class UserSerializer(serializers.ModelSerializer): - class UserStorySerializer(serializers.ModelSerializer): project = ProjectSerializer(read_only=True) - added_by = UserSerializer(read_only=True) - milestone = MileStoneSerializer(read_only=True) - confirmed_date = serializers.SerializerMethodField() - completed_date = serializers.SerializerMethodField() + #added_by = UserSerializer(read_only=True) + #milestone = MileStoneSerializer(read_only=True) + #confirmed_date = serializers.SerializerMethodField() + #completed_date = serializers.SerializerMethodField() class Meta: model = UserStory fields = "__all__" - def get_confirmed_date(self, obj): - last_task = Task.objects.filter(userstory=obj).order_by("-id").first() - if last_task: - last_point = PointActivity.objects.filter(point__task=last_task).order_by("-start_time").first() - if last_point: # or "Confirmed" if that's your label - return last_point.start_time - return None - - def get_completed_date(self, obj): - last_task = Task.objects.filter(userstory=obj).order_by("-id").first() - if last_task: - last_point = PointActivity.objects.filter(point__task=last_task).order_by("-start_time").first() - if last_point: # completed means Closed - return last_point.end_time or last_point.start_time - return None \ No newline at end of file + #def get_confirmed_date(self, obj): + #last_task = Task.objects.filter(userstory=obj).order_by("-id").first() + #if last_task: + #last_point = PointActivity.objects.filter(point__task=last_task).order_by("-start_time").first() + #if last_point: # or "Confirmed" if that's your label + #return last_point.start_time + #return None + + #def get_completed_date(self, obj): + #last_task = Task.objects.filter(userstory=obj).order_by("-id").first() + #if last_task: + #last_point = PointActivity.objects.filter(point__task=last_task).order_by("-start_time").first() + #if last_point: # completed means Closed + #return last_point.end_time or last_point.start_time + #return None + + +class PointActivitySerializer(serializers.ModelSerializer): + + + class Meta: + model = PointActivity + fields = "__all__" + + + +class PointSerializer(serializers.ModelSerializer): + activities = PointActivitySerializer(read_only=True, many=True, source="pointactivity_set") + duration = serializers.SerializerMethodField() + + + class Meta: + model = Point + fields = "__all__" + + def get_duration(self, obj): + hours, minutes, seconds = obj.total_activity_time() + return f"{str(hours).zfill(2)}:{str(minutes).zfill(2)}:{str(seconds).zfill(2)}" + + + +class TaskSerializer(serializers.ModelSerializer): + project = ProjectSerializer(read_only=True) + assigned_to = StaffProfileSerializer(read_only=True) + user_story = UserSerializer(read_only=True) + milestone = MileStoneSerializer(read_only=True) + duration = serializers.SerializerMethodField() + points = PointSerializer(read_only=True, many=True, source="point_set") + + class Meta: + model = Task + fields = "__all__" + + + def get_duration(self, obj): + hours, minutes, seconds = obj.total_task_time() + return f"{str(hours).zfill(2)}:{str(minutes).zfill(2)}:{str(seconds).zfill(2)}" \ No newline at end of file diff --git a/osinaweb/osinacore/api/urls.py b/osinaweb/osinacore/api/urls.py index ebec75d2..acadd220 100644 --- a/osinaweb/osinacore/api/urls.py +++ b/osinaweb/osinacore/api/urls.py @@ -9,4 +9,5 @@ urlpatterns = [ path("epics/", EpicsAPIView.as_view(), name="epics"), path("milestones/", MileStoneAPIView.as_view(), name="milestones"), path("userstories/", UserStoryAPIView.as_view(), name="userstories"), + path("tasks/", TaskAPIView.as_view(), name="tasks"), ] \ No newline at end of file diff --git a/osinaweb/osinacore/api/views.py b/osinaweb/osinacore/api/views.py index 45855e4d..30fd5bc9 100644 --- a/osinaweb/osinacore/api/views.py +++ b/osinaweb/osinacore/api/views.py @@ -117,4 +117,19 @@ class UserStoryAPIView(APIView): data.append(user_story_data) + return Response(data, status=status.HTTP_200_OK) + + +class TaskAPIView(APIView): + def get(self, request): + data = [] + + tasks = Task.objects.all() + + for task in tasks: + task_data = TaskSerializer(task).data + + + data.append(task_data) + return Response(data, status=status.HTTP_200_OK) \ No newline at end of file