Add search filter has_albums.
Sometimes it's nice to search just for the free spirits.
This commit is contained in:
		
							parent
							
								
									353b9eadaf
								
							
						
					
					
						commit
						3767558c66
					
				
					 6 changed files with 43 additions and 9 deletions
				
			
		|  | @ -426,6 +426,7 @@ class PDBPhotoMixin: | |||
|             extension=None, | ||||
|             extension_not=None, | ||||
|             filename=None, | ||||
|             has_albums=None, | ||||
|             has_tags=None, | ||||
|             has_thumbnail=None, | ||||
|             is_searchhidden=False, | ||||
|  | @ -475,6 +476,11 @@ class PDBPhotoMixin: | |||
|             '.pdf AND (programming OR "survival guide")' | ||||
|             '.pdf programming python' (implicitly AND each term) | ||||
| 
 | ||||
|         has_albums: | ||||
|             If True, require that the Photo belongs to >=1 album. | ||||
|             If False, require that the Photo belongs to no albums. | ||||
|             If None, either is okay. | ||||
| 
 | ||||
|         has_tags: | ||||
|             If True, require that the Photo has >=1 tag. | ||||
|             If False, require that the Photo has no tags. | ||||
|  | @ -569,6 +575,7 @@ class PDBPhotoMixin: | |||
|         extension = searchhelpers.normalize_extension(extension) | ||||
|         extension_not = searchhelpers.normalize_extension(extension_not) | ||||
|         filename = searchhelpers.normalize_filename(filename) | ||||
|         has_albums = searchhelpers.normalize_has_tags(has_albums) | ||||
|         has_tags = searchhelpers.normalize_has_tags(has_tags) | ||||
|         has_thumbnail = searchhelpers.normalize_has_thumbnail(has_thumbnail) | ||||
|         is_searchhidden = searchhelpers.normalize_is_searchhidden(is_searchhidden) | ||||
|  | @ -660,6 +667,7 @@ class PDBPhotoMixin: | |||
|                 'extension': list(extension) or None, | ||||
|                 'extension_not': list(extension_not) or None, | ||||
|                 'filename': filename or None, | ||||
|                 'has_albums': has_albums, | ||||
|                 'has_tags': has_tags, | ||||
|                 'has_thumbnail': has_thumbnail, | ||||
|                 'mimetype': list(mimetype) or None, | ||||
|  | @ -731,9 +739,14 @@ class PDBPhotoMixin: | |||
|             wheres.append(clauses) | ||||
|             bindings.extend(patterns) | ||||
| 
 | ||||
|         if has_albums is True: | ||||
|             wheres.append('EXISTS (SELECT 1 FROM album_photo_rel WHERE photoid == photos.id)') | ||||
|         elif has_albums is False: | ||||
|             wheres.append('NOT EXISTS (SELECT 1 FROM album_photo_rel WHERE photoid == photos.id)') | ||||
| 
 | ||||
|         if has_tags is True: | ||||
|             wheres.append('EXISTS (SELECT 1 FROM photo_tag_rel WHERE photoid == photos.id)') | ||||
|         if has_tags is False: | ||||
|         elif 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: | ||||
|  |  | |||
|  | @ -192,6 +192,12 @@ def normalize_filename(filename_terms): | |||
| 
 | ||||
|     return filename_terms | ||||
| 
 | ||||
| def normalize_has_albums(has_albums): | ||||
|     ''' | ||||
|     See voussoirkit.stringtools.truthystring. | ||||
|     ''' | ||||
|     return stringtools.truthystring(has_albums, None) | ||||
| 
 | ||||
| def normalize_has_tags(has_tags): | ||||
|     ''' | ||||
|     See voussoirkit.stringtools.truthystring. | ||||
|  |  | |||
|  | @ -140,6 +140,7 @@ def search_by_argparse(args, yield_albums=False, yield_photos=False): | |||
|         extension=args.extension, | ||||
|         extension_not=args.extension_not, | ||||
|         filename=args.filename, | ||||
|         has_albums=args.has_albums, | ||||
|         has_tags=args.has_tags, | ||||
|         has_thumbnail=args.has_thumbnail, | ||||
|         is_searchhidden=args.is_searchhidden, | ||||
|  | @ -1417,6 +1418,16 @@ def main(argv): | |||
|         Search for strings within Photos' filenames. | ||||
|         ''', | ||||
|     ) | ||||
|     p_search.add_argument( | ||||
|         '--has_albums', | ||||
|         '--has-albums', | ||||
|         default=None, | ||||
|         help=''' | ||||
|         If "yes", Photo must belong to at least one album. | ||||
|         If "no", Photo must not belong to any albums. | ||||
|         If "null", doesn't matter. | ||||
|         ''', | ||||
|     ) | ||||
|     p_search.add_argument( | ||||
|         '--has_tags', | ||||
|         '--has-tags', | ||||
|  |  | |||
|  | @ -205,14 +205,10 @@ def get_all_album_names(): | |||
|     response = {'albums': all_albums} | ||||
|     return flasktools.json_response(response) | ||||
| 
 | ||||
| def get_albums_core(): | ||||
|     albums = list(common.P.get_root_albums()) | ||||
|     albums.sort(key=lambda x: x.display_name.lower()) | ||||
|     return albums | ||||
| 
 | ||||
| @site.route('/albums') | ||||
| def get_albums_html(): | ||||
|     albums = get_albums_core() | ||||
|     albums = list(common.P.get_root_albums()) | ||||
|     albums.sort(key=lambda x: x.display_name.lower()) | ||||
|     response = common.render_template( | ||||
|         request, | ||||
|         'album.html', | ||||
|  | @ -223,8 +219,9 @@ def get_albums_html(): | |||
| 
 | ||||
| @site.route('/albums.json') | ||||
| def get_albums_json(): | ||||
|     albums = get_albums_core() | ||||
|     albums = [album.jsonify(minimal=True) for album in albums] | ||||
|     albums = list(common.P.get_albums()) | ||||
|     albums.sort(key=lambda x: x.display_name.lower()) | ||||
|     albums = [album.jsonify(include_photos=False) for album in albums] | ||||
|     return flasktools.json_response(albums) | ||||
| 
 | ||||
| # Album create and delete ########################################################################## | ||||
|  |  | |||
|  | @ -401,6 +401,7 @@ def get_search_core(): | |||
|     height = request.args.get('height') | ||||
|     aspectratio = request.args.get('aspectratio') | ||||
|     bytes = request.args.get('bytes') | ||||
|     has_albums = request.args.get('has_albums') | ||||
|     has_thumbnail = request.args.get('has_thumbnail') | ||||
|     duration = request.args.get('duration') | ||||
|     bitrate = request.args.get('bitrate') | ||||
|  | @ -421,6 +422,7 @@ def get_search_core(): | |||
|         'extension': extension, | ||||
|         'extension_not': extension_not, | ||||
|         'filename': filename_terms, | ||||
|         'has_albums': has_albums, | ||||
|         'has_tags': has_tags, | ||||
|         'has_thumbnail': has_thumbnail, | ||||
|         'is_searchhidden': is_searchhidden, | ||||
|  |  | |||
|  | @ -296,6 +296,11 @@ | |||
|                 </option> | ||||
|                 {% endfor %} | ||||
|             </select> | ||||
|             <select name="has_albums" class="basic_param"> | ||||
|                 <option value=""    {{"selected" if search_kwargs['has_albums']==None else ""}}>Album or no album</option> | ||||
|                 <option value="yes" {{"selected" if search_kwargs['has_albums']==True else ""}}>Photos contained in albums</option> | ||||
|                 <option value="no"  {{"selected" if search_kwargs['has_albums']==False else ""}}>Photos not in albums</option> | ||||
|             </select> | ||||
|             <select name="has_tags" class="basic_param"> | ||||
|                 <option value=""    {{"selected" if search_kwargs['has_tags']==None else ""}}>Tagged or untagged</option> | ||||
|                 <option value="yes" {{"selected" if search_kwargs['has_tags']==True else ""}}>Tagged only</option> | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue