Browse Source

Models for DB based settings. #320

Rafał Pitoń 11 years ago
parent
commit
392724eb7f
1 changed files with 103 additions and 0 deletions
  1. 103 0
      misago/conf/models.py

+ 103 - 0
misago/conf/models.py

@@ -0,0 +1,103 @@
+import base64
+from django.db import models
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+
+class SettingsGroup(models.Model):
+    key = models.CharField(max_length=255, unique=True)
+    name = models.CharField(max_length=255)
+    description = models.TextField(null=True, blank=True)
+
+
+# Setting hydrate/dehydrate functions
+
+def hydrate_string(dry_value):
+    return dry_value
+
+
+def dehydrate_string(wet_value):
+    return wet_value
+
+
+def hydrate_bool(dry_value):
+    return dry_value == 'True'
+
+
+def dehydrate_bool(wet_value):
+    return 'True' if dry_value else 'False'
+
+
+def hydrate_int(dry_value):
+    return int(dry_value)
+
+
+def dehydrate_int(wet_value):
+    return unicode(wet_value)
+
+
+def hydrate_list(dry_value):
+    return int(dry_value)
+
+
+def dehydrate_list(wet_value):
+    return unicode(wet_value)
+
+
+VALUE_HYDRATORS = {
+    'string': (hydrate_string, dehydrate_string),
+    'bool': (hydrate_bool, dehydrate_bool),
+    'int': (hydrate_int, dehydrate_int),
+    'list': (hydrate_list, dehydrate_list),
+}
+
+
+def hydrate_value(python_type, dry_value):
+    value_hydrator = VALUE_HYDRATORS[python_type][0]
+    return value_hydrator(dry_value)
+
+
+def dehydrate_value(python_type, wet_value):
+    value_dehydrator = VALUE_HYDRATORS[python_type][1]
+    return value_dehydrator(wet_value)
+
+
+class Setting(models.Model):
+    group = models.ForeignKey('SettingsGroup')
+    setting = models.CharField(max_length=255, unique=True)
+    name = models.CharField(max_length=255)
+    description = models.TextField(null=True, blank=True)
+    legend = models.CharField(max_length=255, null=True, blank=True)
+    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)
+    is_lazy = models.BooleanField(default=False)
+    form_field = models.CharField(max_length=255)
+    pickled_field_extra = models.TextField(null=True, blank=True)
+
+    @property
+    def value(self):
+        return hydrate_value(self.python_type, self.dry_value)
+
+    @value.setter
+    def value(self, new_value):
+        return dehydrate_value(self.python_type, self.new_value)
+
+    @property
+    def has_custom_value(self):
+        return self.default_value and self.dry_value != self.default_value
+
+    @property
+    def field_extra(self):
+        if self.pickled_field_extra:
+            return pickle.loads(base64.decodestring(self.pickled_field_extra))
+        else:
+            return {}
+
+    @field_extra.setter
+    def field_extra(self, new_extra):
+        pickled_extra = pickle.dumps(choices_cache, pickle.HIGHEST_PROTOCOL)
+        self.pickled_field_extra = base64.encodestring(pickled_extra)