diff --git a/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc index dadc174f..3113d317 100644 Binary files a/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc and b/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc differ diff --git a/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc index 897e60bb..d2c47631 100644 Binary files a/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc and b/osinaweb/osinacore/api/__pycache__/urls.cpython-313.pyc differ diff --git a/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc index 203a6d3b..43fe06ce 100644 Binary files a/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc and b/osinaweb/osinacore/api/__pycache__/views.cpython-313.pyc differ 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