specify / specify7

Specify 7
https://www.specifysoftware.org/products/specify-7/
GNU General Public License v2.0
62 stars 36 forks source link

Resolve faulty revert migration #5225

Open realVinayak opened 1 month ago

realVinayak commented 1 month ago

https://github.com/specify/specify7/blob/38501653e08cbc0ecf63f136e2253f3d4f9d54bc/specifyweb/specify/migrations/0002_geo.py#L160-L163

This is not a reverse of

https://github.com/specify/specify7/blob/38501653e08cbc0ecf63f136e2253f3d4f9d54bc/specifyweb/specify/migrations/0002_geo.py#L151-L158

Causes issues when a treedefname is same.

Not sure why it was added in the first place, a question for @acwhite211.

To reproduce: Revert the 0002 migration on fwri

Operations to perform:
  Target specific migration: 0001_initial, from specify
Running migrations:
  Rendering model states... DONE
  Unapplying specify.0002_geo...Traceback (most recent call last):
  File "manage.py", line 25, in <module>
    execute_from_command_line(sys.argv)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/core/management/base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/core/management/base.py", line 89, in wrapped
    res = handle_func(*args, **kwargs)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 244, in handle
    post_migrate_state = executor.migrate(
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/db/migrations/executor.py", line 121, in migrate
    state = self._migrate_all_backwards(plan, full_plan, fake=fake)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/db/migrations/executor.py", line 196, in _migrate_all_backwards
    self.unapply_migration(states[migration], migration, fake=fake)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/db/migrations/executor.py", line 252, in unapply_migration
    state = migration.unapply(state, schema_editor)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/db/migrations/migration.py", line 174, in unapply
    operation.database_backwards(self.app_label, schema_editor, from_state, to_state)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/db/migrations/operations/special.py", line 196, in database_backwards
    self.reverse_code(from_state.apps, schema_editor)
  File "/opt/specify7/specifyweb/specify/migrations/0002_geo.py", line 181, in revert_cosolidated_python_django_migration_operations
    revert_discipline_for_taxon_treedefs()
  File "/opt/specify7/specifyweb/specify/migrations/0002_geo.py", line 163, in revert_discipline_for_taxon_treedefs
    treedef.save()
  File "/opt/specify7/specifyweb/specify/models.py", line 22, in custom_save
    save_auto_timestamp_field_with_override(super(self.__class__, self).save, args, kwargs, self)
  File "/opt/specify7/specifyweb/specify/model_timestamp.py", line 28, in save_auto_timestamp_field_with_override
    return save_func(*args, **new_kwargs)
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/db/models/base.py", line 739, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/db/models/base.py", line 763, in save_base
    pre_save.send(
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 180, in send
    return [
  File "/opt/specify7/ve/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 181, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File "/opt/specify7/specifyweb/businessrules/orm_signal_handler.py", line 39, in handler
    rule(sender, instance)
  File "/opt/specify7/specifyweb/businessrules/uniqueness_rules.py", line 109, in check_unique
    raise get_exception(conflicts, matchable, field_map)
specifyweb.businessrules.exceptions.BusinessRuleException: ('Taxontreedef must have unique name in discipline', {'table': 'Taxontreedef', 'localizationKey': 'childFieldNotUnique', 'fieldName': 'name', 'fieldData': {'name': 'Taxon'}, 'parentField': 'discipline', 'parentData': {'discipline': 'None'}, 'conflicting': [1]})
grantfitzsimmons commented 3 weeks ago

Alec will get to this tomorrow