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_mays=None, | ||||||
|             tag_forbids=None, |             tag_forbids=None, | ||||||
|             tag_expression=None, |             tag_expression=None, | ||||||
|  |             within_directory=None, | ||||||
| 
 | 
 | ||||||
|             limit=None, |             limit=None, | ||||||
|             offset=None, |             offset=None, | ||||||
|  | @ -628,6 +629,11 @@ class PDBPhotoMixin: | ||||||
|             'family AND (animals OR vacation)' |             'family AND (animals OR vacation)' | ||||||
|             'family vacation outdoors' (implicitly AND each term) |             '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 |         QUERY OPTIONS | ||||||
|         limit: |         limit: | ||||||
|             The maximum number of *successful* results to yield. |             The maximum number of *successful* results to yield. | ||||||
|  | @ -675,6 +681,7 @@ class PDBPhotoMixin: | ||||||
|         has_thumbnail = searchhelpers.normalize_has_thumbnail(has_thumbnail) |         has_thumbnail = searchhelpers.normalize_has_thumbnail(has_thumbnail) | ||||||
|         is_searchhidden = searchhelpers.normalize_is_searchhidden(is_searchhidden) |         is_searchhidden = searchhelpers.normalize_is_searchhidden(is_searchhidden) | ||||||
|         mimetype = searchhelpers.normalize_extension(mimetype) |         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_albums = searchhelpers.normalize_yield_albums(yield_albums) | ||||||
| 
 | 
 | ||||||
|         if has_tags is False: |         if has_tags is False: | ||||||
|  | @ -761,6 +768,7 @@ class PDBPhotoMixin: | ||||||
|                 'tag_mays': tag_mays or None, |                 'tag_mays': tag_mays or None, | ||||||
|                 'tag_forbids': tag_forbids or None, |                 'tag_forbids': tag_forbids or None, | ||||||
|                 'tag_expression': giveback_tag_expression or None, |                 'tag_expression': giveback_tag_expression or None, | ||||||
|  |                 'within_directory': within_directory or None, | ||||||
|                 'limit': limit, |                 'limit': limit, | ||||||
|                 'offset': offset or None, |                 'offset': offset or None, | ||||||
|                 'orderby': giveback_orderby or None, |                 'orderby': giveback_orderby or None, | ||||||
|  | @ -802,6 +810,17 @@ class PDBPhotoMixin: | ||||||
|         if mimetype: |         if mimetype: | ||||||
|             notnulls.add('extension') |             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: |         if has_tags is True: | ||||||
|             wheres.append('EXISTS (SELECT 1 FROM photo_tag_rel WHERE photoid == photos.id)') |             wheres.append('EXISTS (SELECT 1 FROM photo_tag_rel WHERE photoid == photos.id)') | ||||||
|         if has_tags is False: |         if has_tags is False: | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ from . import helpers | ||||||
| from . import objects | from . import objects | ||||||
| 
 | 
 | ||||||
| from voussoirkit import expressionmatch | from voussoirkit import expressionmatch | ||||||
|  | from voussoirkit import pathclass | ||||||
| from voussoirkit import sqlhelpers | from voussoirkit import sqlhelpers | ||||||
| 
 | 
 | ||||||
| def expand_mmf(tag_musts, tag_mays, tag_forbids): | def expand_mmf(tag_musts, tag_mays, tag_forbids): | ||||||
|  | @ -385,6 +386,36 @@ def normalize_tag_expression(expression): | ||||||
| 
 | 
 | ||||||
|     return 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): | def normalize_yield_albums(yield_albums): | ||||||
|     ''' |     ''' | ||||||
|     See etiquette.helpers.truthystring. |     See etiquette.helpers.truthystring. | ||||||
|  |  | ||||||
|  | @ -387,6 +387,9 @@ def get_search_core(): | ||||||
|     search_generator = common.P.search(**search_kwargs) |     search_generator = common.P.search(**search_kwargs) | ||||||
|     # Because of the giveback, first element is cleaned up kwargs |     # Because of the giveback, first element is cleaned up kwargs | ||||||
|     search_kwargs = next(search_generator) |     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) |     # print(search_kwargs) | ||||||
| 
 | 
 | ||||||
|     warnings = set() |     warnings = set() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue