# serializers.py in Osina app from rest_framework import serializers from osinacore.models import * class BusinessTypeSerializer(serializers.ModelSerializer): class Meta: model = BusinessType fields = "__all__" class StaffProfileSerializer(serializers.ModelSerializer): class Meta: model = StaffProfile fields = "__all__" class DepartmentSerializer(serializers.ModelSerializer): class Meta: model = Department fields = "__all__" class JobPositionSerializer(serializers.ModelSerializer): department = DepartmentSerializer() class Meta: model = JobPosition fields = "__all__" class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = "__all__" class CustomerProfileSerializer(serializers.ModelSerializer): user = UserSerializer() reference_name = serializers.CharField(source='reference.name', read_only=True) class Meta: model = CustomerProfile fields = "__all__" class StaffProfileSerializer(serializers.ModelSerializer): user = UserSerializer() class Meta: model = StaffProfile fields = "__all__" class ProjectTypeSerializer(serializers.ModelSerializer): class Meta: model = ProjectType fields = "__all__" class ProjectStatusSerializer(serializers.ModelSerializer): class Meta: model = ProjectStatus fields = "__all__" class ProjectSerializer(serializers.ModelSerializer): #types = ProjectTypeSerializer(read_only=True, many=True, source="project_type") #members = StaffProfileSerializer(read_only=True, many=True) #manager = StaffProfileSerializer(read_only=True, many=False) #statuses = ProjectStatusSerializer(read_only=True, many=True, source="projectstatus_set") class Meta: model = Project fields = "__all__" #def to_representation(self, instance): #representation = super().to_representation(instance) # Exclude manager from members list #manager_id = representation.get("manager", {}).get("id") #if manager_id: #representation["members"] = [ #member for member in representation["members"] #if member.get("id") != manager_id #] #return representation class EpicSerializer(serializers.ModelSerializer): #project = ProjectSerializer(read_only=True) class Meta: model = Epic fields = "__all__" class MileStoneSerializer(serializers.ModelSerializer): #project = ProjectSerializer(read_only=True) class Meta: model = Milestone fields = "__all__" class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = "__all__" class UserStorySerializer(serializers.ModelSerializer): #added_by = UserSerializer(read_only=True) #milestone = MileStoneSerializer(read_only=True) #confirmed_date = serializers.SerializerMethodField() #project = ProjectSerializer(read_only=True) #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 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) epic = EpicSerializer(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)}" class DailyReportSerializer(serializers.ModelSerializer): staff = StaffProfileSerializer(read_only=True) date = serializers.SerializerMethodField() total_time = serializers.SerializerMethodField() class Meta: model = DailyReport fields = "__all__" def get_date(self, obj): try: # Combine the date and time strings into one datetime object return datetime.strptime(f"{obj.date} {obj.time}", "%Y-%m-%d %I:%M %p") except Exception: return None def get_total_time(self, obj): try: # Parse report.date string into date object report_date = datetime.strptime(obj.date, "%Y-%m-%d").date() total_time = PointActivity.objects.filter( point__task__assigned_to=obj.staff, start_time__date=report_date ).aggregate(Sum('total_time'))['total_time__sum'] or timedelta() # Convert to H:M:S string total_seconds = int(total_time.total_seconds()) hours = total_seconds // 3600 minutes = (total_seconds % 3600) // 60 seconds = total_seconds % 60 return f"{hours:02d}:{minutes:02d}:{seconds:02d}" except Exception: return None class StatusSerializer(serializers.ModelSerializer): staff = StaffProfileSerializer(read_only=True) class Meta: model = Status fields = "__all__"