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

+ 34
- 0
EditorialModel/fieldtypes.py View File

51
             value = self.value
51
             value = self.value
52
         return value
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
     def sql_column(self):
88
     def sql_column(self):
55
         return "int(11) NOT NULL"
89
         return "int(11) NOT NULL"
56
 
90
 

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

170
             elif vname in ['date_create', 'date_update']:
170
             elif vname in ['date_create', 'date_update']:
171
                 # Datetime comparison
171
                 # Datetime comparison
172
                 if check_date:
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
             else:
174
             else:
175
                 prop = vname
175
                 prop = vname
176
                 self.assertEqual(getattr(test_comp, prop), val[vname], msg+"Inconsistency for "+prop+" property")
176
                 self.assertEqual(getattr(test_comp, prop), val[vname], msg+"Inconsistency for "+prop+" property")
203
 
203
 
204
     def test_component_abstract_init(self):
204
     def test_component_abstract_init(self):
205
         """ Test not valid call (from EmComponent) of __init__ """
205
         """ Test not valid call (from EmComponent) of __init__ """
206
-        with self.assertRaises(EnvironmentError):
206
+        with self.assertRaises(NotImplementedError):
207
             test_comp = EmComponent(2)
207
             test_comp = EmComponent(2)
208
-        with self.assertRaises(EnvironmentError):
208
+        with self.assertRaises(NotImplementedError):
209
             test_comp = EmComponent('name')
209
             test_comp = EmComponent('name')
210
         pass
210
         pass
211
 
211
 
294
         for prop in ['name', 'help', 'string', 'date_update', 'date_create', 'rank' ]:
294
         for prop in ['name', 'help', 'string', 'date_update', 'date_create', 'rank' ]:
295
             if prop in ['string', 'help']:
295
             if prop in ['string', 'help']:
296
                 assertion = self.assertEqualMlString
296
                 assertion = self.assertEqualMlString
297
-            elif prop in ['date_update', 'date_create']:
297
+            elif prop == 'date_create':
298
                 assertion = self.assertEqualDatetime
298
                 assertion = self.assertEqualDatetime
299
+            elif prop == 'date_update':
300
+                assertion = self.assertLess
299
             else:
301
             else:
300
                 assertion = self.assertEqual
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
         pass
305
         pass
304
 
306
 
305
     def test_component_save_setattr(self):
307
     def test_component_save_setattr(self):
352
 
354
 
353
         pass
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
     def test_component_save_illegalchanges(self):
357
     def test_component_save_illegalchanges(self):
382
         """ checking that the save method forbids some changes """
358
         """ checking that the save method forbids some changes """
383
         val = self.test_values[1]
359
         val = self.test_values[1]
385
         changes = { 'date_create': datetime.datetime(1982,4,2,13,37), 'date_update': datetime.datetime(1982,4,2,22,43), 'rank': 42 }
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
         for prop in changes:
363
         for prop in changes:
388
-            with self.subTest("Illega change of "+prop):
364
+            with self.subTest("Illegal change of "+prop):
389
                 test_comp = EmTestComp(val['name'])
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
                 test_comp.save()
370
                 test_comp.save()
394
     
371
     
395
                 test_comp2 = EmTestComp(val['name'])
372
                 test_comp2 = EmTestComp(val['name'])
564
 
541
 
565
             for j in range(1,i+1):
542
             for j in range(1,i+1):
566
                 test_comp2 = EmTestComp(names[j])
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
             for j in range(i+1,nmax+1):
545
             for j in range(i+1,nmax+1):
569
                 test_comp2 = EmTestComp(names[j])
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
             test_comp.modify_rank(i,'-')
549
             test_comp.modify_rank(i,'-')
573
             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)+"'")
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
 
553
 
577
             for j in range(1,nmax+1):
554
             for j in range(1,nmax+1):
578
                 test_comp2 = EmTestComp(names[j])
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
         test_comp = EmTestComp(names[3])
558
         test_comp = EmTestComp(names[3])
582
         test_comp.modify_rank(2,'+')
559
         test_comp.modify_rank(2,'+')

Loading…
Cancel
Save