You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
6.6 KiB
Python
235 lines
6.6 KiB
Python
# 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__" |