diff --git a/etiquette/objects.py b/etiquette/objects.py index cfaacfa..43d766e 100644 --- a/etiquette/objects.py +++ b/etiquette/objects.py @@ -1207,6 +1207,26 @@ class Tag(ObjectBase, GroupableMixin): return description + @staticmethod + def normalize_name(name, valid_chars=None, min_length=None, max_length=None): + original_name = name + if valid_chars is None: + valid_chars = constants.DEFAULT_CONFIG['tag']['valid_chars'] + + name = name.lower() + name = name.replace('-', '_') + name = name.replace(' ', '_') + name = (c for c in name if c in valid_chars) + name = ''.join(name) + + if min_length is not None and len(name) < min_length: + raise exceptions.TagTooShort(original_name) + + if max_length is not None and len(name) > max_length: + raise exceptions.TagTooLong(name) + + return name + def _uncache(self): self.photodb.caches['tag'].remove(self.id) self._cached_qualified_name = None diff --git a/etiquette/photodb.py b/etiquette/photodb.py index 1306168..a738ffa 100644 --- a/etiquette/photodb.py +++ b/etiquette/photodb.py @@ -892,27 +892,13 @@ class PDBTagMixin: return tag def normalize_tagname(self, tagname): - ''' - Tag names can only consist of characters defined in the config. - The given tagname is lowercased, gets its spaces and hyphens - replaced by underscores, and is stripped of any not-whitelisted - characters. - ''' - original_tagname = tagname - tagname = tagname.lower() - tagname = tagname.replace('-', '_') - tagname = tagname.replace(' ', '_') - tagname = (c for c in tagname if c in self.config['tag']['valid_chars']) - tagname = ''.join(tagname) - - if len(tagname) < self.config['tag']['min_length']: - raise exceptions.TagTooShort(original_tagname) - - elif len(tagname) > self.config['tag']['max_length']: - raise exceptions.TagTooLong(tagname) - - else: - return tagname + tagname = objects.Tag.normalize_name( + tagname, + valid_chars=self.config['tag']['valid_chars'], + min_length=self.config['tag']['min_length'], + max_length=self.config['tag']['max_length'], + ) + return tagname class PDBUserMixin: