40 from cubicweb.schema import (RQLVocabularyConstraint, RQLConstraint, |
40 from cubicweb.schema import (RQLVocabularyConstraint, RQLConstraint, |
41 GeneratedConstraint) |
41 GeneratedConstraint) |
42 from cubicweb.rqlrewrite import RQLRewriter |
42 from cubicweb.rqlrewrite import RQLRewriter |
43 |
43 |
44 from cubicweb.uilib import soup2xhtml |
44 from cubicweb.uilib import soup2xhtml |
45 from cubicweb.mixins import MI_REL_TRIGGERS |
|
46 from cubicweb.mttransforms import ENGINE |
45 from cubicweb.mttransforms import ENGINE |
47 |
46 |
48 _marker = object() |
47 _marker = object() |
49 |
48 |
50 def greater_card(rschema, subjtypes, objtypes, index): |
49 def greater_card(rschema, subjtypes, objtypes, index): |
192 if rschema.type == 'eid': |
191 if rschema.type == 'eid': |
193 continue |
192 continue |
194 setattr(cls, rschema.type, Attribute(rschema.type)) |
193 setattr(cls, rschema.type, Attribute(rschema.type)) |
195 mixins = [] |
194 mixins = [] |
196 for rschema, _, role in eschema.relation_definitions(): |
195 for rschema, _, role in eschema.relation_definitions(): |
197 if (rschema, role) in MI_REL_TRIGGERS: |
|
198 mixin = MI_REL_TRIGGERS[(rschema, role)] |
|
199 if not (issubclass(cls, mixin) or mixin in mixins): # already mixed ? |
|
200 mixins.append(mixin) |
|
201 for iface in getattr(mixin, '__implements__', ()): |
|
202 if not interface.implements(cls, iface): |
|
203 interface.extend(cls, iface) |
|
204 if role == 'subject': |
196 if role == 'subject': |
205 attr = rschema.type |
197 attr = rschema.type |
206 else: |
198 else: |
207 attr = 'reverse_%s' % rschema.type |
199 attr = 'reverse_%s' % rschema.type |
208 setattr(cls, attr, Relation(rschema, role)) |
200 setattr(cls, attr, Relation(rschema, role)) |
209 if mixins: |
|
210 # see etype class instantation in cwvreg.ETypeRegistry.etype_class method: |
|
211 # due to class dumping, cls is the generated top level class with actual |
|
212 # user class as (only) parent. Since we want to be able to override mixins |
|
213 # method from this user class, we have to take care to insert mixins after that |
|
214 # class |
|
215 # |
|
216 # note that we don't plug mixins as user class parent since it causes pb |
|
217 # with some cases of entity classes inheritance. |
|
218 mixins.insert(0, cls.__bases__[0]) |
|
219 mixins += cls.__bases__[1:] |
|
220 cls.__bases__ = tuple(mixins) |
|
221 cls.info('plugged %s mixins on %s', mixins, cls) |
|
222 |
201 |
223 fetch_attrs = ('modification_date',) |
202 fetch_attrs = ('modification_date',) |
224 |
203 |
225 @classmethod |
204 @classmethod |
226 def cw_fetch_order(cls, select, attr, var): |
205 def cw_fetch_order(cls, select, attr, var): |
1336 |
1315 |
1337 @deprecated('[3.13] use entity.cw_clear_all_caches()') |
1316 @deprecated('[3.13] use entity.cw_clear_all_caches()') |
1338 def clear_all_caches(self): |
1317 def clear_all_caches(self): |
1339 return self.cw_clear_all_caches() |
1318 return self.cw_clear_all_caches() |
1340 |
1319 |
1341 @deprecated('[3.9] use entity.cw_attr_value(attr)') |
|
1342 def get_value(self, name): |
|
1343 return self.cw_attr_value(name) |
|
1344 |
|
1345 @deprecated('[3.9] use entity.cw_delete()') |
|
1346 def delete(self, **kwargs): |
|
1347 return self.cw_delete(**kwargs) |
|
1348 |
|
1349 @deprecated('[3.9] use entity.cw_attr_metadata(attr, metadata)') |
|
1350 def attr_metadata(self, attr, metadata): |
|
1351 return self.cw_attr_metadata(attr, metadata) |
|
1352 |
|
1353 @deprecated('[3.9] use entity.cw_has_perm(action)') |
|
1354 def has_perm(self, action): |
|
1355 return self.cw_has_perm(action) |
|
1356 |
|
1357 @deprecated('[3.9] use entity.cw_set_relation_cache(rtype, role, rset)') |
|
1358 def set_related_cache(self, rtype, role, rset): |
|
1359 self.cw_set_relation_cache(rtype, role, rset) |
|
1360 |
|
1361 @deprecated('[3.9] use entity.cw_clear_relation_cache(rtype, role)') |
|
1362 def clear_related_cache(self, rtype=None, role=None): |
|
1363 self.cw_clear_relation_cache(rtype, role) |
|
1364 |
|
1365 @deprecated('[3.9] use entity.cw_related_rql(rtype, [role, [targettypes]])') |
|
1366 def related_rql(self, rtype, role='subject', targettypes=None): |
|
1367 return self.cw_related_rql(rtype, role, targettypes) |
|
1368 |
|
1369 @property |
1320 @property |
1370 @deprecated('[3.10] use entity.cw_edited') |
1321 @deprecated('[3.10] use entity.cw_edited') |
1371 def edited_attributes(self): |
1322 def edited_attributes(self): |
1372 return self.cw_edited |
1323 return self.cw_edited |
1373 |
1324 |