Exemple #1
0
    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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
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
                    },
                },
            }
Exemple #6
0
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)