Add search argument within_directory.
This commit is contained in:
		
							parent
							
								
									da67740689
								
							
						
					
					
						commit
						667c14f072
					
				
					 3 changed files with 53 additions and 0 deletions
				
			
		|  | @ -550,6 +550,7 @@ class PDBPhotoMixin: | |||
|             tag_mays=None, | ||||
|             tag_forbids=None, | ||||
|             tag_expression=None, | ||||
|             within_directory=None, | ||||
| 
 | ||||
|             limit=None, | ||||
|             offset=None, | ||||
|  | @ -628,6 +629,11 @@ class PDBPhotoMixin: | |||
|             'family AND (animals OR vacation)' | ||||
|             'family vacation outdoors' (implicitly AND each term) | ||||
| 
 | ||||
|         within_directory: | ||||
|             A string or list of strings or pathclass Paths of directories. | ||||
|             Photos MUST have a `filepath` that is a child of one of these | ||||
|             directories. | ||||
| 
 | ||||
|         QUERY OPTIONS | ||||
|         limit: | ||||
|             The maximum number of *successful* results to yield. | ||||
|  | @ -675,6 +681,7 @@ class PDBPhotoMixin: | |||
|         has_thumbnail = searchhelpers.normalize_has_thumbnail(has_thumbnail) | ||||
|         is_searchhidden = searchhelpers.normalize_is_searchhidden(is_searchhidden) | ||||
|         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) | ||||
| 
 | ||||
|         if has_tags is False: | ||||
|  | @ -761,6 +768,7 @@ class PDBPhotoMixin: | |||
|                 'tag_mays': tag_mays or None, | ||||
|                 'tag_forbids': tag_forbids or None, | ||||
|                 'tag_expression': giveback_tag_expression or None, | ||||
|                 'within_directory': within_directory or None, | ||||
|                 'limit': limit, | ||||
|                 'offset': offset or None, | ||||
|                 'orderby': giveback_orderby or None, | ||||
|  | @ -802,6 +810,17 @@ class PDBPhotoMixin: | |||
|         if mimetype: | ||||
|             notnulls.add('extension') | ||||
| 
 | ||||
|         if within_directory: | ||||
|             patterns = {f'{d.absolute_path}{os.sep}%' for d in within_directory} | ||||
|             clauses = ['filepath LIKE ?'] * len(patterns) | ||||
|             if len(clauses) > 1: | ||||
|                 clauses = ' OR '.join(clauses) | ||||
|                 clauses = f'({clauses})' | ||||
|             else: | ||||
|                 clauses = clauses.pop() | ||||
|             wheres.append(clauses) | ||||
|             bindings.extend(patterns) | ||||
| 
 | ||||
|         if has_tags is True: | ||||
|             wheres.append('EXISTS (SELECT 1 FROM photo_tag_rel WHERE photoid == photos.id)') | ||||
|         if has_tags is False: | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ from . import helpers | |||
| from . import objects | ||||
| 
 | ||||
| from voussoirkit import expressionmatch | ||||
| from voussoirkit import pathclass | ||||
| from voussoirkit import sqlhelpers | ||||
| 
 | ||||
| def expand_mmf(tag_musts, tag_mays, tag_forbids): | ||||
|  | @ -385,6 +386,36 @@ def normalize_tag_expression(expression): | |||
| 
 | ||||
|     return expression | ||||
| 
 | ||||
| def normalize_within_directory(paths, warning_bag=None): | ||||
|     if paths is None: | ||||
|         return set() | ||||
| 
 | ||||
|     if isinstance(paths, set): | ||||
|         pass | ||||
|     elif isinstance(paths, (str, pathclass.Path)): | ||||
|         paths = {paths} | ||||
|     elif isinstance(paths, (list, tuple)): | ||||
|         paths = set(paths) | ||||
|     else: | ||||
|         exc = TypeError(paths) | ||||
|         if warning_bag: | ||||
|             warning_bag.add(exc) | ||||
|             return set() | ||||
|         else: | ||||
|             raise exc | ||||
| 
 | ||||
|     paths = {pathclass.Path(p) for p in paths} | ||||
|     directories = {p for p in paths if p.is_dir} | ||||
|     not_directories = paths.difference(directories) | ||||
|     if not_directories: | ||||
|         exc = pathclass.NotDirectory(not_directories) | ||||
|         if warning_bag: | ||||
|             warning_bag.add(exc) | ||||
|         else: | ||||
|             raise exc | ||||
| 
 | ||||
|     return directories | ||||
| 
 | ||||
| def normalize_yield_albums(yield_albums): | ||||
|     ''' | ||||
|     See etiquette.helpers.truthystring. | ||||
|  |  | |||
|  | @ -387,6 +387,9 @@ def get_search_core(): | |||
|     search_generator = common.P.search(**search_kwargs) | ||||
|     # Because of the giveback, first element is cleaned up kwargs | ||||
|     search_kwargs = next(search_generator) | ||||
|     # Web UI users aren't allowed to use within_directory anyway, so don't | ||||
|     # show it to them. | ||||
|     search_kwargs.pop('within_directory', None) | ||||
|     # print(search_kwargs) | ||||
| 
 | ||||
|     warnings = set() | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue