Skip to content

Commit 20e5a56

Browse files
committed
update JsonApiException parameters and bug fixes
1 parent 05b6754 commit 20e5a56

File tree

4 files changed

+70
-90
lines changed

4 files changed

+70
-90
lines changed

flask_rest_jsonapi/data_layers/alchemy.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def create_object(self, data, view_kwargs):
5353
self.session.commit()
5454
except Exception as e:
5555
self.session.rollback()
56-
raise JsonApiException({'pointer': '/data'}, "Object creation error: " + str(e))
56+
raise JsonApiException("Object creation error: " + str(e), source={'pointer': '/data'})
5757

5858
self.after_create_object(obj, data, view_kwargs)
5959

@@ -126,8 +126,8 @@ def update_object(self, obj, data, view_kwargs):
126126
if obj is None:
127127
url_field = getattr(self, 'url_field', 'id')
128128
filter_value = view_kwargs[url_field]
129-
raise ObjectNotFound({'parameter': url_field},
130-
'{}: {} not found'.format(self.model.__name__, filter_value))
129+
raise ObjectNotFound('{}: {} not found'.format(self.model.__name__, filter_value),
130+
source={'parameter': url_field})
131131

132132
self.before_update_object(obj, data, view_kwargs)
133133

@@ -142,7 +142,7 @@ def update_object(self, obj, data, view_kwargs):
142142
self.session.commit()
143143
except Exception as e:
144144
self.session.rollback()
145-
raise JsonApiException({'pointer': '/data'}, "Update object error: " + str(e))
145+
raise JsonApiException("Update object error: " + str(e), source={'pointer': '/data'})
146146

147147
self.after_update_object(obj, data, view_kwargs)
148148

@@ -155,8 +155,8 @@ def delete_object(self, obj, view_kwargs):
155155
if obj is None:
156156
url_field = getattr(self, 'url_field', 'id')
157157
filter_value = view_kwargs[url_field]
158-
raise ObjectNotFound({'parameter': url_field},
159-
'{}: {} not found'.format(self.model.__name__, filter_value))
158+
raise ObjectNotFound('{}: {} not found'.format(self.model.__name__, filter_value),
159+
source={'parameter': url_field})
160160

161161
self.before_delete_object(obj, view_kwargs)
162162

@@ -165,7 +165,7 @@ def delete_object(self, obj, view_kwargs):
165165
self.session.commit()
166166
except Exception as e:
167167
self.session.rollback()
168-
raise JsonApiException('', "Delete object error: " + str(e))
168+
raise JsonApiException("Delete object error: " + str(e))
169169

170170
self.after_delete_object(obj, view_kwargs)
171171

@@ -185,11 +185,11 @@ def create_relationship(self, json_data, relationship_field, related_id_field, v
185185
if obj is None:
186186
url_field = getattr(self, 'url_field', 'id')
187187
filter_value = view_kwargs[url_field]
188-
raise ObjectNotFound({'parameter': url_field},
189-
'{}: {} not found'.format(self.model.__name__, filter_value))
188+
raise ObjectNotFound('{}: {} not found'.format(self.model.__name__, filter_value),
189+
source={'parameter': url_field})
190190

191191
if not hasattr(obj, relationship_field):
192-
raise RelationNotFound('', "{} has no attribute {}".format(obj.__class__.__name__, relationship_field))
192+
raise RelationNotFound("{} has no attribute {}".format(obj.__class__.__name__, relationship_field))
193193

194194
related_model = getattr(obj.__class__, relationship_field).property.mapper.class_
195195

@@ -219,7 +219,7 @@ def create_relationship(self, json_data, relationship_field, related_id_field, v
219219
self.session.commit()
220220
except Exception as e:
221221
self.session.rollback()
222-
raise JsonApiException('', "Create relationship error: " + str(e))
222+
raise JsonApiException("Create relationship error: " + str(e))
223223

224224
self.after_create_relationship(obj, updated, json_data, relationship_field, related_id_field, view_kwargs)
225225

@@ -241,11 +241,11 @@ def get_relationship(self, relationship_field, related_type_, related_id_field,
241241
if obj is None:
242242
url_field = getattr(self, 'url_field', 'id')
243243
filter_value = view_kwargs[url_field]
244-
raise ObjectNotFound({'parameter': url_field},
245-
'{}: {} not found'.format(self.model.__name__, filter_value))
244+
raise ObjectNotFound('{}: {} not found'.format(self.model.__name__, filter_value),
245+
source={'parameter': url_field})
246246

247247
if not hasattr(obj, relationship_field):
248-
raise RelationNotFound('', "{} has no attribute {}".format(obj.__class__.__name__, relationship_field))
248+
raise RelationNotFound("{} has no attribute {}".format(obj.__class__.__name__, relationship_field))
249249

250250
related_objects = getattr(obj, relationship_field)
251251

@@ -277,11 +277,11 @@ def update_relationship(self, json_data, relationship_field, related_id_field, v
277277
if obj is None:
278278
url_field = getattr(self, 'url_field', 'id')
279279
filter_value = view_kwargs[url_field]
280-
raise ObjectNotFound({'parameter': url_field},
281-
'{}: {} not found'.format(self.model.__name__, filter_value))
280+
raise ObjectNotFound('{}: {} not found'.format(self.model.__name__, filter_value),
281+
source={'parameter': url_field})
282282

283283
if not hasattr(obj, relationship_field):
284-
raise RelationNotFound('', "{} has no attribute {}".format(obj.__class__.__name__, relationship_field))
284+
raise RelationNotFound("{} has no attribute {}".format(obj.__class__.__name__, relationship_field))
285285

286286
related_model = getattr(obj.__class__, relationship_field).property.mapper.class_
287287

@@ -315,7 +315,7 @@ def update_relationship(self, json_data, relationship_field, related_id_field, v
315315
self.session.commit()
316316
except Exception as e:
317317
self.session.rollback()
318-
raise JsonApiException('', "Update relationship error: " + str(e))
318+
raise JsonApiException("Update relationship error: " + str(e))
319319

320320
self.after_update_relationship(obj, updated, json_data, relationship_field, related_id_field, view_kwargs)
321321

@@ -336,11 +336,11 @@ def delete_relationship(self, json_data, relationship_field, related_id_field, v
336336
if obj is None:
337337
url_field = getattr(self, 'url_field', 'id')
338338
filter_value = view_kwargs[url_field]
339-
raise ObjectNotFound({'parameter': url_field},
340-
'{}: {} not found'.format(self.model.__name__, filter_value))
339+
raise ObjectNotFound('{}: {} not found'.format(self.model.__name__, filter_value),
340+
source={'parameter': url_field})
341341

342342
if not hasattr(obj, relationship_field):
343-
raise RelationNotFound('', "{} has no attribute {}".format(obj.__class__.__name__, relationship_field))
343+
raise RelationNotFound("{} has no attribute {}".format(obj.__class__.__name__, relationship_field))
344344

345345
related_model = getattr(obj.__class__, relationship_field).property.mapper.class_
346346

@@ -362,7 +362,7 @@ def delete_relationship(self, json_data, relationship_field, related_id_field, v
362362
self.session.commit()
363363
except Exception as e:
364364
self.session.rollback()
365-
raise JsonApiException('', "Delete relationship error: " + str(e))
365+
raise JsonApiException("Delete relationship error: " + str(e))
366366

367367
self.after_delete_relationship(obj, updated, json_data, relationship_field, related_id_field, view_kwargs)
368368

@@ -381,9 +381,9 @@ def get_related_object(self, related_model, related_id_field, obj):
381381
.filter(getattr(related_model, related_id_field) == obj['id'])\
382382
.one()
383383
except NoResultFound:
384-
raise RelatedObjectNotFound('', "{}.{}: {} not found".format(related_model.__name__,
385-
related_id_field,
386-
obj['id']))
384+
raise RelatedObjectNotFound("{}.{}: {} not found".format(related_model.__name__,
385+
related_id_field,
386+
obj['id']))
387387

388388
return related_object
389389

flask_rest_jsonapi/exceptions.py

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@ class JsonApiException(Exception):
88

99
title = 'Unknown error'
1010
status = '500'
11+
source = ''
1112

12-
def __init__(self, source, detail, title=None, status=None, code=None, id_=None, links=None, meta=None):
13+
def __init__(self, detail, source=None, title=None, status=None, code=None, id_=None, links=None, meta=None):
1314
"""Initialize a jsonapi exception
1415
1516
:param dict source: the source of the error
1617
:param str detail: the detail of the error
1718
"""
18-
self.source = source
1919
self.detail = detail
20+
if source is not None:
21+
self.source = source
22+
self.source = source
2023
self.code = code
2124
self.id = id_
2225
self.links = links or {}
@@ -49,14 +52,7 @@ class InvalidField(BadRequest):
4952
"""Error to warn that a field specified in fields querystring is not in the requested resource schema"""
5053

5154
title = "Invalid fields querystring parameter."
52-
53-
def __init__(self, detail):
54-
"""Initialize InvalidField error instance
55-
56-
:param str detail: the detail of the error
57-
"""
58-
self.source = {'parameter': 'fields'}
59-
self.detail = detail
55+
source = {'parameter': 'fields'}
6056

6157

6258
class InvalidInclude(BadRequest):
@@ -65,42 +61,21 @@ class InvalidInclude(BadRequest):
6561
"""
6662

6763
title = 'Invalid include querystring parameter.'
68-
69-
def __init__(self, detail):
70-
"""Initialize InvalidInclude error instance
71-
72-
:param str detail: the detail of the error
73-
"""
74-
self.source = {'parameter': 'include'}
75-
self.detail = detail
64+
source = {'parameter': 'include'}
7665

7766

7867
class InvalidFilters(BadRequest):
7968
"""Error to warn that a specified filters in querystring parameter contains errors"""
8069

8170
title = 'Invalid filters querystring parameter.'
82-
83-
def __init__(self, detail):
84-
"""Initialize InvalidField error instance
85-
86-
:param str detail: the detail of the error
87-
"""
88-
self.source = {'parameter': 'filters'}
89-
self.detail = detail
71+
source = {'parameter': 'filters'}
9072

9173

9274
class InvalidSort(BadRequest):
9375
"""Error to warn that a field specified in sort querystring parameter is not in the requested resource schema"""
9476

9577
title = 'Invalid sort querystring parameter.'
96-
97-
def __init__(self, detail):
98-
"""Initialize InvalidField error instance
99-
100-
:param str detail: the detail of the error
101-
"""
102-
self.source = {'parameter': 'sort'}
103-
self.detail = detail
78+
source = {'parameter': 'sort'}
10479

10580

10681
class ObjectNotFound(JsonApiException):

flask_rest_jsonapi/querystring.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def _get_key_values(self, name):
5555
item_value = value
5656
results.update({item_key: item_value})
5757
except Exception:
58-
raise BadRequest({'parameter': key}, "Parse error")
58+
raise BadRequest("Parse error", source={'parameter': key})
5959

6060
return results
6161

@@ -105,16 +105,16 @@ def pagination(self):
105105
result = self._get_key_values('page')
106106
for key, value in result.items():
107107
if key not in ('number', 'size'):
108-
raise BadRequest({'parameter': 'page'}, "{} is not a valid parameter of pagination".format(key))
108+
raise BadRequest("{} is not a valid parameter of pagination".format(key), source={'parameter': 'page'})
109109
try:
110110
int(value)
111111
except ValueError:
112-
raise BadRequest({'parameter': 'page[{}]'.format(key)}, "Parse error")
112+
raise BadRequest("Parse error", source={'parameter': 'page[{}]'.format(key)})
113113

114114
if current_app.config.get('MAX_PAGE_SIZE') is not None and 'size' in result:
115115
if int(result['size']) > current_app.config['MAX_PAGE_SIZE']:
116-
raise BadRequest({'parameter': 'page[size]'},
117-
"Maximum page size is {}".format(current_app.config['MAX_PAGE_SIZE']))
116+
raise BadRequest("Maximum page size is {}".format(current_app.config['MAX_PAGE_SIZE']),
117+
source={'parameter': 'page[size]'})
118118

119119
return result
120120

0 commit comments

Comments
 (0)