Rename variable 'row_tuple' to 'db_row'; Improve some docstrings
This commit is contained in:
parent
d71d7b03c2
commit
c3a4fa443b
5 changed files with 80 additions and 66 deletions
|
@ -171,13 +171,13 @@ class GroupableMixin:
|
|||
|
||||
|
||||
class Album(ObjectBase, GroupableMixin):
|
||||
def __init__(self, photodb, row_tuple):
|
||||
def __init__(self, photodb, db_row):
|
||||
self.photodb = photodb
|
||||
if isinstance(row_tuple, (list, tuple)):
|
||||
row_tuple = {constants.SQL_ALBUM_COLUMNS[index]: value for (index, value) in enumerate(row_tuple)}
|
||||
self.id = row_tuple['id']
|
||||
self.title = row_tuple['title']
|
||||
self.description = row_tuple['description']
|
||||
if isinstance(db_row, (list, tuple)):
|
||||
db_row = {constants.SQL_ALBUM_COLUMNS[index]: value for (index, value) in enumerate(db_row)}
|
||||
self.id = db_row['id']
|
||||
self.title = db_row['title']
|
||||
self.description = db_row['description']
|
||||
self.name = 'Album %s' % self.id
|
||||
self.group_getter = self.photodb.get_album
|
||||
|
||||
|
@ -285,27 +285,25 @@ class Album(ObjectBase, GroupableMixin):
|
|||
else:
|
||||
return total
|
||||
|
||||
|
||||
def walk_photos(self):
|
||||
yield from self.photos()
|
||||
children = self.walk_children()
|
||||
# The first yield is itself
|
||||
next(children)
|
||||
for child in children:
|
||||
print(child)
|
||||
yield from child.walk_photos()
|
||||
|
||||
|
||||
class Bookmark(ObjectBase):
|
||||
def __init__(self, photodb, row_tuple):
|
||||
def __init__(self, photodb, db_row):
|
||||
self.photodb = photodb
|
||||
if isinstance(row_tuple, (list, tuple)):
|
||||
row_tuple = {constants.SQL_BOOKMARK_COLUMNS[index]: value for (index, value) in enumerate(row_tuple)}
|
||||
if isinstance(db_row, (list, tuple)):
|
||||
db_row = {constants.SQL_BOOKMARK_COLUMNS[index]: value for (index, value) in enumerate(db_row)}
|
||||
|
||||
self.id = row_tuple['id']
|
||||
self.title = row_tuple['title']
|
||||
self.url = row_tuple['url']
|
||||
self.author_id = row_tuple['author_id']
|
||||
self.id = db_row['id']
|
||||
self.title = db_row['title']
|
||||
self.url = db_row['url']
|
||||
self.author_id = db_row['author_id']
|
||||
|
||||
def __repr__(self):
|
||||
return 'Bookmark:{id}'.format(id=self.id)
|
||||
|
@ -339,34 +337,34 @@ class Photo(ObjectBase):
|
|||
Photo objects cannot exist without a corresponding PhotoDB object, because
|
||||
Photos are not the actual image data, just the database entry.
|
||||
'''
|
||||
def __init__(self, photodb, row_tuple):
|
||||
def __init__(self, photodb, db_row):
|
||||
self.photodb = photodb
|
||||
if isinstance(row_tuple, (list, tuple)):
|
||||
row_tuple = {constants.SQL_PHOTO_COLUMNS[index]: value for (index, value) in enumerate(row_tuple)}
|
||||
if isinstance(db_row, (list, tuple)):
|
||||
db_row = {constants.SQL_PHOTO_COLUMNS[index]: value for (index, value) in enumerate(db_row)}
|
||||
|
||||
self.real_filepath = helpers.normalize_filepath(row_tuple['filepath'], allowed=':\\/')
|
||||
self.real_filepath = helpers.normalize_filepath(db_row['filepath'], allowed=':\\/')
|
||||
self.real_path = pathclass.Path(self.real_filepath)
|
||||
|
||||
self.id = row_tuple['id']
|
||||
self.created = row_tuple['created']
|
||||
self.author_id = row_tuple['author_id']
|
||||
self.filepath = row_tuple['override_filename'] or self.real_path.absolute_path
|
||||
self.basename = row_tuple['override_filename'] or self.real_path.basename
|
||||
self.extension = row_tuple['extension']
|
||||
self.tagged_at = row_tuple['tagged_at']
|
||||
self.id = db_row['id']
|
||||
self.created = db_row['created']
|
||||
self.author_id = db_row['author_id']
|
||||
self.filepath = db_row['override_filename'] or self.real_path.absolute_path
|
||||
self.basename = db_row['override_filename'] or self.real_path.basename
|
||||
self.extension = db_row['extension']
|
||||
self.tagged_at = db_row['tagged_at']
|
||||
|
||||
if self.extension == '':
|
||||
self.dot_extension = ''
|
||||
else:
|
||||
self.dot_extension = '.' + self.extension
|
||||
|
||||
self.area = row_tuple['area']
|
||||
self.bytes = row_tuple['bytes']
|
||||
self.duration = row_tuple['duration']
|
||||
self.width = row_tuple['width']
|
||||
self.height = row_tuple['height']
|
||||
self.ratio = row_tuple['ratio']
|
||||
self.thumbnail = row_tuple['thumbnail']
|
||||
self.area = db_row['area']
|
||||
self.bytes = db_row['bytes']
|
||||
self.duration = db_row['duration']
|
||||
self.width = db_row['width']
|
||||
self.height = db_row['height']
|
||||
self.ratio = db_row['ratio']
|
||||
self.thumbnail = db_row['thumbnail']
|
||||
|
||||
self.mimetype = helpers.get_mimetype(self.real_filepath)
|
||||
if self.mimetype is None:
|
||||
|
@ -736,12 +734,12 @@ class Tag(ObjectBase, GroupableMixin):
|
|||
'''
|
||||
A Tag, which can be applied to Photos for organization.
|
||||
'''
|
||||
def __init__(self, photodb, row_tuple):
|
||||
def __init__(self, photodb, db_row):
|
||||
self.photodb = photodb
|
||||
if isinstance(row_tuple, (list, tuple)):
|
||||
row_tuple = {constants.SQL_TAG_COLUMNS[index]: value for (index, value) in enumerate(row_tuple)}
|
||||
self.id = row_tuple['id']
|
||||
self.name = row_tuple['name']
|
||||
if isinstance(db_row, (list, tuple)):
|
||||
db_row = {constants.SQL_TAG_COLUMNS[index]: value for (index, value) in enumerate(db_row)}
|
||||
self.id = db_row['id']
|
||||
self.name = db_row['name']
|
||||
self.group_getter = self.photodb.get_tag
|
||||
self._cached_qualified_name = None
|
||||
|
||||
|
@ -913,13 +911,13 @@ class User(ObjectBase):
|
|||
'''
|
||||
A dear friend of ours.
|
||||
'''
|
||||
def __init__(self, photodb, row_tuple):
|
||||
def __init__(self, photodb, db_row):
|
||||
self.photodb = photodb
|
||||
if isinstance(row_tuple, (list, tuple)):
|
||||
row_tuple = {constants.SQL_USER_COLUMNS[index]: value for (index, value) in enumerate(row_tuple)}
|
||||
self.id = row_tuple['id']
|
||||
self.username = row_tuple['username']
|
||||
self.created = row_tuple['created']
|
||||
if isinstance(db_row, (list, tuple)):
|
||||
db_row = {constants.SQL_USER_COLUMNS[index]: value for (index, value) in enumerate(db_row)}
|
||||
self.id = db_row['id']
|
||||
self.username = db_row['username']
|
||||
self.created = db_row['created']
|
||||
|
||||
def __repr__(self):
|
||||
rep = 'User:{id}:{username}'.format(id=self.id, username=self.username)
|
||||
|
|
|
@ -541,14 +541,16 @@ class PDBPhotoMixin:
|
|||
'''
|
||||
PHOTO PROPERTIES
|
||||
area, width, height, ratio, bytes, duration:
|
||||
A hyphen_range string representing min and max. Or just a number for lower bound.
|
||||
A hyphen_range string representing min and max. Or just a number
|
||||
for lower bound.
|
||||
|
||||
TAGS AND FILTERS
|
||||
authors:
|
||||
A list of User objects, or usernames, or user ids.
|
||||
|
||||
created:
|
||||
A hyphen_range string respresenting min and max. Or just a number for lower bound.
|
||||
A hyphen_range string respresenting min and max. Or just a number
|
||||
for lower bound.
|
||||
|
||||
extension:
|
||||
A string or list of strings of acceptable file extensions.
|
||||
|
@ -558,16 +560,20 @@ class PDBPhotoMixin:
|
|||
Including '*' will forbid all extensions
|
||||
|
||||
filename:
|
||||
A string or list of strings which will be split into words. The file's basename
|
||||
must include every word, NOT case-sensitive.
|
||||
A string or list of strings in the form of an expression.
|
||||
Match is CASE-INSENSITIVE.
|
||||
Examples:
|
||||
'.pdf AND (programming OR "survival guide")'
|
||||
'.pdf programming python' (implicitly AND each term)
|
||||
|
||||
has_tags:
|
||||
If True, require that the Photo has >=1 tag.
|
||||
If False, require that the Photo has no tags.
|
||||
If None, not considered.
|
||||
If None, any amount is okay.
|
||||
|
||||
mimetype:
|
||||
A string or list of strings of acceptable mimetypes. 'image', 'video', ...
|
||||
A string or list of strings of acceptable mimetypes.
|
||||
'image', 'video', ...
|
||||
|
||||
tag_musts:
|
||||
A list of tag names or Tag objects.
|
||||
|
@ -582,8 +588,11 @@ class PDBPhotoMixin:
|
|||
Photos MUST NOT have ANY tag in the list.
|
||||
|
||||
tag_expression:
|
||||
A string like 'family AND (animals OR vacation)' to filter by.
|
||||
A string or list of strings in the form of an expression.
|
||||
Can NOT be used with the must, may, forbid style search.
|
||||
Examples:
|
||||
'family AND (animals OR vacation)'
|
||||
'family vacation outdoors' (implicitly AND each term)
|
||||
|
||||
QUERY OPTIONS
|
||||
limit:
|
||||
|
@ -598,13 +607,15 @@ class PDBPhotoMixin:
|
|||
Descending is assumed if not provided.
|
||||
|
||||
warning_bag:
|
||||
Invalid search queries will add a warning to the bag and try their best to continue.
|
||||
Otherwise they may raise exceptions.
|
||||
If provided, invalid search queries will add a warning to the bag
|
||||
and try their best to continue. The generator will yield the bag
|
||||
back to you as the final object.
|
||||
Without the bag, exceptions may be raised.
|
||||
|
||||
give_back_parameters:
|
||||
If True, the generator's first yield will be a dictionary of all the cleaned up, normalized
|
||||
parameters. The user may have given us loads of trash, so we should show them the formatting
|
||||
we want.
|
||||
If True, the generator's first yield will be a dictionary of all the
|
||||
cleaned up, normalized parameters. The user may have given us loads
|
||||
of trash, so we should show them the formatting we want.
|
||||
'''
|
||||
start_time = time.time()
|
||||
|
||||
|
@ -791,7 +802,6 @@ class PDBPhotoMixin:
|
|||
#print('Failed has_tags=True')
|
||||
continue
|
||||
|
||||
|
||||
if tag_expression:
|
||||
success = expression_tree.evaluate(
|
||||
photo_tags,
|
||||
|
@ -819,7 +829,6 @@ class PDBPhotoMixin:
|
|||
if limit is not None and photos_received >= limit:
|
||||
break
|
||||
|
||||
|
||||
photos_received += 1
|
||||
yield photo
|
||||
|
||||
|
@ -1383,7 +1392,7 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs
|
|||
|
||||
things = cur.fetchall()
|
||||
for thing in things:
|
||||
thing = thing_map['class'](self, row_tuple=thing)
|
||||
thing = thing_map['class'](self, db_row=thing)
|
||||
yield thing
|
||||
|
||||
|
||||
|
|
|
@ -153,7 +153,6 @@ def normalize_filename(filename_terms):
|
|||
filename_terms = ' '.join(filename_terms)
|
||||
|
||||
filename_terms = filename_terms.strip()
|
||||
filename_terms = shlex.split(filename_terms)
|
||||
|
||||
if not filename_terms:
|
||||
return None
|
||||
|
@ -280,6 +279,11 @@ def normalize_tag_expression(expression):
|
|||
if not isinstance(expression, str):
|
||||
expression = ' '.join(expression)
|
||||
|
||||
expression = expression.strip()
|
||||
|
||||
if not expression:
|
||||
return None
|
||||
|
||||
return expression
|
||||
|
||||
def normalize_tag_mmf(tags, photodb, warning_bag=None):
|
||||
|
|
|
@ -484,16 +484,19 @@ def get_search_core():
|
|||
# The search has converted many arguments into sets or other types.
|
||||
# Convert them back into something that will display nicely on the search form.
|
||||
join_helper = lambda x: ', '.join(x) if x else None
|
||||
tagname_helper = lambda tags: [tag.qualified_name() for tag in tags] if tags else None
|
||||
filename_helper = lambda fn: ' '.join('"%s"' % part if ' ' in part else part for part in fn) if fn else None
|
||||
search_kwargs['extension'] = join_helper(search_kwargs['extension'])
|
||||
search_kwargs['extension_not'] = join_helper(search_kwargs['extension_not'])
|
||||
search_kwargs['mimetype'] = join_helper(search_kwargs['mimetype'])
|
||||
search_kwargs['filename'] = filename_helper(search_kwargs['filename'])
|
||||
|
||||
tagname_helper = lambda tags: [tag.qualified_name() for tag in tags] if tags else None
|
||||
search_kwargs['tag_musts'] = tagname_helper(search_kwargs['tag_musts'])
|
||||
search_kwargs['tag_mays'] = tagname_helper(search_kwargs['tag_mays'])
|
||||
search_kwargs['tag_forbids'] = tagname_helper(search_kwargs['tag_forbids'])
|
||||
|
||||
#quoted_helper = lambda text: '"%s"' % text if ' ' in text else text
|
||||
#filename_helper = lambda fn: ' '.join(quoted_helper(part) for part in fn) if fn else None
|
||||
#search_kwargs['filename'] = filename_helper(search_kwargs['filename'])
|
||||
|
||||
search_results = list(search_generator)
|
||||
warnings = set()
|
||||
photos = []
|
||||
|
|
|
@ -37,7 +37,7 @@ def upgrade_3_to_4(sql):
|
|||
'''
|
||||
cur = sql.cursor()
|
||||
cur.execute('ALTER TABLE photos ADD COLUMN author_id TEXT')
|
||||
cur.execute('CREATE INDEX IF NOT EXISTS index_photo_author on photos(author_id)')
|
||||
cur.execute('CREATE INDEX IF NOT EXISTS index_photo_author ON photos(author_id)')
|
||||
|
||||
def upgrade_4_to_5(sql):
|
||||
'''
|
||||
|
@ -52,8 +52,8 @@ def upgrade_4_to_5(sql):
|
|||
author_id TEXT
|
||||
)
|
||||
''')
|
||||
cur.execute('CREATE INDEX IF NOT EXISTS index_bookmark_id on bookmarks(id)')
|
||||
cur.execute('CREATE INDEX IF NOT EXISTS index_bookmark_author on bookmarks(author_id)')
|
||||
cur.execute('CREATE INDEX IF NOT EXISTS index_bookmark_id ON bookmarks(id)')
|
||||
cur.execute('CREATE INDEX IF NOT EXISTS index_bookmark_author ON bookmarks(author_id)')
|
||||
|
||||
def upgrade_all(database_filename):
|
||||
'''
|
||||
|
|
Loading…
Reference in a new issue