diff -r 6c4ae3a06619 -r 0f1504a9fb51 entities/adapters.py --- a/entities/adapters.py Wed Jul 03 14:16:21 2013 +0200 +++ b/entities/adapters.py Wed Jul 03 14:33:27 2013 +0200 @@ -379,6 +379,7 @@ class IUserFriendlyError(view.EntityAdapter): __regid__ = 'IUserFriendlyError' __abstract__ = True + def __init__(self, *args, **kwargs): self.exc = kwargs.pop('exc') super(IUserFriendlyError, self).__init__(*args, **kwargs) @@ -386,11 +387,27 @@ class IUserFriendlyUniqueTogether(IUserFriendlyError): __select__ = match_exception(UniqueTogetherError) + def raise_user_exception(self): etype, rtypes = self.exc.args - msg = self._cw._('violates unique_together constraints (%s)') % ( - ', '.join([self._cw._(rtype) for rtype in rtypes])) - raise ValidationError(self.entity.eid, dict((col, msg) for col in rtypes)) + # Because of index name size limits (e.g: postgres around 64, + # sqlserver around 128), we cannot be sure of what we got, + # especially for the rtypes part. + # Hence we will try to validate them, and handle invalid ones + # in the most user-friendly manner ... + _ = self._cw._ + schema = self.entity._cw.vreg.schema + rtypes_msg = {} + for rtype in rtypes: + if rtype in schema: + rtypes_msg[rtype] = _('%s is part of violated unicity constraint') % rtype + globalmsg = _('some relations %sviolate a unicity constraint') + if len(rtypes) != len(rtypes_msg): # we got mangled/missing rtypes + globalmsg = globalmsg % _('(not all shown here) ') + else: + globalmsg = globalmsg % '' + rtypes_msg['unicity constraint'] = globalmsg + raise ValidationError(self.entity.eid, rtypes_msg) # deprecated ###################################################################