44from typing import List , Dict
55from apps .datasource .models .datasource import CoreField , CoreDatasource
66from apps .db .constant import DB
7- from common .core .deps import SessionDep
7+ from apps .system .models .system_variable_model import SystemVariable
8+ from common .core .deps import SessionDep , CurrentUser
89
910
10- def transFilterTree (session : SessionDep , tree_list : List [any ], ds : CoreDatasource ) -> str | None :
11+ def transFilterTree (session : SessionDep , current_user : CurrentUser , tree_list : List [any ],
12+ ds : CoreDatasource ) -> str | None :
1113 if tree_list is None :
1214 return None
1315 res : List [str ] = []
1416 for dto in tree_list :
1517 tree = dto .tree
1618 if tree is None :
1719 continue
18- tree_exp = transTreeToWhere (session , tree , ds )
20+ tree_exp = transTreeToWhere (session , current_user , tree , ds )
1921 if tree_exp is not None :
2022 res .append (tree_exp )
2123 return " AND " .join (res )
2224
2325
24- def transTreeToWhere (session : SessionDep , tree : any , ds : CoreDatasource ) -> str | None :
26+ def transTreeToWhere (session : SessionDep , current_user : CurrentUser , tree : any , ds : CoreDatasource ) -> str | None :
2527 if tree is None :
2628 return None
2729 logic = tree ['logic' ]
@@ -32,23 +34,25 @@ def transTreeToWhere(session: SessionDep, tree: any, ds: CoreDatasource) -> str
3234 for item in items :
3335 exp : str = None
3436 if item ['type' ] == 'item' :
35- exp = transTreeItem (session , item , ds )
37+ exp = transTreeItem (session , current_user , item , ds )
3638 elif item ['type' ] == 'tree' :
37- exp = transTreeToWhere (session , item ['sub_tree' ], ds )
39+ exp = transTreeToWhere (session , current_user , item ['sub_tree' ], ds )
3840
3941 if exp is not None :
4042 list .append (exp )
4143 return '(' + f' { logic } ' .join (list ) + ')' if len (list ) > 0 else None
4244
4345
44- def transTreeItem (session : SessionDep , item : Dict , ds : CoreDatasource ) -> str | None :
46+ def transTreeItem (session : SessionDep , current_user : CurrentUser , item : Dict , ds : CoreDatasource ) -> str | None :
4547 res : str = None
4648 field = session .query (CoreField ).filter (CoreField .id == int (item ['field_id' ])).first ()
4749 if field is None :
4850 return None
4951
5052 db = DB .get_db (ds .type )
5153 whereName = db .prefix + field .field_name + db .suffix
54+ whereTerm = transFilterTerm (item ['term' ])
55+
5256 if item ['filter_type' ] == 'enum' :
5357 if len (item ['enum_value' ]) > 0 :
5458 if ds ['type' ] == 'sqlServer' and (
@@ -57,38 +61,113 @@ def transTreeItem(session: SessionDep, item: Dict, ds: CoreDatasource) -> str |
5761 else :
5862 res = "(" + whereName + " IN ('" + "','" .join (item ['enum_value' ]) + "'))"
5963 else :
60- value = item ['value' ]
61- whereTerm = transFilterTerm (item ['term' ])
62- whereValue = ''
64+ # if system variable, do check and get value
65+ # new field: value_type(variable or normal), variable_id
66+ value_type = item .get ('value_type' )
67+ if value_type and value_type == 'variable' :
68+ # get system variable
69+ variable_id = item .get ('variable_id' )
70+ if variable_id is not None :
71+ sys_variable = session .query (SystemVariable ).filter (SystemVariable .id == variable_id ).first ()
72+ # do inner system variable
73+ if sys_variable .type == 'system' :
74+ res = whereName + whereTerm + getSysVariableValue (sys_variable , current_user )
75+ else :
76+ # check user variable
77+ user_variables = current_user .system_variables
78+ if user_variables is None or len (user_variables ) == 0 or not userHaveVariable (user_variables ,
79+ sys_variable ):
80+ return None
81+ else :
82+ # get user variable
83+ u_variable = None
84+ for u in user_variables :
85+ if u .get ('variableId' ) == sys_variable .id :
86+ u_variable = u
87+ break
88+ if u_variable is None :
89+ return None
6390
64- if item ['term' ] == 'null' :
65- whereValue = ''
66- elif item ['term' ] == 'not_null' :
67- whereValue = ''
68- elif item ['term' ] == 'empty' :
69- whereValue = "''"
70- elif item ['term' ] == 'not_empty' :
71- whereValue = "''"
72- elif item ['term' ] == 'in' or item ['term' ] == 'not in' :
73- if ds .type == 'sqlServer' and (
74- field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
75- whereValue = "(N'" + "', N'" .join (value .split ("," )) + "')"
76- else :
77- whereValue = "('" + "', '" .join (value .split ("," )) + "')"
78- elif item ['term' ] == 'like' or item ['term' ] == 'not like' :
79- if ds .type == 'sqlServer' and (
80- field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
81- whereValue = f"N'%{ value } %'"
91+ # check value
92+ values = u_variable .get ('variableValues' )
93+ if sys_variable .var_type == 'text' :
94+ set_sys = set (sys_variable .value )
95+ values = [x for x in values if x in set_sys ]
96+ if values is None or len (values ) == 0 :
97+ return None
98+ elif sys_variable .var_type == 'number' :
99+ if (sys_variable .value [0 ] is not None and values [0 ] < sys_variable .value [0 ]) or (
100+ sys_variable .value [1 ] is not None and values [0 ] > sys_variable .value [1 ]):
101+ return None
102+ elif sys_variable .var_type == 'datetime' :
103+ if (sys_variable .value [0 ] is not None and values [0 ] < sys_variable .value [0 ]) or (
104+ sys_variable .value [1 ] is not None and values [0 ] > sys_variable .value [1 ]):
105+ return None
106+
107+ # build exp
108+ whereValue = ''
109+ if item ['term' ] == 'null' :
110+ whereValue = ''
111+ elif item ['term' ] == 'not_null' :
112+ whereValue = ''
113+ elif item ['term' ] == 'empty' :
114+ whereValue = "''"
115+ elif item ['term' ] == 'not_empty' :
116+ whereValue = "''"
117+ elif item ['term' ] == 'in' or item ['term' ] == 'not in' :
118+ if ds .type == 'sqlServer' and (
119+ field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
120+ whereValue = "(N'" + "', N'" .join (values ) + "')"
121+ else :
122+ whereValue = "('" + "', '" .join (values ) + "')"
123+ elif item ['term' ] == 'like' or item ['term' ] == 'not like' :
124+ if ds .type == 'sqlServer' and (
125+ field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
126+ whereValue = f"N'%{ values [0 ]} %'"
127+ else :
128+ whereValue = f"'%{ values [0 ]} %'"
129+ else :
130+ if ds .type == 'sqlServer' and (
131+ field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
132+ whereValue = f"N'{ values [0 ]} '"
133+ else :
134+ whereValue = f"'{ values [0 ]} '"
135+
136+ res = whereName + whereTerm + whereValue
82137 else :
83- whereValue = f"'% { value } %'"
138+ return None
84139 else :
85- if ds .type == 'sqlServer' and (
86- field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
87- whereValue = f"N'{ value } '"
140+ value = item ['value' ]
141+ whereValue = ''
142+
143+ if item ['term' ] == 'null' :
144+ whereValue = ''
145+ elif item ['term' ] == 'not_null' :
146+ whereValue = ''
147+ elif item ['term' ] == 'empty' :
148+ whereValue = "''"
149+ elif item ['term' ] == 'not_empty' :
150+ whereValue = "''"
151+ elif item ['term' ] == 'in' or item ['term' ] == 'not in' :
152+ if ds .type == 'sqlServer' and (
153+ field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
154+ whereValue = "(N'" + "', N'" .join (value .split ("," )) + "')"
155+ else :
156+ whereValue = "('" + "', '" .join (value .split ("," )) + "')"
157+ elif item ['term' ] == 'like' or item ['term' ] == 'not like' :
158+ if ds .type == 'sqlServer' and (
159+ field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
160+ whereValue = f"N'%{ value } %'"
161+ else :
162+ whereValue = f"'%{ value } %'"
88163 else :
89- whereValue = f"'{ value } '"
164+ if ds .type == 'sqlServer' and (
165+ field .field_type == 'nchar' or field .field_type == 'NCHAR' or field .field_type == 'nvarchar' or field .field_type == 'NVARCHAR' ):
166+ whereValue = f"N'{ value } '"
167+ else :
168+ whereValue = f"'{ value } '"
90169
91- res = whereName + whereTerm + whereValue
170+ res = whereName + whereTerm + whereValue
92171 return res
93172
94173
@@ -124,3 +203,19 @@ def transFilterTerm(term: str) -> str:
124203 if term == "between" :
125204 return " BETWEEN "
126205 return ""
206+
207+
208+ def userHaveVariable (user_variables : List , sys_variable : SystemVariable ):
209+ for u in user_variables :
210+ if sys_variable .id == u .get ('variableId' ):
211+ return True
212+ return False
213+
214+
215+ def getSysVariableValue (sys_variable : SystemVariable , current_user : CurrentUser ):
216+ if sys_variable .value [0 ] == 'name' :
217+ return current_user .name
218+ if sys_variable .value [0 ] == 'account' :
219+ return current_user .account
220+ if sys_variable .value [0 ] == 'email' :
221+ return current_user .email
0 commit comments