migrationutils.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import base64
  2. from importlib import import_module
  3. from misago.conf.dbsettings import CACHE_KEY
  4. from misago.conf.hydrators import dehydrate_value
  5. from misago.core.cache import cache as default_cache
  6. try:
  7. import cPickle as pickle
  8. except ImportError:
  9. import pickle
  10. def with_conf_models(migration, this_migration=None):
  11. module_name = 'misago.conf.migrations.%s' % migration
  12. migration_module = import_module(module_name)
  13. conf_models = migration_module.Migration.models
  14. if this_migration:
  15. conf_models.update(this_migration)
  16. return conf_models
  17. def get_custom_settings_values(orm, group):
  18. custom_settings_values = {}
  19. for setting in group.setting_set.iterator():
  20. if setting.has_custom_value:
  21. custom_settings_values[setting.setting] = setting.value
  22. return custom_settings_values
  23. def get_group(orm, group_key):
  24. try:
  25. return orm['conf.SettingsGroup'].objects.get(key=group_key)
  26. except orm['conf.SettingsGroup'].DoesNotExist:
  27. return orm['conf.SettingsGroup']()
  28. def migrate_settings_group(orm, group_fixture, old_group_key=None):
  29. group_key = group_fixture['key']
  30. # Fetch settings group
  31. if old_group_key:
  32. group = get_group(orm, old_group_key)
  33. custom_settings_values = get_custom_settings_values(orm, group)
  34. else:
  35. group = get_group(orm, group_key)
  36. if group.pk:
  37. custom_settings_values = get_custom_settings_values(orm, group)
  38. else:
  39. custom_settings_values = {}
  40. # Update group's attributes
  41. group.key = group_fixture['key']
  42. group.name = group_fixture['name']
  43. group.description = group_fixture.get('description')
  44. group.save()
  45. # Delete groups settings and make new ones
  46. # Its easier to create news ones and then assign them old values
  47. group.setting_set.all().delete()
  48. for order, setting_fixture in enumerate(group_fixture['settings']):
  49. setting_fixture['group'] = group
  50. setting_fixture['order'] = order
  51. try:
  52. value = custom_settings_values[setting_fixture['setting']]
  53. except KeyError:
  54. value = setting_fixture.pop('value', None)
  55. finally:
  56. setting_fixture.pop('value', None)
  57. field_extra = setting_fixture.pop('field_extra', None)
  58. setting = orm['conf.Setting'](**setting_fixture)
  59. setting.dry_value = dehydrate_value(setting.python_type, value)
  60. if field_extra:
  61. pickled_extra = pickle.dumps(field_extra, pickle.HIGHEST_PROTOCOL)
  62. setting.pickled_field_extra = base64.encodestring(pickled_extra)
  63. setting.save()
  64. def delete_settings_cache():
  65. default_cache.delete(CACHE_KEY)