Skip to content
This repository was archived by the owner on Dec 16, 2025. It is now read-only.

Commit 46a1478

Browse files
committed
pass view_kwargs as dict to update it, enhance logical abstraction management, fix wrong attribute spelling and enhance relationships management
1 parent 8adee36 commit 46a1478

File tree

8 files changed

+220
-218
lines changed

8 files changed

+220
-218
lines changed

flask_rest_jsonapi/data_layers/alchemy.py

Lines changed: 80 additions & 87 deletions
Large diffs are not rendered by default.

flask_rest_jsonapi/data_layers/base.py

Lines changed: 43 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,20 @@ class BaseDataLayer(object):
2525
'before_delete_relationship',
2626
'after_delete_relationship')
2727

28-
def __init__(self, **kwargs):
28+
def __init__(self, kwargs):
2929
"""Intialize an data layer instance with kwargs
3030
3131
:param dict kwargs: information about data layer instance
3232
"""
33+
kwargs.pop('class', None)
34+
3335
for key, value in kwargs.items():
3436
setattr(self, key, value)
3537

3638
if kwargs.get('methods') is not None:
3739
self.bound_additional_methods()
3840

39-
def create_object(self, data, **view_kwargs):
41+
def create_object(self, data, view_kwargs):
4042
"""Create an object
4143
4244
:param dict data: the data validated by marshmallow
@@ -45,15 +47,15 @@ def create_object(self, data, **view_kwargs):
4547
"""
4648
raise NotImplementedError
4749

48-
def get_object(self, **view_kwargs):
50+
def get_object(self, view_kwargs):
4951
"""Retrieve an object
5052
5153
:params dict view_kwargs: kwargs from the resource view
5254
:return DeclarativeMeta: an object
5355
"""
5456
raise NotImplementedError
5557

56-
def get_collection(self, qs, **view_kwargs):
58+
def get_collection(self, qs, view_kwargs):
5759
"""Retrieve a collection of objects
5860
5961
:param QueryStringManager qs: a querystring manager to retrieve information from url
@@ -62,7 +64,7 @@ def get_collection(self, qs, **view_kwargs):
6264
"""
6365
raise NotImplementedError
6466

65-
def update_object(self, obj, data, **view_kwargs):
67+
def update_object(self, obj, data, view_kwargs):
6668
"""Update an object
6769
6870
:param DeclarativeMeta obj: an object
@@ -72,73 +74,73 @@ def update_object(self, obj, data, **view_kwargs):
7274
"""
7375
raise NotImplementedError
7476

75-
def delete_object(self, obj, **view_kwargs):
77+
def delete_object(self, obj, view_kwargs):
7678
"""Delete an item through the data layer
7779
7880
:param DeclarativeMeta obj: an object
7981
:param dict view_kwargs: kwargs from the resource view
8082
"""
8183
raise NotImplementedError
8284

83-
def create_relationship(self, json_data, relationship_field, related_id_field, **view_kwargs):
85+
def create_relationship(self, json_data, relationship_field, related_id_field, view_kwargs):
8486
"""Create a relationship
8587
8688
:param dict json_data: the request params
87-
:param str relationship_field: the model attribut used for relationship
89+
:param str relationship_field: the model attribute used for relationship
8890
:param str related_id_field: the identifier field of the related model
8991
:param dict view_kwargs: kwargs from the resource view
9092
:return boolean: True if relationship have changed else False
9193
"""
9294
raise NotImplementedError
9395

94-
def get_relationship(self, relationship_field, related_type_, related_id_field, **view_kwargs):
96+
def get_relationship(self, relationship_field, related_type_, related_id_field, view_kwargs):
9597
"""Get information about a relationship
9698
97-
:param str relationship_field: the model attribut used for relationship
99+
:param str relationship_field: the model attribute used for relationship
98100
:param str related_type_: the related resource type
99101
:param str related_id_field: the identifier field of the related model
100102
:param dict view_kwargs: kwargs from the resource view
101103
:return tuple: the object and related object(s)
102104
"""
103105
raise NotImplementedError
104106

105-
def update_relationship(self, json_data, relationship_field, related_id_field, **view_kwargs):
107+
def update_relationship(self, json_data, relationship_field, related_id_field, view_kwargs):
106108
"""Update a relationship
107109
108110
:param dict json_data: the request params
109-
:param str relationship_field: the model attribut used for relationship
111+
:param str relationship_field: the model attribute used for relationship
110112
:param str related_id_field: the identifier field of the related model
111113
:param dict view_kwargs: kwargs from the resource view
112114
:return boolean: True if relationship have changed else False
113115
"""
114116
raise NotImplementedError
115117

116-
def delete_relationship(self, json_data, relationship_field, related_id_field, **view_kwargs):
118+
def delete_relationship(self, json_data, relationship_field, related_id_field, view_kwargs):
117119
"""Delete a relationship
118120
119121
:param dict json_data: the request params
120-
:param str relationship_field: the model attribut used for relationship
122+
:param str relationship_field: the model attribute used for relationship
121123
:param str related_id_field: the identifier field of the related model
122124
:param dict view_kwargs: kwargs from the resource view
123125
"""
124126
raise NotImplementedError
125127

126-
def query(self, **view_kwargs):
128+
def query(self, view_kwargs):
127129
"""Construct the base query to retrieve wanted data
128130
129131
:param dict view_kwargs: kwargs from the resource view
130132
"""
131133
raise NotImplementedError
132134

133-
def before_create_object(self, data, **view_kwargs):
135+
def before_create_object(self, data, view_kwargs):
134136
"""Provide additional data before object creation
135137
136138
:param dict data: the data validated by marshmallow
137139
:param dict view_kwargs: kwargs from the resource view
138140
"""
139141
raise NotImplementedError
140142

141-
def after_create_object(self, obj, data, **view_kwargs):
143+
def after_create_object(self, obj, data, view_kwargs):
142144
"""Provide additional data after object creation
143145
144146
:param obj: an object from data layer
@@ -147,30 +149,30 @@ def after_create_object(self, obj, data, **view_kwargs):
147149
"""
148150
raise NotImplementedError
149151

150-
def before_get_object(self, **view_kwargs):
152+
def before_get_object(self, view_kwargs):
151153
"""Make work before to retrieve an object
152154
153155
:param dict view_kwargs: kwargs from the resource view
154156
"""
155157
raise NotImplementedError
156158

157-
def after_get_object(self, obj, **view_kwargs):
159+
def after_get_object(self, obj, view_kwargs):
158160
"""Make work after to retrieve an object
159161
160162
:param obj: an object from data layer
161163
:param dict view_kwargs: kwargs from the resource view
162164
"""
163165
raise NotImplementedError
164166

165-
def before_get_collection(self, qs, **view_kwargs):
167+
def before_get_collection(self, qs, view_kwargs):
166168
"""Make work before to retrieve a collection of objects
167169
168170
:param QueryStringManager qs: a querystring manager to retrieve information from url
169171
:param dict view_kwargs: kwargs from the resource view
170172
"""
171173
raise NotImplementedError
172174

173-
def after_get_collection(self, collection, qs, **view_kwargs):
175+
def after_get_collection(self, collection, qs, view_kwargs):
174176
"""Make work after to retrieve a collection of objects
175177
176178
:param iterable collection: the collection of objects
@@ -179,7 +181,7 @@ def after_get_collection(self, collection, qs, **view_kwargs):
179181
"""
180182
raise NotImplementedError
181183

182-
def before_update_object(self, obj, data, **view_kwargs):
184+
def before_update_object(self, obj, data, view_kwargs):
183185
"""Make checks or provide additional data before update object
184186
185187
:param obj: an object from data layer
@@ -188,7 +190,7 @@ def before_update_object(self, obj, data, **view_kwargs):
188190
"""
189191
raise NotImplementedError
190192

191-
def after_update_object(self, obj, data, **view_kwargs):
193+
def after_update_object(self, obj, data, view_kwargs):
192194
"""Make work after update object
193195
194196
:param obj: an object from data layer
@@ -197,50 +199,50 @@ def after_update_object(self, obj, data, **view_kwargs):
197199
"""
198200
raise NotImplementedError
199201

200-
def before_delete_object(self, obj, **view_kwargs):
202+
def before_delete_object(self, obj, view_kwargs):
201203
"""Make checks before delete object
202204
203205
:param obj: an object from data layer
204206
:param dict view_kwargs: kwargs from the resource view
205207
"""
206208
raise NotImplementedError
207209

208-
def after_delete_object(self, obj, **view_kwargs):
210+
def after_delete_object(self, obj, view_kwargs):
209211
"""Make work after delete object
210212
211213
:param obj: an object from data layer
212214
:param dict view_kwargs: kwargs from the resource view
213215
"""
214216
raise NotImplementedError
215217

216-
def before_create_relationship(self, json_data, relationship_field, related_id_field, **view_kwargs):
218+
def before_create_relationship(self, json_data, relationship_field, related_id_field, view_kwargs):
217219
"""Make work before to create a relationship
218220
219221
:param dict json_data: the request params
220-
:param str relationship_field: the model attribut used for relationship
222+
:param str relationship_field: the model attribute used for relationship
221223
:param str related_id_field: the identifier field of the related model
222224
:param dict view_kwargs: kwargs from the resource view
223225
:return boolean: True if relationship have changed else False
224226
"""
225227
raise NotImplementedError
226228

227-
def after_create_relationship(self, obj, updated, json_data, relationship_field, related_id_field, **view_kwargs):
229+
def after_create_relationship(self, obj, updated, json_data, relationship_field, related_id_field, view_kwargs):
228230
"""Make work after to create a relationship
229231
230232
:param obj: an object from data layer
231233
:param bool updated: True if object was updated else False
232234
:param dict json_data: the request params
233-
:param str relationship_field: the model attribut used for relationship
235+
:param str relationship_field: the model attribute used for relationship
234236
:param str related_id_field: the identifier field of the related model
235237
:param dict view_kwargs: kwargs from the resource view
236238
:return boolean: True if relationship have changed else False
237239
"""
238240
raise NotImplementedError
239241

240-
def before_get_relationship(self, relationship_field, related_type_, related_id_field, **view_kwargs):
242+
def before_get_relationship(self, relationship_field, related_type_, related_id_field, view_kwargs):
241243
"""Make work before to get information about a relationship
242244
243-
:param str relationship_field: the model attribut used for relationship
245+
:param str relationship_field: the model attribute used for relationship
244246
:param str related_type_: the related resource type
245247
:param str related_id_field: the identifier field of the related model
246248
:param dict view_kwargs: kwargs from the resource view
@@ -249,60 +251,60 @@ def before_get_relationship(self, relationship_field, related_type_, related_id_
249251
raise NotImplementedError
250252

251253
def after_get_relationship(self, obj, related_objects, relationship_field, related_type_, related_id_field,
252-
**view_kwargs):
254+
view_kwargs):
253255
"""Make work after to get information about a relationship
254256
255257
:param obj: an object from data layer
256258
:param iterable related_objects: related objects of the object
257-
:param str relationship_field: the model attribut used for relationship
259+
:param str relationship_field: the model attribute used for relationship
258260
:param str related_type_: the related resource type
259261
:param str related_id_field: the identifier field of the related model
260262
:param dict view_kwargs: kwargs from the resource view
261263
:return tuple: the object and related object(s)
262264
"""
263265
raise NotImplementedError
264266

265-
def before_update_relationship(self, json_data, relationship_field, related_id_field, **view_kwargs):
267+
def before_update_relationship(self, json_data, relationship_field, related_id_field, view_kwargs):
266268
"""Make work before to update a relationship
267269
268270
:param dict json_data: the request params
269-
:param str relationship_field: the model attribut used for relationship
271+
:param str relationship_field: the model attribute used for relationship
270272
:param str related_id_field: the identifier field of the related model
271273
:param dict view_kwargs: kwargs from the resource view
272274
:return boolean: True if relationship have changed else False
273275
"""
274276
raise NotImplementedError
275277

276-
def after_update_relationship(self, obj, updated, json_data, relationship_field, related_id_field, **view_kwargs):
278+
def after_update_relationship(self, obj, updated, json_data, relationship_field, related_id_field, view_kwargs):
277279
"""Make work after to update a relationship
278280
279281
:param obj: an object from data layer
280282
:param bool updated: True if object was updated else False
281283
:param dict json_data: the request params
282-
:param str relationship_field: the model attribut used for relationship
284+
:param str relationship_field: the model attribute used for relationship
283285
:param str related_id_field: the identifier field of the related model
284286
:param dict view_kwargs: kwargs from the resource view
285287
:return boolean: True if relationship have changed else False
286288
"""
287289
raise NotImplementedError
288290

289-
def before_delete_relationship(self, json_data, relationship_field, related_id_field, **view_kwargs):
291+
def before_delete_relationship(self, json_data, relationship_field, related_id_field, view_kwargs):
290292
"""Make work before to delete a relationship
291293
292294
:param dict json_data: the request params
293-
:param str relationship_field: the model attribut used for relationship
295+
:param str relationship_field: the model attribute used for relationship
294296
:param str related_id_field: the identifier field of the related model
295297
:param dict view_kwargs: kwargs from the resource view
296298
"""
297299
raise NotImplementedError
298300

299-
def after_delete_relationship(self, obj, updated, json_data, relationship_field, related_id_field, **view_kwargs):
301+
def after_delete_relationship(self, obj, updated, json_data, relationship_field, related_id_field, view_kwargs):
300302
"""Make work after to delete a relationship
301303
302304
:param obj: an object from data layer
303305
:param bool updated: True if object was updated else False
304306
:param dict json_data: the request params
305-
:param str relationship_field: the model attribut used for relationship
307+
:param str relationship_field: the model attribute used for relationship
306308
:param str related_id_field: the identifier field of the related model
307309
:param dict view_kwargs: kwargs from the resource view
308310
"""

flask_rest_jsonapi/data_layers/filtering/alchemy.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlalchemy import and_, or_, not_
44

55
from flask_rest_jsonapi.exceptions import InvalidFilters
6-
from flask_rest_jsonapi.schema import get_relationships
6+
from flask_rest_jsonapi.schema import get_relationships, get_model_field
77

88

99
def create_filters(model, filter_info, resource):
@@ -68,7 +68,7 @@ def name(self):
6868
name = name.split('__')[0]
6969

7070
if name not in self.schema._declared_fields:
71-
raise InvalidFilters("{} has no attribut {}".format(self.schema.__name__, name))
71+
raise InvalidFilters("{} has no attribute {}".format(self.schema.__name__, name))
7272

7373
return name
7474

@@ -109,13 +109,12 @@ def column(self):
109109
"""
110110
field = self.name
111111

112-
if self.schema._declared_fields[field].attribute is not None:
113-
field = self.schema._declared_fields[field].attribute
112+
model_field = get_model_field(self.schema, field)
114113

115114
try:
116-
return getattr(self.model, field)
115+
return getattr(self.model, model_field)
117116
except AttributeError:
118-
raise InvalidFilters("{} has no attribute {} in a filter".format(self.model.__name__, field))
117+
raise InvalidFilters("{} has no attribute {} in a filter".format(self.model.__name__, model_field))
119118

120119
@property
121120
def operator(self):
@@ -153,14 +152,12 @@ def related_model(self):
153152
"""
154153
relationship_field = self.name
155154

156-
if relationship_field not in get_relationships(self.schema):
157-
raise InvalidFilters("{} has no relationship attribut {}".format(self.schema.__name__, relationship_field))
155+
if relationship_field not in get_relationships(self.schema).values():
156+
raise InvalidFilters("{} has no relationship attribute {}".format(self.schema.__name__, relationship_field))
158157

159-
if hasattr(self.resource, 'schema_to_model') and\
160-
self.resource.schema_to_model.get(relationship_field) is not None:
161-
relationship_field = self.resource.schema_to_model[relationship_field]
158+
relationship_model_field = get_model_field(self.schema, relationship_field)
162159

163-
return getattr(self.model, relationship_field).property.mapper.class_
160+
return getattr(self.model, relationship_model_field).property.mapper.class_
164161

165162
@property
166163
def related_schema(self):
@@ -170,7 +167,7 @@ def related_schema(self):
170167
"""
171168
relationship_field = self.name
172169

173-
if relationship_field not in get_relationships(self.schema):
174-
raise InvalidFilters("{} has no relationship attribut {}".format(self.schema.__name__, relationship_field))
170+
if relationship_field not in get_relationships(self.schema).values():
171+
raise InvalidFilters("{} has no relationship attribute {}".format(self.schema.__name__, relationship_field))
175172

176173
return self.schema._declared_fields[relationship_field].schema.__class__

flask_rest_jsonapi/pagination.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@ def add_pagination_links(data, object_count, querystring, base_url):
3232
if last_page > 1:
3333
links['first'] = links['last'] = base_url
3434

35-
try:
36-
del all_qs_args['page[number]']
37-
except KeyError:
38-
pass
35+
all_qs_args.pop('page[number]', None)
3936

4037
# compute first link
4138
if all_qs_args:

0 commit comments

Comments
 (0)