754 # need string comparison because of various backends |
754 # need string comparison because of various backends |
755 for arg in ex.args: |
755 for arg in ex.args: |
756 mo = re.search('unique_cw_[^ ]+_idx', arg) |
756 mo = re.search('unique_cw_[^ ]+_idx', arg) |
757 if mo is not None: |
757 if mo is not None: |
758 index_name = mo.group(0) |
758 index_name = mo.group(0) |
759 elements = index_name.rstrip('_idx').split('_cw_')[1:] |
759 # right-chop '_idx' postfix |
|
760 # (garanteed to be there, see regexp above) |
|
761 elements = index_name[:-4].split('_cw_')[1:] |
760 etype = elements[0] |
762 etype = elements[0] |
761 rtypes = elements[1:] |
763 rtypes = elements[1:] |
762 raise UniqueTogetherError(etype, rtypes) |
764 raise UniqueTogetherError(etype, rtypes) |
763 mo = re.search('columns (.*) are not unique', arg) |
765 mo = re.search('columns (.*) are not unique', arg) |
764 if mo is not None: # sqlite in use |
766 if mo is not None: # sqlite in use |
765 rtypes = [c.strip().lstrip('cw_') for c in mo.group(1).split(',')] |
767 # we left chop the 'cw_' prefix of attribute names |
|
768 rtypes = [c.strip()[3:] |
|
769 for c in mo.group(1).split(',')] |
766 etype = '???' |
770 etype = '???' |
767 raise UniqueTogetherError(etype, rtypes) |
771 raise UniqueTogetherError(etype, rtypes) |
768 raise |
772 raise |
769 return cursor |
773 return cursor |
770 |
774 |