Add more docstrings; Remove unused code
This commit is contained in:
parent
3be8813a0a
commit
d7cd1e9748
4 changed files with 55 additions and 31 deletions
|
@ -112,7 +112,9 @@ 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.'
|
||||||
|
|
||||||
# Operational info
|
# Operational info
|
||||||
EXPRESSION_OPERATORS = {'(', ')', 'OR', 'AND', 'NOT'}
|
TRUTHYSTRING_TRUE = {s.lower() for s in ('1', 'true', 't', 'yes', 'y', 'on')}
|
||||||
|
TRUTHYSTRING_NONE = {s.lower() for s in ('null', 'none')}
|
||||||
|
|
||||||
ADDITIONAL_MIMETYPES = {
|
ADDITIONAL_MIMETYPES = {
|
||||||
'7z': 'archive',
|
'7z': 'archive',
|
||||||
'gz': 'archive',
|
'gz': 'archive',
|
||||||
|
|
|
@ -55,6 +55,17 @@ def binding_filler(column_names, values, require_all=True):
|
||||||
Manually aligning question marks and bindings is annoying.
|
Manually aligning question marks and bindings is annoying.
|
||||||
Given the table's column names and a dictionary of {column: value},
|
Given the table's column names and a dictionary of {column: value},
|
||||||
return the question marks and the list of bindings in the right order.
|
return the question marks and the list of bindings in the right order.
|
||||||
|
|
||||||
|
require_all:
|
||||||
|
If `values` does not contain one of the column names, should we raise
|
||||||
|
an exception?
|
||||||
|
Otherwise, that column will simply receive None.
|
||||||
|
|
||||||
|
Ex:
|
||||||
|
column_names=['id', 'name', 'score'],
|
||||||
|
values={'score': 20, 'id': '1111', 'name': 'James'}
|
||||||
|
->
|
||||||
|
returns ('?, ?, ?, ?', ['1111', 'James', 20])
|
||||||
'''
|
'''
|
||||||
values = values.copy()
|
values = values.copy()
|
||||||
for column in column_names:
|
for column in column_names:
|
||||||
|
@ -70,6 +81,19 @@ def binding_filler(column_names, values, require_all=True):
|
||||||
return (qmarks, bindings)
|
return (qmarks, bindings)
|
||||||
|
|
||||||
def checkerboard_image(color_1, color_2, image_size, checker_size):
|
def checkerboard_image(color_1, color_2, image_size, checker_size):
|
||||||
|
'''
|
||||||
|
Generate a PIL Image with a checkerboard pattern.
|
||||||
|
|
||||||
|
color_1:
|
||||||
|
The color starting in the top left. Either RGB tuple or a string
|
||||||
|
that PIL understands.
|
||||||
|
color_2:
|
||||||
|
The alternate color
|
||||||
|
image_size:
|
||||||
|
Tuple of two integers, the image size in pixels.
|
||||||
|
checker_size:
|
||||||
|
Tuple of two integers, the size of each checker in pixels.
|
||||||
|
'''
|
||||||
image = PIL.Image.new('RGB', image_size, color_1)
|
image = PIL.Image.new('RGB', image_size, color_1)
|
||||||
checker = PIL.Image.new('RGB', (checker_size, checker_size), color_2)
|
checker = PIL.Image.new('RGB', (checker_size, checker_size), color_2)
|
||||||
offset = True
|
offset = True
|
||||||
|
@ -143,6 +167,9 @@ def fit_into_bounds(image_width, image_height, frame_width, frame_height):
|
||||||
return (new_width, new_height)
|
return (new_width, new_height)
|
||||||
|
|
||||||
def get_mimetype(filepath):
|
def get_mimetype(filepath):
|
||||||
|
'''
|
||||||
|
Extension to mimetypes.guess_type which uses my constants.ADDITIONAL_MIMETYPES.
|
||||||
|
'''
|
||||||
extension = os.path.splitext(filepath)[1].replace('.', '')
|
extension = os.path.splitext(filepath)[1].replace('.', '')
|
||||||
if extension in constants.ADDITIONAL_MIMETYPES:
|
if extension in constants.ADDITIONAL_MIMETYPES:
|
||||||
return constants.ADDITIONAL_MIMETYPES[extension]
|
return constants.ADDITIONAL_MIMETYPES[extension]
|
||||||
|
@ -154,7 +181,8 @@ def hyphen_range(s):
|
||||||
Given a string like '1-3', return numbers (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, for example
|
||||||
|
'1k-2k', '10:00-20:00', '4gib-'
|
||||||
'''
|
'''
|
||||||
s = s.strip()
|
s = s.strip()
|
||||||
s = s.replace(' ', '')
|
s = s.replace(' ', '')
|
||||||
|
@ -280,12 +308,19 @@ def select_generator(sql, query, bindings=None):
|
||||||
yield fetch
|
yield fetch
|
||||||
|
|
||||||
def truthystring(s):
|
def truthystring(s):
|
||||||
|
'''
|
||||||
|
Convert strings to True, False, or None based on the options presented
|
||||||
|
in constants.TRUTHYSTRING_TRUE, constants.TRUTHYSTRING_NONE, or False
|
||||||
|
for all else.
|
||||||
|
|
||||||
|
Case insensitive.
|
||||||
|
'''
|
||||||
if isinstance(s, (bool, int)) or s is None:
|
if isinstance(s, (bool, int)) or s is None:
|
||||||
return s
|
return s
|
||||||
s = s.lower()
|
s = s.lower()
|
||||||
if s in {'1', 'true', 't', 'yes', 'y', 'on'}:
|
if s in constants.TRUTHYSTRING_TRUE:
|
||||||
return True
|
return True
|
||||||
if s in {'null', 'none'}:
|
if s in constants.TRUTHYSTRING_NONE:
|
||||||
return None
|
return None
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -230,6 +230,14 @@ class Album(ObjectBase, GroupableMixin):
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
def add_tag_to_all(self, tag, *, nested_children=True, commit=True):
|
def add_tag_to_all(self, tag, *, nested_children=True, commit=True):
|
||||||
|
'''
|
||||||
|
Add this tag to every photo in the album. Saves you from having to
|
||||||
|
write the for-loop yourself.
|
||||||
|
|
||||||
|
nested_children:
|
||||||
|
If True, add the tag to photos contained in sub-albums.
|
||||||
|
Otherwise, only local photos.
|
||||||
|
'''
|
||||||
tag = self.photodb.get_tag(tag)
|
tag = self.photodb.get_tag(tag)
|
||||||
if nested_children:
|
if nested_children:
|
||||||
photos = self.walk_photos()
|
photos = self.walk_photos()
|
||||||
|
@ -253,6 +261,9 @@ class Album(ObjectBase, GroupableMixin):
|
||||||
self.photodb.commit()
|
self.photodb.commit()
|
||||||
|
|
||||||
def edit(self, title=None, description=None, *, commit=True):
|
def edit(self, title=None, description=None, *, commit=True):
|
||||||
|
'''
|
||||||
|
Change the title or description. Leave None to keep current value.
|
||||||
|
'''
|
||||||
if title is None:
|
if title is None:
|
||||||
title = self.title
|
title = self.title
|
||||||
if description is None:
|
if description is None:
|
||||||
|
@ -467,6 +478,9 @@ class Photo(ObjectBase):
|
||||||
return bytestring.bytestring(self.bytes)
|
return bytestring.bytestring(self.bytes)
|
||||||
|
|
||||||
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.
|
||||||
|
'''
|
||||||
for tag in other_photo.tags():
|
for tag in other_photo.tags():
|
||||||
self.add_tag(tag)
|
self.add_tag(tag)
|
||||||
|
|
||||||
|
|
|
@ -145,33 +145,6 @@ def _helper_filenamefilter(subject, terms):
|
||||||
basename = subject.lower()
|
basename = subject.lower()
|
||||||
return all(term in basename for term in terms)
|
return all(term in basename for term in terms)
|
||||||
|
|
||||||
def operate(operand_stack, operator_stack):
|
|
||||||
#print('before:', operand_stack, operator_stack)
|
|
||||||
operator = operator_stack.pop()
|
|
||||||
if operator == 'NOT':
|
|
||||||
operand = operand_stack.pop()
|
|
||||||
value = operand ^ 1
|
|
||||||
else:
|
|
||||||
right = operand_stack.pop()
|
|
||||||
left = operand_stack.pop()
|
|
||||||
if operator == 'OR':
|
|
||||||
value = left | right
|
|
||||||
elif operator == 'AND':
|
|
||||||
value = left & right
|
|
||||||
else:
|
|
||||||
raise ValueError('werwer')
|
|
||||||
operand_stack.append(value)
|
|
||||||
#print('after:', operand_stack, operator_stack)
|
|
||||||
|
|
||||||
# def raise_no_such_thing(exception_class, thing_id=None, thing_name=None, comment=''):
|
|
||||||
# if thing_id is not None:
|
|
||||||
# message = 'ID: %s. %s' % (thing_id, comment)
|
|
||||||
# elif thing_name is not None:
|
|
||||||
# message = 'Name: %s. %s' % (thing_name, comment)
|
|
||||||
# else:
|
|
||||||
# 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):
|
||||||
#print('Failed musts')
|
#print('Failed musts')
|
||||||
|
|
Loading…
Reference in a new issue