Coverage for gws-app/gws/plugin/model_field/text/__init__.py: 85%

46 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-10-16 22:59 +0200

1"""Text field.""" 

2 

3from typing import Optional, cast 

4 

5import gws 

6import gws.base.database.model 

7import gws.base.model.scalar_field 

8import gws.lib.sa as sa 

9 

10 

11gws.ext.new.modelField('text') 

12 

13 

14class Config(gws.base.model.scalar_field.Config): 

15 """Configuration for text field.""" 

16 

17 textSearch: Optional[gws.TextSearchOptions] 

18 """Text search options, if enabled.""" 

19 

20 

21class Props(gws.base.model.scalar_field.Props): 

22 pass 

23 

24 

25class Object(gws.base.model.scalar_field.Object): 

26 attributeType = gws.AttributeType.str 

27 textSearch: Optional[gws.TextSearchOptions] 

28 

29 def configure(self): 

30 self.textSearch = self.cfg('textSearch') 

31 if self.textSearch: 

32 self.supportsKeywordSearch = True 

33 

34 def configure_widget(self): 

35 if not super().configure_widget(): 

36 self.widget = self.root.create_shared(gws.ext.object.modelWidget, type='input') 

37 return True 

38 

39 ## 

40 

41 def before_select(self, mc): 

42 super().before_select(mc) 

43 

44 kw = mc.search.keyword 

45 ts = self.textSearch 

46 

47 if not kw or not ts or (ts.minLength and len(kw) < ts.minLength): 

48 return 

49 

50 model = cast(gws.base.database.model.Object, self.model) 

51 col = sa.cast(model.column(self.name), sa.String) 

52 

53 if ts.type == gws.TextSearchType.exact: 

54 mc.dbSelect.keywordWhere.append(col.__eq__(kw)) 

55 return 

56 

57 if ts.type == gws.TextSearchType.any: 

58 kw = '%' + _escape_like(kw) + '%' 

59 elif ts.type == gws.TextSearchType.begin: 

60 kw = _escape_like(kw) + '%' 

61 elif ts.type == gws.TextSearchType.end: 

62 kw = '%' + _escape_like(kw) 

63 elif ts.type == gws.TextSearchType.like: 

64 pass 

65 

66 if ts.caseSensitive: 

67 mc.dbSelect.keywordWhere.append(col.like(kw, escape='\\')) 

68 else: 

69 mc.dbSelect.keywordWhere.append(col.ilike(kw, escape='\\')) 

70 

71 

72def _escape_like(s, escape='\\'): 

73 return s.replace(escape, escape + escape).replace('%', escape + '%').replace('_', escape + '_')