migrationutils.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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('choices'):
  47. untranslated_choices = setting_fixture['field_extra']['choices']
  48. translated_choices = []
  49. for val, name in untranslated_choices:
  50. translated_choices.append((val, name))
  51. setting_fixture['field_extra']['choices'] = tuple(translated_choices)
  52. if old_value is None:
  53. value = setting_fixture.pop('value', None)
  54. else:
  55. value = old_value
  56. setting_fixture.pop('value', None)
  57. field_extra = setting_fixture.pop('field_extra', None)
  58. setting = Setting(**setting_fixture)
  59. setting.dry_value = dehydrate_value(setting.python_type, value)
  60. if setting_fixture.get("default_value"):
  61. setting.default_value = dehydrate_value(
  62. setting.python_type, setting_fixture.get("default_value")
  63. )
  64. setting.field_extra = field_extra or {}
  65. setting.save()