cubicweb/schema.py
changeset 12542 85194bd49119
parent 12539 10159a3d1d72
child 12567 26744ad37953
equal deleted inserted replaced
12541:bbbccb0b3a66 12542:85194bd49119
    22 from functools import wraps
    22 from functools import wraps
    23 import re
    23 import re
    24 from os.path import join
    24 from os.path import join
    25 from hashlib import md5
    25 from hashlib import md5
    26 from logging import getLogger
    26 from logging import getLogger
    27 from warnings import warn
       
    28 
    27 
    29 from six import PY2, text_type, string_types, add_metaclass
    28 from six import PY2, text_type, string_types, add_metaclass
    30 from six.moves import range
    29 from six.moves import range
    31 
    30 
    32 from logilab.common.decorators import cached, clear_cache, monkeypatch, cachedproperty
    31 from logilab.common.decorators import cached, clear_cache, monkeypatch, cachedproperty
    42                               cstr_json_dumps, cstr_json_loads)
    41                               cstr_json_dumps, cstr_json_loads)
    43 from yams.reader import (CONSTRAINTS, PyFileReader, SchemaLoader,
    42 from yams.reader import (CONSTRAINTS, PyFileReader, SchemaLoader,
    44                          cleanup_sys_modules, fill_schema_from_namespace)
    43                          cleanup_sys_modules, fill_schema_from_namespace)
    45 from yams.buildobjs import _add_relation as yams_add_relation
    44 from yams.buildobjs import _add_relation as yams_add_relation
    46 
    45 
    47 from rql import parse, nodes, stmts, RQLSyntaxError, TypeResolverException
    46 from rql import parse, nodes, RQLSyntaxError, TypeResolverException
    48 from rql.analyze import ETypeResolver
    47 from rql.analyze import ETypeResolver
    49 
    48 
    50 import cubicweb
    49 import cubicweb
    51 from cubicweb import server
    50 from cubicweb import server
    52 from cubicweb import ETYPE_NAME_MAP, ValidationError, Unauthorized, _
    51 from cubicweb import ValidationError, Unauthorized, _
    53 
    52 
    54 
    53 
    55 PURE_VIRTUAL_RTYPES = set(('identity', 'has_text',))
    54 PURE_VIRTUAL_RTYPES = set(('identity', 'has_text',))
    56 VIRTUAL_RTYPES = set(('eid', 'identity', 'has_text',))
    55 VIRTUAL_RTYPES = set(('eid', 'identity', 'has_text',))
    57 
    56 
   567                     except KeyError:
   566                     except KeyError:
   568                         continue
   567                         continue
   569     return eschemas
   568     return eschemas
   570 
   569 
   571 
   570 
   572 def bw_normalize_etype(etype):
       
   573     if etype in ETYPE_NAME_MAP:
       
   574         msg = '%s has been renamed to %s, please update your code' % (
       
   575             etype, ETYPE_NAME_MAP[etype])
       
   576         warn(msg, DeprecationWarning, stacklevel=4)
       
   577         etype = ETYPE_NAME_MAP[etype]
       
   578     return etype
       
   579 
       
   580 
       
   581 def display_name(req, key, form='', context=None):
   571 def display_name(req, key, form='', context=None):
   582     """return a internationalized string for the key (schema entity or relation
   572     """return a internationalized string for the key (schema entity or relation
   583     name) in a given form
   573     name) in a given form
   584     """
   574     """
   585     assert form in ('', 'plural', 'subject', 'object')
   575     assert form in ('', 'plural', 'subject', 'object')
  1031             rules[rschema.type] = RRQLExpression(rschema.rule)
  1021             rules[rschema.type] = RRQLExpression(rschema.rule)
  1032         return rules
  1022         return rules
  1033 
  1023 
  1034     def add_entity_type(self, edef):
  1024     def add_entity_type(self, edef):
  1035         edef.name = str(edef.name)
  1025         edef.name = str(edef.name)
  1036         edef.name = bw_normalize_etype(edef.name)
       
  1037         if not re.match(self.etype_name_re, edef.name):
  1026         if not re.match(self.etype_name_re, edef.name):
  1038             raise BadSchemaDefinition(
  1027             raise BadSchemaDefinition(
  1039                 '%r is not a valid name for an entity type. It should start '
  1028                 '%r is not a valid name for an entity type. It should start '
  1040                 'with an upper cased letter and be followed by at least a '
  1029                 'with an upper cased letter and be followed by at least a '
  1041                 'lower cased letter' % edef.name)
  1030                 'lower cased letter' % edef.name)
  1077 
  1066 
  1078         :rtype: RelationSchema
  1067         :rtype: RelationSchema
  1079         :param: the newly created or just completed relation schema
  1068         :param: the newly created or just completed relation schema
  1080         """
  1069         """
  1081         rdef.name = rdef.name.lower()
  1070         rdef.name = rdef.name.lower()
  1082         rdef.subject = bw_normalize_etype(rdef.subject)
       
  1083         rdef.object = bw_normalize_etype(rdef.object)
       
  1084         rdefs = super(CubicWebSchema, self).add_relation_def(rdef)
  1071         rdefs = super(CubicWebSchema, self).add_relation_def(rdef)
  1085         if rdefs:
  1072         if rdefs:
  1086             try:
  1073             try:
  1087                 self._eid_index[rdef.eid] = rdefs
  1074                 self._eid_index[rdef.eid] = rdefs
  1088             except AttributeError:
  1075             except AttributeError:
  1455         else:
  1442         else:
  1456             hasperm = cw.user.matching_groups(MAY_USE_TEMPLATE_FORMAT)
  1443             hasperm = cw.user.matching_groups(MAY_USE_TEMPLATE_FORMAT)
  1457         if hasperm:
  1444         if hasperm:
  1458             return self.regular_formats + tuple(NEED_PERM_FORMATS)
  1445             return self.regular_formats + tuple(NEED_PERM_FORMATS)
  1459     return self.regular_formats
  1446     return self.regular_formats
  1460 
       
  1461 
       
  1462 # XXX itou for some Statement methods
       
  1463 
       
  1464 @_override_method(stmts.ScopeNode, pass_original=True)
       
  1465 def get_etype(self, name, _orig):
       
  1466     return _orig(self, bw_normalize_etype(name))
       
  1467 
       
  1468 
       
  1469 @_override_method(stmts.Delete, method_name='add_main_variable',
       
  1470                   pass_original=True)
       
  1471 def _add_main_variable_delete(self, etype, vref, _orig):
       
  1472     return _orig(self, bw_normalize_etype(etype), vref)
       
  1473 
       
  1474 
       
  1475 @_override_method(stmts.Insert, method_name='add_main_variable',
       
  1476                   pass_original=True)
       
  1477 def _add_main_variable_insert(self, etype, vref, _orig):
       
  1478     return _orig(self, bw_normalize_etype(etype), vref)
       
  1479 
       
  1480 
       
  1481 @_override_method(stmts.Select, pass_original=True)
       
  1482 def set_statement_type(self, etype, _orig):
       
  1483     return _orig(self, bw_normalize_etype(etype))