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