|
@@ -220,11 +220,6 @@ class EmType(EmComponent):
|
220
|
220
|
# @throw ValueError when relation_nature isn't reconized or not allowed for this type
|
221
|
221
|
# @throw ValueError when relation_nature don't allow to link this types together
|
222
|
222
|
def add_superior(self, em_type, relation_nature):
|
223
|
|
- if not isinstance(em_type, EmType) or not isinstance(relation_nature, str):
|
224
|
|
- raise TypeError("Excepted <class EmType> and <class str> as em_type argument. But got : " + str(type(em_type)) + " " + str(type(relation_nature)))
|
225
|
|
- if relation_nature not in EmClassType.natures(self.classtype['name']):
|
226
|
|
- raise ValueError("Invalid nature for add_superior : '" + relation_nature + "'. Allowed relations for this type are " + str(EmClassType.natures(self.classtype['name'])))
|
227
|
|
-
|
228
|
223
|
#Checking that this relation is allowed by the nature of the relation
|
229
|
224
|
att = self.classtype['hierarchy'][relation_nature]['attach']
|
230
|
225
|
if att == 'classtype':
|
|
@@ -233,38 +228,43 @@ class EmType(EmComponent):
|
233
|
228
|
elif self.name != em_type.name:
|
234
|
229
|
raise ValueError("Not allowed to put a different em_type as superior in a relation of nature '" + relation_nature + "'")
|
235
|
230
|
|
236
|
|
- # TODO Réimplémenter
|
237
|
|
- # conn = self.db_engine.connect()
|
238
|
|
- # htable = self._table_hierarchy
|
239
|
|
- # values = {'subordinate_id': self.uid, 'superior_id': em_type.uid, 'nature': relation_nature}
|
240
|
|
- # req = htable.insert(values=values)
|
241
|
|
- #
|
242
|
|
- # try:
|
243
|
|
- # conn.execute(req)
|
244
|
|
- # except sql.exc.IntegrityError:
|
245
|
|
- # ret = False
|
246
|
|
- # else:
|
247
|
|
- # ret = True
|
248
|
|
- # finally:
|
249
|
|
- # conn.close()
|
250
|
|
- #
|
251
|
|
- # return ret
|
|
231
|
+ self._change_superiors_list(em_type, relation_nature, True)
|
252
|
232
|
|
253
|
233
|
## Delete a superior in the type hierarchy
|
254
|
234
|
# @param em_type EmType: An EmType instance
|
|
235
|
+ # @param relation_nature str: The name of the relation's nature
|
255
|
236
|
# @throw TypeError when em_type isn't an EmType instance
|
|
237
|
+ # @throw ValueError when relation_nature isn't reconized or not allowed for this type
|
256
|
238
|
def del_superior(self, em_type, relation_nature):
|
257
|
|
- if not isinstance(em_type, EmType):
|
258
|
|
- raise TypeError("Excepted <class EmType> as argument. But got : " + str(type(em_type)))
|
|
239
|
+ self._change_superiors_list(em_type, relation_nature, False)
|
|
240
|
+
|
|
241
|
+ ## Apply changes to the superiors_list
|
|
242
|
+ # @param em_type EmType: An EmType instance
|
|
243
|
+ # @param relation_nature str: The name of the relation's nature
|
|
244
|
+ # @param add bool: Add or delete relation
|
|
245
|
+ def _change_superiors_list(self, em_type, relation_nature, add=True):
|
|
246
|
+ # check instance of parameters
|
|
247
|
+ if not isinstance(em_type, EmType) or not isinstance(relation_nature, str):
|
|
248
|
+ raise TypeError("Excepted <class EmType> and <class str> as em_type argument. But got : " + str(type(em_type)) + " " + str(type(relation_nature)))
|
|
249
|
+ # check if relation_nature is valid for this type
|
259
|
250
|
if relation_nature not in EmClassType.natures(self.classtype['name']):
|
260
|
251
|
raise ValueError("Invalid nature for add_superior : '" + relation_nature + "'. Allowed relations for this type are " + str(EmClassType.natures(self.classtype['name'])))
|
261
|
252
|
|
262
|
|
- # TODO Réimplémenter
|
263
|
|
- # conn = self.db_engine.connect()
|
264
|
|
- # htable = self._table_hierarchy
|
265
|
|
- # req = htable.delete(htable.c.superior_id == em_type.uid and htable.c.nature == relation_nature)
|
266
|
|
- # conn.execute(req)
|
267
|
|
- # conn.close()
|
|
253
|
+ try:
|
|
254
|
+ if add:
|
|
255
|
+ self.superiors_list[relation_nature] = em_type.uid
|
|
256
|
+ self.model.migration_handler.register_change(self.model, self.uid, None, {'superiors_list': {relation_nature: em_type.uid}})
|
|
257
|
+ else:
|
|
258
|
+ del self.superiors_list[relation_nature]
|
|
259
|
+ self.model.migration_handler.register_change(self.model, self.uid, {'superiors_list': {relation_nature: em_type.uid}}, None)
|
|
260
|
+ except MigrationHandlerChangeError as exception_object:
|
|
261
|
+ if add:
|
|
262
|
+ del self.superiors_list[relation_nature]
|
|
263
|
+ else:
|
|
264
|
+ self.superiors_list[relation_nature] = em_type.uid
|
|
265
|
+ raise exception_object
|
|
266
|
+
|
|
267
|
+ self.model.migration_handler.register_model_state(self.model, hash(self.model))
|
268
|
268
|
|
269
|
269
|
## Checks if the EmType is valid
|
270
|
270
|
# @throw EmComponentCheckError if check fails
|