Add yield_photos, count albums in search result limit.
This experiment of bringing Photos and Albums closer to parity in search is going well so far. I have found some situations where it is nice to only get albums back from search results.
This commit is contained in:
parent
c7eda36133
commit
63bc2dfed5
5 changed files with 43 additions and 9 deletions
|
@ -193,6 +193,13 @@ class FeatureDisabled(EtiquetteException):
|
|||
'''
|
||||
error_message = 'This feature has been disabled. Requires {}.'
|
||||
|
||||
class NoYields(EtiquetteException):
|
||||
'''
|
||||
For when all of the yield_* arguments have been provided as False, and thus
|
||||
there is nothing for the called function to yield.
|
||||
'''
|
||||
error_message = 'At least one of {} must be selected.'
|
||||
|
||||
class NotExclusive(EtiquetteException):
|
||||
'''
|
||||
For when two or more mutually exclusive actions have been requested.
|
||||
|
|
|
@ -559,6 +559,7 @@ class PDBPhotoMixin:
|
|||
give_back_parameters=False,
|
||||
|
||||
yield_albums=True,
|
||||
yield_photos=True,
|
||||
):
|
||||
'''
|
||||
PHOTO PROPERTIES
|
||||
|
@ -683,6 +684,7 @@ class PDBPhotoMixin:
|
|||
mimetype = searchhelpers.normalize_extension(mimetype)
|
||||
within_directory = searchhelpers.normalize_within_directory(within_directory, warning_bag=warning_bag)
|
||||
yield_albums = searchhelpers.normalize_yield_albums(yield_albums)
|
||||
yield_photos = searchhelpers.normalize_yield_photos(yield_photos)
|
||||
|
||||
if has_tags is False:
|
||||
tag_musts = None
|
||||
|
@ -773,9 +775,19 @@ class PDBPhotoMixin:
|
|||
'offset': offset or None,
|
||||
'orderby': giveback_orderby or None,
|
||||
'yield_albums': yield_albums,
|
||||
'yield_photos': yield_photos,
|
||||
}
|
||||
yield parameters
|
||||
|
||||
if not yield_albums and not yield_photos:
|
||||
exc = exceptions.NoYields(['yield_albums', 'yield_photos'])
|
||||
if warning_bag:
|
||||
warning_bag.add(exc)
|
||||
yield warning_bag
|
||||
return
|
||||
else:
|
||||
raise exceptions.NoYields(['yield_albums', 'yield_photos'])
|
||||
|
||||
photo_tag_rel_exist_clauses = searchhelpers.photo_tag_rel_exist_clauses(
|
||||
tag_musts,
|
||||
tag_mays,
|
||||
|
@ -826,6 +838,9 @@ class PDBPhotoMixin:
|
|||
if has_tags is False:
|
||||
wheres.append('NOT EXISTS (SELECT 1 FROM photo_tag_rel WHERE photoid == photos.id)')
|
||||
|
||||
if yield_albums and not yield_photos:
|
||||
wheres.append('EXISTS (SELECT 1 FROM album_photo_rel WHERE photoid == photos.id)')
|
||||
|
||||
if has_thumbnail is True:
|
||||
notnulls.add('thumbnail')
|
||||
elif has_thumbnail is False:
|
||||
|
@ -875,7 +890,7 @@ class PDBPhotoMixin:
|
|||
#print('\n'.join(str(x) for x in explain.fetchall()))
|
||||
generator = self.sql_select(query, bindings)
|
||||
seen_albums = set()
|
||||
photos_received = 0
|
||||
results_received = 0
|
||||
for row in generator:
|
||||
photo = self.get_cached_instance('photo', row)
|
||||
|
||||
|
@ -898,16 +913,18 @@ class PDBPhotoMixin:
|
|||
offset -= 1
|
||||
continue
|
||||
|
||||
if limit is not None and photos_received >= limit:
|
||||
if limit is not None and results_received >= limit:
|
||||
break
|
||||
|
||||
if yield_albums:
|
||||
new_albums = photo.get_containing_albums().difference(seen_albums)
|
||||
yield from new_albums
|
||||
results_received += len(new_albums)
|
||||
seen_albums.update(new_albums)
|
||||
|
||||
photos_received += 1
|
||||
if yield_photos:
|
||||
yield photo
|
||||
results_received += 1
|
||||
|
||||
if warning_bag and warning_bag.warnings:
|
||||
yield warning_bag
|
||||
|
|
|
@ -422,6 +422,12 @@ def normalize_yield_albums(yield_albums):
|
|||
'''
|
||||
return helpers.truthystring(yield_albums)
|
||||
|
||||
def normalize_yield_photos(yield_photos):
|
||||
'''
|
||||
See etiquette.helpers.truthystring.
|
||||
'''
|
||||
return helpers.truthystring(yield_photos)
|
||||
|
||||
EXIST_FORMAT = '''
|
||||
{operator} (
|
||||
SELECT 1 FROM photo_tag_rel WHERE photos.id == photo_tag_rel.photoid
|
||||
|
|
|
@ -326,6 +326,7 @@ def get_search_core():
|
|||
mimetype = request.args.get('mimetype')
|
||||
is_searchhidden = request.args.get('is_searchhidden', False)
|
||||
yield_albums = request.args.get('yield_albums', True)
|
||||
yield_photos = request.args.get('yield_photos', True)
|
||||
|
||||
limit = request.args.get('limit')
|
||||
# This is being pre-processed because the site enforces a maximum value
|
||||
|
@ -382,6 +383,7 @@ def get_search_core():
|
|||
'give_back_parameters': True,
|
||||
|
||||
'yield_albums': yield_albums,
|
||||
'yield_photos': yield_photos,
|
||||
}
|
||||
# print(search_kwargs)
|
||||
search_generator = common.P.search(**search_kwargs)
|
||||
|
@ -394,14 +396,11 @@ def get_search_core():
|
|||
|
||||
warnings = set()
|
||||
search_results = []
|
||||
search_results_photo_count = 0
|
||||
for item in search_generator:
|
||||
if isinstance(item, etiquette.objects.WarningBag):
|
||||
warnings.update(item.warnings)
|
||||
continue
|
||||
search_results.append(item)
|
||||
if isinstance(item, etiquette.objects.Photo):
|
||||
search_results_photo_count += 1
|
||||
|
||||
# TAGS ON THIS PAGE
|
||||
total_tags = set()
|
||||
|
@ -415,7 +414,7 @@ def get_search_core():
|
|||
original_params = request.args.to_dict()
|
||||
original_params['limit'] = limit
|
||||
|
||||
if limit and search_results_photo_count >= limit:
|
||||
if limit and len(search_results) >= limit:
|
||||
next_params = original_params.copy()
|
||||
next_params['offset'] = offset + limit
|
||||
next_params = helpers.dict_to_params(next_params)
|
||||
|
|
|
@ -298,6 +298,10 @@
|
|||
<option value="yes" {{"selected" if search_kwargs['yield_albums']==True else ""}}>Include albums</option>
|
||||
<option value="no" {{"selected" if search_kwargs['yield_albums']==False else ""}}>Don't include albums</option>
|
||||
</select>
|
||||
<select name="yield_photos" class="basic_param">
|
||||
<option value="yes" {{"selected" if search_kwargs['yield_photos']==True else ""}}>Include photos</option>
|
||||
<option value="no" {{"selected" if search_kwargs['yield_photos']==False else ""}}>Don't include photos</option>
|
||||
</select>
|
||||
<select name="view" class="basic_param">
|
||||
<option value="grid" {{"selected" if search_kwargs['view']=="grid" else ""}}>Grid</option>
|
||||
<option value="list" {{"selected" if search_kwargs['view']=="list" else ""}}>List</option>
|
||||
|
@ -375,7 +379,8 @@ selected form values are these.
|
|||
const PARAM_DEFAULTS = {
|
||||
'limit': 50,
|
||||
'view': 'grid',
|
||||
'yield_albums': 'yes'
|
||||
'yield_albums': 'yes',
|
||||
'yield_photos': 'yes'
|
||||
}
|
||||
function add_searchtag(ul, value, inputted_list, li_class)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue