Organize config by nesting related stuff.
I thought about switching to .ini files but that's even less desirable.
This commit is contained in:
parent
c3c86de7f8
commit
bd847159fa
4 changed files with 105 additions and 75 deletions
|
@ -150,35 +150,52 @@ DEFAULT_THUMBDIR = 'site_thumbnails'
|
||||||
DEFAULT_CONFIGURATION = {
|
DEFAULT_CONFIGURATION = {
|
||||||
'log_level': logging.DEBUG,
|
'log_level': logging.DEBUG,
|
||||||
|
|
||||||
'cache_size_album': 1000,
|
'cache_size': {
|
||||||
'cache_size_photo': 100000,
|
'album': 1000,
|
||||||
'cache_size_tag': 1000,
|
'photo': 100000,
|
||||||
'cache_size_user': 200,
|
'tag': 1000,
|
||||||
|
'user': 200,
|
||||||
|
},
|
||||||
|
|
||||||
'enable_album_edit': True,
|
'enable_feature': {
|
||||||
'enable_login': True,
|
'album': {
|
||||||
'enable_new_album': True,
|
'edit': True,
|
||||||
'enable_new_bookmark': True,
|
'new': True,
|
||||||
'enable_new_photo': True,
|
},
|
||||||
'enable_new_tag': True,
|
'bookmark': {
|
||||||
'enable_new_user': True,
|
'edit': True,
|
||||||
'enable_bookmark_edit': True,
|
'new': True,
|
||||||
'enable_photo_add_remove_tag': True,
|
},
|
||||||
'enable_photo_edit': True,
|
'photo': {
|
||||||
'enable_photo_generate_thumbnail': True,
|
'add_remove_tag': True,
|
||||||
'enable_photo_reload_metadata': True,
|
'new': True,
|
||||||
'enable_tag_edit': True,
|
'edit': True,
|
||||||
|
'generate_thumbnail': True,
|
||||||
|
'reload_metadata': True,
|
||||||
|
},
|
||||||
|
'tag': {
|
||||||
|
'edit': True,
|
||||||
|
'new': True,
|
||||||
|
},
|
||||||
|
'user': {
|
||||||
|
'login': True,
|
||||||
|
'new': True,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
'min_tag_name_length': 1,
|
'tag': {
|
||||||
'max_tag_name_length': 32,
|
'min_length': 1,
|
||||||
'valid_tag_chars': string.ascii_lowercase + string.digits + '_()',
|
'max_length': 32,
|
||||||
|
'valid_chars': string.ascii_lowercase + string.digits + '_()',
|
||||||
|
},
|
||||||
|
|
||||||
'min_username_length': 2,
|
'user': {
|
||||||
'max_username_length': 24,
|
'min_length': 2,
|
||||||
'valid_username_chars': string.ascii_letters + string.digits + '~!@#$%^*()[]{}:;,.<>/\\-_+=',
|
'min_password_length': 6,
|
||||||
'min_password_length': 6,
|
'max_length': 24,
|
||||||
|
'valid_chars': string.ascii_letters + string.digits + '~!@#$%^*()[]{}:;,.<>/\\-_+=',
|
||||||
|
},
|
||||||
|
|
||||||
'id_length': 12,
|
|
||||||
'digest_exclude_files': [
|
'digest_exclude_files': [
|
||||||
'phototagger.db',
|
'phototagger.db',
|
||||||
'desktop.ini',
|
'desktop.ini',
|
||||||
|
@ -188,9 +205,10 @@ DEFAULT_CONFIGURATION = {
|
||||||
'_site_thumbnails',
|
'_site_thumbnails',
|
||||||
],
|
],
|
||||||
|
|
||||||
'file_read_chunk': 2 ** 20,
|
'id_length': 12,
|
||||||
'thumbnail_width': 400,
|
'thumbnail_width': 400,
|
||||||
'thumbnail_height': 400,
|
'thumbnail_height': 400,
|
||||||
|
|
||||||
'motd_strings': [
|
'motd_strings': [
|
||||||
'Good morning, Paul. What will your first sequence of the day be?',
|
'Good morning, Paul. What will your first sequence of the day be?',
|
||||||
],
|
],
|
||||||
|
|
|
@ -22,8 +22,20 @@ def required_feature(features):
|
||||||
else:
|
else:
|
||||||
config = self.config
|
config = self.config
|
||||||
|
|
||||||
if not all(config[key] for key in features):
|
config = config['enable_feature']
|
||||||
raise exceptions.FeatureDisabled(function.__name__)
|
|
||||||
|
# Using the received string like "photo.new", try to navigate the
|
||||||
|
# config and wind up at a True.
|
||||||
|
# Allow KeyErrors to raise themselves.
|
||||||
|
for feature in features:
|
||||||
|
cfg = config
|
||||||
|
pieces = feature.split('.')
|
||||||
|
for piece in pieces:
|
||||||
|
cfg = cfg[piece]
|
||||||
|
if cfg is False:
|
||||||
|
raise exceptions.FeatureDisabled(function.__qualname__)
|
||||||
|
if cfg is not True:
|
||||||
|
raise ValueError('Bad required_feature "%s" led to %s' % (feature, cfg))
|
||||||
|
|
||||||
return function(self, *args, **kwargs)
|
return function(self, *args, **kwargs)
|
||||||
return wrapped
|
return wrapped
|
||||||
|
|
|
@ -241,11 +241,11 @@ class Album(ObjectBase, GroupableMixin):
|
||||||
self._sum_bytes_photos = None
|
self._sum_bytes_photos = None
|
||||||
self._sum_bytes_albums = None
|
self._sum_bytes_albums = None
|
||||||
|
|
||||||
@decorators.required_feature('enable_album_edit')
|
@decorators.required_feature('album.edit')
|
||||||
def add(self, *args, **kwargs):
|
def add(self, *args, **kwargs):
|
||||||
return super().add(*args, **kwargs)
|
return super().add(*args, **kwargs)
|
||||||
|
|
||||||
@decorators.required_feature('enable_album_edit')
|
@decorators.required_feature('album.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def add_associated_directory(self, filepath, *, commit=True):
|
def add_associated_directory(self, filepath, *, commit=True):
|
||||||
filepath = pathclass.Path(filepath)
|
filepath = pathclass.Path(filepath)
|
||||||
|
@ -277,7 +277,7 @@ class Album(ObjectBase, GroupableMixin):
|
||||||
self.photodb.log.debug('Committing - add associated directory')
|
self.photodb.log.debug('Committing - add associated directory')
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_album_edit')
|
@decorators.required_feature('album.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def add_photo(self, photo, *, commit=True):
|
def add_photo(self, photo, *, commit=True):
|
||||||
if self.photodb != photo.photodb:
|
if self.photodb != photo.photodb:
|
||||||
|
@ -325,7 +325,7 @@ class Album(ObjectBase, GroupableMixin):
|
||||||
directories = [pathclass.Path(x) for x in directories]
|
directories = [pathclass.Path(x) for x in directories]
|
||||||
return directories
|
return directories
|
||||||
|
|
||||||
@decorators.required_feature('enable_album_edit')
|
@decorators.required_feature('album.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def delete(self, *, delete_children=False, commit=True):
|
def delete(self, *, delete_children=False, commit=True):
|
||||||
self.photodb.log.debug('Deleting album {album:r}'.format(album=self))
|
self.photodb.log.debug('Deleting album {album:r}'.format(album=self))
|
||||||
|
@ -346,7 +346,7 @@ class Album(ObjectBase, GroupableMixin):
|
||||||
else:
|
else:
|
||||||
return self.id
|
return self.id
|
||||||
|
|
||||||
@decorators.required_feature('enable_album_edit')
|
@decorators.required_feature('album.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def edit(self, title=None, description=None, *, commit=True):
|
def edit(self, title=None, description=None, *, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -378,11 +378,11 @@ class Album(ObjectBase, GroupableMixin):
|
||||||
)
|
)
|
||||||
return cur.fetchone() is not None
|
return cur.fetchone() is not None
|
||||||
|
|
||||||
@decorators.required_feature('enable_album_edit')
|
@decorators.required_feature('album.edit')
|
||||||
def join_group(self, *args, **kwargs):
|
def join_group(self, *args, **kwargs):
|
||||||
return super().join_group(*args, **kwargs)
|
return super().join_group(*args, **kwargs)
|
||||||
|
|
||||||
@decorators.required_feature('enable_album_edit')
|
@decorators.required_feature('album.edit')
|
||||||
def leave_group(self, *args, **kwargs):
|
def leave_group(self, *args, **kwargs):
|
||||||
return super().leave_group(*args, **kwargs)
|
return super().leave_group(*args, **kwargs)
|
||||||
|
|
||||||
|
@ -400,7 +400,7 @@ class Album(ObjectBase, GroupableMixin):
|
||||||
photos.sort(key=lambda x: x.basename.lower())
|
photos.sort(key=lambda x: x.basename.lower())
|
||||||
return photos
|
return photos
|
||||||
|
|
||||||
@decorators.required_feature('enable_album_edit')
|
@decorators.required_feature('album.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def remove_photo(self, photo, *, commit=True):
|
def remove_photo(self, photo, *, commit=True):
|
||||||
if not self.has_photo(photo):
|
if not self.has_photo(photo):
|
||||||
|
@ -454,7 +454,7 @@ class Bookmark(ObjectBase):
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return 'Bookmark:{id}'.format(id=self.id)
|
return 'Bookmark:{id}'.format(id=self.id)
|
||||||
|
|
||||||
@decorators.required_feature('enable_bookmark_edit')
|
@decorators.required_feature('bookmark.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def delete(self, *, commit=True):
|
def delete(self, *, commit=True):
|
||||||
cur = self.photodb.sql.cursor()
|
cur = self.photodb.sql.cursor()
|
||||||
|
@ -462,7 +462,7 @@ class Bookmark(ObjectBase):
|
||||||
if commit:
|
if commit:
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_bookmark_edit')
|
@decorators.required_feature('bookmark.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def edit(self, title=None, url=None, *, commit=True):
|
def edit(self, title=None, url=None, *, commit=True):
|
||||||
if title is None and url is None:
|
if title is None and url is None:
|
||||||
|
@ -547,7 +547,7 @@ class Photo(ObjectBase):
|
||||||
def _uncache(self):
|
def _uncache(self):
|
||||||
self.photodb.caches['photo'].remove(self.id)
|
self.photodb.caches['photo'].remove(self.id)
|
||||||
|
|
||||||
@decorators.required_feature('enable_photo_add_remove_tag')
|
@decorators.required_feature('photo.add_remove_tag')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def add_tag(self, tag, *, commit=True):
|
def add_tag(self, tag, *, commit=True):
|
||||||
tag = self.photodb.get_tag(tag)
|
tag = self.photodb.get_tag(tag)
|
||||||
|
@ -599,7 +599,7 @@ class Photo(ObjectBase):
|
||||||
return bytestring.bytestring(self.bytes)
|
return bytestring.bytestring(self.bytes)
|
||||||
return '??? b'
|
return '??? b'
|
||||||
|
|
||||||
@decorators.required_feature('enable_photo_add_remove_tag')
|
@decorators.required_feature('photo.add_remove_tag')
|
||||||
def copy_tags(self, other_photo):
|
def copy_tags(self, other_photo):
|
||||||
'''
|
'''
|
||||||
Take all of the tags owned by other_photo and apply them to this photo.
|
Take all of the tags owned by other_photo and apply them to this photo.
|
||||||
|
@ -607,7 +607,7 @@ class Photo(ObjectBase):
|
||||||
for tag in other_photo.tags():
|
for tag in other_photo.tags():
|
||||||
self.add_tag(tag)
|
self.add_tag(tag)
|
||||||
|
|
||||||
@decorators.required_feature('enable_photo_edit')
|
@decorators.required_feature('photo.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def delete(self, *, delete_file=False, commit=True):
|
def delete(self, *, delete_file=False, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -638,7 +638,7 @@ class Photo(ObjectBase):
|
||||||
return helpers.seconds_to_hms(self.duration)
|
return helpers.seconds_to_hms(self.duration)
|
||||||
|
|
||||||
#@decorators.time_me
|
#@decorators.time_me
|
||||||
@decorators.required_feature('enable_photo_generate_thumbnail')
|
@decorators.required_feature('photo.generate_thumbnail')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def generate_thumbnail(self, *, commit=True, **special):
|
def generate_thumbnail(self, *, commit=True, **special):
|
||||||
'''
|
'''
|
||||||
|
@ -773,7 +773,7 @@ class Photo(ObjectBase):
|
||||||
return hopeful_filepath
|
return hopeful_filepath
|
||||||
|
|
||||||
#@decorators.time_me
|
#@decorators.time_me
|
||||||
@decorators.required_feature('enable_photo_reload_metadata')
|
@decorators.required_feature('photo.reload_metadata')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def reload_metadata(self, *, commit=True):
|
def reload_metadata(self, *, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -830,7 +830,7 @@ class Photo(ObjectBase):
|
||||||
self.photodb.log.debug('Committing - reload metadata')
|
self.photodb.log.debug('Committing - reload metadata')
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_photo_edit')
|
@decorators.required_feature('photo.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def relocate(self, new_filepath, *, allow_duplicates=False, commit=True):
|
def relocate(self, new_filepath, *, allow_duplicates=False, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -864,7 +864,7 @@ class Photo(ObjectBase):
|
||||||
self.photodb.log.debug('Commit - relocate photo')
|
self.photodb.log.debug('Commit - relocate photo')
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_photo_add_remove_tag')
|
@decorators.required_feature('photo.add_remove_tag')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def remove_tag(self, tag, *, commit=True):
|
def remove_tag(self, tag, *, commit=True):
|
||||||
tag = self.photodb.get_tag(tag)
|
tag = self.photodb.get_tag(tag)
|
||||||
|
@ -884,7 +884,7 @@ class Photo(ObjectBase):
|
||||||
self.photodb.log.debug('Committing - remove photo tag')
|
self.photodb.log.debug('Committing - remove photo tag')
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_photo_edit')
|
@decorators.required_feature('photo.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def rename_file(self, new_filename, *, move=False, commit=True):
|
def rename_file(self, new_filename, *, move=False, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -1007,11 +1007,11 @@ class Tag(ObjectBase, GroupableMixin):
|
||||||
self.photodb.caches['tag'].remove(self.id)
|
self.photodb.caches['tag'].remove(self.id)
|
||||||
self._cached_qualified_name = None
|
self._cached_qualified_name = None
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
def add(self, *args, **kwargs):
|
def add(self, *args, **kwargs):
|
||||||
return super().add(*args, **kwargs)
|
return super().add(*args, **kwargs)
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
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)
|
||||||
|
@ -1037,7 +1037,7 @@ class Tag(ObjectBase, GroupableMixin):
|
||||||
|
|
||||||
return synname
|
return synname
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def convert_to_synonym(self, mastertag, *, commit=True):
|
def convert_to_synonym(self, mastertag, *, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -1087,7 +1087,7 @@ class Tag(ObjectBase, GroupableMixin):
|
||||||
self.photodb.log.debug('Committing - convert to synonym')
|
self.photodb.log.debug('Committing - convert to synonym')
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def delete(self, *, delete_children=False, commit=True):
|
def delete(self, *, delete_children=False, commit=True):
|
||||||
self.photodb.log.debug('Deleting tag {tag:r}'.format(tag=self))
|
self.photodb.log.debug('Deleting tag {tag:r}'.format(tag=self))
|
||||||
|
@ -1102,7 +1102,7 @@ class Tag(ObjectBase, GroupableMixin):
|
||||||
self.photodb.log.debug('Committing - delete tag')
|
self.photodb.log.debug('Committing - delete tag')
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def edit(self, description=None, *, commit=True):
|
def edit(self, description=None, *, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -1121,11 +1121,11 @@ class Tag(ObjectBase, GroupableMixin):
|
||||||
self.photodb.log.debug('Committing - edit tag')
|
self.photodb.log.debug('Committing - edit tag')
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
def join_group(self, *args, **kwargs):
|
def join_group(self, *args, **kwargs):
|
||||||
return super().join_group(*args, **kwargs)
|
return super().join_group(*args, **kwargs)
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
def leave_group(self, *args, **kwargs):
|
def leave_group(self, *args, **kwargs):
|
||||||
return super().leave_group(*args, **kwargs)
|
return super().leave_group(*args, **kwargs)
|
||||||
|
|
||||||
|
@ -1164,7 +1164,7 @@ class Tag(ObjectBase, GroupableMixin):
|
||||||
|
|
||||||
return qualname
|
return qualname
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def remove_synonym(self, synname, *, commit=True):
|
def remove_synonym(self, synname, *, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -1191,7 +1191,7 @@ class Tag(ObjectBase, GroupableMixin):
|
||||||
self.photodb.log.debug('Committing - remove synonym')
|
self.photodb.log.debug('Committing - remove synonym')
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
@decorators.required_feature('enable_tag_edit')
|
@decorators.required_feature('tag.edit')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def rename(self, new_name, *, apply_to_synonyms=True, commit=True):
|
def rename(self, new_name, *, apply_to_synonyms=True, commit=True):
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -215,7 +215,7 @@ class PDBAlbumMixin:
|
||||||
if album.parent() is None:
|
if album.parent() is None:
|
||||||
yield album
|
yield album
|
||||||
|
|
||||||
@decorators.required_feature('enable_new_album')
|
@decorators.required_feature('album.new')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def new_album(
|
def new_album(
|
||||||
self,
|
self,
|
||||||
|
@ -283,7 +283,7 @@ class PDBBookmarkMixin:
|
||||||
def get_bookmarks(self):
|
def get_bookmarks(self):
|
||||||
yield from self.get_things(thing_type='bookmark')
|
yield from self.get_things(thing_type='bookmark')
|
||||||
|
|
||||||
@decorators.required_feature('enable_new_bookmark')
|
@decorators.required_feature('bookmark.new')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def new_bookmark(self, url, title=None, *, author=None, commit=True):
|
def new_bookmark(self, url, title=None, *, author=None, commit=True):
|
||||||
if not url:
|
if not url:
|
||||||
|
@ -356,7 +356,7 @@ class PDBPhotoMixin:
|
||||||
if count <= 0:
|
if count <= 0:
|
||||||
break
|
break
|
||||||
|
|
||||||
@decorators.required_feature('enable_new_photo')
|
@decorators.required_feature('photo.new')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def new_photo(
|
def new_photo(
|
||||||
self,
|
self,
|
||||||
|
@ -894,7 +894,7 @@ class PDBTagMixin:
|
||||||
if tag.parent() is None:
|
if tag.parent() is None:
|
||||||
yield tag
|
yield tag
|
||||||
|
|
||||||
@decorators.required_feature('enable_new_tag')
|
@decorators.required_feature('tag.new')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
def new_tag(self, tagname, description=None, *, commit=True):
|
def new_tag(self, tagname, description=None, *, commit=True):
|
||||||
'''
|
'''
|
||||||
|
@ -936,13 +936,13 @@ class PDBTagMixin:
|
||||||
tagname = tagname.lower()
|
tagname = tagname.lower()
|
||||||
tagname = tagname.replace('-', '_')
|
tagname = tagname.replace('-', '_')
|
||||||
tagname = tagname.replace(' ', '_')
|
tagname = tagname.replace(' ', '_')
|
||||||
tagname = (c for c in tagname if c in self.config['valid_tag_chars'])
|
tagname = (c for c in tagname if c in self.config['tag']['valid_chars'])
|
||||||
tagname = ''.join(tagname)
|
tagname = ''.join(tagname)
|
||||||
|
|
||||||
if len(tagname) < self.config['min_tag_name_length']:
|
if len(tagname) < self.config['tag']['min_length']:
|
||||||
raise exceptions.TagTooShort(original_tagname)
|
raise exceptions.TagTooShort(original_tagname)
|
||||||
|
|
||||||
elif len(tagname) > self.config['max_tag_name_length']:
|
elif len(tagname) > self.config['tag']['max_length']:
|
||||||
raise exceptions.TagTooLong(tagname)
|
raise exceptions.TagTooLong(tagname)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
@ -1006,7 +1006,7 @@ class PDBUserMixin:
|
||||||
author_id = None
|
author_id = None
|
||||||
return author_id
|
return author_id
|
||||||
|
|
||||||
@decorators.required_feature('enable_login')
|
@decorators.required_feature('user.login')
|
||||||
def login(self, user_id, password):
|
def login(self, user_id, password):
|
||||||
cur = self.sql.cursor()
|
cur = self.sql.cursor()
|
||||||
cur.execute('SELECT * FROM users WHERE id == ?', [user_id])
|
cur.execute('SELECT * FROM users WHERE id == ?', [user_id])
|
||||||
|
@ -1026,30 +1026,30 @@ class PDBUserMixin:
|
||||||
|
|
||||||
return objects.User(self, fetch)
|
return objects.User(self, fetch)
|
||||||
|
|
||||||
@decorators.required_feature('enable_new_user')
|
@decorators.required_feature('user.new')
|
||||||
@decorators.transaction
|
@decorators.transaction
|
||||||
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['user']['min_length']:
|
||||||
raise exceptions.UsernameTooShort(
|
raise exceptions.UsernameTooShort(
|
||||||
username=username,
|
username=username,
|
||||||
min_length=self.config['min_username_length']
|
min_length=self.config['user']['min_length']
|
||||||
)
|
)
|
||||||
|
|
||||||
if len(username) > self.config['max_username_length']:
|
if len(username) > self.config['user']['max_length']:
|
||||||
raise exceptions.UsernameTooLong(
|
raise exceptions.UsernameTooLong(
|
||||||
username=username,
|
username=username,
|
||||||
max_length=self.config['max_username_length']
|
max_length=self.config['user']['max_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['user']['valid_chars']]
|
||||||
if badchars:
|
if badchars:
|
||||||
raise exceptions.InvalidUsernameChars(username=username, badchars=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['user']['min_password_length']:
|
||||||
raise exceptions.PasswordTooShort(min_length=self.config['min_password_length'])
|
raise exceptions.PasswordTooShort(min_length=self.config['user']['min_password_length'])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
existing_user = self.get_user(username=username)
|
existing_user = self.get_user(username=username)
|
||||||
|
@ -1141,10 +1141,10 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs
|
||||||
self.on_commit_queue = []
|
self.on_commit_queue = []
|
||||||
self._cached_frozen_children = None
|
self._cached_frozen_children = None
|
||||||
|
|
||||||
self._album_cache.maxlen = self.config['cache_size_album']
|
self._album_cache.maxlen = self.config['cache_size']['album']
|
||||||
self._photo_cache.maxlen = self.config['cache_size_photo']
|
self._photo_cache.maxlen = self.config['cache_size']['photo']
|
||||||
self._tag_cache.maxlen = self.config['cache_size_tag']
|
self._tag_cache.maxlen = self.config['cache_size']['tag']
|
||||||
self._user_cache.maxlen = self.config['cache_size_user']
|
self._user_cache.maxlen = self.config['cache_size']['user']
|
||||||
self.caches = {
|
self.caches = {
|
||||||
'album': self._album_cache,
|
'album': self._album_cache,
|
||||||
'photo': self._photo_cache,
|
'photo': self._photo_cache,
|
||||||
|
|
Loading…
Reference in a new issue