cubicweb/entities/schemaobjs.py
changeset 11057 0b59724cb3f2
parent 7827 9bbf83f68bcc
child 11767 432f87a63057
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cubicweb/entities/schemaobjs.py	Sat Jan 16 13:48:51 2016 +0100
@@ -0,0 +1,178 @@
+# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of CubicWeb.
+#
+# CubicWeb is free software: you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
+"""schema definition related entities"""
+
+__docformat__ = "restructuredtext en"
+
+from logilab.common.decorators import cached
+
+from yams.schema import role_name
+
+from cubicweb import ValidationError
+from cubicweb.schema import ERQLExpression, RRQLExpression
+
+from cubicweb.entities import AnyEntity, fetch_config
+
+
+class CWEType(AnyEntity):
+    __regid__ = 'CWEType'
+    fetch_attrs, cw_fetch_order = fetch_config(['name'])
+
+    def dc_title(self):
+        return u'%s (%s)' % (self.name, self._cw._(self.name))
+
+    def dc_long_title(self):
+        stereotypes = []
+        _ = self._cw._
+        if self.final:
+            stereotypes.append(_('final'))
+        if stereotypes:
+            return u'%s <<%s>>' % (self.dc_title(), ', '.join(stereotypes))
+        return self.dc_title()
+
+
+class CWRType(AnyEntity):
+    __regid__ = 'CWRType'
+    fetch_attrs, cw_fetch_order = fetch_config(['name'])
+
+    def dc_title(self):
+        return u'%s (%s)' % (self.name, self._cw._(self.name))
+
+    def dc_long_title(self):
+        stereotypes = []
+        _ = self._cw._
+        if self.symmetric:
+            stereotypes.append(_('symmetric'))
+        if self.inlined:
+            stereotypes.append(_('inlined'))
+        if self.final:
+            stereotypes.append(_('final'))
+        if stereotypes:
+            return u'%s <<%s>>' % (self.dc_title(), ', '.join(stereotypes))
+        return self.dc_title()
+
+    def check_inlined_allowed(self):
+        """check inlining is possible, raise ValidationError if not possible
+        """
+        # don't use the persistent schema, we may miss cardinality changes
+        # in the same transaction
+        for rdef in self.reverse_relation_type:
+            card = rdef.cardinality[0]
+            if not card in '?1':
+                qname = role_name('inlined', 'subject')
+                rtype = self.name
+                stype = rdef.stype
+                otype = rdef.otype
+                msg = self._cw._("can't set inlined=True, "
+                                 "%(stype)s %(rtype)s %(otype)s "
+                                 "has cardinality=%(card)s")
+                raise ValidationError(self.eid, {qname: msg % locals()})
+
+
+class CWRelation(AnyEntity):
+    __regid__ = 'CWRelation'
+    fetch_attrs = fetch_config(['cardinality'])[0]
+
+    def dc_title(self):
+        return u'%s %s %s' % (
+            self.from_entity[0].name,
+            self.relation_type[0].name,
+            self.to_entity[0].name)
+
+    def dc_long_title(self):
+        card = self.cardinality
+        scard, ocard = u'', u''
+        if card[0] != '1':
+            scard = '[%s]' % card[0]
+        if card[1] != '1':
+            ocard = '[%s]' % card[1]
+        return u'%s %s%s%s %s' % (
+            self.from_entity[0].name,
+            scard, self.relation_type[0].name, ocard,
+            self.to_entity[0].name)
+
+    @property
+    def rtype(self):
+        return self.relation_type[0]
+
+    @property
+    def stype(self):
+        return self.from_entity[0]
+
+    @property
+    def otype(self):
+        return self.to_entity[0]
+
+    def yams_schema(self):
+        rschema = self._cw.vreg.schema.rschema(self.rtype.name)
+        return rschema.rdefs[(self.stype.name, self.otype.name)]
+
+
+class CWAttribute(CWRelation):
+    __regid__ = 'CWAttribute'
+
+    def dc_long_title(self):
+        card = self.cardinality
+        scard = u''
+        if card[0] == '1':
+            scard = '+'
+        return u'%s %s%s %s' % (
+            self.from_entity[0].name,
+            scard, self.relation_type[0].name,
+            self.to_entity[0].name)
+
+
+class CWConstraint(AnyEntity):
+    __regid__ = 'CWConstraint'
+    fetch_attrs, cw_fetch_order = fetch_config(['value'])
+
+    def dc_title(self):
+        return '%s(%s)' % (self.cstrtype[0].name, self.value or u'')
+
+    @property
+    def type(self):
+        return self.cstrtype[0].name
+
+
+class RQLExpression(AnyEntity):
+    __regid__ = 'RQLExpression'
+    fetch_attrs, cw_fetch_order = fetch_config(['exprtype', 'mainvars', 'expression'])
+
+    def dc_title(self):
+        return self.expression or u''
+
+    def dc_long_title(self):
+        return '%s(%s)' % (self.exprtype, self.expression or u'')
+
+    @property
+    def expression_of(self):
+        for rel in ('read_permission', 'add_permission', 'delete_permission',
+                    'update_permission', 'condition'):
+            values = getattr(self, 'reverse_%s' % rel)
+            if values:
+                return values[0]
+
+    @cached
+    def _rqlexpr(self):
+        if self.exprtype == 'ERQLExpression':
+            return ERQLExpression(self.expression, self.mainvars, self.eid)
+        #if self.exprtype == 'RRQLExpression':
+        return RRQLExpression(self.expression, self.mainvars, self.eid)
+
+    def check_expression(self, *args, **kwargs):
+        return self._rqlexpr().check(*args, **kwargs)