class DataTableApplicationsOfficerOnBehalfView( OfficerRequiredMixin, base.DataTableApplicationBaseView): columns = [ 'lodgement_number', 'licence_type', 'applicant', 'application_type', 'processing_status', 'lodgement_date', 'action' ] order_columns = [ 'lodgement_number', ['licence_type.short_name', 'licence_type.name'], ['applicant.last_name', 'applicant.first_name', 'applicant.email'], 'application_type', 'processing_status', 'lodgement_date', '' ] columns_helpers = dict( base.DataTableApplicationBaseView.columns_helpers.items(), **{ 'lodgement_number': { 'render': lambda self, instance: base.render_lodgement_number(instance) }, 'lodgement_date': { 'render': lambda self, instance: base.render_date(instance.lodgement_date ) }, 'action': { 'render': lambda self, instance: self._render_action_column(instance), }, }) @staticmethod def _get_pending_processing_statuses(): return [ s[0] for s in Application.PROCESSING_STATUS_CHOICES if s[0] != 'issued' and s[0] != 'declined' and s[0] != 'temp' ] @staticmethod def _render_action_column(obj): # same as a customer return DataTableApplicationCustomerView.render_action_column(obj) @staticmethod def _get_proxy_applications(user): return Application.objects.filter(proxy_applicant=user).exclude( customer_status='temp') @staticmethod def filter_status(value): if value.lower() == TablesApplicationsOfficerView.STATUS_PENDING: return Q( processing_status__in=DataTableApplicationsOfficerOnBehalfView. _get_pending_processing_statuses()) else: return base.DataTableApplicationBaseView.filter_status(value) def get_initial_queryset(self): return self._get_proxy_applications(self.request.user)
class DataTableApplicationAssessorView(OfficerOrAssessorRequiredMixin, base.DataTableBaseView): """ The model of this table is not Application but Assessment. """ APPLICATION_TYPES = dict(Application.APPLICATION_TYPE_CHOICES) model = Assessment columns = [ 'application.lodgement_number', 'licence_type', 'application.applicant', 'application.application_type', 'status', 'application.lodgement_date', 'application.assigned_officer', 'assigned_assessor', 'application_pdf', 'action' ] order_columns = [ 'application.lodgement_number', [ 'application.licence_type.short_name', 'application.licence_type.name' ], [ 'application.applicant.last_name', 'application.applicant.first_name', 'application.applicant.email' ], 'application.application_type', 'status', 'application.lodgement_date', [ 'application.assigned_officer.first_name', 'application.assigned_officer.last_name', 'application.assigned_officer.email' ], [ 'assigned_assessor.first_name', 'assigned_assessor.last_name', 'assigned_assessor.email' ], '' ] columns_helpers = dict( **{ 'licence_type': { 'render': lambda self, instance: instance.application.licence_type. display_name, 'search': lambda self, search: base.build_field_query([ 'application__licence_type__short_name', 'application__licence_type__name', 'application__licence_type__version' ], search) }, 'application.lodgement_number': { 'search': lambda self, search: DataTableApplicationAssessorView. _search_lodgement_number(search), 'render': lambda self, instance: base.render_lodgement_number( instance.application) }, 'application.applicant': { 'render': lambda self, instance: render_user_name(instance.application. applicant), 'search': lambda self, search: base.build_field_query([ 'application__applicant_profile__user__last_name', 'application__applicant_profile__user__first_name' ], search), }, 'application.application_type': { 'render': lambda self, instance: self.APPLICATION_TYPES[ instance.application.application_type] }, 'application.assigned_officer': { 'render': lambda self, instance: render_user_name(instance.application. assigned_officer), 'search': lambda self, search: base.build_field_query([ 'application__assigned_officer__last_name', 'application__assigned_officer__first_name', 'application__assigned_officer__email' ], search), }, 'assigned_assessor': { 'render': lambda self, instance: render_user_name(instance. assigned_assessor), 'search': lambda self, search: base.build_field_query([ 'assigned_assessor__last_name', 'assigned_assessor__first_name', 'assigned_assessor__email' ], search), }, 'application.lodgement_date': { 'render': lambda self, instance: base.render_date(instance.application. lodgement_date), }, 'application_pdf': { 'render': lambda self, instance: base.render_application_document( instance.application) }, 'action': { 'render': lambda self, instance: DataTableApplicationAssessorView. render_action_column(instance), }, }) @staticmethod def render_action_column(obj): if obj.status == 'awaiting_assessment': return '<a href="{0}">Assess</a>'.format( reverse('wl_applications:enter_conditions_assessor', args=[obj.application.pk, obj.pk])) else: return '<a href="{0}">View (read-only)</a>'.format( reverse('wl_applications:view_assessment', args=[obj.application.pk, obj.pk])) @staticmethod def _search_lodgement_number(search): # testing to see if search term contains no spaces and two hyphens, meaning it's a lodgement number with a sequence if search and search.count(' ') == 0 and search.count('-') == 2: components = search.split('-') lodgement_number, lodgement_sequence = '-'.join( components[:2]), '-'.join(components[2:]) return Q(application__lodgement_number__icontains=lodgement_number) & \ Q(application__lodgement_sequence__icontains=lodgement_sequence) else: return Q(application__lodgement_number__icontains=search) @staticmethod def filter_licence_type(value): return Q(application__licence_type__pk=value ) if value.lower() != 'all' else None @staticmethod def filter_status(value): return Q(status=value) if value.lower() != 'all' else None def get_initial_queryset(self): groups = self.request.user.assessorgroup_set.all() assessments = self.model.objects.filter( assessor_group__in=groups).all() return assessments
class DataTableApplicationCustomerView(base.DataTableApplicationBaseView): columns = [ 'lodgement_number', 'licence_type', 'applicant_profile', 'application_type', 'customer_status', 'lodgement_date', 'action' ] order_columns = [ 'lodgement_number', ['licence_type.short_name', 'licence_type.name'], 'applicant_profile', 'application_type', 'customer_status', 'lodgement_date', '' ] columns_helpers = dict( base.DataTableApplicationBaseView.columns_helpers.items(), **{ 'lodgement_number': { 'search': lambda self, search: DataTableApplicationCustomerView. _search_lodgement_number(search), 'render': lambda self, instance: base.render_lodgement_number(instance) }, 'action': { 'render': lambda self, instance: DataTableApplicationCustomerView. render_action_column(instance), }, 'lodgement_date': { 'render': lambda self, instance: base.render_date(instance.lodgement_date ) }, }) @staticmethod def _search_lodgement_number(search): # testing to see if search term contains no spaces and two hyphens, # meaning it's a lodgement number with a sequence if search and search.count(' ') == 0 and search.count('-') == 2: components = search.split('-') lodgement_number, lodgement_sequence = '-'.join( components[:2]), '-'.join(components[2:]) return Q(lodgement_number__icontains=lodgement_number) & Q( lodgement_sequence__icontains=lodgement_sequence) else: return Q(lodgement_number__icontains=search) @staticmethod def render_action_column(obj): status = obj.customer_status if status == 'draft': result = '<a href="{0}">{1}</a>'.format( reverse('wl_applications:edit_application', args=[obj.pk]), 'Continue') elif status == 'amendment_required' or status == 'id_and_amendment_required': result = '<a href="{0}">{1}</a>'.format( reverse('wl_applications:edit_application', args=[obj.pk]), 'Amend application') elif status == 'id_required' and obj.id_check_status == 'awaiting_update': result = '<a href="{0}">{1}</a>'.format( reverse('wl_main:identification'), 'Update ID') else: result = '<a href="{0}"">{1}</a>'.format( reverse('wl_applications:view_application', args=[obj.pk]), 'View application (read-only)') # Add discard action if obj.is_discardable: result += ' / <a href="{}">{}</a>'.format( reverse('wl_applications:discard_application', args=[obj.pk]), 'Discard') return result def get_initial_queryset(self): return _get_user_applications(self.request.user)
class DataTableApplicationsOfficerView(OfficerRequiredMixin, base.DataTableApplicationBaseView): columns = [ 'lodgement_number', 'licence_type', 'applicant', 'application_type', 'processing_status', 'lodgement_date', 'assigned_officer', 'payment', 'application_pdf', 'action' ] order_columns = [ 'lodgement_number', ['licence_type.short_name', 'licence_type.name'], ['applicant.last_name', 'applicant.first_name', 'applicant.email'], 'application_type', 'processing_status', 'lodgement_date', [ 'assigned_officer.first_name', 'assigned_officer.last_name', 'assigned_officer.email' ], '' '' ] columns_helpers = dict( base.DataTableApplicationBaseView.columns_helpers.items(), **{ 'lodgement_number': { 'search': lambda self, search: DataTableApplicationsOfficerView. _search_lodgement_number(search), 'render': lambda self, instance: base.render_lodgement_number(instance), }, 'lodgement_date': { 'render': lambda self, instance: base.render_date(instance.lodgement_date ) }, 'assigned_officer': { 'search': lambda self, search: base.build_field_query([ 'assigned_officer__last_name', 'assigned_officer__first_name' ], search), 'render': lambda self, instance: base.render_user_name(instance. assigned_officer) }, 'payment': { 'render': lambda self, instance: base.render_payment( instance, self.request.build_absolute_uri( reverse('wl_dashboard:tables_applications_officer'))) }, 'application_pdf': { 'render': lambda self, instance: base.render_application_document( instance) }, 'action': { 'render': lambda self, instance: DataTableApplicationsOfficerView. _render_action_column(instance), } }) SESSION_SAVE_SETTINGS = True @staticmethod def _get_pending_processing_statuses(): return [ s[0] for s in Application.PROCESSING_STATUS_CHOICES if s[0] != 'draft' and s[0] != 'issued' and s[0] != 'declined' ] @staticmethod def filter_status(value): # officers should not see applications in draft mode. if value.lower() == TablesApplicationsOfficerView.STATUS_PENDING: return Q(processing_status__in=DataTableApplicationsOfficerView. _get_pending_processing_statuses()) return Q(processing_status=value) if value != 'all' else ~Q( customer_status='draft') @staticmethod def _search_lodgement_number(search): # testing to see if search term contains no spaces and two hyphens, meaning it's a lodgement number with a sequence if search and search.count(' ') == 0 and search.count('-') == 2: components = search.split('-') lodgement_number, lodgement_sequence = '-'.join( components[:2]), '-'.join(components[2:]) return Q(lodgement_number__icontains=lodgement_number) & Q( lodgement_sequence__icontains=lodgement_sequence) else: return Q(lodgement_number__icontains=search) @staticmethod def _render_action_column(obj): issued = obj.processing_status == 'issued' and obj.licence is not None and obj.licence.licence_document is not None discarded = obj.processing_status == 'discarded' declined = obj.processing_status == 'declined' if obj.processing_status == 'ready_for_conditions': return '<a href="{0}">Enter Conditions</a>'.format( reverse('wl_applications:enter_conditions', args=[obj.pk]), ) elif obj.processing_status == 'ready_to_issue': return '<a href="{0}">Issue Licence</a>'.format( reverse('wl_applications:issue_licence', args=[obj.pk]), ) elif any([issued, discarded, declined]): return '<a href="{0}">{1}</a>'.format( reverse('wl_applications:view_application_officer', args=[obj.pk]), 'View (read-only)') else: return '<a href="{0}">Process</a>'.format( reverse('wl_applications:process', args=[obj.pk]), ) def get_initial_queryset(self): return Application.objects.exclude( processing_status__in=['draft', 'temp']).exclude( customer_status='temp')
class DataTableApplicationsOfficerOnBehalfView( OfficerRequiredMixin, base.DataTableApplicationBaseView): columns = [ 'lodgement_number', 'licence_type', 'applicant', 'processing_status', 'lodgement_date', 'action' ] order_columns = [ 'lodgement_number', ['licence_type.short_name', 'licence_type.name'], ['applicant.last_name', 'applicant.first_name', 'applicant.email'], 'processing_status', 'lodgement_date', '' ] columns_helpers = dict( base.DataTableApplicationBaseView.columns_helpers.items(), **{ 'lodgement_number': { 'render': lambda self, instance: base.render_lodgement_number(instance) }, 'lodgement_date': { 'render': lambda self, instance: base.render_date(instance.lodgement_date ) }, 'action': { 'render': lambda self, instance: self._render_action_column(instance), }, }) @staticmethod def _get_pending_processing_statuses(): return [ s[0] for s in Application.PROCESSING_STATUS_CHOICES if s[0] != 'issued' and s[0] != 'declined' and s[0] != 'temp' ] @staticmethod def _render_action_column(obj): status = obj.customer_status if status == 'draft': return '<a href="{0}">{1}</a> / <a href="{2}">{3}</a>'.format( reverse('wl_applications:edit_application', args=[obj.pk]), 'Continue', reverse('wl_applications:delete_application', args=[obj.pk]), 'Discard') elif status == 'amendment_required' or status == 'id_and_amendment_required': return '<a href="{0}">{1}</a>'.format( reverse('wl_applications:edit_application', args=[obj.pk]), 'Amend application') elif status == 'id_required' and obj.id_check_status == 'awaiting_update': return '<a href="{0}">{1}</a>'.format( reverse('wl_main:identification'), 'Update ID') else: return '<a href="{0}">{1}</a>'.format( reverse('wl_applications:view_application', args=[obj.pk]), 'View application (read-only)') @staticmethod def _get_proxy_applications(user): return Application.objects.filter(proxy_applicant=user) @staticmethod def filter_status(value): if value.lower() == TableApplicationsOfficerView.STATUS_PENDING: return Q( processing_status__in=DataTableApplicationsOfficerOnBehalfView. _get_pending_processing_statuses()) else: return base.DataTableApplicationBaseView.filter_status(value) def get_initial_queryset(self): return self._get_proxy_applications(self.request.user)