def create(self, validated_data): users = [] if "users" in validated_data: users = validated_data.pop("users") address_data = validated_data.pop("address") address_data["country"] = address_data["country"].id address_serializer = AddressSerializer(data=address_data) if address_serializer.is_valid(raise_exception=True): address = Address(**address_serializer.validated_data) address.save() site = Site.objects.create(address=address, **validated_data) if users: site.users.set([ get_user_organisation_relationship( user, validated_data["organisation"]) for user in users ]) if "site_records_stored_here" in self.initial_data: if str_to_bool(self.initial_data.get("site_records_stored_here")): site.site_records_located_at = site site.save() return site
class ExporterComplianceSiteDetailSerializer(serializers.Serializer): id = serializers.UUIDField() reference_code = serializers.CharField() site_name = serializers.CharField(source="site.name") address = AddressSerializer(source="site.address") visit_date = serializers.SerializerMethodField() exporter_user_notification_count = serializers.SerializerMethodField() is_primary_site = serializers.SerializerMethodField() def get_visit_date(self, instance): # if review date exists get one in the future (nearest) # else determine most recent visit_cases = ComplianceVisitCase.objects.filter( site_case_id=instance.id).order_by("visit_date") if visit_cases.filter(visit_date__gte=timezone.now().date()).exists(): return visit_cases.filter( visit_date__gte=timezone.now().date()).first().visit_date visit_case = visit_cases.last() if visit_case: return visit_case.visit_date return None def get_exporter_user_notification_count(self, instance): return get_exporter_user_notification_individual_count_with_compliance_visit( exporter_user=self.context.get("request").user, organisation_id=self.context.get("organisation").id, case=instance, ) def get_is_primary_site(self, instance): return instance.site.id == self.context.get( "organisation").primary_site_id
class SiteCreateUpdateSerializer(serializers.ModelSerializer): name = serializers.CharField( error_messages={"blank": "Enter a name for your site"}, write_only=True) address = AddressSerializer() organisation = serializers.PrimaryKeyRelatedField( queryset=Organisation.objects.all(), required=False) users = serializers.PrimaryKeyRelatedField( queryset=ExporterUser.objects.all(), many=True, required=False) site_records_located_at = serializers.PrimaryKeyRelatedField( queryset=Site.objects.all(), required=False) class Meta: model = Site fields = ("id", "name", "address", "organisation", "users", "site_records_located_at") @transaction.atomic def create(self, validated_data): users = [] if "users" in validated_data: users = validated_data.pop("users") address_data = validated_data.pop("address") address_data["country"] = address_data["country"].id address_serializer = AddressSerializer(data=address_data) if address_serializer.is_valid(raise_exception=True): address = Address(**address_serializer.validated_data) address.save() site = Site.objects.create(address=address, **validated_data) if users: site.users.set([ get_user_organisation_relationship( user, validated_data["organisation"]) for user in users ]) if "site_records_stored_here" in self.initial_data: if str_to_bool(self.initial_data.get("site_records_stored_here")): site.site_records_located_at = site site.save() return site def update(self, instance, validated_data): instance.name = validated_data.get("name", instance.name) instance.site_records_located_at = validated_data.get( "site_records_located_at", instance.site_records_located_at) instance.save() return instance
class ExporterComplianceSiteListSerializer(serializers.Serializer): id = serializers.UUIDField() reference_code = serializers.CharField() site_name = serializers.CharField(source="site.name") address = AddressSerializer(source="site.address") review_date = serializers.SerializerMethodField() def get_review_date(self, instance): comp_visit_case = (ComplianceVisitCase.objects.filter( site_case_id=instance.id, visit_date__gte=timezone.now().date()).order_by( "visit_date").first()) if comp_visit_case: return comp_visit_case.visit_date return None
class SiteListSerializer(serializers.Serializer): id = serializers.UUIDField() name = serializers.CharField() address = AddressSerializer() records_located_at = serializers.SerializerMethodField() def get_records_located_at(self, instance): if instance.site_records_located_at: site = instance.site_records_located_at return { "id": site.id, "name": site.name, "address": { "address_line_1": site.address.address_line_1, "address_line_2": site.address.address_line_2, "region": site.address.region, "postcode": site.address.postcode, "city": site.address.city, "country": { "name": site.address.country.name }, }, }
class ComplianceSiteViewSerializer(serializers.ModelSerializer): site_name = serializers.CharField(source="site.name") address = AddressSerializer(source="site.address") status = serializers.SerializerMethodField() organisation = PrimaryKeyRelatedSerializerField( queryset=Organisation.objects.all(), serializer=OrganisationDetailSerializer) open_licence_returns = serializers.SerializerMethodField() visits = serializers.SerializerMethodField() team = None class Meta: model = ComplianceSiteCase fields = ( "address", "site_name", "status", "organisation", "visits", "open_licence_returns", ) def __init__(self, *args, **kwargs): super(ComplianceSiteViewSerializer, self).__init__(*args, **kwargs) self.team = self.context.get("team") def get_status(self, instance): if instance.status: return { "key": instance.status.status, "value": get_status_value_from_case_status_enum(instance.status.status), } return None def get_visits(self, instance): visit_cases = (ComplianceVisitCase.objects.select_related( "case_officer", "case_type").prefetch_related("flags").filter( site_case_id=instance.id)) return [{ "id": case.id, "reference_code": case.reference_code, "visit_date": case.visit_date, "case_officer": f"{case.case_officer.first_name} {case.case_officer.last_name}" if case.case_officer and case.case_officer.first_name else case.case_officer.email if case.case_officer and case.case_officer.email else None, "flags": get_ordered_flags(case=case, team=self.team, limit=3), } for case in visit_cases] def get_open_licence_returns(self, instance): queryset = OpenLicenceReturns.objects.filter( organisation_id=instance.organisation_id).order_by( "-year", "-created_at") return OpenLicenceReturnsListSerializer(queryset, many=True).data
class ComplianceVisitSerializer(serializers.ModelSerializer): site_case_reference_code = serializers.CharField( source="site_case.reference_code") site_name = serializers.CharField(source="site_case.site.name") address = AddressSerializer(source="site_case.site.address") status = serializers.SerializerMethodField() organisation = PrimaryKeyRelatedSerializerField( queryset=Organisation.objects.all(), serializer=OrganisationDetailSerializer) overall_risk_value = KeyValueChoiceField( choices=ComplianceRiskValues.choices, allow_blank=True) compliance_risk_value = KeyValueChoiceField( choices=ComplianceRiskValues.choices, error_messages={ "invalid_choice": strings.Compliance.VisitCaseSerializer.RISK_VALUE_INVALID_CHOICE }, ) individuals_risk_value = KeyValueChoiceField( choices=ComplianceRiskValues.choices, error_messages={ "invalid_choice": strings.Compliance.VisitCaseSerializer.RISK_VALUE_INVALID_CHOICE }, ) products_risk_value = KeyValueChoiceField( choices=ComplianceRiskValues.choices, error_messages={ "invalid_choice": strings.Compliance.VisitCaseSerializer.RISK_VALUE_INVALID_CHOICE }, ) visit_type = KeyValueChoiceField(choices=ComplianceVisitTypes.choices, allow_blank=True) licence_risk_value = serializers.IntegerField(min_value=1, max_value=5, allow_null=True) overview = serializers.CharField( max_length=COMPLIANCEVISITCASE_TEXTFIELD_LENGTH) inspection = serializers.CharField( max_length=COMPLIANCEVISITCASE_TEXTFIELD_LENGTH) compliance_overview = serializers.CharField( max_length=COMPLIANCEVISITCASE_TEXTFIELD_LENGTH, error_messages={ "blank": strings.Compliance.VisitCaseSerializer.OVERVIEW_BLANK }, ) individuals_overview = serializers.CharField( max_length=COMPLIANCEVISITCASE_TEXTFIELD_LENGTH, error_messages={ "blank": strings.Compliance.VisitCaseSerializer.OVERVIEW_BLANK }, ) products_overview = serializers.CharField( max_length=COMPLIANCEVISITCASE_TEXTFIELD_LENGTH, error_messages={ "blank": strings.Compliance.VisitCaseSerializer.OVERVIEW_BLANK }, ) people_present = serializers.SerializerMethodField(read_only=True) visit_date = serializers.DateField(allow_null=True) class Meta: model = ComplianceVisitCase fields = ( "id", "site_case_id", "site_case_reference_code", "site_name", "address", "status", "organisation", "site_case", "visit_type", "visit_date", "overall_risk_value", "licence_risk_value", "overview", "inspection", "compliance_overview", "compliance_risk_value", "individuals_overview", "individuals_risk_value", "products_overview", "products_risk_value", "people_present", ) def get_status(self, instance): if instance.status: return { "key": instance.status.status, "value": get_status_value_from_case_status_enum(instance.status.status), } return None def get_people_present(self, instance): people = CompliancePerson.objects.filter(visit_case_id=instance.id) return [{ "id": person.id, "name": person.name, "job_title": person.job_title } for person in people] def __init__(self, instance=None, data=empty, **kwargs): # If an IntegerField receives a blank field, it throws an error. We don't enforce the user to add the # licence_risk_value field till they desire to regardless of form. if data is not empty: if data.get("licence_risk_value") == "": data.pop("licence_risk_value") super(ComplianceVisitSerializer, self).__init__(instance, data, **kwargs)