Yann Weber 9 лет назад
Родитель
Сommit
ff50f7ee64
1 измененных файлов: 72 добавлений и 25 удалений
  1. 72
    25
      leobject/leobject.py

+ 72
- 25
leobject/leobject.py Просмотреть файл

@@ -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

Загрузка…
Отмена
Сохранить