Sfoglia il codice sorgente

Bugfixes on leobject & query

Yann Weber 8 anni fa
parent
commit
9c23abcdcc
3 ha cambiato i file con 28 aggiunte e 29 eliminazioni
  1. 4
    5
      lodel/leapi/leobject.py
  2. 20
    20
      lodel/leapi/query.py
  3. 4
    4
      tests/leapi/test_leobject.py

+ 4
- 5
lodel/leapi/leobject.py Vedi File

@@ -1,7 +1,6 @@
1 1
 #-*- coding: utf-8 -*-
2 2
 
3 3
 import importlib
4
-import warnings
5 4
 
6 5
 from lodel.plugin import Plugin
7 6
 from lodel import logger
@@ -91,7 +90,7 @@ class LeObject(object):
91 90
                     )
92 91
             else:
93 92
                 self.__datas[fieldname] = fieldval
94
-                self.__initialized = list()
93
+                self.__initialized.append(fieldname)
95 94
         if len(err_list) > 0:
96 95
             raise LeApiErrors(err_list)
97 96
         self.__set_initialized()
@@ -145,7 +144,7 @@ class LeObject(object):
145 144
         mod = importlib.import_module(cls.__module__)
146 145
         try:
147 146
             return getattr(mod, leobject_name)
148
-        except AttributeError:
147
+        except (AttributeError, TypeError) :
149 148
             raise LeApiError("No LeObject named '%s'" % leobject_name)
150 149
     
151 150
     @classmethod
@@ -512,10 +511,10 @@ raised when trying to import Datasource"
512 511
         query_filter = list()
513 512
         for uid in uids:
514 513
             query_filter.append((uid, '=', self.data(uid)))
515
-        query = LeDeleteQuery(cls, query_filter)
514
+        query = LeDeleteQuery(self.__class__, query_filter)
516 515
         try:
517 516
             result = query.execute()
518
-        except LeQueryError as err:
517
+        except LeApiQueryError as err:
519 518
             raise err
520 519
             
521 520
         return result

+ 20
- 20
lodel/leapi/query.py Vedi File

@@ -33,10 +33,10 @@ class LeQuery(object):
33 33
     ##@brief Execute a query and return the result
34 34
     # @param **datas
35 35
     # @return the query result
36
-    # @see LeQuery.__query()
36
+    # @see LeQuery._query()
37 37
     #
38 38
     def execute(self, **datas):
39
-        if len(datas) > 0:
39
+        if 'datas' in datas and len(datas['datas']) > 0:
40 40
             self._target_class.check_datas_value(
41 41
                                                     datas['datas'],
42 42
                                                     **self._data_check_args)
@@ -46,7 +46,7 @@ class LeQuery(object):
46 46
         LodelHook.call_hook(    self._hook_prefix+'_pre',
47 47
                                 self._target_class,
48 48
                                 datas)
49
-        ret = self.__query(target = self._target_class, **datas)
49
+        ret = self._query(**datas)
50 50
         ret = LodelHook.call_hook(  self._hook_prefix+'_post',
51 51
                                     self._target_class,
52 52
                                     ret)
@@ -55,7 +55,7 @@ class LeQuery(object):
55 55
     ##@brief Childs classes implements this method to execute the query
56 56
     # @param **datas
57 57
     # @return query result
58
-    def __query(self, **datas):
58
+    def _query(self, **datas):
59 59
         raise NotImplementedError("Asbtract method")
60 60
     
61 61
     ##@return a dict with query infos
@@ -95,7 +95,7 @@ class LeFilteredQuery(LeQuery):
95 95
     def __init__(self, target_class, query_filters = None):
96 96
         super().__init__(target_class)
97 97
         ##@brief The query filter tuple(std_filter, relational_filters)
98
-        self.__query_filter = None
98
+        self._query_filter = None
99 99
         ##@brief Stores potential subqueries (used when a query implies
100 100
         # more than one datasource.
101 101
         #
@@ -108,23 +108,23 @@ class LeFilteredQuery(LeQuery):
108 108
     # This method takes care to execute subqueries before calling super execute
109 109
     def execute(self, datas = None):
110 110
         #copy originals filters
111
-        orig_filters = copy.copy(self.__query_filter)
112
-        std_filters, rel_filters = self.__query_filter
111
+        orig_filters = copy.copy(self._query_filter)
112
+        std_filters, rel_filters = self._query_filter
113 113
 
114 114
         for rfield, subq in self.subqueries:
115 115
             subq_res = subq.execute()
116 116
             std_filters.append(
117 117
                 (rfield, ' in ', subq_res))
118
-        self.__query_filter = (std_filters, rel_filters)
118
+        self._query_filter = (std_filters, rel_filters)
119 119
         try:
120
-            filters, rel_filters = self.__query_filter
120
+            filters, rel_filters = self._query_filter
121 121
             res = super().execute(filters = filters, rel_filters = rel_filters)
122 122
         except Exception as e:
123 123
             #restoring filters even if an exception is raised
124
-            self.__query_filter = orig_filter
124
+            self._query_filter = orig_filters
125 125
             raise e #reraise
126 126
         #restoring filters
127
-        self.__query_filter = orig_filters
127
+        self._query_filter = orig_filters
128 128
         return res
129 129
 
130 130
     ##@brief Add filter(s) to the query
@@ -185,8 +185,8 @@ class LeFilteredQuery(LeQuery):
185 185
                     ((rfield, ref_dict), op, value))
186 186
         #deduplication of std filters
187 187
         filters_orig = list(set(filters_orig))
188
-        # Sets __query_filter attribute of self query
189
-        self.__query_filter = (filters_orig, result_rel_filters)
188
+        # Sets _query_filter attribute of self query
189
+        self._query_filter = (filters_orig, result_rel_filters)
190 190
 
191 191
         #Sub queries creation
192 192
         subq = list()
@@ -204,7 +204,7 @@ class LeFilteredQuery(LeQuery):
204 204
     ##@return informations
205 205
     def dump_infos(self):
206 206
         ret = super().dump_infos()
207
-        ret['query_filter'] = self.__query_filter
207
+        ret['query_filter'] = self._query_filter
208 208
         ret['subqueries'] = self.subqueries
209 209
         return ret
210 210
 
@@ -212,7 +212,7 @@ class LeFilteredQuery(LeQuery):
212 212
         res = "<{classname} target={target_class} query_filter={query_filter}"
213 213
         res = ret.format(
214 214
             classname=self.__class__.__name__,
215
-            query_filter = self.__query_filter,
215
+            query_filter = self._query_filter,
216 216
             target_class = self._target_class)
217 217
         if len(self.subqueries) > 0:
218 218
             for n,subq in enumerate(self.subqueries):
@@ -459,7 +459,7 @@ class LeInsertQuery(LeQuery):
459 459
     
460 460
     ## @brief Implements an insert query operation, with only one insertion
461 461
     # @param new_datas : datas to be inserted
462
-    def __query(self, datas):
462
+    def _query(self, datas):
463 463
         datas = self._target_class.prepare_datas(datas, True, False)
464 464
         nb_inserted = self._rw_datasource.insert(self._target_class,datas)
465 465
         if nb_inserted < 0:
@@ -468,7 +468,7 @@ class LeInsertQuery(LeQuery):
468 468
     """
469 469
     ## @brief Implements an insert query operation, with multiple insertions
470 470
     # @param datas : list of **datas to be inserted
471
-    def __query(self, datas):
471
+    def _query(self, datas):
472 472
         nb_inserted = self._datasource.insert_multi(
473 473
             self._target_class,datas_list)
474 474
         if nb_inserted < 0:
@@ -525,7 +525,7 @@ target to LeUpdateQuery constructor"
525 525
     #@returns the number of updated items
526 526
     #@todo change stategy for instance update. Datas should be allowed 
527 527
     #for execute method (and query)
528
-    def __query(self, filters, rel_filters, datas):
528
+    def _query(self, filters, rel_filters, datas):
529 529
         uid_name = self._target_class._uid[0]
530 530
         if self.__leobject_instance is not None:
531 531
             #Instance update
@@ -575,7 +575,7 @@ class LeDeleteQuery(LeFilteredQuery):
575 575
     #@param filters list : see @ref LeFilteredQuery
576 576
     #@param rel_filters list : see @ref LeFilteredQuery
577 577
     #@returns the number of deleted items
578
-    def __query(self, filters, rel_filters):
578
+    def _query(self, filters, rel_filters):
579 579
         nb_deleted = self._rw_datasource.delete(
580 580
             self._target_class, filters, rel_filters)
581 581
         return nb_deleted
@@ -666,7 +666,7 @@ class LeGetQuery(LeFilteredQuery):
666 666
 
667 667
     ##@brief Implements select query operations
668 668
     # @returns a list containing the item(s)
669
-    def __query(self):
669
+    def _query(self):
670 670
         # select datas corresponding to query_filter
671 671
         l_datas=self._ro_datasource.select(  self._target_class,
672 672
                                     list(self.field_list),

+ 4
- 4
tests/leapi/test_leobject.py Vedi File

@@ -59,11 +59,12 @@ class LeObjectDummyTestCase(unittest.TestCase):
59 59
     def test_bad_name2class(self):
60 60
         """ Testing failures of the class method that returns a dynamic object
61 61
             given it's name """
62
-        badnames = ['foobar', 'LeObject', 'str', str, None, 42]
62
+        badnames = ['foobar', 'str', str, None, 42]
63 63
         callers = [dyncode.Object, dyncode.Person, dyncode.Entitie]
64 64
         for caller in callers:
65 65
             for badname in badnames:
66
-                with self.assertRaises(LeApiError):
66
+                with self.assertRaises(LeApiError, msg="LeApiError not raised \
67
+but invalid name %s was given" % badname):
67 68
                     caller.name2class(badname)
68 69
 
69 70
     def test_abstract_name2class(self):
@@ -151,7 +152,7 @@ class LeObjectQueryMockTestCase(unittest.TestCase):
151 152
                 dyncode.Person, [('lodel_id', '=', 1)], [])
152 153
 
153 154
     def test_delete_bundle(self):
154
-        """ Checking that LeObject delete_bundle methid calls LeDeleteQuery
155
+        """ Checking that LeObject delete_bundle method calls LeDeleteQuery
155 156
             correctly """
156 157
         with patch.object(
157 158
             LeDeleteQuery, '__init__', return_value = None) as mock_init:
@@ -167,4 +168,3 @@ class LeObjectQueryMockTestCase(unittest.TestCase):
167 168
             mock_init.assert_called_once_with(
168 169
                 dyncode.Person, [('lodel_id', '>', 1)], [])
169 170
 
170
-        

Loading…
Annulla
Salva