Completely revise exception message formatting technique
This commit is contained in:
		
							parent
							
								
									901020781c
								
							
						
					
					
						commit
						888c3b48cd
					
				
					 7 changed files with 122 additions and 123 deletions
				
			
		|  | @ -1,104 +1,100 @@ | ||||||
|  | import re | ||||||
|  | 
 | ||||||
|  | def pascal_to_loudsnakes(text): | ||||||
|  |     match = re.findall('[A-Z][a-z]*', text) | ||||||
|  |     text = '_'.join(match) | ||||||
|  |     text = text.upper() | ||||||
|  |     return text | ||||||
|  | 
 | ||||||
| class EtiquetteException(Exception): | class EtiquetteException(Exception): | ||||||
|     pass |     error_message = '' | ||||||
|  |     def __init__(self, *args): | ||||||
|  |         self.error_type = pascal_to_loudsnakes(type(self).__name__) | ||||||
|  |         Exception.__init__(self, *args) | ||||||
|  | 
 | ||||||
|  | class WithFormat(EtiquetteException): | ||||||
|  |     def __init__(self, *args, **kwargs): | ||||||
|  |         self.error_message = self.error_message.format(*args, **kwargs) | ||||||
|  |         EtiquetteException.__init__(self, self.error_message) | ||||||
| 
 | 
 | ||||||
| # NO SUCH | # NO SUCH | ||||||
| class NoSuchAlbum(EtiquetteException): | class NoSuch(WithFormat): | ||||||
|     error_type = 'NO_SUCH_ALBUM' |  | ||||||
|     error_message = 'Album "{album}" does not exist.' |  | ||||||
|     pass |     pass | ||||||
| 
 | 
 | ||||||
| class NoSuchBookmark(EtiquetteException): | class NoSuchAlbum(NoSuch): | ||||||
|     error_type = 'NO_SUCH_BOOKMARK' |     error_message = 'Album "{}" does not exist.' | ||||||
|     error_message = 'Bookmark "{bookmark}" does not exist.' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class NoSuchGroup(EtiquetteException): | class NoSuchBookmark(NoSuch): | ||||||
|     error_type = 'NO_SUCH_GROUP' |     error_message = 'Bookmark "{}" does not exist.' | ||||||
|     error_message = 'Group "{group}" does not exist.' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class NoSuchPhoto(EtiquetteException): | class NoSuchGroup(NoSuch): | ||||||
|     error_type = 'NO_SUCH_PHOTO' |     error_message = 'Group "{}" does not exist.' | ||||||
|     error_message = 'Photo "{photo}" does not exist.' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class NoSuchSynonym(EtiquetteException): | class NoSuchPhoto(NoSuch): | ||||||
|     error_type = 'NO_SUCH_SYNONYM' |     error_message = 'Photo "{}" does not exist.' | ||||||
|     error_message = 'Synonym "{synonym}" does not exist.' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class NoSuchTag(EtiquetteException): | class NoSuchSynonym(NoSuch): | ||||||
|     error_type = 'NO_SUCH_TAG' |     error_message = 'Synonym "{}" does not exist.' | ||||||
|     error_message = 'Tag "{tag}" does not exist.' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class NoSuchUser(EtiquetteException): | class NoSuchTag(NoSuch): | ||||||
|     error_type = 'NO_SUCH_User' |     error_message = 'Tag "{}" does not exist.' | ||||||
|     error_message = 'User "{user}" does not exist.' | 
 | ||||||
|     pass | class NoSuchUser(NoSuch): | ||||||
|  |     error_message = 'User "{}" does not exist.' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # EXISTS | # EXISTS | ||||||
| class GroupExists(EtiquetteException): | class GroupExists(WithFormat): | ||||||
|     pass |     error_message = '{member} already in group {group}' | ||||||
| 
 | 
 | ||||||
| class PhotoExists(EtiquetteException): | class PhotoExists(WithFormat): | ||||||
|     pass |     error_message = 'Photo "{}" already exists.' | ||||||
|  |     def __init__(self, photo): | ||||||
|  |         self.photo = photo | ||||||
|  |         WithFormat.__init__(self, photo.id) | ||||||
| 
 | 
 | ||||||
| class TagExists(EtiquetteException): | class TagExists(WithFormat): | ||||||
|     pass |     error_message = 'Tag "{}" already exists.' | ||||||
|  |     def __init__(self, tag): | ||||||
|  |         self.tag = tag | ||||||
|  |         WithFormat.__init__(self, tag.name) | ||||||
| 
 | 
 | ||||||
| class UserExists(EtiquetteException): | class UserExists(WithFormat): | ||||||
|     error_type = 'USER_EXISTS' |     error_message = 'User "{}" already exists.' | ||||||
|     error_message = 'Username "{username}" already exists.' |     def __init__(self, user): | ||||||
|     pass |         self.user = user | ||||||
|  |         WithFormat.__init__(self, user.username) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # TAG ERRORS | # TAG ERRORS | ||||||
| class CantSynonymSelf(EtiquetteException): | class CantSynonymSelf(EtiquetteException): | ||||||
|     error_type = 'TAG_SYNONYM_ITSELF' |  | ||||||
|     error_message = 'Cannot apply synonym to self.' |     error_message = 'Cannot apply synonym to self.' | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class RecursiveGrouping(EtiquetteException): | class RecursiveGrouping(EtiquetteException): | ||||||
|     error_type = 'RECURSIVE_GROUPING' |     error_message = '{group} is an ancestor of {member}.' | ||||||
|     error_message = 'Cannot create a group within itself.' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class TagTooLong(EtiquetteException): | class TagTooLong(WithFormat): | ||||||
|     error_type = 'TAG_TOO_LONG' |     error_message = 'Tag "{}" is too long.' | ||||||
|     error_message = 'Tag "{tag}" is too long.' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class TagTooShort(EtiquetteException): | class TagTooShort(WithFormat): | ||||||
|     error_type = 'TAG_TOO_SHORT' |     error_message = 'Tag "{}" has too few valid characters.' | ||||||
|     error_message = 'Tag "{tag}" has too few valid characters.' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # USER ERRORS | # USER ERRORS | ||||||
| class InvalidUsernameChars(EtiquetteException): | class InvalidUsernameChars(WithFormat): | ||||||
|     error_type = 'INVALID_USERNAME_CHARACTERS' |     error_message = 'Username "{username}" contains invalid characters: {badchars}.' | ||||||
|     error_message = 'Username "{username}" contains invalid characters: {badchars}' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class PasswordTooShort(EtiquetteException): | class PasswordTooShort(WithFormat): | ||||||
|     error_type = 'PASSWORD_TOO_SHORT' |     error_message = 'Password is shorter than the minimum of {min_length}.' | ||||||
|     error_message = 'Password is shorter than the minimum of {min_length}' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class UsernameTooLong(EtiquetteException): | class UsernameTooLong(WithFormat): | ||||||
|     error_type = 'USERNAME_TOO_LONG' |     error_message = 'Username "{username}" is longer than maximum of {max_length}.' | ||||||
|     error_message = 'Username "{username}" is longer than maximum of {max_length}' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class UsernameTooShort(EtiquetteException): | class UsernameTooShort(WithFormat): | ||||||
|     error_type = 'USERNAME_TOO_SHORT' |     error_message = 'Username "{username}" is shorter than minimum of {min_length}.' | ||||||
|     error_message = 'Username "{username}" is shorter than minimum of {min_length}' |  | ||||||
|     pass |  | ||||||
| 
 | 
 | ||||||
| class WrongLogin(EtiquetteException): | class WrongLogin(EtiquetteException): | ||||||
|     pass |     error_message = 'Wrong username-password combination.' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # GENERAL ERRORS | # GENERAL ERRORS | ||||||
|  | @ -108,10 +104,8 @@ class NotExclusive(EtiquetteException): | ||||||
|     ''' |     ''' | ||||||
|     pass |     pass | ||||||
| 
 | 
 | ||||||
| class OutOfOrder(EtiquetteException): | class OutOfOrder(WithFormat): | ||||||
|     ''' |     ''' | ||||||
|     For when a requested minmax range (a, b) has b > a |     For when a requested minmax range (a, b) has b > a | ||||||
|     ''' |     ''' | ||||||
|     error_type = 'OUT_OF_ORDER' |     error_message = 'Range "{range}": minimum "{min}" and maximum "{max}" are out of order.' | ||||||
|     error_message = 'Field "{field}": minimum "{min}" and maximum "{max}" are out of order.' |  | ||||||
|     pass |  | ||||||
|  |  | ||||||
|  | @ -151,7 +151,7 @@ def get_mimetype(filepath): | ||||||
| 
 | 
 | ||||||
| def hyphen_range(s): | def hyphen_range(s): | ||||||
|     ''' |     ''' | ||||||
|     Given a string like '1-3', return ints (1, 3) representing lower |     Given a string like '1-3', return numbers (1, 3) representing lower | ||||||
|     and upper bounds. |     and upper bounds. | ||||||
| 
 | 
 | ||||||
|     Supports bytestring.parsebytes and hh:mm:ss format. |     Supports bytestring.parsebytes and hh:mm:ss format. | ||||||
|  | @ -173,7 +173,7 @@ def hyphen_range(s): | ||||||
|     low = _unitconvert(low) |     low = _unitconvert(low) | ||||||
|     high = _unitconvert(high) |     high = _unitconvert(high) | ||||||
|     if low is not None and high is not None and low > high: |     if low is not None and high is not None and low > high: | ||||||
|         raise exceptions.OutOfOrder(s, low, high) |         raise exceptions.OutOfOrder(range=s, min=low, max=high) | ||||||
|     return low, high |     return low, high | ||||||
| 
 | 
 | ||||||
| def hms_to_seconds(hms): | def hms_to_seconds(hms): | ||||||
|  |  | ||||||
|  | @ -61,11 +61,11 @@ class GroupableMixin: | ||||||
|                 that_group = self |                 that_group = self | ||||||
|             else: |             else: | ||||||
|                 that_group = self.group_getter(id=parent_id) |                 that_group = self.group_getter(id=parent_id) | ||||||
|             raise exceptions.GroupExists('%s already in group %s' % (member, that_group)) |             raise exceptions.GroupExists(member=member, group=that_group) | ||||||
| 
 | 
 | ||||||
|         for parent in self.walk_parents(): |         for parent in self.walk_parents(): | ||||||
|             if parent == member: |             if parent == member: | ||||||
|                 raise exceptions.RecursiveGrouping('%s is an ancestor of %s' % (member, self)) |                 raise exceptions.RecursiveGrouping(member=member, group=self) | ||||||
| 
 | 
 | ||||||
|         self.photodb._cached_frozen_children = None |         self.photodb._cached_frozen_children = None | ||||||
|         cur.execute( |         cur.execute( | ||||||
|  | @ -808,8 +808,9 @@ class Tag(ObjectBase, GroupableMixin): | ||||||
|     def add_synonym(self, synname, *, commit=True): |     def add_synonym(self, synname, *, commit=True): | ||||||
|         synname = self.photodb.normalize_tagname(synname) |         synname = self.photodb.normalize_tagname(synname) | ||||||
| 
 | 
 | ||||||
|  |         print(synname, self.name) | ||||||
|         if synname == self.name: |         if synname == self.name: | ||||||
|             raise ValueError('Cannot assign synonym to itself.') |             raise exceptions.CantSynonymSelf() | ||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             self.photodb.get_tag_by_name(synname) |             self.photodb.get_tag_by_name(synname) | ||||||
|  |  | ||||||
|  | @ -163,14 +163,14 @@ def operate(operand_stack, operator_stack): | ||||||
|     operand_stack.append(value) |     operand_stack.append(value) | ||||||
|     #print('after:', operand_stack, operator_stack) |     #print('after:', operand_stack, operator_stack) | ||||||
| 
 | 
 | ||||||
| def raise_no_such_thing(exception_class, thing_id=None, thing_name=None, comment=''): | # def raise_no_such_thing(exception_class, thing_id=None, thing_name=None, comment=''): | ||||||
|     if thing_id is not None: | #     if thing_id is not None: | ||||||
|         message = 'ID: %s. %s' % (thing_id, comment) | #         message = 'ID: %s. %s' % (thing_id, comment) | ||||||
|     elif thing_name is not None: | #     elif thing_name is not None: | ||||||
|         message = 'Name: %s. %s' % (thing_name, comment) | #         message = 'Name: %s. %s' % (thing_name, comment) | ||||||
|     else: | #     else: | ||||||
|         message = '' | #         message = '' | ||||||
|     raise exception_class(message) | #     raise exception_class(message) | ||||||
| 
 | 
 | ||||||
| def searchfilter_must_may_forbid(photo_tags, tag_musts, tag_mays, tag_forbids, frozen_children): | def searchfilter_must_may_forbid(photo_tags, tag_musts, tag_mays, tag_forbids, frozen_children): | ||||||
|     if tag_musts and not all(any(option in photo_tags for option in frozen_children[must]) for must in tag_musts): |     if tag_musts and not all(any(option in photo_tags for option in frozen_children[must]) for must in tag_musts): | ||||||
|  | @ -382,7 +382,7 @@ class PDBPhotoMixin: | ||||||
|         cur.execute('SELECT * FROM photos WHERE filepath == ?', [filepath]) |         cur.execute('SELECT * FROM photos WHERE filepath == ?', [filepath]) | ||||||
|         fetch = cur.fetchone() |         fetch = cur.fetchone() | ||||||
|         if fetch is None: |         if fetch is None: | ||||||
|             raise_no_such_thing(exceptions.NoSuchPhoto, thing_name=filepath) |             raise exceptions.NoSuchPhoto(filepath) | ||||||
|         photo = objects.Photo(self, fetch) |         photo = objects.Photo(self, fetch) | ||||||
|         return photo |         return photo | ||||||
| 
 | 
 | ||||||
|  | @ -440,9 +440,7 @@ class PDBPhotoMixin: | ||||||
|             except exceptions.NoSuchPhoto: |             except exceptions.NoSuchPhoto: | ||||||
|                 pass |                 pass | ||||||
|             else: |             else: | ||||||
|                 exc = exceptions.PhotoExists(filename, existing) |                 raise exceptions.PhotoExists(existing) | ||||||
|                 exc.photo = existing |  | ||||||
|                 raise exc |  | ||||||
| 
 | 
 | ||||||
|         self.log.debug('New Photo: %s' % filename) |         self.log.debug('New Photo: %s' % filename) | ||||||
|         author_id = self.get_user_id_or_none(author) |         author_id = self.get_user_id_or_none(author) | ||||||
|  | @ -743,11 +741,14 @@ class PDBPhotoMixin: | ||||||
|             for node in expression_tree.walk_leaves(): |             for node in expression_tree.walk_leaves(): | ||||||
|                 if node.token in frozen_children: |                 if node.token in frozen_children: | ||||||
|                     continue |                     continue | ||||||
|  | 
 | ||||||
|  |                 exc = exceptions.NoSuchTag(node.token) | ||||||
|                 if warning_bag is not None: |                 if warning_bag is not None: | ||||||
|                     warning_bag.add(exceptions.NoSuchTag.error_message.format(tag=node.token)) |                     warning_bag.add(exc.error_message) | ||||||
|                     node.token = None |                     node.token = None | ||||||
|                 else: |                 else: | ||||||
|                     raise_no_such_thing(exceptions.NoSuchTag, thing_name=node.token) |                     raise exc | ||||||
|  | 
 | ||||||
|             expression_tree.prune() |             expression_tree.prune() | ||||||
| 
 | 
 | ||||||
|         if filename: |         if filename: | ||||||
|  | @ -873,10 +874,8 @@ class PDBTagMixin: | ||||||
| 
 | 
 | ||||||
|         if id is not None: |         if id is not None: | ||||||
|             return self.get_tag_by_id(id) |             return self.get_tag_by_id(id) | ||||||
|         elif name is not None: |  | ||||||
|             return self.get_tag_by_name(name) |  | ||||||
|         else: |         else: | ||||||
|             raise_no_such_thing(exceptions.NoSuchTag, thing_id=id, thing_name=name) |             return self.get_tag_by_name(name) | ||||||
| 
 | 
 | ||||||
|     def get_tag_by_id(self, id): |     def get_tag_by_id(self, id): | ||||||
|         return self.get_thing_by_id('tag', thing_id=id) |         return self.get_thing_by_id('tag', thing_id=id) | ||||||
|  | @ -890,17 +889,18 @@ class PDBTagMixin: | ||||||
| 
 | 
 | ||||||
|         cur = self.sql.cursor() |         cur = self.sql.cursor() | ||||||
|         while True: |         while True: | ||||||
|             # Return if it's a toplevel, or resolve the synonym and try that. |             # Return if it's a toplevel... | ||||||
|             cur.execute('SELECT * FROM tags WHERE name == ?', [tagname]) |             cur.execute('SELECT * FROM tags WHERE name == ?', [tagname]) | ||||||
|             fetch = cur.fetchone() |             fetch = cur.fetchone() | ||||||
|             if fetch is not None: |             if fetch is not None: | ||||||
|                 return objects.Tag(self, fetch) |                 return objects.Tag(self, fetch) | ||||||
| 
 | 
 | ||||||
|  |             # ...or resolve the synonym and try again. | ||||||
|             cur.execute('SELECT * FROM tag_synonyms WHERE name == ?', [tagname]) |             cur.execute('SELECT * FROM tag_synonyms WHERE name == ?', [tagname]) | ||||||
|             fetch = cur.fetchone() |             fetch = cur.fetchone() | ||||||
|             if fetch is None: |             if fetch is None: | ||||||
|                 # was not a top tag or synonym |                 # was not a master tag or synonym | ||||||
|                 raise_no_such_thing(exceptions.NoSuchTag, thing_name=tagname) |                 raise exceptions.NoSuchTag(tagname) | ||||||
|             tagname = fetch[constants.SQL_SYN['master']] |             tagname = fetch[constants.SQL_SYN['master']] | ||||||
| 
 | 
 | ||||||
|     def get_tags(self): |     def get_tags(self): | ||||||
|  | @ -935,6 +935,7 @@ class PDBTagMixin: | ||||||
|         replaced by underscores, and is stripped of any not-whitelisted |         replaced by underscores, and is stripped of any not-whitelisted | ||||||
|         characters. |         characters. | ||||||
|         ''' |         ''' | ||||||
|  |         original_tagname = tagname | ||||||
|         tagname = tagname.lower() |         tagname = tagname.lower() | ||||||
|         tagname = tagname.replace('-', '_') |         tagname = tagname.replace('-', '_') | ||||||
|         tagname = tagname.replace(' ', '_') |         tagname = tagname.replace(' ', '_') | ||||||
|  | @ -942,18 +943,20 @@ class PDBTagMixin: | ||||||
|         tagname = ''.join(tagname) |         tagname = ''.join(tagname) | ||||||
| 
 | 
 | ||||||
|         if len(tagname) < self.config['min_tag_name_length']: |         if len(tagname) < self.config['min_tag_name_length']: | ||||||
|  |             exc = exceptions.TagTooShort(original_tagname) | ||||||
|             if warning_bag is not None: |             if warning_bag is not None: | ||||||
|                 warning_bag.add(exceptions.TagTooShort.error_message.format(tag=tagname)) |                 warning_bag.add(exc.error_message) | ||||||
|                 return None |                 return None | ||||||
|             else: |             else: | ||||||
|                 raise exceptions.TagTooShort(tagname) |                 raise exc | ||||||
| 
 | 
 | ||||||
|         elif len(tagname) > self.config['max_tag_name_length']: |         elif len(tagname) > self.config['max_tag_name_length']: | ||||||
|  |             exc = exceptions.TagTooLong(tagname) | ||||||
|             if warning_bag is not None: |             if warning_bag is not None: | ||||||
|                 warning_bag.add(exceptions.TagTooLong.format(tag=tagname)) |                 warning_bag.add(exc.error_message) | ||||||
|                 return None |                 return None | ||||||
|             else: |             else: | ||||||
|                 raise exceptions.TagTooLong(tagname) |                 raise exc | ||||||
| 
 | 
 | ||||||
|         else: |         else: | ||||||
|             return tagname |             return tagname | ||||||
|  | @ -1033,20 +1036,20 @@ class PDBUserMixin: | ||||||
| 
 | 
 | ||||||
|     def register_user(self, username, password, commit=True): |     def register_user(self, username, password, commit=True): | ||||||
|         if len(username) < self.config['min_username_length']: |         if len(username) < self.config['min_username_length']: | ||||||
|             raise exceptions.UsernameTooShort(username) |             raise exceptions.UsernameTooShort(username=username, min_length=self.config['min_username_length']) | ||||||
| 
 | 
 | ||||||
|         if len(username) > self.config['max_username_length']: |         if len(username) > self.config['max_username_length']: | ||||||
|             raise exceptions.UsernameTooLong(username) |             raise exceptions.UsernameTooLong(username=username, max_length=self.config['max_username_length']) | ||||||
| 
 | 
 | ||||||
|         badchars = [c for c in username if c not in self.config['valid_username_chars']] |         badchars = [c for c in username if c not in self.config['valid_username_chars']] | ||||||
|         if badchars: |         if badchars: | ||||||
|             raise exceptions.InvalidUsernameChars(badchars) |             raise exceptions.InvalidUsernameChars(username=username, badchars=badchars) | ||||||
| 
 | 
 | ||||||
|         if not isinstance(password, bytes): |         if not isinstance(password, bytes): | ||||||
|             password = password.encode('utf-8') |             password = password.encode('utf-8') | ||||||
| 
 | 
 | ||||||
|         if len(password) < self.config['min_password_length']: |         if len(password) < self.config['min_password_length']: | ||||||
|             raise exceptions.PasswordTooShort |             raise exceptions.PasswordTooShort(min_length=self.config['min_password_length']) | ||||||
| 
 | 
 | ||||||
|         cur = self.sql.cursor() |         cur = self.sql.cursor() | ||||||
|         cur.execute('SELECT * FROM users WHERE username == ?', [username]) |         cur.execute('SELECT * FROM users WHERE username == ?', [username]) | ||||||
|  | @ -1288,7 +1291,7 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs | ||||||
|         ebstring = ebstring.strip() |         ebstring = ebstring.strip() | ||||||
|         ebstring = ebstring.strip('.+=') |         ebstring = ebstring.strip('.+=') | ||||||
|         if ebstring == '': |         if ebstring == '': | ||||||
|             return |             return output_notes | ||||||
| 
 | 
 | ||||||
|         if '=' in ebstring and '+' in ebstring: |         if '=' in ebstring and '+' in ebstring: | ||||||
|             raise ValueError('Cannot rename and assign snynonym at once') |             raise ValueError('Cannot rename and assign snynonym at once') | ||||||
|  | @ -1312,7 +1315,7 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs | ||||||
|             raise ValueError('Too many plus signs') |             raise ValueError('Too many plus signs') | ||||||
| 
 | 
 | ||||||
|         if not tag: |         if not tag: | ||||||
|             return None |             return output_notes | ||||||
| 
 | 
 | ||||||
|         if rename_to: |         if rename_to: | ||||||
|             tag = self.get_tag(tag) |             tag = self.get_tag(tag) | ||||||
|  | @ -1382,7 +1385,7 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs | ||||||
|         cur.execute(query, [thing_id]) |         cur.execute(query, [thing_id]) | ||||||
|         thing = cur.fetchone() |         thing = cur.fetchone() | ||||||
|         if thing is None: |         if thing is None: | ||||||
|             return raise_no_such_thing(thing_map['exception'], thing_id=thing_id) |             raise thing_map['exception'](thing_id) | ||||||
|         thing = thing_map['class'](self, thing) |         thing = thing_map['class'](self, thing) | ||||||
|         return thing |         return thing | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -77,7 +77,7 @@ def minmax(key, value, minimums, maximums, warning_bag=None): | ||||||
| 
 | 
 | ||||||
|     except exceptions.OutOfOrder as e: |     except exceptions.OutOfOrder as e: | ||||||
|         if warning_bag: |         if warning_bag: | ||||||
|             warning_bag.add(e.error_message.format(field=key, min=e.args[1], max=e.args[2])) |             warning_bag.add(e.error_message) | ||||||
|             return |             return | ||||||
|         else: |         else: | ||||||
|             raise |             raise | ||||||
|  | @ -113,9 +113,9 @@ def normalize_authors(authors, photodb, warning_bag=None): | ||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             user = get_user(photodb, requested_author) |             user = get_user(photodb, requested_author) | ||||||
|         except exceptions.NoSuchUser: |         except exceptions.NoSuchUser as e: | ||||||
|             if warning_bag: |             if warning_bag: | ||||||
|                 warning_bag.add(exceptions.NoSuchUser.format(username=requested_author)) |                 warning_bag.add(e.error_message) | ||||||
|             else: |             else: | ||||||
|                 raise |                 raise | ||||||
|         else: |         else: | ||||||
|  | @ -309,9 +309,9 @@ def normalize_tag_mmf(tags, photodb, warning_bag=None): | ||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             tag = photodb.get_tag(name=tag) |             tag = photodb.get_tag(name=tag) | ||||||
|         except exceptions.NoSuchTag: |         except exceptions.NoSuchTag as e: | ||||||
|             if warning_bag: |             if warning_bag: | ||||||
|                 warning_bag.add(exceptions.NoSuchTag.format(tag=tag)) |                 warning_bag.add(e.error_message) | ||||||
|                 continue |                 continue | ||||||
|             else: |             else: | ||||||
|                 raise |                 raise | ||||||
|  |  | ||||||
|  | @ -76,11 +76,16 @@ def P_wrapper(function): | ||||||
|             return function(thingid) |             return function(thingid) | ||||||
| 
 | 
 | ||||||
|         except exceptions.EtiquetteException as e: |         except exceptions.EtiquetteException as e: | ||||||
|  |             if isinstance(e, exceptions.NoSuch): | ||||||
|  |                 status = 404 | ||||||
|  |             else: | ||||||
|  |                 status = 400 | ||||||
|  | 
 | ||||||
|             if response_type == 'html': |             if response_type == 'html': | ||||||
|                 flask.abort(404, e.error_message) |                 flask.abort(status, e.error_message) | ||||||
|             else: |             else: | ||||||
|                 response = {'error_type': e.error_type, 'error_message': e.error_message} |                 response = {'error_type': e.error_type, 'error_message': e.error_message} | ||||||
|                 response = jsonify.make_json_response(response, status=404) |                 response = jsonify.make_json_response(response, status=status) | ||||||
|                 flask.abort(response) |                 flask.abort(response) | ||||||
| 
 | 
 | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|  | @ -390,21 +395,17 @@ def get_file(photoid): | ||||||
|         return send_file(photo.real_filepath, override_mimetype=photo.mimetype) |         return send_file(photo.real_filepath, override_mimetype=photo.mimetype) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_photo_core(photoid): |  | ||||||
|     photo = P_photo(photoid) |  | ||||||
|     return photo |  | ||||||
| 
 |  | ||||||
| @site.route('/photo/<photoid>', methods=['GET']) | @site.route('/photo/<photoid>', methods=['GET']) | ||||||
| @session_manager.give_token | @session_manager.give_token | ||||||
| def get_photo_html(photoid): | def get_photo_html(photoid): | ||||||
|     photo = get_photo_core(photoid) |     photo = P_photo(photoid, response_type='html') | ||||||
|     session = session_manager.get(request) |     session = session_manager.get(request) | ||||||
|     return flask.render_template('photo.html', photo=photo, session=session) |     return flask.render_template('photo.html', photo=photo, session=session) | ||||||
| 
 | 
 | ||||||
| @site.route('/photo/<photoid>.json', methods=['GET']) | @site.route('/photo/<photoid>.json', methods=['GET']) | ||||||
| @session_manager.give_token | @session_manager.give_token | ||||||
| def get_photo_json(photoid): | def get_photo_json(photoid): | ||||||
|     photo = get_photo_core(photoid) |     photo = P_photo(photoid, response_type='json') | ||||||
|     photo = jsonify.photo(photo) |     photo = jsonify.photo(photo) | ||||||
|     photo = jsonify.make_json_response(photo) |     photo = jsonify.make_json_response(photo) | ||||||
|     return photo |     return photo | ||||||
|  |  | ||||||
|  | @ -133,10 +133,10 @@ function receive_callback(responses) | ||||||
|     { |     { | ||||||
|         var response = responses[index]; |         var response = responses[index]; | ||||||
|         var tagname = response["tagname"]; |         var tagname = response["tagname"]; | ||||||
|         if ("error" in response) |         if ("error_type" in response) | ||||||
|         { |         { | ||||||
|             message_positivity = "message_negative"; |             message_positivity = "message_negative"; | ||||||
|             message_text = '"' + tagname + '" ' + response["error"]; |             message_text = '"' + tagname + '" ' + response["error_message"]; | ||||||
|         } |         } | ||||||
|         else if ("action" in response) |         else if ("action" in response) | ||||||
|         { |         { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue