#31 API POST/PUT Intervention
* splits code in smaller, reusable methods * adds put method to view * adds update_model_from_json() method
This commit is contained in:
		
							parent
							
								
									854e358b73
								
							
						
					
					
						commit
						b1a42b126e
					
				@ -78,6 +78,20 @@ class AbstractModelAPISerializer:
 | 
			
		||||
        serialized_data = self.model_to_geo_json(entry)
 | 
			
		||||
        return serialized_data
 | 
			
		||||
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    def update_model_from_json(self, id, json_model, user):
 | 
			
		||||
        """ Updates an instance from given json data
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            id (str): The instance's to be updated
 | 
			
		||||
            json_model (dict): JSON data
 | 
			
		||||
            user (User): The performing user
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        raise NotImplementedError("Must be implemented in subclasses")
 | 
			
		||||
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    def create_model_from_json(self, json_model, user):
 | 
			
		||||
        """ Creates a new instance from given json data
 | 
			
		||||
 | 
			
		||||
@ -34,47 +34,96 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1):
 | 
			
		||||
        self.properties_data["payments"] = self.payments_to_json(entry.payments.all())
 | 
			
		||||
        self.properties_data["deductions"] = self.deductions_to_json(entry.deductions.all())
 | 
			
		||||
 | 
			
		||||
    def create_model_from_json(self, json_model, user):
 | 
			
		||||
        with transaction.atomic():
 | 
			
		||||
            # Create geometry
 | 
			
		||||
            json_geom = self.create_geometry_from_json(json_model)
 | 
			
		||||
            geometry = Geometry()
 | 
			
		||||
            geometry.geom = json_geom
 | 
			
		||||
    def initialize_objects(self, json_model, user):
 | 
			
		||||
        """ Initializes all needed objects from the json_model data
 | 
			
		||||
 | 
			
		||||
            # Create linked objects
 | 
			
		||||
            obj = Intervention()
 | 
			
		||||
            resp = Responsibility()
 | 
			
		||||
            legal = Legal()
 | 
			
		||||
            created = UserActionLogEntry.get_created_action(user, comment="API Import")
 | 
			
		||||
            obj.legal = legal
 | 
			
		||||
            obj.created = created
 | 
			
		||||
            obj.geometry = geometry
 | 
			
		||||
            obj.responsible = resp
 | 
			
		||||
        Does not persist data to the DB!
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            json_model (dict): The json data
 | 
			
		||||
            user (User): The API user
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            obj (Intervention)
 | 
			
		||||
        """
 | 
			
		||||
        # Create geometry
 | 
			
		||||
        json_geom = self.create_geometry_from_json(json_model)
 | 
			
		||||
        geometry = Geometry()
 | 
			
		||||
        geometry.geom = json_geom
 | 
			
		||||
 | 
			
		||||
        # Create linked objects
 | 
			
		||||
        obj = Intervention()
 | 
			
		||||
        resp = Responsibility()
 | 
			
		||||
        legal = Legal()
 | 
			
		||||
        created = UserActionLogEntry.get_created_action(user, comment="API Import")
 | 
			
		||||
        obj.legal = legal
 | 
			
		||||
        obj.created = created
 | 
			
		||||
        obj.geometry = geometry
 | 
			
		||||
        obj.responsible = resp
 | 
			
		||||
        return obj
 | 
			
		||||
 | 
			
		||||
    def set_legal(self, obj, legal_data):
 | 
			
		||||
        """ Sets the legal data contents to the provided legal_data dict
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            obj (Intervention): The intervention object
 | 
			
		||||
            legal_data (dict): The new data
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            obj
 | 
			
		||||
        """
 | 
			
		||||
        obj.legal.registration_date = legal_data["registration_date"]
 | 
			
		||||
        obj.legal.binding_date = legal_data["binding_date"]
 | 
			
		||||
        obj.legal.process_type = self.konova_code_from_json(
 | 
			
		||||
            legal_data["process_type"],
 | 
			
		||||
            CODELIST_PROCESS_TYPE_ID,
 | 
			
		||||
        )
 | 
			
		||||
        laws = [self.konova_code_from_json(law, CODELIST_LAW_ID) for law in legal_data["laws"]]
 | 
			
		||||
        obj.legal.laws.set(laws)
 | 
			
		||||
        return obj
 | 
			
		||||
    
 | 
			
		||||
    def set_responsibility(self, obj, responsibility_data: dict):
 | 
			
		||||
        """ Sets the responsible data contents to the provided responsibility_data dict
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            obj (Intervention): The intervention object
 | 
			
		||||
            responsibility_data (dict): The new data
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            obj
 | 
			
		||||
        """
 | 
			
		||||
        obj.responsible.registration_office = self.konova_code_from_json(
 | 
			
		||||
            responsibility_data["registration_office"],
 | 
			
		||||
            CODELIST_REGISTRATION_OFFICE_ID
 | 
			
		||||
        )
 | 
			
		||||
        obj.responsible.registration_file_number = responsibility_data["registration_file_number"]
 | 
			
		||||
        obj.responsible.conservation_office = self.konova_code_from_json(
 | 
			
		||||
            responsibility_data["conservation_office"],
 | 
			
		||||
            CODELIST_CONSERVATION_OFFICE_ID,
 | 
			
		||||
        )
 | 
			
		||||
        obj.responsible.conservation_file_number = responsibility_data["conservation_file_number"]
 | 
			
		||||
        obj.responsible.handler = responsibility_data["handler"]
 | 
			
		||||
        return obj
 | 
			
		||||
 | 
			
		||||
    def create_model_from_json(self, json_model, user):
 | 
			
		||||
        """ Creates a new entry for the model based on the contents of json_model
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
            json_model (dict): The json containing data
 | 
			
		||||
            user (User): The API user
 | 
			
		||||
 | 
			
		||||
        Returns:
 | 
			
		||||
            created_id (str): The id of the newly created Intervention entry
 | 
			
		||||
        """
 | 
			
		||||
        with transaction.atomic():
 | 
			
		||||
            obj = self.initialize_objects(json_model, user)
 | 
			
		||||
 | 
			
		||||
            # Fill in data to objects
 | 
			
		||||
            properties = json_model["properties"]
 | 
			
		||||
            obj.identifier = obj.generate_new_identifier()
 | 
			
		||||
            obj.title = properties["title"]
 | 
			
		||||
            obj.responsible.registration_office = self.konova_code_from_json(
 | 
			
		||||
                properties["responsible"]["registration_office"],
 | 
			
		||||
                CODELIST_REGISTRATION_OFFICE_ID
 | 
			
		||||
            )
 | 
			
		||||
            obj.responsible.registration_file_number = properties["responsible"]["registration_file_number"]
 | 
			
		||||
            obj.responsible.conservation_office = self.konova_code_from_json(
 | 
			
		||||
                properties["responsible"]["conservation_office"],
 | 
			
		||||
                CODELIST_CONSERVATION_OFFICE_ID,
 | 
			
		||||
            )
 | 
			
		||||
            obj.responsible.conservation_file_number = properties["responsible"]["conservation_file_number"]
 | 
			
		||||
            obj.responsible.handler = properties["responsible"]["handler"]
 | 
			
		||||
 | 
			
		||||
            obj.legal.registration_date = properties["legal"]["registration_date"]
 | 
			
		||||
            obj.legal.binding_date = properties["legal"]["binding_date"]
 | 
			
		||||
            obj.legal.process_type = self.konova_code_from_json(
 | 
			
		||||
                properties["legal"]["process_type"],
 | 
			
		||||
                CODELIST_PROCESS_TYPE_ID,
 | 
			
		||||
            )
 | 
			
		||||
            laws = [self.konova_code_from_json(law, CODELIST_LAW_ID) for law in properties["legal"]["laws"]]
 | 
			
		||||
            obj.legal.laws.set(laws)
 | 
			
		||||
            self.set_responsibility(obj, properties["responsible"])
 | 
			
		||||
            self.set_legal(obj, properties["legal"])
 | 
			
		||||
 | 
			
		||||
            obj.responsible.save()
 | 
			
		||||
            obj.geometry.save()
 | 
			
		||||
@ -83,6 +132,6 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1):
 | 
			
		||||
 | 
			
		||||
            obj.users.add(user)
 | 
			
		||||
 | 
			
		||||
            celery_update_parcels.delay(geometry.id)
 | 
			
		||||
            celery_update_parcels.delay(obj.geometry.id)
 | 
			
		||||
 | 
			
		||||
            return obj.id
 | 
			
		||||
 | 
			
		||||
@ -51,6 +51,15 @@ class AbstractModelAPIViewV1(AbstractModelAPIView):
 | 
			
		||||
            return self.return_error_response(e, 500)
 | 
			
		||||
        return JsonResponse({"id": created_id})
 | 
			
		||||
 | 
			
		||||
    def put(self, request: HttpRequest, id=None):
 | 
			
		||||
        try:
 | 
			
		||||
            body = request.body.decode("utf-8")
 | 
			
		||||
            body = json.loads(body)
 | 
			
		||||
            updated_id = self.serializer.update_model_from_json(id, body, self.user)
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            return self.return_error_response(e, 500)
 | 
			
		||||
        return JsonResponse({"id": updated_id})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InterventionAPIViewV1(AbstractModelAPIViewV1):
 | 
			
		||||
    serializer = InterventionAPISerializerV1
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user