diff --git a/osinaweb/osinacore/__pycache__/models.cpython-313.pyc b/osinaweb/osinacore/__pycache__/models.cpython-313.pyc index 59f1929c..2842d342 100644 Binary files a/osinaweb/osinacore/__pycache__/models.cpython-313.pyc and b/osinaweb/osinacore/__pycache__/models.cpython-313.pyc differ diff --git a/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc b/osinaweb/osinacore/api/__pycache__/serializers.cpython-313.pyc index 810a0826..980664a1 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 d2c47631..5fb250af 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 43fe06ce..811e60c7 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 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