Skip to content

Commit

Permalink
Merge pull request #961 from uktrade/LTD-1433-certificates-section
Browse files Browse the repository at this point in the history
Add field for is covered by firearm act unsure explanation
  • Loading branch information
kevincarrogan authored Apr 4, 2022
2 parents 1d8799b + a1b2001 commit 8c34a43
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 11 deletions.
9 changes: 2 additions & 7 deletions api/applications/views/goods.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,15 @@
application_in_state,
)
from api.core.exceptions import BadRequestError
from api.core.helpers import str_to_bool
from api.flags.enums import SystemFlags
from api.goods.enums import GoodStatus
from api.goods.helpers import FIREARMS_CORE_TYPES, has_valid_certificate
from api.goods.helpers import FIREARMS_CORE_TYPES, get_rfd_status
from api.goods.libraries.get_goods import get_good_with_organisation
from api.goods.serializers import FirearmDetailsSerializer
from api.goodstype.helpers import get_goods_type, delete_goods_type_document_if_exists
from api.goodstype.models import GoodsType
from api.goodstype.serializers import GoodsTypeSerializer, GoodsTypeViewSerializer
from lite_content.lite_api import strings
from api.organisations.models import OrganisationDocumentType
from api.organisations.libraries.get_organisation import get_request_user_organisation_id
from api.staticdata.countries.models import Country
from api.staticdata.statuses.enums import CaseStatusEnum
Expand Down Expand Up @@ -104,11 +102,8 @@ def post(self, request, pk):
good = get_good_with_organisation(data.get("good"), get_request_user_organisation_id(request))

if data.get("firearm_details") and good.firearm_details.type in FIREARMS_CORE_TYPES:
is_rfd = str_to_bool(data.get("is_registered_firearm_dealer")) is True
rfd_status = get_rfd_status(data, good.organisation_id)

rfd_status = is_rfd or has_valid_certificate(
good.organisation_id, OrganisationDocumentType.REGISTERED_FIREARM_DEALER_CERTIFICATE
)
data["firearm_details"]["rfd_status"] = rfd_status

# If the user is a registered firearms dealer and has a valid certificate then it
Expand Down
19 changes: 19 additions & 0 deletions api/goods/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from rest_framework import serializers

from api.core.exceptions import BadRequestError
from api.core.helpers import str_to_bool
from api.organisations.models import DocumentOnOrganisation
from api.organisations.enums import OrganisationDocumentType
from lite_content.lite_api import strings
Expand Down Expand Up @@ -110,3 +111,21 @@ def update_firearms_certificate_data(organisation_id, firearm_data):
del firearm_data["section_certificate_number"]

return firearm_data


def get_rfd_status(data, organisation_id):
is_rfd = str_to_bool(data.get("is_registered_firearm_dealer")) is True
is_certificate_valid = has_valid_certificate(
organisation_id, OrganisationDocumentType.REGISTERED_FIREARM_DEALER_CERTIFICATE
)
if data["firearm_details"].get("is_rfd_certificate_valid") is not None:
if not data["firearm_details"]["is_rfd_certificate_valid"]:
# We can disgregard whetherh there is already valid certificate because the user has
# explicitly stated it's no longer valid
is_certificate_valid = False
elif not is_certificate_valid:
# If there's a case where the user has said it's valid but in fact we think it's not then
# something has gone wrong and we want to bale out
raise BadRequestError({"non_field_errors": "Conflicting certificate validity"})

return is_rfd or is_certificate_valid
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-04-01 10:37

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("goods", "0010_auto_20220328_1348"),
]

operations = [
migrations.AddField(
model_name="firearmgooddetails",
name="is_covered_by_firearm_act_section_one_two_or_five_explanation",
field=models.TextField(blank=True, default=""),
),
]
1 change: 1 addition & 0 deletions api/goods/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ def has_serial_numbers(cls, value):
replica_description = models.TextField(blank=True, default="")
# this refers specifically to section 1, 2 or 5 of firearms act 1968
is_covered_by_firearm_act_section_one_two_or_five = models.TextField(blank=True, default="")
is_covered_by_firearm_act_section_one_two_or_five_explanation = models.TextField(blank=True, default="")
firearms_act_section = models.TextField(blank=True, default="")

section_certificate_missing = models.BooleanField(blank=True, null=True)
Expand Down
12 changes: 12 additions & 0 deletions api/goods/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ class FirearmDetailsSerializer(serializers.ModelSerializer):
replica_description = serializers.CharField(allow_blank=True, required=False)
# this refers specifically to section 1, 2 or 5 of firearms act 1968
is_covered_by_firearm_act_section_one_two_or_five = serializers.CharField(allow_blank=True, required=False)
is_covered_by_firearm_act_section_one_two_or_five_explanation = serializers.CharField(
allow_blank=True, required=False
)
firearms_act_section = serializers.CharField(allow_blank=True, required=False)
section_certificate_missing = serializers.BooleanField(allow_null=True, required=False)
section_certificate_missing_reason = serializers.CharField(allow_blank=True, required=False)
Expand Down Expand Up @@ -112,6 +115,7 @@ class Meta:
"is_replica",
"replica_description",
"is_covered_by_firearm_act_section_one_two_or_five",
"is_covered_by_firearm_act_section_one_two_or_five_explanation",
"firearms_act_section",
"section_certificate_missing",
"section_certificate_missing_reason",
Expand Down Expand Up @@ -154,6 +158,13 @@ def update(self, instance, validated_data):
instance.is_covered_by_firearm_act_section_one_two_or_five,
)
instance.is_covered_by_firearm_act_section_one_two_or_five = is_covered_by_firearms_act
is_covered_by_firearm_act_section_one_two_or_five_explanation = validated_data.get(
"is_covered_by_firearm_act_section_one_two_or_five_explanation",
instance.is_covered_by_firearm_act_section_one_two_or_five_explanation,
)
instance.is_covered_by_firearm_act_section_one_two_or_five_explanation = (
is_covered_by_firearm_act_section_one_two_or_five_explanation
)
instance.firearms_act_section = validated_data.get("firearms_act_section", instance.firearms_act_section)

if is_covered_by_firearms_act == "Yes" and instance.firearms_act_section:
Expand Down Expand Up @@ -215,6 +226,7 @@ def update(self, instance, validated_data):

if instance.type not in FIREARMS_CORE_TYPES:
instance.is_covered_by_firearm_act_section_one_two_or_five = ""
instance.is_covered_by_firearm_act_section_one_two_or_five_explanation = ""
instance.serial_numbers_available = ""
instance.year_of_manufacture = None
instance.calibre = ""
Expand Down
5 changes: 5 additions & 0 deletions api/goods/tests/test_edit.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,10 @@ def test_update_firearm_type_invalidates_notapplicable_fields(self):
good = self.create_good(
"a good", self.organisation, item_category=ItemCategory.GROUP2_FIREARMS, create_firearm_details=True
)
firearm_details = good.firearm_details
firearm_details.is_covered_by_firearm_act_section_one_two_or_five = "Unknown"
firearm_details.is_covered_by_firearm_act_section_one_two_or_five_explanation = "Explanation"
firearm_details.save()

url = reverse("goods:good_details", kwargs={"pk": str(good.id)})
request_data = {"firearm_details": {"type": FirearmGoodType.FIREARMS_ACCESSORY}}
Expand All @@ -326,6 +330,7 @@ def test_update_firearm_type_invalidates_notapplicable_fields(self):
self.assertIsNone(good["firearm_details"]["year_of_manufacture"])
self.assertEqual(good["firearm_details"]["calibre"], "")
self.assertEqual(good["firearm_details"]["is_covered_by_firearm_act_section_one_two_or_five"], "")
self.assertEqual(good["firearm_details"]["is_covered_by_firearm_act_section_one_two_or_five_explanation"], "")
self.assertEqual(good["firearm_details"]["serial_numbers_available"], "")
# 2 due to creating a new good for this test
self.assertEqual(Good.objects.all().count(), 2)
Expand Down
6 changes: 2 additions & 4 deletions api/goods/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from api.goods.helpers import (
FIREARMS_CORE_TYPES,
check_if_firearm_details_edited_on_unsupported_good,
get_rfd_status,
has_valid_certificate,
)
from api.goods.libraries.get_goods import get_good, get_good_document
Expand Down Expand Up @@ -245,10 +246,7 @@ def post(self, request, *args, **kwargs):
# check if the user is registered firearm dealer
if item_category == ItemCategory.GROUP2_FIREARMS:
if data.get("firearm_details") and data["firearm_details"]["type"] in FIREARMS_CORE_TYPES:
is_rfd = str_to_bool(data.get("is_registered_firearm_dealer")) is True
rfd_status = is_rfd or has_valid_certificate(
str(data["organisation"]), OrganisationDocumentType.REGISTERED_FIREARM_DEALER_CERTIFICATE
)
rfd_status = get_rfd_status(data, str(data["organisation"]))

data["firearm_details"]["rfd_status"] = rfd_status

Expand Down

0 comments on commit 8c34a43

Please sign in to comment.