|
@@ -84,29 +84,13 @@ class _LeObject(object):
|
84
|
84
|
# @param classname str : The name of the LeClass we want
|
85
|
85
|
# @return responses ({string:*}): a list of dict with field:value
|
86
|
86
|
def get(self, query_filters, field_list = None, typename = None, classname = None):
|
87
|
|
- filters = list()
|
88
|
|
- for query in query_filters:
|
89
|
|
- if len(query) == 3 and not isinstance(query, str):
|
90
|
|
- filters.append(tuple(query))
|
91
|
|
- else:
|
92
|
|
- filters.append(self._split_filter(query))
|
93
|
|
- #Now filters is a list of tuple (FIELD, OPERATOR, VALUE
|
94
|
|
-
|
|
87
|
+
|
|
88
|
+ letype,leclass = self._prepare_target(typename, classname)
|
|
89
|
+
|
95
|
90
|
#Fetching LeType
|
96
|
91
|
if typename is None:
|
97
|
|
- letype = None
|
98
|
92
|
if 'type_id' not in field_list:
|
99
|
93
|
field_list.append('type_id')
|
100
|
|
- else:
|
101
|
|
- letype = leobject.lefactory.LeFactory.leobj_from_name(typename)
|
102
|
|
-
|
103
|
|
- #Fetching LeClass
|
104
|
|
- if classname is None:
|
105
|
|
- leclass = None
|
106
|
|
- else:
|
107
|
|
- leclass = leobject.lefactory.LeFactory.leobj_from_name(classname)
|
108
|
|
- if not emclass:
|
109
|
|
- raise LeObjectQueryError("No such EmClass : '%s'"%classname)
|
110
|
94
|
|
111
|
95
|
#Checking field_list
|
112
|
96
|
if field_list is None:
|
|
@@ -119,12 +103,9 @@ class _LeObject(object):
|
119
|
103
|
else:
|
120
|
104
|
LeFactory._check_fields(letype, leclass, field_list)
|
121
|
105
|
|
122
|
|
- #Checking relational filters (for the moment fields like superior.NATURE)
|
123
|
|
- relational_filters = [ (LeFactory._nature_from_relational_field(field), operator, value) for field, operator, value in filters if LeFactory._field_is_relational(field)]
|
124
|
|
- filters = [f for f in filters if not self._field_is_relational(f[0])]
|
125
|
|
- #Checking the rest of the fields
|
126
|
|
- LeFactory._check_fields(letype, leclass, [ f[0] for f in filters ])
|
127
|
|
-
|
|
106
|
+ #preparing filters
|
|
107
|
+ filters, relationnal_filters = self._prepare_filters(query_filters, letype, leclass)
|
|
108
|
+
|
128
|
109
|
#Fetching datas from datasource
|
129
|
110
|
datas = self._datasource.get(emclass, emtype, field_list, filters, relational_filters)
|
130
|
111
|
|
|
@@ -136,6 +117,41 @@ class _LeObject(object):
|
136
|
117
|
|
137
|
118
|
return result
|
138
|
119
|
|
|
120
|
+ ## @brief Preparing letype and leclass arguments
|
|
121
|
+ #
|
|
122
|
+ # This function will do multiple things :
|
|
123
|
+ # - Convert string to LeType or LeClass child instances
|
|
124
|
+ # - If both letype and leclass given, check that letype inherit from leclass
|
|
125
|
+ # - If only a letype is given, fetch the parent leclass
|
|
126
|
+ # @note If we give only a leclass as argument returned letype will be None
|
|
127
|
+ # @note Its possible to give letype=None and leclass=None. In this case the method will return tuple(None,None)
|
|
128
|
+ # @param letype LeType|str|None : LeType child instant or its name
|
|
129
|
+ # @param leclass LeClass|str|None : LeClass child instant or its name
|
|
130
|
+ # @return a tuple with 2 python classes (LeTypeChild, LeClassChild)
|
|
131
|
+ @staticmethod
|
|
132
|
+ def _prepare_targets(letype = None , leclass = None):
|
|
133
|
+
|
|
134
|
+ if not(leclass is None):
|
|
135
|
+ if isinstance(leclass, str):
|
|
136
|
+ leclass = leobject.lefactory.LeFactory.leobj_from_name(leclass)
|
|
137
|
+
|
|
138
|
+ if not isinstance(leclass, LeClass) or leclass.__class__ == leobject.leclass.LeClass:
|
|
139
|
+ raise ValueError("None | str | LeType child class excpected, but got : %s"%type(letype))
|
|
140
|
+
|
|
141
|
+ if not(letype is None):
|
|
142
|
+ if isinstance(letype, str):
|
|
143
|
+ letype = leobject.lefactory.LeFactory.leobj_from_name(letype)
|
|
144
|
+
|
|
145
|
+ if not isinstance(letype, LeType) or letype.__class__ == leobject.letype.LeType:
|
|
146
|
+ raise ValueError("None | str | LeType child class excpected, but got : %s"%type(letype))
|
|
147
|
+
|
|
148
|
+ if leclass is None:
|
|
149
|
+ leclass = letype._leclass
|
|
150
|
+ elif leclass != letype._leclass:
|
|
151
|
+ raise ValueError("LeType child class %s does'nt inherite from LeClass %s"%(letype.__name__, leclass.__name))
|
|
152
|
+
|
|
153
|
+ return (letype, leclass)
|
|
154
|
+
|
139
|
155
|
## @brief Check if a fieldname is valid
|
140
|
156
|
# @param letype LeType|None : The concerned type (or None)
|
141
|
157
|
# @param leclass LeClass|None : The concerned class (or None)
|
|
@@ -164,6 +180,37 @@ class _LeObject(object):
|
164
|
180
|
raise LeObjectQueryError("No field named '%s' in '%s'"%(field, typename))
|
165
|
181
|
pass
|
166
|
182
|
|
|
183
|
+ ## @brief Prepare filters for datasource
|
|
184
|
+ #
|
|
185
|
+ # This method divide filters in two categories :
|
|
186
|
+ # - filters : standart FIELDNAME OP VALUE filter
|
|
187
|
+ # - relationnal_filters : filter on object relation RELATION_NATURE OP VALUE
|
|
188
|
+ #
|
|
189
|
+ # Both categories of filters are represented in the same way, a tuple with 3 elements (NAME|NAT , OP, VALUE )
|
|
190
|
+ #
|
|
191
|
+ # @warning This method assume that letype and leclass are returned from _LeObject._prepare_targets() method
|
|
192
|
+ # @param filters_l list : This list can contain str "FIELDNAME OP VALUE" and tuples (FIELDNAME, OP, VALUE)
|
|
193
|
+ # @param letype LeType|None : needed to check filters
|
|
194
|
+ # @param leclass LeClass|None : needed to check filters
|
|
195
|
+ # @return a tuple(FILTERS, RELATIONNAL_FILTERS°
|
|
196
|
+ @staticmethod
|
|
197
|
+ def _prepare_filters(filters_l, letype = None, leclass = None):
|
|
198
|
+ filters = list()
|
|
199
|
+ for fil in filters_l:
|
|
200
|
+ if len(fil) == 3 and not isinstance(fil, str):
|
|
201
|
+ filters.append(tuple(fil))
|
|
202
|
+ else:
|
|
203
|
+ filters.append(_LeObject._split_filter(fil))
|
|
204
|
+
|
|
205
|
+ #Checking relational filters (for the moment fields like superior.NATURE)
|
|
206
|
+ relational_filters = [ (LeFactory._nature_from_relational_field(field), operator, value) for field, operator, value in filters if LeFactory._field_is_relational(field)]
|
|
207
|
+ filters = [f for f in filters if not self._field_is_relational(f[0])]
|
|
208
|
+ #Checking the rest of the fields
|
|
209
|
+ LeFactory._check_fields(letype, leclass, [ f[0] for f in filters ])
|
|
210
|
+
|
|
211
|
+ return (filters, relationnal_filters)
|
|
212
|
+
|
|
213
|
+
|
167
|
214
|
## @brief Check if a field is relational or not
|
168
|
215
|
# @param field str : the field to test
|
169
|
216
|
# @return True if the field is relational else False
|