Browse Source

DB Settings and Settings gateway. #320

Rafał Pitoń 11 years ago
parent
commit
0db8757517

+ 60 - 2
misago/conf/dbsettings.py

@@ -1,8 +1,66 @@
+from misago.core import threadstore
+
+
 CACHE_KEY = 'misago_db_settings'
 
 
 class DBSettings(object):
-    pass
+    def __init__(self):
+        self._settings = self._read_cache()
+
+    def _read_cache(self):
+        from misago.core.cache import cache
+
+        data = cache.get(CACHE_KEY, 'nada')
+        if data == 'nada':
+            data = self._read_db()
+            cache.set(CACHE_KEY, data)
+        return data
+
+    def _read_db(self):
+        from misago.conf.models import Setting
+
+        data = {}
+        for setting in Setting.objects.iterator():
+            if setting.is_lazy:
+                data[setting.setting] = {
+                    'value': True if setting.value else False,
+                    'is_lazy': setting.is_lazy
+                }
+            else:
+                data[setting.setting] = {
+                    'value': setting.value,
+                    'is_lazy': setting.is_lazy
+                }
+        return data
+
+    def get_lazy_setting(self, setting):
+        try:
+            if self._settings[setting]['is_lazy']:
+                return Setting.objects.get(setting=setting).value
+            else:
+                raise AttributeError("Setting %s is not lazy" % setting)
+        except (KeyError, Setting.DoesNotExist):
+            raise AttributeError("Setting %s is undefined" % setting)
+
+
+    def __getattr__(self, attr):
+        try:
+            return self._settings[attr]['value']
+        except KeyError:
+            raise AttributeError("Setting %s is undefined" % attr)
+
+
+class _DBSettingsGateway(object):
+    def get_db_settings(self):
+        dbsettings = threadstore.get(CACHE_KEY)
+        if not dbsettings:
+            dbsettings = DBSettings()
+            threadstore.set(CACHE_KEY, dbsettings)
+        return dbsettings
+
+    def __getattr__(self, attr):
+        return getattr(self.get_db_settings(), attr)
 
 
-db_settings = DBSettings()
+db_settings = _DBSettingsGateway()

+ 24 - 0
misago/conf/tests/test_settings.py

@@ -0,0 +1,24 @@
+from django.conf import settings as dj_settings
+from django.test import TestCase
+from misago.conf.gateway import settings as gateway
+from misago.conf.dbsettings import db_settings
+
+
+class DBSettingsTests(TestCase):
+    def test_get_existing_setting(self):
+        """forum_name is defined"""
+        self.assertEqual(db_settings.forum_name, 'Misago')
+
+        with self.assertRaises(AttributeError):
+            db_settings.MISAGO_MAILER_BATCH_SIZE
+
+
+class GatewaySettingsTests(TestCase):
+    def test_get_existing_setting(self):
+        """forum_name is defined"""
+        self.assertEqual(gateway.forum_name, db_settings.forum_name)
+        self.assertEqual(gateway.MISAGO_MAILER_BATCH_SIZE,
+                         dj_settings.MISAGO_MAILER_BATCH_SIZE)
+
+        with self.assertRaises(AttributeError):
+            gateway.LoremIpsum

+ 2 - 2
misago/core/tests/test_migrationutils.py

@@ -32,7 +32,7 @@ class CacheBusterUtilsTests(TestCase):
                 'default_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
                 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
                 'dry_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
-                'form_field': ('django.db.models.fields.CharField',[], {'max_length': '255'}),
+                'form_field': ('django.db.models.fields.CharField', [], {'max_length': '255', 'default': u"text"}),
                 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['conf.SettingsGroup']"}),
                 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
                 'is_lazy': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
@@ -40,7 +40,7 @@ class CacheBusterUtilsTests(TestCase):
                 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
                 'order': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
                 'pickled_field_extra': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
-                'python_type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+                'python_type': ('django.db.models.fields.CharField', [], {'max_length': '255', 'default': u"string"}),
                 'setting': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
             },
             u'conf.settingsgroup': {