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