コード例 #1
0
ファイル: api.py プロジェクト: shibaken/wildlifecompliance
    def update(self, request, *args, **kwargs):
        instance = self.get_object()
        try:
            with transaction.atomic():
                request_data = request.data

                if (
                    request_data.get('location', {}).get('geometry', {}).get('coordinates', {}) or
                    request_data.get('location', {}).get('properties', {}).get('postcode', {}) or
                    request_data.get('location', {}).get('properties', {}).get('details', {})
                ):
                    location_request_data = request.data.get('location')
                    returned_location = save_location(location_request_data)
                    if returned_location:
                        request_data.update({'location_id': returned_location.get('id')})

                # self.save_email_user(request)

                if request_data.get('renderer_data'):
                    self.form_data(request)

                #if request_data.get('report_type_id'):
                 #   request_data.update({'report_type_id': request_data.get('report_type', {}).get('id')})

                if instance.report_type and 'report_type_id' in request.data.keys() and not request.data.get('report_type_id'):
                        del request.data['report_type_id']

                serializer = SaveCallEmailSerializer(instance, data=request_data)
                serializer.is_valid(raise_exception=True)
                if serializer.is_valid():
                    saved_instance = serializer.save()
                    instance.log_user_action(
                        CallEmailUserAction.ACTION_SAVE_CALL_EMAIL_.format(
                        instance.number), request)
                    headers = self.get_success_headers(serializer.data)
                    return_serializer = CallEmailSerializer(instance=saved_instance, context={'request': request})
                    return Response(
                        return_serializer.data,
                        status=status.HTTP_201_CREATED,
                        headers=headers
                    )
                    
        except serializers.ValidationError:
            print(traceback.print_exc())
            raise
        except ValidationError as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(repr(e.error_dict))
        except Exception as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(str(e))
コード例 #2
0
ファイル: api.py プロジェクト: dbca-wa/wildlifecompliance
    def create(self, request, *args, **kwargs):
        try:
            with transaction.atomic():
                # 1. Save Location
                if (request.data.get('location', {}).get('geometry', {}).get(
                        'coordinates', {})
                        or request.data.get('location', {}).get(
                            'properties', {}).get('postcode', {})
                        or request.data.get('location', {}).get(
                            'properties', {}).get('details', {})):
                    location_request_data = request.data.get('location')
                    returned_location = save_location(location_request_data)
                    if returned_location:
                        request.data.update(
                            {'location_id': returned_location.get('id')})

                serializer = SaveInspectionSerializer(data=request.data,
                                                      partial=True)
                serializer.is_valid(raise_exception=True)
                if serializer.is_valid():
                    instance = serializer.save()
                    instance.log_user_action(
                        InspectionUserAction.ACTION_CREATE_INSPECTION.format(
                            instance.number), request)
                    # Create comms_log and send mail
                    res = self.workflow_action(request,
                                               instance,
                                               create_inspection=True)
                    if instance.call_email:
                        print("update parent")
                        self.update_parent(request, instance)
                    return res
        except serializers.ValidationError:
            print(traceback.print_exc())
            raise
        except ValidationError as e:
            if hasattr(e, 'error_dict'):
                raise serializers.ValidationError(repr(e.error_dict))
            else:
                # raise serializers.ValidationError(repr(e[0].encode('utf-8')))
                raise serializers.ValidationError(repr(e[0]))
        except Exception as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(str(e))
コード例 #3
0
ファイル: api.py プロジェクト: shibaken/wildlifecompliance
    def update(self, request, workflow=False, *args, **kwargs):
        try:
            with transaction.atomic():
                # 1. Save Location
                if (
                        request.data.get('location', {}).get('geometry', {}).get('coordinates', {}) or
                        request.data.get('location', {}).get('properties', {}).get('postcode', {}) or
                        request.data.get('location', {}).get('properties', {}).get('details', {})
                ):
                    location_request_data = request.data.get('location')
                    returned_location = save_location(location_request_data)
                    if returned_location:
                        request.data.update({'location_id': returned_location.get('id')})

                instance = self.get_object()
                # record individual inspected before update
                individual_inspected_id = instance.individual_inspected_id
                # record organisation inspected before update
                organisation_inspected_id = instance.organisation_inspected_id
                # record party_inspected before update
                party_inspected = instance.party_inspected
                if request.data.get('renderer_data'):
                    self.form_data(request)

                if instance.inspection_type and not request.data.get('inspection_type_id') and 'inspection_type_id' in request.data.keys():
                    del request.data['inspection_type_id']

                serializer = SaveInspectionSerializer(instance, data=request.data)
                serializer.is_valid(raise_exception=True)
                if serializer.is_valid():
                    serializer.save()
                    instance.log_user_action(
                            InspectionUserAction.ACTION_SAVE_INSPECTION_.format(
                            instance.number), request)
                    # Log individual_inspected update if applicable
                    if instance.party_inspected == 'individual' and individual_inspected_id and \
                            (individual_inspected_id != instance.individual_inspected_id or \
                            party_inspected != instance.party_inspected):
                        prev_individual_inspected = EmailUser.objects.get(id=individual_inspected_id)
                        instance.log_user_action(
                                InspectionUserAction.ACTION_CHANGE_INDIVIDUAL_INSPECTED.format(
                                prev_individual_inspected.get_full_name(),
                                instance.individual_inspected.get_full_name()), request)
                    # Log organisation_inspected update if applicable
                    if instance.party_inspected == 'organisation' and organisation_inspected_id and \
                            (organisation_inspected_id != instance.organisation_inspected_id or \
                            party_inspected != instance.party_inspected):
                        prev_organisation_inspected = Organisation.objects.get(id=organisation_inspected_id)
                        instance.log_user_action(
                                InspectionUserAction.ACTION_CHANGE_ORGANISATION_INSPECTED.format(
                                prev_organisation_inspected.name,
                                instance.organisation_inspected.name), request)

                    headers = self.get_success_headers(serializer.data)
                    return_serializer = InspectionSerializer(instance, context={'request': request})
                    return Response(
                            return_serializer.data,
                            status=status.HTTP_201_CREATED,
                            headers=headers
                            )
        except serializers.ValidationError:
            print(traceback.print_exc())
            raise
        except ValidationError as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(repr(e.error_dict))
        except Exception as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(str(e))
コード例 #4
0
    def create(self, request, *args, **kwargs):
        try:
            with transaction.atomic():
                request_data = request.data

                # 1. Save Location
                if (request_data.get('location', {}).get('geometry', {}).get(
                        'coordinates', {})
                        or request_data.get('location', {}).get(
                            'properties', {}).get('postcode', {})
                        or request_data.get('location', {}).get(
                            'properties', {}).get('details', {})):
                    location_request_data = request.data.get('location')
                    returned_location = save_location(location_request_data)
                    if returned_location:
                        request_data.update(
                            {'location_id': returned_location.get('id')})

                # 2. Create Offence
                request_data['status'] = 'open'
                request_data['region_id'] = int(
                    request_data['region_id']
                ) if request_data['region_id'] else None
                request_data['district_id'] = int(
                    request_data['district_id']
                ) if request_data['district_id'] else None
                serializer = SaveOffenceSerializer(data=request_data)
                serializer.is_valid(raise_exception=True)
                saved_offence_instance = serializer.save(
                )  # Here, relations between this offence and location, and this offence and call_email/inspection are created

                # 2.1. Determine allocated group and save it
                new_group = Offence.get_compliance_permission_group(
                    saved_offence_instance.regionDistrictId)
                saved_offence_instance.allocated_group = new_group
                saved_offence_instance.assigned_to = None
                saved_offence_instance.responsible_officer = request.user
                saved_offence_instance.log_user_action(
                    OffenceUserAction.ACTION_CREATE.format(
                        saved_offence_instance.lodgement_number), request)
                saved_offence_instance.save()

                # 2.2. Update parents
                self.update_parent(request, saved_offence_instance)

                # Handle documents
                from wildlifecompliance.components.main.models import TemporaryDocumentCollection
                from wildlifecompliance.components.main.process_document import save_default_document_obj
                temporary_document_collection_dict = request_data.get(
                    'temporary_document_collection_id', None)
                if temporary_document_collection_dict:
                    temporary_document_collection_id = temporary_document_collection_dict.get(
                        'temp_doc_id', None)
                    if temporary_document_collection_id:
                        temp_doc_collection, created = TemporaryDocumentCollection.objects.get_or_create(
                            id=temporary_document_collection_id)
                        if temp_doc_collection:
                            for doc in temp_doc_collection.documents.all():
                                save_default_document_obj(
                                    saved_offence_instance, doc)
                                pass
                            temp_doc_collection.delete()

                ## 2a. Log it to the call email, if applicable
                #if saved_offence_instance.call_email:
                #    saved_offence_instance.call_email.log_user_action(
                #            CallEmailUserAction.ACTION_OFFENCE.format(
                #                saved_offence_instance.call_email.number),
                #                request)

                ## 2b. Log it to the inspection, if applicable
                #if saved_offence_instance.inspection:
                #    saved_offence_instance.inspection.log_user_action(
                #            InspectionUserAction.ACTION_OFFENCE.format(
                #                saved_offence_instance.inspection.number),
                #                request)

                # 3. Create relations between this offence and the alleged 0ffence(s)
                for alleged_offence in request_data['alleged_offences']:
                    section_regulation = SectionRegulation.objects.get(
                        id=alleged_offence['section_regulation']['id'])
                    # Insert a record into the through table
                    alleged_offence = AllegedOffence.objects.create(
                        section_regulation=section_regulation,
                        offence=saved_offence_instance,
                    )

                # 4. Create relations between this offence and offender(s)
                for dict in request_data['offenders']:
                    if dict['data_type'] == 'individual':
                        offender = EmailUser.objects.get(id=dict['id'])
                        serializer_offender = SaveOffenderSerializer(
                            data={
                                'offence_id': saved_offence_instance.id,
                                'person_id': offender.id
                            })
                        serializer_offender.is_valid(raise_exception=True)
                        serializer_offender.save()
                    elif dict['data_type'] == 'organisation':
                        offender = Organisation.objects.get(id=dict['id'])
                        serializer_offender = SaveOffenderSerializer(
                            data={
                                'offence_id': saved_offence_instance.id,
                                'organisation_id': offender.id
                            })
                        serializer_offender.is_valid(raise_exception=True)
                        serializer_offender.save()

                # 4. Return Json
                headers = self.get_success_headers(serializer.data)
                return_serializer = OffenceSerializer(
                    instance=saved_offence_instance,
                    context={'request': request})
                # return_serializer = InspectionSerializer(saved_instance, context={'request': request})
                ret = Response(return_serializer.data,
                               status=status.HTTP_201_CREATED,
                               headers=headers)
                return ret

        except serializers.ValidationError:
            print(traceback.print_exc())
            raise
        except ValidationError as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(repr(e.error_dict))
        except Exception as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(str(e))
コード例 #5
0
    def update(self, request, *args, **kwargs):
        try:
            with transaction.atomic():
                instance = self.get_object()
                request_data = request.data

                # 1. Save Location
                if (request_data.get('location', {}).get('geometry', {}).get(
                        'coordinates', {})
                        or request_data.get('location', {}).get(
                            'properties', {}).get('postcode', {})
                        or request_data.get('location', {}).get(
                            'properties', {}).get('details', {})):
                    location_request_data = request.data.get('location')
                    returned_location = save_location(location_request_data)
                    if returned_location:
                        request_data.update(
                            {'location_id': returned_location.get('id')})

                # 2. Save Offence
                serializer = SaveOffenceSerializer(instance,
                                                   data=request_data,
                                                   partial=True)
                serializer.is_valid(raise_exception=True)
                serializer.save(
                )  # Here, relations between this offence and location, and this offence and call_email/inspection are created
                instance.log_user_action(
                    OffenceUserAction.ACTION_UPDATE.format(
                        instance.lodgement_number), request)

                # 3. Handle alleged offences
                for item in request_data['alleged_offences']:
                    alleged_offence, created = AllegedOffence.objects.get_or_create(
                        section_regulation_id=item['section_regulation']['id'],
                        offence_id=request_data['id'])

                    if created:
                        # new alleged offence is added to the offence
                        # Which should be added to all the sanction outcomes under the offence if the status is 'draft'
                        sanction_outcomes = SanctionOutcome.objects.filter(
                            status=SanctionOutcome.STATUS_DRAFT,
                            offence=instance)
                        for so in sanction_outcomes:
                            aco = AllegedCommittedOffence.objects.create(
                                included=False,
                                alleged_offence=alleged_offence,
                                sanction_outcome=so)
                    else:
                        serializer = None
                        alleged_offence_removed = False
                        alleged_offence_restored = False

                        # Update attributes of existing alleged offence
                        if not alleged_offence.removed and item['removed']:
                            # This alleged offence is going to be removed
                            alleged_offence_removed = True
                            serializer = UpdateAllegedOffenceAttributeSerializer(
                                alleged_offence,
                                data={
                                    'removed':
                                    item['removed'],
                                    'removed_by_id':
                                    request.user.id,
                                    'reason_for_removal':
                                    item['reason_for_removal']
                                })
                        elif alleged_offence.removed and not item['removed']:
                            # This alleged offence is going to be restored
                            alleged_offence_restored = True
                            serializer = UpdateAllegedOffenceAttributeSerializer(
                                alleged_offence,
                                data={
                                    'removed': item['removed'],
                                    'removed_by_id': None,
                                    'reason_for_removal': ''
                                })

                        if serializer:
                            serializer.is_valid(raise_exception=True)
                            serializer.save()

                            # Action log
                            if alleged_offence_removed:
                                instance.log_user_action(
                                    OffenceUserAction.
                                    ACTION_REMOVE_ALLEGED_OFFENCE.format(
                                        alleged_offence,
                                        item['reason_for_removal']), request)

                                # Update alleged committed offence's included status to False
                                alleged_committed_offences = AllegedCommittedOffence.objects.filter(
                                    Q(alleged_offence=alleged_offence))
                                for aco in alleged_committed_offences.all():
                                    serializer_aco = UpdateAllegedCommittedOffenceSerializer(
                                        aco,
                                        data={'included': False},
                                        context={
                                            'sanction_outcome':
                                            aco.sanction_outcome
                                        })
                                    serializer_aco.is_valid(
                                        raise_exception=True)
                                    serializer_aco.save()

                            elif alleged_offence_restored:
                                instance.log_user_action(
                                    OffenceUserAction.
                                    ACTION_RESTORE_ALLEGED_OFFENCE.format(
                                        alleged_offence), request)

                # 4. Create relations between this offence and offender(s)
                for item in request_data['offenders']:
                    if item['person']:
                        offender, created = Offender.objects.get_or_create(
                            person_id=item['person']['id'],
                            offence_id=request_data['id'])
                    elif item['organisation']:
                        offender, created = Offender.objects.get_or_create(
                            organisation_id=item['organisation']['id'],
                            offence_id=request_data['id'])

                    if not created:
                        serializer = None

                        # Update attributes of existing offender
                        if not offender.removed and item['removed']:
                            # This offender is going to be removed
                            serializer = UpdateOffenderAttributeSerializer(
                                offender,
                                data={
                                    'removed':
                                    item['removed'],
                                    'removed_by_id':
                                    request.user.id,
                                    'reason_for_removal':
                                    item['reason_for_removal']
                                })

                        elif offender.removed and not item['removed']:
                            # This offender is going to be restored
                            serializer = UpdateOffenderAttributeSerializer(
                                offender,
                                data={
                                    'removed': item['removed'],
                                    'removed_by_id': None,
                                    'reason_for_removal': ''
                                })

                        else:
                            # other case where nothing changed on this offender
                            pass

                        if serializer:
                            serializer.is_valid(raise_exception=True)

                            # Action log
                            if not offender.removed and item['removed']:
                                instance.log_user_action(
                                    OffenceUserAction.ACTION_REMOVE_OFFENDER.
                                    format(offender,
                                           item['reason_for_removal']),
                                    request)
                            elif offender.removed and not item['removed']:
                                instance.log_user_action(
                                    OffenceUserAction.ACTION_RESTORE_OFFENDER.
                                    format(offender), request)

                            serializer.save()

                # 4. Return Json
                return self.retrieve(request)

        except serializers.ValidationError:
            print(traceback.print_exc())
            raise
        except ValidationError as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(repr(e.error_dict))
        except Exception as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(str(e))
コード例 #6
0
ファイル: api.py プロジェクト: shibaken/wildlifecompliance
    def create(self, request, *args, **kwargs):
        try:
            with transaction.atomic():
                request_data = request.data
                # Create location then include in request to create new Call/Email
                returned_location = None

                if (
                    request_data.get('location', {}).get('geometry', {}).get('coordinates', {}) or
                    request_data.get('location', {}).get('properties', {}).get('postcode', {}) or
                    request_data.get('location', {}).get('properties', {}).get('details', {})
                ):
                    #returned_location = self.save_location(request)
                    location_request_data = request.data.get('location')
                    returned_location = save_location(location_request_data)
                    if returned_location:
                        request_data.update({'location_id': returned_location.get('id')})

                #if request_data.get('report_type'):
                 #   request_data.update({'report_type_id': request_data.get('report_type', {}).get('id')})

                # Initial allocated_group_id must be volunteers
                compliance_content_type = ContentType.objects.get(model="compliancepermissiongroup")
                permission = Permission.objects.filter(codename='volunteer').filter(content_type_id=compliance_content_type.id).first()
                group = CompliancePermissionGroup.objects.filter(permissions=permission).first()
                request_data.update({'allocated_group_id': group.id})
                
                serializer = CreateCallEmailSerializer(data=request_data, partial=True)
                serializer.is_valid(raise_exception=True)
                if serializer.is_valid():
                    new_instance = serializer.save()
                    new_instance.log_user_action(
                            CallEmailUserAction.ACTION_CREATE_CALL_EMAIL.format(
                            new_instance.number), request)
                    new_returned = serializer.data
                    # Ensure classification_id and report_type_id is returned for Vue template evaluation                
                    # new_returned.update({'classification_id': request_data.get('classification_id')})
                    new_returned.update({'report_type_id': request_data.get('report_type_id')})
                    # new_returned.update({'referrer_id': request_data.get('referrer_id')})
                    if request_data.get('location'):
                        new_returned.update({'location_id': request_data.get('location').get('id')})

                    if request.data.get('renderer_data'):
                    # option required for duplicated Call/Emails
                        ComplianceFormDataRecord.process_form(
                            request,
                            new_instance,
                            request.data.get('renderer_data'),
                            action=ComplianceFormDataRecord.ACTION_TYPE_ASSIGN_VALUE
                        )

                        # Serializer returns CallEmail.data for HTTP response
                        duplicate = CallEmailSerializer(instance=new_instance, context={'request': request})
                        headers = self.get_success_headers(duplicate.data)

                        # duplicate.data.update({'classification_id': request_data.get('classification_id')})
                        duplicate.data.update({'report_type_id': request_data.get('report_type_id')})
                        # duplicate.data.update({'referrer_id': request_data.get('referrer_id')})
                        if request_data.get('location'):
                            duplicate.data.update({'location_id': request_data.get('location').get('id')})
                        
                        return Response(
                            duplicate.data,
                            status=status.HTTP_201_CREATED,
                            headers=headers
                            )
                    else:
                        headers = self.get_success_headers(serializer.data)
                        return Response(
                            new_returned,
                            status=status.HTTP_201_CREATED,
                            headers=headers
                        )
        except serializers.ValidationError:
            print(traceback.print_exc())
            raise
        except ValidationError as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(repr(e.error_dict))
        except Exception as e:
            print(traceback.print_exc())
            raise serializers.ValidationError(str(e))