migrationutils.py 3.1 KB

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