import django from django.core.exceptions import ValidationError as DjangoValidationError from datetime import timezone from rest_framework import serializers from rest_framework.serializers import ValidationError from base.models import Company, Department, EmployeeShift, EmployeeShiftDay, EmployeeShiftSchedule, JobPosition, JobRole, RotatingShift, RotatingShiftAssign, RotatingWorkType, RotatingWorkTypeAssign, ShiftRequest, WorkType, WorkTypeRequest from employee.models import Actiontype from employee.models import Employee from django.http import QueryDict class CompanySerializer(serializers.ModelSerializer): class Meta: model = Company fields = "__all__" class JobPositionSerializer(serializers.ModelSerializer): class Meta: model = JobPosition fields = "__all__" class JobRoleSerializer(serializers.ModelSerializer): class Meta: model = JobRole fields = "__all__" class DepartmentSerializer(serializers.ModelSerializer): class Meta: model = Department fields = "__all__" def create(self, validated_data): comapny_id = validated_data.pop('company_id', []) obj = Department(**validated_data) obj.save() obj.company_id.set(comapny_id) return obj class WorkTypeSerializer(serializers.ModelSerializer): class Meta: model = WorkType fields = '__all__' def validate(self, attrs): # Create an instance of the model with the provided data instance = WorkType(**attrs) # Call the model's clean method for validation try: instance.clean() except DjangoValidationError as e: # Raise DRF's ValidationError with the same message raise serializers.ValidationError(e) return attrs def create(self, validated_data): return super().create(validated_data) def update(self, instance, validated_data): for attr, value in validated_data.items(): setattr(instance, attr, value) instance.clean() # Call clean method before saving the instance instance.save() return instance class RotatingWorkTypeSerializer(serializers.ModelSerializer): class Meta: model = RotatingWorkType fields = '__all__' def validate(self, attrs): # Create an instance of the model with the provided data instance = RotatingWorkType(**attrs) # Call the model's clean method for validation try: instance.clean() except DjangoValidationError as e: # Raise DRF's ValidationError with the same message raise serializers.ValidationError(e) return attrs def create(self, validated_data): return super().create(validated_data) def update(self, instance, validated_data): for attr, value in validated_data.items(): setattr(instance, attr, value) instance.clean() # Call clean method before saving the instance instance.save() return instance class RotatingWorkTypeAssignSerializer(serializers.ModelSerializer): rotating_work_type_name = serializers.SerializerMethodField(read_only=True) current_work_type_name = serializers.SerializerMethodField(read_only=True) next_work_type_name = serializers.SerializerMethodField(read_only=True) class Meta: model = RotatingWorkTypeAssign fields = '__all__' def get_current_work_type_name(self, instance): current_work_type = instance.current_work_type if current_work_type: return current_work_type.work_type else: return None # Return null if previous_work_type_id doesn't exist def get_next_work_type_name(self, instance): next_work_type = instance.next_work_type if next_work_type: return next_work_type.work_type else: return None # Return null if previous_work_type_id doesn't exist def get_rotating_work_type_name(self, instance): rotating_work_type_id = instance.rotating_work_type_id if rotating_work_type_id: return rotating_work_type_id.name else: return None # Return null if previous_work_type_id doesn't exist def validate(self, attrs): if self.instance: return attrs # Create an instance of the model with the provided data instance = RotatingWorkTypeAssign(**attrs) # Call the model's clean method for validation try: instance.clean() except DjangoValidationError as e: # Raise DRF's ValidationError with the same message raise serializers.ValidationError(e) return attrs def create(self, validated_data): return super().create(validated_data) def update(self, instance, validated_data): for attr, value in validated_data.items(): setattr(instance, attr, value) instance.save() return instance class EmployeeShiftDaySerializer(serializers.ModelSerializer): class Meta: model = EmployeeShiftDay fields = '__all__' class EmployeeShiftSerializer(serializers.ModelSerializer): class Meta: model = EmployeeShift fields = '__all__' def validate(self, attrs): # Create an instance of the model with the provided data instance = EmployeeShift(**attrs) # Call the model's clean method for validation try: instance.clean() except DjangoValidationError as e: # Raise DRF's ValidationError with the same message raise serializers.ValidationError(e) return attrs def create(self, validated_data): return super().create(validated_data) def update(self, instance, validated_data): for attr, value in validated_data.items(): setattr(instance, attr, value) instance.clean() # Call clean method before saving the instance instance.save() return instance class EmployeeShiftScheduleSerializer(serializers.ModelSerializer): class Meta: model = EmployeeShiftSchedule fields = '__all__' class RotatingShiftSerializer(serializers.ModelSerializer): class Meta: model = RotatingShift fields = '__all__' def validate(self, attrs): # Create an instance of the model with the provided data instance = RotatingShift(**attrs) # Call the model's clean method for validation try: instance.clean() except DjangoValidationError as e: # Raise DRF's ValidationError with the same message raise serializers.ValidationError(e) return attrs def create(self, validated_data): return super().create(validated_data) def update(self, instance, validated_data): for attr, value in validated_data.items(): setattr(instance, attr, value) instance.clean() # Call clean method before saving the instance instance.save() return instance class RotatingShiftAssignSerializer(serializers.ModelSerializer): current_shift_name = serializers.SerializerMethodField(read_only=True) next_shift_name = serializers.SerializerMethodField(read_only=True) rotating_shift_name = serializers.SerializerMethodField(read_only=True) rotate = serializers.CharField(read_only=True) class Meta: model = RotatingShiftAssign fields = '__all__' def validate(self, attrs): # Create an instance of the model with the provided data instance = RotatingShiftAssign(**attrs) # Call the model's clean method for validation try: instance.clean() except DjangoValidationError as e: # Raise DRF's ValidationError with the same message raise serializers.ValidationError(e) return attrs def create(self, validated_data): return super().create(validated_data) def to_representation(self, instance): representation = super().to_representation(instance) if instance.based_on == 'after': representation['rotate'] = f"Rotate after {instance.rotate_after_day} days" elif instance.based_on == 'weekly': representation['rotate'] = f"Weekly every {instance.rotate_every_weekend}" elif instance.based_on == 'monthly': if instance.rotate_every == '1': representation['rotate'] = f"Rotate every {instance.rotate_every}st day of month" elif instance.rotate_every == '2': representation['rotate'] = f"Rotate every {instance.rotate_every}nd day of month" elif instance.rotate_every == '3': representation['rotate'] = f"Rotate every {instance.rotate_every}rd day of month" elif instance.rotate_every == 'last': representation['rotate'] = "Rotate every last day of month" else: representation['rotate'] = f"Rotate every {instance.rotate_every}th day of month" return representation def get_rotating_shift_name(self, instance): rotating_shift_id = instance.rotating_shift_id if rotating_shift_id: return rotating_shift_id.name else: return None # Return null if previous_work_type_id doesn't exist def get_next_shift_name(self, instance): next_shift = instance.next_shift if next_shift: return next_shift.employee_shift else: return None # Return null if previous_work_type_id doesn't exist def get_current_shift_name(self, instance): current_shift = instance.current_shift if current_shift: return current_shift.employee_shift else: return None # Return null if previous_work_type_id doesn't exist def update(self, instance, validated_data): for attr, value in validated_data.items(): setattr(instance, attr, value) instance.clean() # Call clean method before saving the instance instance.save() return instance class WorkTypeRequestSerializer(serializers.ModelSerializer): employee_first_name = serializers.CharField( source='employee_id.employee_first_name', read_only=True) employee_last_name = serializers.CharField( source='employee_id.employee_last_name', read_only=True) work_type_name = serializers.CharField( source='work_type_id.work_type', read_only=True) previous_work_type_name = serializers.SerializerMethodField(read_only=True) class Meta: model = WorkTypeRequest fields = '__all__' def validate(self, attrs): # Create an instance of the model with the provided data instance = WorkTypeRequest(**attrs) # Call the model's clean method for validation try: instance.clean() except DjangoValidationError as e: # Raise DRF's ValidationError with the same message raise serializers.ValidationError(e) return attrs def create(self, validated_data): return super().create(validated_data) def get_previous_work_type_name(self, instance): previous_work_type = instance.previous_work_type_id if previous_work_type: return previous_work_type.work_type else: return None # Return null if previous_work_type_id doesn't exist def update(self, instance, validated_data): for attr, value in validated_data.items(): setattr(instance, attr, value) instance.clean() # Call clean method before saving the instance instance.save() return instance class ShiftRequestSerializer(serializers.ModelSerializer): employee_first_name = serializers.CharField( source='employee_id.employee_first_name', read_only=True) employee_last_name = serializers.CharField( source='employee_id.employee_last_name', read_only=True) shift_name = serializers.SerializerMethodField(read_only=True) previous_shift_name = serializers.SerializerMethodField(read_only=True) def get_previous_shift_name(self, instance): previous_shift_id = instance.previous_shift_id if previous_shift_id: return previous_shift_id.employee_shift else: return None # Re def get_shift_name(self, instance): shift_id = instance.shift_id if shift_id: return shift_id.employee_shift else: return None # Re def validate(self, attrs): # Create an instance of the model with the provided data instance = ShiftRequest(**attrs) # Call the model's clean method for validation try: instance.clean() except DjangoValidationError as e: # Raise DRF's ValidationError with the same message raise serializers.ValidationError(e) return attrs def create(self, validated_data): return super().create(validated_data) def update(self, instance, validated_data): for attr, value in validated_data.items(): setattr(instance, attr, value) instance.clean() # Call clean method before saving the instance instance.save() return instance class Meta: model = ShiftRequest fields = '__all__' class ActiontypeSerializer(serializers.ModelSerializer): class Meta: model = Actiontype fields = ['id', 'title', 'action_type']