Skip to content

Commit

Permalink
Merge pull request #2 from dbca-wa/master
Browse files Browse the repository at this point in the history
dbca-wa/master to djandwich/master
  • Loading branch information
Djandwich authored Feb 12, 2021
2 parents bf48d7f + 2cb5c16 commit 9dcef2d
Show file tree
Hide file tree
Showing 33 changed files with 1,243 additions and 474 deletions.
12 changes: 9 additions & 3 deletions wildlifecompliance/components/applications/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1849,20 +1849,26 @@ def create(self, request, *args, **kwargs):
Application.APPLICATION_TYPE_RENEWAL,
Application.APPLICATION_TYPE_REISSUE,
]:
# Check that at least one active application exists in this licence category for amendment/renewal
# Check that at least one active application exists in this
# licence category for amendment/renewal.
if not latest_active_licence:
raise serializers.ValidationError(
'Cannot create amendment application: active licence not found!')

# Ensure purpose ids are in a shared set with the latest current applications purposes
# to prevent front-end tampering. Remove any that aren't valid for renew/amendment/reissue.
# Ensure purpose ids are in a shared set with the latest
# current applications purposes to prevent front-end
# tampering. Remove any that aren't valid for
# renew/amendment/reissue.
active_current_purposes = active_current_applications.filter(
licence_purposes__licence_activity_id__in=licence_activity_ids
).values_list(
'licence_purposes__id',
flat=True
)

# Set the previous for these application types.
# Although multiple purposes of the same type can exist for
# a licence, only one can be created for selected activity.
previous_application = licence_activities.filter(
id=selected_activity
).values_list(
Expand Down
414 changes: 336 additions & 78 deletions wildlifecompliance/components/applications/models.py

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions wildlifecompliance/components/applications/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,11 @@ def get_can_current_user_edit(self, obj):
Application.PROCESSING_STATUS_AWAITING_APPLICANT_RESPONSE:
# Outstanding amendment request - edit required.
result = True
elif not obj.licence:
result = obj.can_user_edit
elif not obj.licence.has_proposed_purposes_in_current():
# no active purposes ie. licence is expired.
result = False
else:
result = obj.can_user_edit
logger.debug('BaseApplicationSerializer.can_user_edit() - end')
Expand Down
182 changes: 95 additions & 87 deletions wildlifecompliance/components/licences/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -400,26 +400,29 @@ def surrender_licence(self, request, pk=None, *args, **kwargs):
def surrender_purposes(self, request, pk=None, *args, **kwargs):
try:
purpose_ids_list = request.data.get('purpose_ids_list', None)
if not type(purpose_ids_list) == list:
# if not type(purpose_ids_list) == list:
# raise serializers.ValidationError(
# 'Purpose IDs must be a list')
if not request.user.has_perm('wildlifecompliance.issuing_officer'):
raise serializers.ValidationError(
'Purpose IDs must be a list')
if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
values_list('licence_activity_id',flat=True).\
distinct().count() != 1:
'You are not authorised to surrender licenced activities')
# if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
# values_list('licence_activity_id',flat=True).\
# distinct().count() != 1:
# raise serializers.ValidationError(
# 'Selected purposes must all be of the same licence activity')

if not purpose_ids_list and pk:
raise serializers.ValidationError(
'Selected purposes must all be of the same licence activity')
'Licence ID and Purpose IDs list must be specified')

if purpose_ids_list and pk:
instance = self.get_object()
LicenceService.request_surrender_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request}
)
instance = self.get_object()
LicenceService.request_surrender_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request})

return Response(serializer.data)

return Response(serializer.data)
else:
raise serializers.ValidationError(
'Licence ID and Purpose IDs list must be specified')
except serializers.ValidationError:
print(traceback.print_exc())
raise
Expand Down Expand Up @@ -461,29 +464,29 @@ def cancel_licence(self, request, pk=None, *args, **kwargs):
def cancel_purposes(self, request, pk=None, *args, **kwargs):
try:
purpose_ids_list = request.data.get('purpose_ids_list', None)
if not type(purpose_ids_list) == list:
raise serializers.ValidationError(
'Purpose IDs must be a list')
# if not type(purpose_ids_list) == list:
# raise serializers.ValidationError(
# 'Purpose IDs must be a list')
if not request.user.has_perm('wildlifecompliance.issuing_officer'):
raise serializers.ValidationError(
'You are not authorised to cancel licenced activities')
if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
values_list('licence_activity_id',flat=True).\
distinct().count() != 1:
raise serializers.ValidationError(
'Selected purposes must all be of the same licence activity')
# if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
# values_list('licence_activity_id',flat=True).\
# distinct().count() != 1:
# raise serializers.ValidationError(
# 'Selected purposes must all be of the same licence activity')

if purpose_ids_list and pk:
instance = self.get_object()
LicenceService.request_cancel_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request}
)

return Response(serializer.data)
else:
if not purpose_ids_list and pk:
raise serializers.ValidationError(
'Licence ID and Purpose IDs list must be specified')

instance = self.get_object()
LicenceService.request_cancel_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request})

return Response(serializer.data)

except serializers.ValidationError:
print(traceback.print_exc())
raise
Expand Down Expand Up @@ -527,31 +530,31 @@ def suspend_purposes(self, request, pk=None, *args, **kwargs):
Request to suspend purposes.
'''
MSG_NOAUTH = 'You are not authorised to suspend licenced activities'
MSG_NOSAME = 'Purposes must all be of the same licence activity'
# MSG_NOSAME = 'Purposes must all be of the same licence activity'
try:
purpose_ids_list = request.data.get('purpose_ids_list', None)
if not type(purpose_ids_list) == list:
raise serializers.ValidationError('Purpose IDs must be a list')
# if not type(purpose_ids_list) == list:
# raise serializers.ValidationError('Purpose IDs must be a list')

if not request.user.has_perm('wildlifecompliance.issuing_officer'):
raise serializers.ValidationError(MSG_NOAUTH)

if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
values_list('licence_activity_id', flat=True).\
distinct().count() != 1:
raise serializers.ValidationError(MSG_NOSAME)
# if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
# values_list('licence_activity_id', flat=True).\
# distinct().count() != 1:
# raise serializers.ValidationError(MSG_NOSAME)

if purpose_ids_list and pk:
instance = self.get_object()
LicenceService.request_suspend_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request}
)

return Response(serializer.data)
else:
if not purpose_ids_list and pk:
raise serializers.ValidationError(
'Licence ID and Purpose IDs list must be specified')

instance = self.get_object()
LicenceService.request_suspend_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request})

return Response(serializer.data)

except serializers.ValidationError:
print(traceback.print_exc())
raise
Expand Down Expand Up @@ -592,31 +595,31 @@ def reinstate_licence(self, request, pk=None, *args, **kwargs):
@detail_route(methods=['POST', ])
def reinstate_purposes(self, request, pk=None, *args, **kwargs):
MSG_NOAUTH = 'You are not authorised to reinstate licenced activities'
MSG_NOSAME = 'Purposes must all be of the same licence activity'
# MSG_NOSAME = 'Purposes must all be of the same licence activity'
try:
purpose_ids_list = request.data.get('purpose_ids_list', None)
if not type(purpose_ids_list) == list:
raise serializers.ValidationError(
'Purpose IDs must be a list')
# if not type(purpose_ids_list) == list:
# raise serializers.ValidationError(
# 'Purpose IDs must be a list')
if not request.user.has_perm('wildlifecompliance.issuing_officer'):
raise serializers.ValidationError(MSG_NOAUTH)

if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
values_list('licence_activity_id',flat=True).\
distinct().count() != 1:
raise serializers.ValidationError(MSG_NOSAME)

if purpose_ids_list and pk:
instance = self.get_object()
LicenceService.request_reinstate_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request}
)
# if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
# values_list('licence_activity_id',flat=True).\
# distinct().count() != 1:
# raise serializers.ValidationError(MSG_NOSAME)

return Response(serializer.data)
else:
if not purpose_ids_list and pk:
raise serializers.ValidationError(
'Licence ID and Purpose IDs list must be specified')

instance = self.get_object()
LicenceService.request_reinstate_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request})

return Response(serializer.data)

except serializers.ValidationError:
print(traceback.print_exc())
raise
Expand All @@ -632,28 +635,29 @@ def reissue_purposes(self, request, pk=None, *args, **kwargs):
try:
purpose_ids_list = request.data.get('purpose_ids_list', None)

if not type(purpose_ids_list) == list:
raise serializers.ValidationError(
'Purpose IDs must be a list')
# if not type(purpose_ids_list) == list:
# raise serializers.ValidationError(
# 'Purpose IDs must be a list')
if not request.user.has_perm('wildlifecompliance.issuing_officer'):
raise serializers.ValidationError(
'You are not authorised to reissue licenced activities')
if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
values_list('licence_activity_id',flat=True).\
distinct().count() != 1:
raise serializers.ValidationError(
'Selected purposes must all be of the same licence activity')
# if LicencePurpose.objects.filter(id__in=purpose_ids_list).\
# values_list('licence_activity_id',flat=True).\
# distinct().count() != 1:
# raise serializers.ValidationError(
# 'Selected purposes must all be of the same licence activity')

if purpose_ids_list and pk:
instance = self.get_object()
LicenceService.request_reissue_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
instance, context={'request': request})

return Response(serializer.data)
else:
if not purpose_ids_list and pk:
raise serializers.ValidationError(
'Licence ID and Purpose IDs list must be specified')

instance = self.get_object()
licence = LicenceService.request_reissue_licence(instance, request)
serializer = DTExternalWildlifeLicenceSerializer(
licence, context={'request': request})

return Response(serializer.data)

except serializers.ValidationError:
print(traceback.print_exc())
raise
Expand Down Expand Up @@ -775,6 +779,7 @@ def list(self, request, *args, **kwargs):
licence_activity_id = request.GET.get('licence_activity')
licence_no = request.GET.get('licence_no')
select_activity_id = request.GET.get('select_activity')
select_purpose_id = request.GET.get('select_purpose')
# active_applications are applications linked with licences that have CURRENT or SUSPENDED activities
active_applications = Application.get_active_licence_applications(request, application_type)
active_current_applications = active_applications.exclude(
Expand Down Expand Up @@ -903,7 +908,7 @@ def list(self, request, *args, **kwargs):
]
p_ids = [
p.purpose_id for p in activitys[0].proposed_purposes.all()
if p.is_issued
if p.id == int(select_purpose_id)
]
# amendable_purpose_ids = active_purpose_id2
amendable_purpose_ids = p_ids
Expand All @@ -915,8 +920,8 @@ def list(self, request, *args, **kwargs):
'licence_activity_id', flat=True)
)

# Filter by Licence Category ID if specified or
# return empty queryset if available_purpose_records is empty for the Licence Category ID specified
# Filter by Licence Category ID if specified or return empty queryset
# if available_purpose_records is empty for the Licence Category ID.
if licence_category_id:
if available_purpose_records:
available_purpose_records = available_purpose_records.filter(
Expand All @@ -926,8 +931,11 @@ def list(self, request, *args, **kwargs):
else:
queryset = LicenceCategory.objects.none()

# Filter out LicenceCategory objects that are not linked with available_purpose_records
queryset = queryset.filter(activity__purpose__in=available_purpose_records).distinct()
# Filter out LicenceCategory objects that are not linked with
# available_purpose_records.
# queryset = queryset.filter(
# activity__purpose__in=available_purpose_records
# ).distinct()

# Set any changes to base fees.
if application_type == Application.APPLICATION_TYPE_AMENDMENT:
Expand Down
Loading

0 comments on commit 9dcef2d

Please sign in to comment.