Browse Source

Bugfixes on EmComponent

- Now except for the modify_rank tests test_component didn't fails
- Added simple integer operation capabilities to EmFieldType_integer ( int cast, +=, -=, *=, /=, +, -, *, /, %, ...)
Yann Weber 9 years ago
parent
commit
80e82073fc
3 changed files with 68 additions and 47 deletions
  1. 20
    10
      EditorialModel/components.py
  2. 34
    0
      EditorialModel/fieldtypes.py
  3. 14
    37
      EditorialModel/test/test_component.py

+ 20
- 10
EditorialModel/components.py View File

@@ -30,6 +30,9 @@ class EmComponent(object):
30 30
     ## Used by EmComponent::modify_rank
31 31
     ranked_in = None
32 32
 
33
+    ##Read only properties
34
+    _ro_properties = [ 'date_update', 'date_create', 'uid', 'rank']
35
+
33 36
     ## Instaciate an EmComponent
34 37
     # @param id_or_name int|str: name or id of the object
35 38
     # @throw TypeError if id_or_name is not an integer nor a string
@@ -44,10 +47,8 @@ class EmComponent(object):
44 47
 
45 48
         # populate
46 49
         if isinstance(id_or_name, int):
47
-            self.uid = id_or_name
48
-            self.name = None
50
+            self._fields['uid'].value = id_or_name #read only propertie set
49 51
         elif isinstance(id_or_name, str):
50
-            self.uid = None
51 52
             self.name = id_or_name
52 53
         else:
53 54
             raise TypeError('Bad argument: expecting <int> or <str> but got : '+str(type(id_or_name)))
@@ -66,6 +67,9 @@ class EmComponent(object):
66 67
     # @param name str: The propertie name
67 68
     # @param value *: The value
68 69
     def __setattr__(self, name, value):
70
+        if name in  self.__class__._ro_properties:
71
+            raise TypeError("Propertie '"+name+"' is readonly")
72
+
69 73
         if name != '_fields' and hasattr(self, '_fields') and name in object.__getattribute__(self, '_fields'):
70 74
             self._fields[name].from_python(value)
71 75
         else:
@@ -119,6 +123,7 @@ class EmComponent(object):
119 123
     # @todo Check that the query didn't failed
120 124
     # @todo Check that every mandatory _fields are given in args
121 125
     # @todo Put a real rank at creation
126
+    # @todo Stop using datetime.datetime.utcnow() for date_update and date_create init
122 127
     @classmethod
123 128
     def create(cl, **kwargs):
124 129
         for argname in kwargs:
@@ -147,15 +152,19 @@ class EmComponent(object):
147 152
 
148 153
     ## Write the representation of the component in the database
149 154
     # @return bool
155
+    # @todo stop using datetime.datetime.utcnow() for date_update update
150 156
     def save(self):
151 157
         values = {}
152 158
         for name, field in self._fields.items():
153 159
             values[name] = field.to_sql()
154 160
 
155 161
         #Don't allow creation date overwritting
162
+        """
156 163
         if 'date_create' in values:
157 164
             del values['date_create']
158 165
             logger.warning("date_create supplied for save, but overwritting of date_create not allowed, the date will not be changed")
166
+        """
167
+        values['date_update'] = datetime.datetime.utcnow()
159 168
 
160 169
         self._saveDb(values)
161 170
     
@@ -247,7 +256,7 @@ class EmComponent(object):
247 256
                         c.execute(req, vals)
248 257
                         c.close()
249 258
 
250
-                        self.rank = new_rank
259
+                        self._fields['rank'].value = new_rank
251 260
 
252 261
                     else:
253 262
                         logger.error("Bad argument")
@@ -277,8 +286,8 @@ class EmComponent(object):
277 286
                             req = component.update().where(component.c.uid == sql.bindparam('id')).values(rank = sql.bindparam('rank'))
278 287
                             c.execute(req, vals)
279 288
                             c.close()
280
-
281
-                            self.rank += new_rank
289
+                            
290
+                            self._fields['rank'] += new_rank
282 291
                         else:
283 292
                             logger.error("Bad argument")
284 293
                             raise ValueError('Excepted a positive int not a null. new_rank = '+str((new_rank)))
@@ -304,7 +313,7 @@ class EmComponent(object):
304 313
                             c.execute(req, vals)
305 314
                             c.close()
306 315
 
307
-                            self.rank -= new_rank
316
+                            self._fields['rank'] -= new_rank
308 317
                         else:
309 318
                             logger.error("Bad argument")
310 319
                             raise ValueError('Excepted a positive int not a null. new_rank = '+str((new_rank)))
@@ -333,10 +342,11 @@ class EmComponent(object):
333 342
     ## Register a new component in UID table
334 343
     # 
335 344
     # Use the class property table
345
+    # @return A new uid (an integer)
336 346
     def newUid(cl):
337
-        """ This function register a new component in uids table
338
-            @return The new uid
339
-        """
347
+        if cl.table == None:
348
+            raise NotImplementedError("Abstract method")
349
+
340 350
         dbe = cl.getDbE()
341 351
 
342 352
         uidtable = sql.Table('uids', sqlutils.meta(dbe))

+ 34
- 0
EditorialModel/fieldtypes.py View File

@@ -51,6 +51,40 @@ class EmField_integer(EmFieldType):
51 51
             value = self.value
52 52
         return value
53 53
 
54
+    def __int__(self):
55
+        return self.value
56
+
57
+    def __add__(self, other):
58
+        return self.value + other
59
+
60
+    def __sub__(self, other):
61
+        return self.value - other
62
+
63
+    def __mul__(self, other):
64
+        return self.value * other
65
+
66
+    def __div__(self, other):
67
+        return self.value / other
68
+
69
+    def __mod__(self, other):
70
+        return self.value % other
71
+
72
+    def __iadd__(self, other):
73
+        self.value = int(self.value + other)
74
+        return self
75
+
76
+    def __isub__(self, other):
77
+        self.value = int(self.value - other)
78
+        return self
79
+
80
+    def __imul__(self, other):
81
+        self.value = int(self.value * other)
82
+        return self
83
+
84
+    def __idiv__(self, other):
85
+        self.value = int(self.value / other)
86
+        return self
87
+
54 88
     def sql_column(self):
55 89
         return "int(11) NOT NULL"
56 90
 

+ 14
- 37
EditorialModel/test/test_component.py View File

@@ -170,7 +170,7 @@ class ComponentTestCase(TestCase):
170 170
             elif vname in ['date_create', 'date_update']:
171 171
                 # Datetime comparison
172 172
                 if check_date:
173
-                    self.assertEqualDatetime(val[vname], getattr(test_comp, vname), msg)
173
+                    self.assertEqualDatetime(val[vname], getattr(test_comp, vname), vname+" assertion error : "+msg)
174 174
             else:
175 175
                 prop = vname
176 176
                 self.assertEqual(getattr(test_comp, prop), val[vname], msg+"Inconsistency for "+prop+" property")
@@ -203,9 +203,9 @@ class TestInit(ComponentTestCase):
203 203
 
204 204
     def test_component_abstract_init(self):
205 205
         """ Test not valid call (from EmComponent) of __init__ """
206
-        with self.assertRaises(EnvironmentError):
206
+        with self.assertRaises(NotImplementedError):
207 207
             test_comp = EmComponent(2)
208
-        with self.assertRaises(EnvironmentError):
208
+        with self.assertRaises(NotImplementedError):
209 209
             test_comp = EmComponent('name')
210 210
         pass
211 211
 
@@ -294,12 +294,14 @@ class TestSave(ComponentTestCase):
294 294
         for prop in ['name', 'help', 'string', 'date_update', 'date_create', 'rank' ]:
295 295
             if prop in ['string', 'help']:
296 296
                 assertion = self.assertEqualMlString
297
-            elif prop in ['date_update', 'date_create']:
297
+            elif prop == 'date_create':
298 298
                 assertion = self.assertEqualDatetime
299
+            elif prop == 'date_update':
300
+                assertion = self.assertLess
299 301
             else:
300 302
                 assertion = self.assertEqual
301 303
 
302
-            assertion(getattr(test_comp, prop), getattr(test_comp2, prop), "Save don't propagate modification properly. The '"+prop+"' property differs between the modified instance and a new one fetch from Db : ")
304
+            assertion(getattr(test_comp, prop), getattr(test_comp2, prop), "Save don't propagate modification properly. The '"+prop+"' property hasn't the exepted value in instance fetched from Db : ")
303 305
         pass
304 306
 
305 307
     def test_component_save_setattr(self):
@@ -352,32 +354,6 @@ class TestSave(ComponentTestCase):
352 354
 
353 355
         pass
354 356
 
355
-    @unittest.skip("Soon we will not use anymore the values argument of the savec method")
356
-    def test_component_save(self):
357
-        """ Checking save method after different changes using values arg of save method """
358
-        val = self.test_values[0]
359
-        test_comp = EmTestComp(val['name'])
360
-        self.check_equals(val, test_comp)
361
-
362
-        save_args = [
363
-            { 'name': 'foonewname' },
364
-            { 'name': 'foo new name'},
365
-            { 'help': '{"fr": "strhelp fr", "en":"strhelp en", "es":"strhelp es"}'},
366
-            { 'string': '{"fr": "helpstr fr", "en":"helpstr en", "es":"helpstr es"}'},
367
-            { 'name': 'oldname', 'help':'{"fr": "help fra", "en":"help eng", "es":"help esp"}', 'string':'{"fr": "string FR", "en":"string EN", "es":"string ES", "foolang":"foofoobar"}'},
368
-            { 'help': '{}', 'string':'{}'},
369
-        ]
370
-        for values in save_args:
371
-            for vname in values:
372
-                val[vname] = values[vname]
373
-
374
-            v = values.copy()
375
-            #WARNING : v is set by save
376
-            test_comp.save(v)
377
-            
378
-            print(val,"\n" ,values)
379
-            self._savecheck(test_comp, val)
380
-
381 357
     def test_component_save_illegalchanges(self):
382 358
         """ checking that the save method forbids some changes """
383 359
         val = self.test_values[1]
@@ -385,11 +361,12 @@ class TestSave(ComponentTestCase):
385 361
         changes = { 'date_create': datetime.datetime(1982,4,2,13,37), 'date_update': datetime.datetime(1982,4,2,22,43), 'rank': 42 }
386 362
 
387 363
         for prop in changes:
388
-            with self.subTest("Illega change of "+prop):
364
+            with self.subTest("Illegal change of "+prop):
389 365
                 test_comp = EmTestComp(val['name'])
390
-                self.check_equals(val, test_comp)
366
+                self.check_equals(val, test_comp, False)
391 367
                 
392
-                setattr(test_comp, prop, changes[prop])
368
+                with self.assertRaises(TypeError):
369
+                    setattr(test_comp, prop, changes[prop])
393 370
                 test_comp.save()
394 371
     
395 372
                 test_comp2 = EmTestComp(val['name'])
@@ -564,10 +541,10 @@ class TestModifyRank(ComponentTestCase):
564 541
 
565 542
             for j in range(1,i+1):
566 543
                 test_comp2 = EmTestComp(names[j])
567
-                self.assertEqual(test_comp2.rank, j-1)
544
+                self.assertEqual(test_comp2.rank, j-1, self.dump_ranks())
568 545
             for j in range(i+1,nmax+1):
569 546
                 test_comp2 = EmTestComp(names[j])
570
-                self.assertEqual(test_comp2.rank, j)
547
+                self.assertEqual(test_comp2.rank, j, self.dump_ranks())
571 548
 
572 549
             test_comp.modify_rank(i,'-')
573 550
             self.assertEqual(test_comp.rank, 0, "The instance on wich we applied the modify_rank -"+str(i)+" doesn't have excepted rank : excepted '0' but got '"+str(test_comp.rank)+"'")
@@ -576,7 +553,7 @@ class TestModifyRank(ComponentTestCase):
576 553
 
577 554
             for j in range(1,nmax+1):
578 555
                 test_comp2 = EmTestComp(names[j])
579
-                self.assertEqual(test_comp2.rank, j)
556
+                self.assertEqual(test_comp2.rank, j, self.dump_ranks())
580 557
 
581 558
         test_comp = EmTestComp(names[3])
582 559
         test_comp.modify_rank(2,'+')

Loading…
Cancel
Save