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)) |
|