Browse Source

Migration utils for settings and settings groups. #320

Rafał Pitoń 11 years ago
parent
commit
93abcacfc9
2 changed files with 68 additions and 2 deletions
  1. 4 0
      misago/conf/__init__.py
  2. 64 2
      misago/conf/migrationutils.py

+ 4 - 0
misago/conf/__init__.py

@@ -0,0 +1,4 @@
+from misago.core.cache import cache as default_cache
+
+
+CACHE_KEY = 'misago_db_settings'

+ 64 - 2
misago/conf/migrationutils.py

@@ -1,2 +1,64 @@
-def insert_or_update_settings_group(orm, group):
-    pass
+from misago.conf import CACHE_KEY
+from misago.core.cache import cache as default_cache
+
+
+def get_custom_settings_values(orm, group_key):
+    custom_settings_values = {}
+
+    for setting in orm.Setting.objects.filter(group_id=group_key).iterator():
+        custom_settings_values[setting.setting] = setting.value
+
+    return custom_settings_values
+
+
+def get_group(orm, group_key):
+    try:
+        return orm.SettingsGroup.objects.get(key=group_key)
+    except orm.SettingsGroup.DoesNotExist:
+        return orm.SettingsGroup()
+
+
+def migrate_settings_group(orm, group_fixture, old_group_key=None):
+    group_key = group_fixture['key']
+
+    # Fetch settings group
+
+    if old_group_key:
+        custom_settings_values = get_custom_settings_values(orm, old_group_key)
+        group = get_group(orm, old_group_key)
+    else:
+        custom_settings_values = get_custom_settings_values(orm, group_key)
+        group = get_group(orm, group_key)
+
+
+    # Update group's attributes
+
+    group.key = group_fixture['key']
+    group.name = group_fixture['name']
+    group.description = group_fixture.get('description')
+    group.save()
+
+
+    # Delete groups settings and make new ones
+    # Its easier to create news ones and then assign them old values
+
+    group.setting_set.all().delete()
+
+    for order, setting in enumerate(group_fixture['settings']):
+        setting['group'] = group
+        setting['order'] = order
+
+        try:
+            value = custom_settings_values[seting['setting']]
+        except KeyError:
+            value = setting.pop('value')
+        field_extra = setting.pop('field_extra', None)
+
+        setting = orm.Setting(**setting)
+        setting.value = value
+        setting.field_extra = field_extra
+        setting.save()
+
+
+def clear_settings_cache():
+    default_cache.delete(CACHE_KEY)