Skip to content

Commit

Permalink
WildlifeCompliance: #4960 - work on amend licence/licence activity/li…
Browse files Browse the repository at this point in the history
…cence purpose, fix up available purposes query function
  • Loading branch information
wilsonc86 committed Jun 25, 2019
1 parent e80d67d commit ac4f239
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 24 deletions.
12 changes: 8 additions & 4 deletions wildlifecompliance/components/applications/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1821,7 +1821,7 @@ def get_request_user_applications(request):
else (
Q(submitter=proxy_id) | Q(proxy_applicant=proxy_id)
) if proxy_id
else Q(submitter=request.user)
else Q(submitter=request.user, proxy_applicant=None, org_applicant=None)
)


Expand Down Expand Up @@ -2305,9 +2305,13 @@ def payment_status(self):

@staticmethod
def get_current_activities_for_application_type(application_type, **kwargs):
# Retrieves the current activities for an ApplicationSelectedActivity, filterable by LicenceActivity ID
# and Application.APPLICATION_TYPE in the case of the additional date_filter (use
# Application.APPLICATION_TYPE_SYSTEM_GENERATED for no APPLICATION_TYPE filters)
"""
Retrieves the current or suspended activities for an ApplicationSelectedActivity,
filterable by LicenceActivity ID and Application.APPLICATION_TYPE in the case
of the additional date_filter (use Application.APPLICATION_TYPE_SYSTEM_GENERATED
for no APPLICATION_TYPE filters)
"""

applications = kwargs.get('applications', Application.objects.none())
activity_ids = kwargs.get('activity_ids', [])

Expand Down
12 changes: 8 additions & 4 deletions wildlifecompliance/components/applications/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,10 @@ def get_can_pay_licence_fee(self, obj):


class ExternalApplicationSelectedActivityMergedSerializer(serializers.Serializer):
"""
Custom serializer for WildlifeLicence.latest_activities_merged LIST of DICT objects for each
ApplicationSelectedActivity, therefore use of obj.get('fieldname') to retrieve data in SerializerMethodFields
"""
licence_activity_id = serializers.IntegerField(read_only=True)
activity_name_str = serializers.CharField(read_only=True)
issue_date = serializers.SerializerMethodField(read_only=True)
Expand Down Expand Up @@ -207,13 +211,13 @@ class Meta:
datatables_always_serialize = fields

def get_issue_date(self, obj):
return obj['issue_date'].strftime('%d/%m/%Y') if obj['issue_date'] else ''
return obj.get('issue_date').strftime('%d/%m/%Y') if obj.get('issue_date') else ''

def get_start_date(self, obj):
return obj['start_date'].strftime('%d/%m/%Y') if obj['start_date'] else ''
return obj.get('start_date').strftime('%d/%m/%Y') if obj.get('start_date') else ''

def get_expiry_date(self, obj):
return obj['expiry_date'].strftime('%d/%m/%Y') if obj['expiry_date'] else ''
return obj.get('expiry_date').strftime('%d/%m/%Y') if obj.get('expiry_date') else ''

def get_can_reissue(self, obj):
try:
Expand All @@ -225,7 +229,7 @@ def get_can_reissue(self, obj):
return user.has_perm('wildlifecompliance.system_administrator') or (
user.has_wildlifelicenceactivity_perm([
'issuing_officer',
], obj.licence_activity_id) and obj.can_reissue
], obj.get('licence_activity_id')) and obj.get('can_reissue')
)


Expand Down
29 changes: 18 additions & 11 deletions wildlifecompliance/components/licences/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ def list(self, request, *args, **kwargs):
from wildlifecompliance.components.licences.models import LicencePurpose

queryset = self.get_queryset()
only_purpose_records = None
available_purpose_records = None
application_type = request.GET.get('application_type')
licence_category_id = request.GET.get('licence_category')
licence_activity_id = request.GET.get('licence_activity')
Expand All @@ -618,7 +618,7 @@ def list(self, request, *args, **kwargs):
if not active_applications.count() and application_type == Application.APPLICATION_TYPE_RENEWAL:
# Do not present with renewal options if no activities are within the renewal period
queryset = LicenceCategory.objects.none()
only_purpose_records = LicencePurpose.objects.none()
available_purpose_records = LicencePurpose.objects.none()

elif active_applications.count():
# Activities relevant to the current application type
Expand All @@ -636,14 +636,16 @@ def list(self, request, *args, **kwargs):
for selected_activity in current_activities:
active_purpose_ids.extend([purpose.id for purpose in selected_activity.purposes])

# Exclude active purposes for New Activity/Purpose or New Licence application types
if application_type in [
Application.APPLICATION_TYPE_ACTIVITY,
Application.APPLICATION_TYPE_NEW_LICENCE,
]:
only_purpose_records = LicencePurpose.objects.exclude(
available_purpose_records = LicencePurpose.objects.exclude(
id__in=active_purpose_ids
)

# Only include active purposes for Amendment or Renewal application types
elif application_type in [
Application.APPLICATION_TYPE_AMENDMENT,
Application.APPLICATION_TYPE_RENEWAL,
Expand All @@ -654,24 +656,29 @@ def list(self, request, *args, **kwargs):
)

queryset = queryset.filter(id__in=active_licence_activity_ids)
only_purpose_records = LicencePurpose.objects.filter(
available_purpose_records = LicencePurpose.objects.filter(
id__in=amendable_purpose_ids,
licence_activity_id__in=current_activities.values_list(
'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
if licence_category_id:
only_purpose_records = only_purpose_records.filter(
licence_category_id=licence_category_id
)
if not only_purpose_records:
queryset = LicenceCategory.objects.none()
else:
if available_purpose_records:
available_purpose_records = available_purpose_records.filter(
licence_category_id=licence_category_id
)
queryset = queryset.filter(id=licence_category_id)
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()

serializer = LicenceCategorySerializer(queryset, many=True, context={
'request': request,
'purpose_records': only_purpose_records
'purpose_records': available_purpose_records
})
return Response(serializer.data)

Expand Down
13 changes: 10 additions & 3 deletions wildlifecompliance/components/licences/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,16 @@ def get_activity(self, obj):
'licence_activity_id', flat=True
)) if purposes else []

activities = obj.activity.filter(
id__in=activity_ids
) if activity_ids else obj.activity.all()
# If purpose_records context is set but is empty, force display of zero activities
# otherwise, assume we want to retrieve all activities for the Licence Category
if self.context.has_key('purpose_records'):
activities = obj.activity.filter(
id__in=activity_ids
)
else:
activities = obj.activity.filter(
id__in=activity_ids
) if activity_ids else obj.activity.all()

serializer = ActivitySerializer(
activities,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
<ul>
<li v-for="(activity, index) in finalisedActivities" v-bind:key="`licence_row_${index}`" :id="`licence_${activity.id}`">
<div v-if="activity.processing_status.id=='accepted'">
<b>{{activity.name}}:</b> issued ({{format(activity.start_date)}} - {{format(activity.expiry_date)}}).
<b>{{activity.name}}:</b> Issued (valid for {{format(activity.start_date)}} - {{format(activity.expiry_date)}})
</div>
<div v-if="activity.processing_status.id=='declined'">
<b>{{activity.name}}:</b> declined.
<b>{{activity.name}}:</b> Declined
</div>
</li>
</ul>
Expand Down

0 comments on commit ac4f239

Please sign in to comment.