Move many errors + warnings to properties of Exception classes
This commit is contained in:
parent
5d1c2dfc40
commit
fcc671a617
5 changed files with 82 additions and 78 deletions
|
@ -101,17 +101,7 @@ SQL_USER = _sql_dictify(SQL_USER_COLUMNS)
|
||||||
|
|
||||||
# Errors and warnings
|
# Errors and warnings
|
||||||
ERROR_DATABASE_OUTOFDATE = 'Database is out-of-date. {current} should be {new}. Please use utilities\\etiquette_upgrader.py'
|
ERROR_DATABASE_OUTOFDATE = 'Database is out-of-date. {current} should be {new}. Please use utilities\\etiquette_upgrader.py'
|
||||||
ERROR_INVALID_ACTION = 'Invalid action'
|
|
||||||
ERROR_NO_SUCH_TAG = 'Tag "{tag}" does not exist'
|
|
||||||
ERROR_NO_TAG_GIVEN = 'No tag name supplied'
|
|
||||||
ERROR_SYNONYM_ITSELF = 'Cant apply synonym to itself'
|
|
||||||
ERROR_TAG_TOO_LONG = '"{tag}" is too long'
|
|
||||||
ERROR_TAG_TOO_SHORT = '"{tag}" has too few valid chars'
|
|
||||||
ERROR_RECURSIVE_GROUPING = 'Recursive grouping'
|
|
||||||
WARNING_MINMAX_INVALID = 'Field "{field}": "{value}" is not a valid request. Ignored.'
|
WARNING_MINMAX_INVALID = 'Field "{field}": "{value}" is not a valid request. Ignored.'
|
||||||
WARNING_MINMAX_OOO = 'Field "{field}": minimum "{min}" maximum "{max}" are out of order. Ignored.'
|
|
||||||
WARNING_NO_SUCH_TAG = 'Tag "{tag}" does not exist. Ignored.'
|
|
||||||
WARNING_NO_SUCH_USER = 'User "{username}" does not exist. Ignored.'
|
|
||||||
WARNING_ORDERBY_INVALID = 'Invalid orderby request "{request}". Ignored.'
|
WARNING_ORDERBY_INVALID = 'Invalid orderby request "{request}". Ignored.'
|
||||||
WARNING_ORDERBY_BADCOL = '"{column}" is not a sorting option. Ignored.'
|
WARNING_ORDERBY_BADCOL = '"{column}" is not a sorting option. Ignored.'
|
||||||
WARNING_ORDERBY_BADDIRECTION = 'You can\'t order "{column}" by "{direction}". Defaulting to descending.'
|
WARNING_ORDERBY_BADDIRECTION = 'You can\'t order "{column}" by "{direction}". Defaulting to descending.'
|
||||||
|
|
|
@ -1,80 +1,117 @@
|
||||||
|
class EtiquetteException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
# NO SUCH
|
# NO SUCH
|
||||||
class NoSuchAlbum(Exception):
|
class NoSuchAlbum(EtiquetteException):
|
||||||
|
error_type = 'NO_SUCH_ALBUM'
|
||||||
|
error_message = 'Album "{album}" does not exist.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class NoSuchBookmark(Exception):
|
class NoSuchBookmark(EtiquetteException):
|
||||||
|
error_type = 'NO_SUCH_BOOKMARK'
|
||||||
|
error_message = 'Bookmark "{bookmark}" does not exist.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class NoSuchGroup(Exception):
|
class NoSuchGroup(EtiquetteException):
|
||||||
|
error_type = 'NO_SUCH_GROUP'
|
||||||
|
error_message = 'Group "{group}" does not exist.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class NoSuchPhoto(Exception):
|
class NoSuchPhoto(EtiquetteException):
|
||||||
|
error_type = 'NO_SUCH_PHOTO'
|
||||||
|
error_message = 'Photo "{photo}" does not exist.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class NoSuchSynonym(Exception):
|
class NoSuchSynonym(EtiquetteException):
|
||||||
|
error_type = 'NO_SUCH_SYNONYM'
|
||||||
|
error_message = 'Synonym "{synonym}" does not exist.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class NoSuchTag(Exception):
|
class NoSuchTag(EtiquetteException):
|
||||||
|
error_type = 'NO_SUCH_TAG'
|
||||||
|
error_message = 'Tag "{tag}" does not exist.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class NoSuchUser(Exception):
|
class NoSuchUser(EtiquetteException):
|
||||||
|
error_type = 'NO_SUCH_User'
|
||||||
|
error_message = 'User "{user}" does not exist.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
# EXISTS
|
# EXISTS
|
||||||
class GroupExists(Exception):
|
class GroupExists(EtiquetteException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class PhotoExists(Exception):
|
class PhotoExists(EtiquetteException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class TagExists(Exception):
|
class TagExists(EtiquetteException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class UserExists(Exception):
|
class UserExists(EtiquetteException):
|
||||||
|
error_type = 'USER_EXISTS'
|
||||||
|
error_message = 'Username "{username}" already exists.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
# TAG ERRORS
|
# TAG ERRORS
|
||||||
class CantSynonymSelf(Exception):
|
class CantSynonymSelf(EtiquetteException):
|
||||||
|
error_type = 'TAG_SYNONYM_ITSELF'
|
||||||
|
error_message = 'Cannot apply synonym to self.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class RecursiveGrouping(Exception):
|
class RecursiveGrouping(EtiquetteException):
|
||||||
|
error_type = 'RECURSIVE_GROUPING'
|
||||||
|
error_message = 'Cannot create a group within itself.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class TagTooLong(Exception):
|
class TagTooLong(EtiquetteException):
|
||||||
|
error_type = 'TAG_TOO_LONG'
|
||||||
|
error_message = 'Tag "{tag}" is too long.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class TagTooShort(Exception):
|
class TagTooShort(EtiquetteException):
|
||||||
|
error_type = 'TAG_TOO_SHORT'
|
||||||
|
error_message = 'Tag "{tag}" has too few valid characters.'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
# USER ERRORS
|
# USER ERRORS
|
||||||
class InvalidUsernameChars(Exception):
|
class InvalidUsernameChars(EtiquetteException):
|
||||||
|
error_type = 'INVALID_USERNAME_CHARACTERS'
|
||||||
|
error_message = 'Username "{username}" contains invalid characters: {badchars}'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class PasswordTooShort(Exception):
|
class PasswordTooShort(EtiquetteException):
|
||||||
|
error_type = 'PASSWORD_TOO_SHORT'
|
||||||
|
error_message = 'Password is shorter than the minimum of {min_length}'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class UsernameTooLong(Exception):
|
class UsernameTooLong(EtiquetteException):
|
||||||
|
error_type = 'USERNAME_TOO_LONG'
|
||||||
|
error_message = 'Username "{username}" is longer than maximum of {max_length}'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class UsernameTooShort(Exception):
|
class UsernameTooShort(EtiquetteException):
|
||||||
|
error_type = 'USERNAME_TOO_SHORT'
|
||||||
|
error_message = 'Username "{username}" is shorter than minimum of {min_length}'
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class WrongLogin(Exception):
|
class WrongLogin(EtiquetteException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
# GENERAL ERRORS
|
# GENERAL ERRORS
|
||||||
class NotExclusive(Exception):
|
class NotExclusive(EtiquetteException):
|
||||||
'''
|
'''
|
||||||
For when two or more mutually exclusive actions have been requested.
|
For when two or more mutually exclusive actions have been requested.
|
||||||
'''
|
'''
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class OutOfOrder(Exception):
|
class OutOfOrder(EtiquetteException):
|
||||||
'''
|
'''
|
||||||
For when a requested range (a, b) has b > a
|
For when a requested minmax range (a, b) has b > a
|
||||||
'''
|
'''
|
||||||
|
error_type = 'OUT_OF_ORDER'
|
||||||
|
error_message = 'Field "{field}": minimum "{min}" and maximum "{max}" are out of order.'
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -723,7 +723,7 @@ class PDBPhotoMixin:
|
||||||
if node.token in frozen_children:
|
if node.token in frozen_children:
|
||||||
continue
|
continue
|
||||||
if warning_bag is not None:
|
if warning_bag is not None:
|
||||||
warning_bag.add(constants.WARNING_NO_SUCH_TAG.format(tag=node.token))
|
warning_bag.add(exceptions.NoSuchTag.error_message.format(tag=node.token))
|
||||||
node.token = None
|
node.token = None
|
||||||
else:
|
else:
|
||||||
raise_no_such_thing(exceptions.NoSuchTag, thing_name=node.token)
|
raise_no_such_thing(exceptions.NoSuchTag, thing_name=node.token)
|
||||||
|
@ -924,13 +924,15 @@ class PDBTagMixin:
|
||||||
|
|
||||||
if len(tagname) < self.config['min_tag_name_length']:
|
if len(tagname) < self.config['min_tag_name_length']:
|
||||||
if warning_bag is not None:
|
if warning_bag is not None:
|
||||||
warning_bag.add(constants.WARNING_TAG_TOO_SHORT.format(tag=tagname))
|
warning_bag.add(exceptions.TagTooShort.error_message.format(tag=tagname))
|
||||||
|
return None
|
||||||
else:
|
else:
|
||||||
raise exceptions.TagTooShort(tagname)
|
raise exceptions.TagTooShort(tagname)
|
||||||
|
|
||||||
elif len(tagname) > self.config['max_tag_name_length']:
|
elif len(tagname) > self.config['max_tag_name_length']:
|
||||||
if warning_bag is not None:
|
if warning_bag is not None:
|
||||||
warning_bag.add(constants.WARNING_TAG_TOO_LONG.format(tag=tagname))
|
warning_bag.add(exceptions.TagTooLong.format(tag=tagname))
|
||||||
|
return None
|
||||||
else:
|
else:
|
||||||
raise exceptions.TagTooLong(tagname)
|
raise exceptions.TagTooLong(tagname)
|
||||||
|
|
||||||
|
|
|
@ -73,14 +73,14 @@ def minmax(key, value, minimums, maximums, warning_bag=None):
|
||||||
warning_bag.add(constants.WARNING_MINMAX_INVALID.format(field=key, value=value))
|
warning_bag.add(constants.WARNING_MINMAX_INVALID.format(field=key, value=value))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
raise e
|
raise
|
||||||
|
|
||||||
except exceptions.OutOfOrder as e:
|
except exceptions.OutOfOrder as e:
|
||||||
if warning_bag:
|
if warning_bag:
|
||||||
warning_bag.add(constants.WARNING_MINMAX_OOO.format(field=key, min=e.args[1], max=e.args[2]))
|
warning_bag.add(e.error_message.format(field=key, min=e.args[1], max=e.args[2]))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
raise e
|
raise
|
||||||
|
|
||||||
if low is not None:
|
if low is not None:
|
||||||
minimums[key] = low
|
minimums[key] = low
|
||||||
|
@ -115,7 +115,7 @@ def normalize_authors(authors, photodb, warning_bag=None):
|
||||||
user = get_user(photodb, requested_author)
|
user = get_user(photodb, requested_author)
|
||||||
except exceptions.NoSuchUser:
|
except exceptions.NoSuchUser:
|
||||||
if warning_bag:
|
if warning_bag:
|
||||||
warning_bag.add(constants.WARNING_NO_SUCH_USER.format(username=requested_author))
|
warning_bag.add(exceptions.NoSuchUser.format(username=requested_author))
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
else:
|
else:
|
||||||
|
@ -307,7 +307,7 @@ def normalize_tag_mmf(tags, photodb, warning_bag=None):
|
||||||
tag = photodb.get_tag(name=tag)
|
tag = photodb.get_tag(name=tag)
|
||||||
except exceptions.NoSuchTag:
|
except exceptions.NoSuchTag:
|
||||||
if warning_bag:
|
if warning_bag:
|
||||||
warning_bag.add(constants.WARNING_NO_SUCH_TAG.format(tag=tag))
|
warning_bag.add(exceptions.NoSuchTag.format(tag=tag))
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
|
@ -239,21 +239,12 @@ def post_register():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
user = P.register_user(username, password_1)
|
user = P.register_user(username, password_1)
|
||||||
except exceptions.UsernameTooShort as e:
|
except EtiquetteException as e:
|
||||||
error = 'Username shorter than minimum of %d' % P.config['min_username_length']
|
response = {
|
||||||
except exceptions.UsernameTooLong as e:
|
'error_type': e.error_type,
|
||||||
error = 'Username longer than maximum of %d' % P.config['max_username_length']
|
'error_message': e.error_message,
|
||||||
except exceptions.InvalidUsernameChars as e:
|
}
|
||||||
error = 'Username contains invalid characters %s' % e.args[0]
|
return jsonify.make_json_response(response, status=400)
|
||||||
except exceptions.PasswordTooShort as e:
|
|
||||||
error = 'Password is shorter than minimum of %d' % P.config['min_password_length']
|
|
||||||
except exceptions.UserExists as e:
|
|
||||||
error = 'User %s already exists' % e.args[0]
|
|
||||||
else:
|
|
||||||
error = None
|
|
||||||
|
|
||||||
if error is not None:
|
|
||||||
return jsonify.make_json_response({'error': error}, status=422)
|
|
||||||
|
|
||||||
session = sessions.Session(request, user)
|
session = sessions.Session(request, user)
|
||||||
session_manager.add(session)
|
session_manager.add(session)
|
||||||
|
@ -684,29 +675,13 @@ def post_photo_remove_tag(photoid):
|
||||||
def post_tag_create_delete_core(tagname, function):
|
def post_tag_create_delete_core(tagname, function):
|
||||||
try:
|
try:
|
||||||
response = function(tagname)
|
response = function(tagname)
|
||||||
except exceptions.TagTooLong:
|
|
||||||
error_type = 'TAG_TOO_LONG'
|
|
||||||
error_message = constants.ERROR_TAG_TOO_LONG.format(tag=tagname)
|
|
||||||
except exceptions.TagTooShort:
|
|
||||||
error_type = 'TAG_TOO_SHORT'
|
|
||||||
error_message = constants.ERROR_TAG_TOO_SHORT.format(tag=tagname)
|
|
||||||
except exceptions.CantSynonymSelf:
|
|
||||||
error_type = 'TAG_SYNONYM_ITSELF'
|
|
||||||
error_message = constants.ERROR_SYNONYM_ITSELF
|
|
||||||
except exceptions.RecursiveGrouping as e:
|
|
||||||
error_type = 'RECURSIVE_GROUPING'
|
|
||||||
error_message = constants.ERROR_RECURSIVE_GROUPING
|
|
||||||
except exceptions.NoSuchTag as e:
|
|
||||||
error_type = 'NO_SUCH_TAG'
|
|
||||||
error_message = constants.ERROR_NO_SUCH_TAG.format(tag=tagname)
|
|
||||||
else:
|
|
||||||
error_type = None
|
|
||||||
|
|
||||||
if error_type is not None:
|
|
||||||
status = 400
|
|
||||||
response = {'error_type': error_type, 'error_message': error_message}
|
|
||||||
else:
|
|
||||||
status = 200
|
status = 200
|
||||||
|
except exceptions.EtiquetteException as e:
|
||||||
|
response = {
|
||||||
|
'error_type': e.error_type,
|
||||||
|
'error_message': e.error_message,
|
||||||
|
}
|
||||||
|
status = 400
|
||||||
|
|
||||||
return jsonify.make_json_response(response, status=status)
|
return jsonify.make_json_response(response, status=status)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue