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 {}.' |     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): | class NotExclusive(EtiquetteException): | ||||||
|     ''' |     ''' | ||||||
|     For when two or more mutually exclusive actions have been requested. |     For when two or more mutually exclusive actions have been requested. | ||||||
|  |  | ||||||
|  | @ -559,6 +559,7 @@ class PDBPhotoMixin: | ||||||
|             give_back_parameters=False, |             give_back_parameters=False, | ||||||
| 
 | 
 | ||||||
|             yield_albums=True, |             yield_albums=True, | ||||||
|  |             yield_photos=True, | ||||||
|         ): |         ): | ||||||
|         ''' |         ''' | ||||||
|         PHOTO PROPERTIES |         PHOTO PROPERTIES | ||||||
|  | @ -683,6 +684,7 @@ class PDBPhotoMixin: | ||||||
|         mimetype = searchhelpers.normalize_extension(mimetype) |         mimetype = searchhelpers.normalize_extension(mimetype) | ||||||
|         within_directory = searchhelpers.normalize_within_directory(within_directory, warning_bag=warning_bag) |         within_directory = searchhelpers.normalize_within_directory(within_directory, warning_bag=warning_bag) | ||||||
|         yield_albums = searchhelpers.normalize_yield_albums(yield_albums) |         yield_albums = searchhelpers.normalize_yield_albums(yield_albums) | ||||||
|  |         yield_photos = searchhelpers.normalize_yield_photos(yield_photos) | ||||||
| 
 | 
 | ||||||
|         if has_tags is False: |         if has_tags is False: | ||||||
|             tag_musts = None |             tag_musts = None | ||||||
|  | @ -773,9 +775,19 @@ class PDBPhotoMixin: | ||||||
|                 'offset': offset or None, |                 'offset': offset or None, | ||||||
|                 'orderby': giveback_orderby or None, |                 'orderby': giveback_orderby or None, | ||||||
|                 'yield_albums': yield_albums, |                 'yield_albums': yield_albums, | ||||||
|  |                 'yield_photos': yield_photos, | ||||||
|             } |             } | ||||||
|             yield parameters |             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( |         photo_tag_rel_exist_clauses = searchhelpers.photo_tag_rel_exist_clauses( | ||||||
|             tag_musts, |             tag_musts, | ||||||
|             tag_mays, |             tag_mays, | ||||||
|  | @ -826,6 +838,9 @@ class PDBPhotoMixin: | ||||||
|         if has_tags is False: |         if has_tags is False: | ||||||
|             wheres.append('NOT EXISTS (SELECT 1 FROM photo_tag_rel WHERE photoid == photos.id)') |             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: |         if has_thumbnail is True: | ||||||
|             notnulls.add('thumbnail') |             notnulls.add('thumbnail') | ||||||
|         elif has_thumbnail is False: |         elif has_thumbnail is False: | ||||||
|  | @ -875,7 +890,7 @@ class PDBPhotoMixin: | ||||||
|         #print('\n'.join(str(x) for x in explain.fetchall())) |         #print('\n'.join(str(x) for x in explain.fetchall())) | ||||||
|         generator = self.sql_select(query, bindings) |         generator = self.sql_select(query, bindings) | ||||||
|         seen_albums = set() |         seen_albums = set() | ||||||
|         photos_received = 0 |         results_received = 0 | ||||||
|         for row in generator: |         for row in generator: | ||||||
|             photo = self.get_cached_instance('photo', row) |             photo = self.get_cached_instance('photo', row) | ||||||
| 
 | 
 | ||||||
|  | @ -898,16 +913,18 @@ class PDBPhotoMixin: | ||||||
|                 offset -= 1 |                 offset -= 1 | ||||||
|                 continue |                 continue | ||||||
| 
 | 
 | ||||||
|             if limit is not None and photos_received >= limit: |             if limit is not None and results_received >= limit: | ||||||
|                 break |                 break | ||||||
| 
 | 
 | ||||||
|             if yield_albums: |             if yield_albums: | ||||||
|                 new_albums = photo.get_containing_albums().difference(seen_albums) |                 new_albums = photo.get_containing_albums().difference(seen_albums) | ||||||
|                 yield from new_albums |                 yield from new_albums | ||||||
|  |                 results_received += len(new_albums) | ||||||
|                 seen_albums.update(new_albums) |                 seen_albums.update(new_albums) | ||||||
| 
 | 
 | ||||||
|             photos_received += 1 |             if yield_photos: | ||||||
|                 yield photo |                 yield photo | ||||||
|  |                 results_received += 1 | ||||||
| 
 | 
 | ||||||
|         if warning_bag and warning_bag.warnings: |         if warning_bag and warning_bag.warnings: | ||||||
|             yield warning_bag |             yield warning_bag | ||||||
|  |  | ||||||
|  | @ -422,6 +422,12 @@ def normalize_yield_albums(yield_albums): | ||||||
|     ''' |     ''' | ||||||
|     return helpers.truthystring(yield_albums) |     return helpers.truthystring(yield_albums) | ||||||
| 
 | 
 | ||||||
|  | def normalize_yield_photos(yield_photos): | ||||||
|  |     ''' | ||||||
|  |     See etiquette.helpers.truthystring. | ||||||
|  |     ''' | ||||||
|  |     return helpers.truthystring(yield_photos) | ||||||
|  | 
 | ||||||
| EXIST_FORMAT = ''' | EXIST_FORMAT = ''' | ||||||
| {operator} ( | {operator} ( | ||||||
|     SELECT 1 FROM photo_tag_rel WHERE photos.id == photo_tag_rel.photoid |     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') |     mimetype = request.args.get('mimetype') | ||||||
|     is_searchhidden = request.args.get('is_searchhidden', False) |     is_searchhidden = request.args.get('is_searchhidden', False) | ||||||
|     yield_albums = request.args.get('yield_albums', True) |     yield_albums = request.args.get('yield_albums', True) | ||||||
|  |     yield_photos = request.args.get('yield_photos', True) | ||||||
| 
 | 
 | ||||||
|     limit = request.args.get('limit') |     limit = request.args.get('limit') | ||||||
|     # This is being pre-processed because the site enforces a maximum value |     # This is being pre-processed because the site enforces a maximum value | ||||||
|  | @ -382,6 +383,7 @@ def get_search_core(): | ||||||
|         'give_back_parameters': True, |         'give_back_parameters': True, | ||||||
| 
 | 
 | ||||||
|         'yield_albums': yield_albums, |         'yield_albums': yield_albums, | ||||||
|  |         'yield_photos': yield_photos, | ||||||
|     } |     } | ||||||
|     # print(search_kwargs) |     # print(search_kwargs) | ||||||
|     search_generator = common.P.search(**search_kwargs) |     search_generator = common.P.search(**search_kwargs) | ||||||
|  | @ -394,14 +396,11 @@ def get_search_core(): | ||||||
| 
 | 
 | ||||||
|     warnings = set() |     warnings = set() | ||||||
|     search_results = [] |     search_results = [] | ||||||
|     search_results_photo_count = 0 |  | ||||||
|     for item in search_generator: |     for item in search_generator: | ||||||
|         if isinstance(item, etiquette.objects.WarningBag): |         if isinstance(item, etiquette.objects.WarningBag): | ||||||
|             warnings.update(item.warnings) |             warnings.update(item.warnings) | ||||||
|             continue |             continue | ||||||
|         search_results.append(item) |         search_results.append(item) | ||||||
|         if isinstance(item, etiquette.objects.Photo): |  | ||||||
|             search_results_photo_count += 1 |  | ||||||
| 
 | 
 | ||||||
|     # TAGS ON THIS PAGE |     # TAGS ON THIS PAGE | ||||||
|     total_tags = set() |     total_tags = set() | ||||||
|  | @ -415,7 +414,7 @@ def get_search_core(): | ||||||
|     original_params = request.args.to_dict() |     original_params = request.args.to_dict() | ||||||
|     original_params['limit'] = limit |     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 = original_params.copy() | ||||||
|         next_params['offset'] = offset + limit |         next_params['offset'] = offset + limit | ||||||
|         next_params = helpers.dict_to_params(next_params) |         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="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> |                 <option value="no" {{"selected" if search_kwargs['yield_albums']==False else ""}}>Don't include albums</option> | ||||||
|             </select> |             </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"> |             <select name="view" class="basic_param"> | ||||||
|                 <option value="grid"  {{"selected" if search_kwargs['view']=="grid" else ""}}>Grid</option> |                 <option value="grid"  {{"selected" if search_kwargs['view']=="grid" else ""}}>Grid</option> | ||||||
|                 <option value="list"  {{"selected" if search_kwargs['view']=="list" else ""}}>List</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 = { | const PARAM_DEFAULTS = { | ||||||
|     'limit': 50, |     'limit': 50, | ||||||
|     'view': 'grid', |     'view': 'grid', | ||||||
|     'yield_albums': 'yes' |     'yield_albums': 'yes', | ||||||
|  |     'yield_photos': 'yes' | ||||||
| } | } | ||||||
| function add_searchtag(ul, value, inputted_list, li_class) | function add_searchtag(ul, value, inputted_list, li_class) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue