From 49009449fb3baa386681b3fe87f565c5fb918a31 Mon Sep 17 00:00:00 2001 From: Salim Elliye Date: Wed, 27 Aug 2025 15:47:56 +0300 Subject: [PATCH] new --- .../__pycache__/serializers.cpython-313.pyc | Bin 6173 -> 8424 bytes .../api/__pycache__/urls.cpython-313.pyc | Bin 821 -> 930 bytes .../api/__pycache__/views.cpython-313.pyc | Bin 5022 -> 5704 bytes osinaweb/osinacore/api/serializers.py | 36 ++++++++++++++++++ osinaweb/osinacore/api/urls.py | 1 + osinaweb/osinacore/api/views.py | 15 ++++++++ 6 files changed, 52 insertions(+) diff --git a/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc index dadc174f304b53125802ffd040f090e3a951af9d..3113d317d13eb13107d07e02e0b50534cf635092 100644 GIT binary patch delta 2347 zcmbtWUu;uV7{90O?ccR4>%HslCT#qXQ5*%Loi4M&9AG5dLUt)JVWyP!uH3C_*|`^l z@z5C~pdzxI_$NjZh%fMBBs>{kc<{x<#9sGMxFI~d2P49W(P;4d&bnC#M8uQa-~G<_ zef|EN`#b0K{FWd4LU)5fzX0RZpI;nm2+xFC$hj+>Nr$^dSR<%U&D@TOD_aFsnYqv| zhVrXo?N<*uiXNtm(W^iCZWHn{yA^oLorC~1$?^?7B*`u|+$TG)UJR@>jSCK(*RoMODX2u%7Bd@Uo;iQs6Gr~(Ks0cDwao_L5b0p2aT9I^* zpmK!$v0@b&;ihi6mzA1Y$aY4=7uh#WIe#8p(&*O9CW8?ux!D1~cs;V-okeYyy%X6$ zvP(7m9yx(+u`^PfOtP<~_$x;&0`m{{(mz z;GsvbYcj_A{1N3CDiCxOxS2P0tX4qWL!Sf7+$4nQjnd~)HqbSIfXRnw4@P1?heSV` zxwW^puqy+T=yw!B#*pMQ))$Dd-Lk(t;)YM@P@O%5dPclUvTwvc+zkH9#u_0})6j;0 z^$2pBxPT#I!m;o(8dBY@0&P@1fML~3n^xp~F+X3(xhe43OL3{7N33}6O@R6yjl~|z zXy(=<=)xB(3R1R~2Sh<|!Q+JIZU+&B4~6}x<72qqYf&fGgt}LXsHBGsd+Jm*v8*~0 z5ERF-Z{b~!i;Glrq#PS+h76E^;#o&!zba7izk>9mQpigNu zo`1maZ3ti-2ACFZN-ZA`%nVeePD|?ia&1NGtVrEeX`3Z&yC%*`yQlXjmq`t>T0yh zigs1PUDq2UoTU#Z=&t`tQ2hQl9?j4vAn1X|C+K2+EaBk{1>A!mn{?Kzm&cTMpKrXL}E%B}@k z%1f6d9_>|9NjTPBut8BN*EdzkXrC))^1Y$%UMfllgd`vAKW*#V3Chk=QK6XU53rKiQMtkj)1q>NB~4 zUyjiSsMKTfbN(}o;gh!r*h+?gq(Fonh!F%LM8QH}bwPr=7~>}M3fZzng9M`|2MEbA zMo%sj4VipcNP^LRGNXXaWC`IEku;!mJV=QZhya@)K3S1Vo(ZUDqp%uV5=b~{@?BvK z#w4)Gej?RC4~b8HAfm@uFqvP}Ry7x-1VkhQaWM~&Xk+-!!o)27g#k!F%*+K^ozIvu z`Jw14`3j(l93U<#1`!Y|K`f9?zoN{^hMdBZr62(ikqKgCg9xy~(#e|g5%S;=1cwbc n6u@2tI~44c(#Z?tWx4BsdKiJY_$$NY6Y`(9zA~^fLL37C8L?xU diff --git a/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc index 897e60bb67eafb707ac8d9afe8d21801d2ab8803..d2c4763173ac905c970e36fd5435fbfa832521a7 100644 GIT binary patch delta 178 zcmdnWwuoKhGcPX}0}!PAU6=8Qk%8echyw%MP{wB|#)%qlIAR!;7=rm@I491N3uE2n7N$}zaiAKYUWVev$;`~PJRi8(_?a5Hi$sA!0FUdnoN)0XL69yXAaP3=E;#uX zpQ$o;DNt`QP;X{x@hwgmr}7p*h#3!(sGO|GFP$g?*9NsiFFmy+7ieH{1dwQ8xWO;j z!SX~*{<@g@MKSg3V%itQv@eV4c5pwIRO#@%BWJil^Rk@Hbveh2a*iGTAJ`ap1^c}_ zy=U-WkwHjbG>ToG#AnO)~O>TZl lX-=wLQ4x^K2*kx{lWl|}#J(`_Fj{_*0}>O;zk=9c^8h`CYcc=; delta 95 zcmX@1Gf$oGGcPX}0}#CZxh`WN*F-)E#yu0&_p+o5X$o)r*C@#BrztR*RdlVgI#5lK o8i-H^61O;Pa`RJ4b5iY!GJsr0ATExYd`mQf>nj5fqa|1&04iu11poj5 diff --git a/osinaweb/osinacore/api/serializers.py b/osinaweb/osinacore/api/serializers.py index ca2d3dbd..badc099e 100644 --- a/osinaweb/osinacore/api/serializers.py +++ b/osinaweb/osinacore/api/serializers.py @@ -109,3 +109,39 @@ class MileStoneSerializer(serializers.ModelSerializer): model = Milestone fields = "__all__" + +class UserSerializer(serializers.ModelSerializer): + + class Meta: + model = User + fields = "__all__" + + + + +class UserStorySerializer(serializers.ModelSerializer): + project = ProjectSerializer(read_only=True) + user = 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 diff --git a/osinaweb/osinacore/api/urls.py b/osinaweb/osinacore/api/urls.py index d4740fe6..ebec75d2 100644 --- a/osinaweb/osinacore/api/urls.py +++ b/osinaweb/osinacore/api/urls.py @@ -8,4 +8,5 @@ urlpatterns = [ path("projects/", ProjectsAPIView.as_view(), name="projects"), path("epics/", EpicsAPIView.as_view(), name="epics"), path("milestones/", MileStoneAPIView.as_view(), name="milestones"), + path("userstories/", UserStoryAPIView.as_view(), name="userstories"), ] \ No newline at end of file diff --git a/osinaweb/osinacore/api/views.py b/osinaweb/osinacore/api/views.py index d9c6728e..45855e4d 100644 --- a/osinaweb/osinacore/api/views.py +++ b/osinaweb/osinacore/api/views.py @@ -102,4 +102,19 @@ class MileStoneAPIView(APIView): data.append(milestone_data) + return Response(data, status=status.HTTP_200_OK) + + +class UserStoryAPIView(APIView): + def get(self, request): + data = [] + + userstories = UserStory.objects.all() + + for userstory in userstories: + user_story_data = UserStorySerializer(userstory).data + + + data.append(user_story_data) + return Response(data, status=status.HTTP_200_OK) \ No newline at end of file