server/repository.py
branchstable
changeset 6211 e9d125fd1465
parent 6189 9fa02f352c8c
child 6225 a176e68b7d0d
child 6256 da77d3f95079
equal deleted inserted replaced
6210:d36104de8459 6211:e9d125fd1465
    48 
    48 
    49 from cubicweb import (CW_SOFTWARE_ROOT, CW_MIGRATION_MAP, QueryError,
    49 from cubicweb import (CW_SOFTWARE_ROOT, CW_MIGRATION_MAP, QueryError,
    50                       UnknownEid, AuthenticationError, ExecutionError,
    50                       UnknownEid, AuthenticationError, ExecutionError,
    51                       ETypeNotSupportedBySources, MultiSourcesError,
    51                       ETypeNotSupportedBySources, MultiSourcesError,
    52                       BadConnectionId, Unauthorized, ValidationError,
    52                       BadConnectionId, Unauthorized, ValidationError,
    53                       RepositoryError, typed_eid, onevent)
    53                       RepositoryError, UniqueTogetherError, typed_eid, onevent)
    54 from cubicweb import cwvreg, schema, server
    54 from cubicweb import cwvreg, schema, server
    55 from cubicweb.server import utils, hook, pool, querier, sources
    55 from cubicweb.server import utils, hook, pool, querier, sources
    56 from cubicweb.server.session import Session, InternalSession, InternalManager, \
    56 from cubicweb.server.session import Session, InternalSession, InternalManager, \
    57      security_enabled
    57      security_enabled
    58 
    58 _ = unicode
    59 
    59 
    60 def del_existing_rel_if_needed(session, eidfrom, rtype, eidto):
    60 def del_existing_rel_if_needed(session, eidfrom, rtype, eidto):
    61     """delete existing relation when adding a new one if card is 1 or ?
    61     """delete existing relation when adding a new one if card is 1 or ?
    62 
    62 
    63     have to be done once the new relation has been inserted to avoid having
    63     have to be done once the new relation has been inserted to avoid having
  1060             if not rschema.final: # inlined relation
  1060             if not rschema.final: # inlined relation
  1061                 relations.append((attr, entity[attr]))
  1061                 relations.append((attr, entity[attr]))
  1062         entity._cw_set_defaults()
  1062         entity._cw_set_defaults()
  1063         if session.is_hook_category_activated('integrity'):
  1063         if session.is_hook_category_activated('integrity'):
  1064             entity._cw_check(creation=True)
  1064             entity._cw_check(creation=True)
  1065         source.add_entity(session, entity)
  1065         try:
       
  1066             source.add_entity(session, entity)
       
  1067         except UniqueTogetherError, exc:
       
  1068             etype, rtypes = exc.args
       
  1069             problems = {}
       
  1070             for col in rtypes:
       
  1071                 problems[col] = _('violates unique_together constraints (%s)') % (','.join(rtypes))
       
  1072             raise ValidationError(entity.eid, problems)
  1066         self.add_info(session, entity, source, extid, complete=False)
  1073         self.add_info(session, entity, source, extid, complete=False)
  1067         entity._cw_is_saved = True # entity has an eid and is saved
  1074         entity._cw_is_saved = True # entity has an eid and is saved
  1068         # prefill entity relation caches
  1075         # prefill entity relation caches
  1069         for rschema in eschema.subject_relations():
  1076         for rschema in eschema.subject_relations():
  1070             rtype = str(rschema)
  1077             rtype = str(rschema)
  1131                                           eidfrom=entity.eid, rtype=attr,
  1138                                           eidfrom=entity.eid, rtype=attr,
  1132                                           eidto=previous_value)
  1139                                           eidto=previous_value)
  1133                     relations.append((attr, entity[attr], previous_value))
  1140                     relations.append((attr, entity[attr], previous_value))
  1134             if source.should_call_hooks:
  1141             if source.should_call_hooks:
  1135                 # call hooks for inlined relations
  1142                 # call hooks for inlined relations
  1136                 for attr, value, _ in relations:
  1143                 for attr, value, _t in relations:
  1137                     hm.call_hooks('before_add_relation', session,
  1144                     hm.call_hooks('before_add_relation', session,
  1138                                   eidfrom=entity.eid, rtype=attr, eidto=value)
  1145                                   eidfrom=entity.eid, rtype=attr, eidto=value)
  1139                 if not only_inline_rels:
  1146                 if not only_inline_rels:
  1140                     hm.call_hooks('before_update_entity', session, entity=entity)
  1147                     hm.call_hooks('before_update_entity', session, entity=entity)
  1141             if session.is_hook_category_activated('integrity'):
  1148             if session.is_hook_category_activated('integrity'):
  1142                 entity._cw_check()
  1149                 entity._cw_check()
  1143             source.update_entity(session, entity)
  1150             try:
       
  1151                 source.update_entity(session, entity)
       
  1152             except UniqueTogetherError, exc:
       
  1153                 etype, rtypes = exc.args
       
  1154                 problems = {}
       
  1155                 for col in rtypes:
       
  1156                     problems[col] = _('violates unique_together constraints (%s)') % (','.join(rtypes))
       
  1157                 raise ValidationError(entity.eid, problems)
       
  1158 
  1144             self.system_source.update_info(session, entity, need_fti_update)
  1159             self.system_source.update_info(session, entity, need_fti_update)
  1145             if source.should_call_hooks:
  1160             if source.should_call_hooks:
  1146                 if not only_inline_rels:
  1161                 if not only_inline_rels:
  1147                     hm.call_hooks('after_update_entity', session, entity=entity)
  1162                     hm.call_hooks('after_update_entity', session, entity=entity)
  1148                 for attr, value, prevvalue in relations:
  1163                 for attr, value, prevvalue in relations: