Coverage for gws-app/gws/base/search/manager.py: 0%

45 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-17 01:37 +0200

1"""Search manager.""" 

2 

3from typing import Optional 

4 

5import gws 

6 

7 

8class Object(gws.SearchManager): 

9 def run_search(self, search, user): 

10 results: list[gws.SearchResult] = [] 

11 

12 if search.layers: 

13 for layer in search.layers: 

14 for finder in layer.finders: 

15 self._run(search, user, finder, layer, results) 

16 if len(results) > search.limit: 

17 return results[:search.limit] 

18 

19 if search.project: 

20 for finder in search.project.finders: 

21 self._run(search, user, finder, None, results) 

22 if len(results) > search.limit: 

23 return results[:search.limit] 

24 

25 for finder in self.root.app.finders: 

26 self._run(search, user, finder, None, results) 

27 if len(results) > search.limit: 

28 return results[:search.limit] 

29 

30 return results 

31 

32 def _run( 

33 self, 

34 search: gws.SearchQuery, 

35 user: gws.User, 

36 finder: gws.Finder, 

37 layer: Optional[gws.Layer], 

38 results, 

39 ): 

40 gws.log.debug(f'SEARCH_BEGIN: {finder=} {layer=}') 

41 

42 if not user.can_use(finder): 

43 gws.log.debug('SEARCH_END: no access') 

44 return 

45 

46 if not finder.can_run(search, user): 

47 gws.log.debug(f'SEARCH_END: cannot run') 

48 return 

49 

50 try: 

51 features: list[gws.Feature] = finder.run(search, user, layer) or [] 

52 except: 

53 gws.log.exception('SEARCH_FAILED') 

54 return 

55 

56 for feature in features: 

57 if finder.title: 

58 feature.category = finder.title 

59 elif not feature.category and layer and layer.title: 

60 feature.category = layer.title 

61 

62 if search.bounds: 

63 feature.transform_to(search.bounds.crs) 

64 

65 results.append(gws.SearchResult(feature=feature, layer=layer, finder=finder)) 

66 if len(results) > search.limit: 

67 break 

68 

69 gws.log.debug(f'SEARCH_END, found={len(features)}')