22
33from sqlalchemy import delete
44from sqlalchemy import select
5+ from sqlalchemy import update
56from sqlalchemy .engine import Result
67
78
89class CreateMixin :
9- """Create object in database."""
10+ """Create object in database.
11+
12+ This mixin supports the following options in the Meta class:
13+ ```
14+ class CustomController(CreateMixin, BaseCRUD):
15+ class Meta:
16+ session = Session
17+ model = Model
18+ input_schema_of_create = InputSchema
19+ output_schema_of_create = OutputSchema
20+
21+ custom_controller = CustomController()
22+ ```
23+
24+ `input_schema_of_create` - marshmallow schema for validating and deserialization input data.
25+ `output_schema_of_create` - marshmallow schema for serialization output data.
26+ """
27+
28+ def create_object (self , ** data ) -> Result :
29+ """If this method does not suit you, simply override it in your class."""
1030
11- def _create_object (self , ** data ) -> Result :
1231 session = self ._get_option_from_meta ('session' )
1332 model = self ._get_option_from_meta ('model' )
1433
@@ -17,69 +36,70 @@ def _create_object(self, **data) -> Result:
1736 session .commit ()
1837 return new_obj
1938
20- def create (self , data : dict , validating : bool = True , jsonify : bool = False ) -> Result or dict :
21- if validating :
22- self ._deserialize_data ('input_schema_of_create' , data )
23-
24- new_object = self ._create_object (** data )
39+ def create (self , data : dict , serialize : bool = False ) -> Result or dict :
40+ deserialized_data = self .deserialize_data ('input_schema_of_create' , data )
41+ new_object = self .create_object (** deserialized_data )
2542
26- if jsonify :
27- return self ._data_to_json ('output_schema_of_create' , new_object )
43+ if serialize :
44+ return self .serialize_data ('output_schema_of_create' , new_object )
2845
2946 return new_object
3047
3148
3249class ReadMixin :
3350 """Read object from database."""
3451
35- def _read_object (self , id : Any ) -> Result :
52+ def get_object (self , id : Any ) -> Result :
53+ """If this method does not suit you, simply override it in your class."""
54+
3655 session = self ._get_option_from_meta ('session' )
3756 model = self ._get_option_from_meta ('model' )
3857 return session .scalars (select (model ).where (model .id == id )).one ()
3958
40- def read (self , id , jsonify : bool = False ) -> Result or dict :
41- obj = self ._read_object (id )
59+ def read (self , id , serialize : bool = False ) -> Result or dict :
60+ obj = self .get_object (id )
4261
43- if jsonify :
44- return self ._data_to_json ('output_schema_of_read' , obj )
62+ if serialize :
63+ return self .serialize_data ('output_schema_of_read' , obj )
4564
4665 return obj
4766
4867
4968class UpdateMixin :
5069 """Update object in database."""
5170
52- def _update_object (self , id : Any , ** data ) -> Result :
71+ def update_object (self , id : Any , ** data ) -> Result :
72+ """If this method does not suit you, simply override it in your class."""
73+
5374 session = self ._get_option_from_meta ('session' )
5475 model = self ._get_option_from_meta ('model' )
5576
77+ stmt = update (model ).where (model .id == id ).values (** data )
78+ session .execute (stmt )
79+
5680 obj = session .scalars (select (model ).where (model .id == id )).one ()
57- for k , v in data .items ():
58- setattr (obj , k , v )
59- session .commit ()
6081 return obj
6182
62- def update (self , data : dict , validating : bool = True , jsonify : bool = False ) -> Result or dict :
63- if validating :
64- self ._deserialize_data ( 'input_schema_of_update' , data )
83+ def update (self , data : dict , serialize : bool = False ) -> Result or dict :
84+ deserialized_data = self . deserialize_data ( 'input_schema_of_update' , data )
85+ updated_object = self .update_object ( ** deserialized_data )
6586
66- updated_object = self ._update_object (** data )
67-
68- if jsonify :
69- return self ._data_to_json ('output_schema_of_update' , updated_object )
87+ if serialize :
88+ return self .serialize_data ('output_schema_of_update' , updated_object )
7089
7190 return updated_object
7291
7392
7493class DeleteMixin :
7594 """Delete object from database."""
7695
77- def _delete_object (self , id : Any ) -> None :
96+ def delete_object (self , id : Any ) -> None :
97+ """If this method does not suit you, simply override it in your class."""
98+
7899 session = self ._get_option_from_meta ('session' )
79100 model = self ._get_option_from_meta ('model' )
80101
81102 session .execute (delete (model ).where (model .id == id ))
82- session .commit ()
83103
84104 def delete (self , id : Any ) -> None :
85- self ._delete_object (id )
105+ self .delete_object (id )
0 commit comments