Browse Source

Holly molly db settings migrations implemented \o/ #320

Rafał Pitoń 11 years ago
parent
commit
f6014e572e

+ 1 - 4
misago/conf/__init__.py

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

+ 8 - 0
misago/conf/dbsettings.py

@@ -0,0 +1,8 @@
+CACHE_KEY = 'misago_db_settings'
+
+
+class DBSettings(object):
+    pass
+
+
+db_settings = DBSettings()

+ 15 - 0
misago/conf/gateway.py

@@ -0,0 +1,15 @@
+from django.conf import settings as dj_settings
+from misago.conf.dbsettings import db_settings
+
+
+class SettingsGateway(object):
+    def __getattr__(self, name):
+        try:
+            return getattr(dj_settings, name)
+        except AttributeError:
+            return getattr(db_settings, name)
+        except AttributeError:
+            raise AttributeError("Setting %s is undefined" % name)
+
+
+settings = SettingsGateway()

+ 1 - 1
misago/conf/migrations/0001_initial.py

@@ -70,4 +70,4 @@ class Migration(SchemaMigration):
         }
     }
 
-    complete_apps = ['conf']
+    complete_apps = ['conf']

+ 26 - 12
misago/conf/migrationutils.py

@@ -1,11 +1,22 @@
-from misago.conf import CACHE_KEY
+from importlib import import_module
+from misago.conf.dbsettings import CACHE_KEY
 from misago.core.cache import cache as default_cache
 
 
-def get_custom_settings_values(orm, group_key):
+def migration_models(migration, this_migration=None):
+    module_name = 'misago.conf.migrations.%s' % migration
+    migration_module = import_module(module_name)
+    conf_models = migration_module.Migration.models
+
+    if this_migration:
+        conf_models.update(this_migration)
+    return conf_models
+
+
+def get_custom_settings_values(orm, group):
     custom_settings_values = {}
 
-    for setting in orm.Setting.objects.filter(group_id=group_key).iterator():
+    for setting in group.setting_set.iterator():
         custom_settings_values[setting.setting] = setting.value
 
     return custom_settings_values
@@ -13,9 +24,9 @@ def get_custom_settings_values(orm, group_key):
 
 def get_group(orm, group_key):
     try:
-        return orm.SettingsGroup.objects.get(key=group_key)
-    except orm.SettingsGroup.DoesNotExist:
-        return orm.SettingsGroup()
+        return orm['conf.SettingsGroup'].objects.get(key=group_key)
+    except orm['conf.SettingsGroup'].DoesNotExist:
+        return orm['conf.SettingsGroup']()
 
 
 def migrate_settings_group(orm, group_fixture, old_group_key=None):
@@ -24,11 +35,14 @@ def migrate_settings_group(orm, group_fixture, old_group_key=None):
     # 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)
+        custom_settings_values = get_custom_settings_values(orm, group)
     else:
-        custom_settings_values = get_custom_settings_values(orm, group_key)
         group = get_group(orm, group_key)
+        if group.pk:
+            custom_settings_values = get_custom_settings_values(orm, group)
+        else:
+            custom_settings_values = {}
 
 
     # Update group's attributes
@@ -49,16 +63,16 @@ def migrate_settings_group(orm, group_fixture, old_group_key=None):
         setting['order'] = order
 
         try:
-            value = custom_settings_values[seting['setting']]
+            value = custom_settings_values[setting['setting']]
         except KeyError:
-            value = setting.pop('value')
+            value = setting.pop('value', None)
         field_extra = setting.pop('field_extra', None)
 
-        setting = orm.Setting(**setting)
+        setting = orm['conf.Setting'](**setting)
         setting.value = value
         setting.field_extra = field_extra
         setting.save()
 
 
-def clear_settings_cache():
+def delete_settings_cache():
     default_cache.delete(CACHE_KEY)

+ 2 - 2
misago/conf/models.py

@@ -22,9 +22,9 @@ class Setting(models.Model):
     order = models.IntegerField(default=0, db_index=True)
     dry_value = models.TextField(null=True, blank=True)
     default_value = models.TextField(null=True, blank=True)
-    python_type = models.CharField(max_length=255)
+    python_type = models.CharField(max_length=255, default='string')
     is_lazy = models.BooleanField(default=False)
-    form_field = models.CharField(max_length=255)
+    form_field = models.CharField(max_length=255, default='text')
     pickled_field_extra = models.TextField(null=True, blank=True)
 
     @property

+ 3 - 2
misago/core/cache.py

@@ -1,10 +1,11 @@
-from django.core.cache import InvalidCacheBackendError, get_cache
+from django.core.cache import (InvalidCacheBackendError, get_cache,
+                               cache as default_cache)
 
 
 try:
     cache = get_cache('misago')
 except InvalidCacheBackendError:
-    cache = get_cache('default')
+    cache = default_cache
 
 
 try:

+ 1 - 1
misago/core/migrations/0001_initial.py

@@ -31,4 +31,4 @@ class Migration(SchemaMigration):
         }
     }
 
-    complete_apps = ['core']
+    complete_apps = ['core']

+ 64 - 0
misago/core/migrations/0002_db_settings.py

@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import DataMigration
+from django.db import models
+from misago.conf.migrationutils import migration_models, migrate_settings_group
+from misago.core.migrationutils import ugettext_lazy as _
+
+
+class Migration(DataMigration):
+
+    def forwards(self, orm):
+        "Write your forwards methods here."
+        migrate_settings_group(
+            orm,
+            {
+            'key': 'basic',
+            'name': _("Basic forum settings"),
+            'description': _("Those settings control most basic properties of "
+                             "your forum like it's name or description."),
+            'settings': (
+                            {
+                            'setting': 'forum_name',
+                            'name': _("Forum name"),
+                            'value': "Misago",
+                            'field_extra': {
+                                           'min_length': 2,
+                                           'max_length': 255
+                                           },
+                            },
+                            {
+                            'setting': 'forum_index_title',
+                            'name': _("Forum index title"),
+                            'description': _("You may set custon title on "
+                                             "forum index by typing it here."),
+                            'legend': _("Forum index"),
+                            'field_extra': {
+                                           'max_length': 255
+                                           },
+                            },
+                            {
+                            'setting': 'forum_index_meta_description',
+                            'name': _("Forum index Meta Description"),
+                            'description': _("Short description of your forum "
+                                             "for internet crawlers."),
+                            'field_extra': {
+                                           'max_length': 255
+                                           },
+                            },
+                        )
+            })
+
+
+    def backwards(self, orm):
+        "Write your backwards methods here."
+
+    models = migration_models('0001_initial')
+
+    complete_apps = ['core']
+    symmetrical = True
+
+    depends_on = (
+        ("misago.conf", "0001_initial"),
+    )

+ 1 - 1
misago/core/migrationutils.py

@@ -26,5 +26,5 @@ def cachebuster_unregister_cache(orm, cache):
         raise ValueError('Cache "%s" is not registered' % cache)
 
 
-def prune_cachebuster_cache():
+def delete_cachebuster_cache():
     default_cache.delete(CACHE_KEY)

+ 2 - 0
runtests.py

@@ -15,6 +15,8 @@ def runtests():
         with open(settings_path, "r") as py_file:
             settings_file = py_file.read().replace("{{ project_name }}",
                                                    "testproject")
+            settings_file = settings_file.replace("{{ secret_key }}",
+                                                   "t3stpr0j3ct")
 
         with open(settings_path, "w") as py_file:
             py_file.write(settings_file)