migrationutils.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from .hydrators import dehydrate_value
  2. from .utils import get_setting_value, has_custom_value
  3. def migrate_settings_group(apps, group_fixture, old_group_key=None):
  4. SettingsGroup = apps.get_model("misago_conf", "SettingsGroup")
  5. Setting = apps.get_model("misago_conf", "Setting")
  6. group_key = group_fixture["key"]
  7. # Fetch settings group
  8. if old_group_key:
  9. group = get_group(SettingsGroup, old_group_key)
  10. custom_settings_values = get_custom_settings_values(group)
  11. else:
  12. group = get_group(SettingsGroup, group_key)
  13. if group.pk:
  14. custom_settings_values = get_custom_settings_values(group)
  15. else:
  16. custom_settings_values = {}
  17. # Update group's attributes
  18. group.key = group_fixture["key"]
  19. group.name = group_fixture["name"]
  20. if group_fixture.get("description"):
  21. group.description = group_fixture.get("description")
  22. group.save()
  23. # Delete groups settings and make new ones
  24. # Its easier to create news ones and then assign them old values
  25. group.setting_set.all().delete()
  26. for order, setting_fixture in enumerate(group_fixture["settings"]):
  27. old_value = custom_settings_values.pop(setting_fixture["setting"], None)
  28. migrate_setting(Setting, group, setting_fixture, order, old_value)
  29. def get_group(SettingsGroup, group_key):
  30. try:
  31. return SettingsGroup.objects.get(key=group_key)
  32. except SettingsGroup.DoesNotExist:
  33. return SettingsGroup()
  34. def get_custom_settings_values(group):
  35. custom_settings_values = {}
  36. for setting in group.setting_set.iterator():
  37. if has_custom_value(setting):
  38. custom_settings_values[setting.setting] = get_setting_value(setting)
  39. return custom_settings_values
  40. def migrate_setting(Setting, group, setting_fixture, order, old_value):
  41. setting_fixture["group"] = group
  42. setting_fixture["order"] = order
  43. setting_fixture["name"] = setting_fixture["name"]
  44. if setting_fixture.get("description"):
  45. setting_fixture["description"] = setting_fixture.get("description")
  46. if setting_fixture.get("field_extra") and setting_fixture.get("field_extra").get(
  47. "choices"
  48. ):
  49. untranslated_choices = setting_fixture["field_extra"]["choices"]
  50. translated_choices = []
  51. for val, name in untranslated_choices:
  52. translated_choices.append((val, name))
  53. setting_fixture["field_extra"]["choices"] = tuple(translated_choices)
  54. if old_value is None:
  55. value = setting_fixture.pop("value", None)
  56. else:
  57. value = old_value
  58. setting_fixture.pop("value", None)
  59. field_extra = setting_fixture.pop("field_extra", None)
  60. setting = Setting(**setting_fixture)
  61. setting.dry_value = dehydrate_value(setting.python_type, value)
  62. if setting_fixture.get("default_value"):
  63. setting.default_value = dehydrate_value(
  64. setting.python_type, setting_fixture.get("default_value")
  65. )
  66. setting.field_extra = field_extra or {}
  67. setting.save()