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 23:09 +0200
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 23:09 +0200
1"""Text field."""
3from typing import Optional, cast
5import gws
6import gws.base.database.model
7import gws.base.model.scalar_field
8import gws.lib.sa as sa
11gws.ext.new.modelField('text')
14class Config(gws.base.model.scalar_field.Config):
15 """Configuration for text field."""
17 textSearch: Optional[gws.TextSearchOptions]
18 """Text search options, if enabled."""
21class Props(gws.base.model.scalar_field.Props):
22 pass
25class Object(gws.base.model.scalar_field.Object):
26 attributeType = gws.AttributeType.str
27 textSearch: Optional[gws.TextSearchOptions]
29 def configure(self):
30 self.textSearch = self.cfg('textSearch')
31 if self.textSearch:
32 self.supportsKeywordSearch = True
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
39 ##
41 def before_select(self, mc):
42 super().before_select(mc)
44 kw = mc.search.keyword
45 ts = self.textSearch
47 if not kw or not ts or (ts.minLength and len(kw) < ts.minLength):
48 return
50 model = cast(gws.base.database.model.Object, self.model)
51 col = sa.cast(model.column(self.name), sa.String)
53 if ts.type == gws.TextSearchType.exact:
54 mc.dbSelect.keywordWhere.append(col.__eq__(kw))
55 return
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
66 if ts.caseSensitive:
67 mc.dbSelect.keywordWhere.append(col.like(kw, escape='\\'))
68 else:
69 mc.dbSelect.keywordWhere.append(col.ilike(kw, escape='\\'))
72def _escape_like(s, escape='\\'):
73 return s.replace(escape, escape + escape).replace('%', escape + '%').replace('_', escape + '_')