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