Browse Source

Refactored it a bit. Form validation doesn't work right now.

sh4nks 11 years ago
parent
commit
2d65d1bf70
4 changed files with 63 additions and 41 deletions
  1. 46 30
      flaskbb/admin/models.py
  2. 7 4
      flaskbb/admin/views.py
  3. 1 1
      flaskbb/app.py
  4. 9 6
      flaskbb/templates/admin/settings.html

+ 46 - 30
flaskbb/admin/models.py

@@ -1,4 +1,3 @@
-import sys
 import base64
 try:
     import cPickle as pickle
@@ -8,7 +7,7 @@ except ImportError:
 from wtforms import (TextField, IntegerField, BooleanField, SelectField,
                      FloatField, validators)
 from flask.ext.wtf import Form
-from flaskbb.extensions import db, cache
+from flaskbb.extensions import db
 
 
 def normalize_to(value, value_type, reverse=False):
@@ -106,21 +105,6 @@ class Setting(db.Model):
         )
 
     @classmethod
-    @cache.memoize(timeout=sys.maxint)
-    def config(self):
-        """Returns the configs as a dict (only self.key and self.value).
-        If a value/key has changed, you need to invalidate the cache."""
-        settings = {}
-        for setting in self.get_all():
-            settings[setting.key.upper()] = setting.value
-
-        return settings
-
-    @classmethod
-    def get_all(cls):
-        return cls.query.all()
-
-    @classmethod
     def get_form(cls, group):
         """Returns a Form for all settings found in :class:`SettingsGroup`.
 
@@ -171,51 +155,83 @@ class Setting(db.Model):
                 if setting.value_type == "integer":
                     setattr(
                         SettingsForm, setting.key,
-                        IntegerField(setting.name, field_validators)
+                        IntegerField(setting.name, field_validators,
+                                     description=setting.description)
                     )
                 # FloatField
                 elif setting.value_type == "float":
                     setattr(
                         SettingsForm, setting.key,
-                        FloatField(setting.name, field_validators)
+                        FloatField(setting.name, field_validators,
+                                   description=setting.description)
                     )
 
             # TextField
             if setting.input_type == "text":
                 setattr(
                     SettingsForm, setting.key,
-                    TextField(setting.name, field_validators)
+                    TextField(setting.name, field_validators,
+                              description=setting.description)
                 )
 
             # SelectField
             if setting.input_type == "choice" and "choices" in setting.extra:
                 setattr(
                     SettingsForm, setting.key,
-                    SelectField(setting.name, choices=setting.extra['choices'])
+                    SelectField(setting.name, choices=setting.extra['choices'],
+                                description=setting.description)
                 )
 
             # BooleanField
             if setting.input_type == "yesno":
                 setattr(
                     SettingsForm, setting.key,
-                    BooleanField(setting.name)
+                    BooleanField(setting.name, description=setting.description)
                 )
 
         return SettingsForm()
 
     @classmethod
-    def update(self, app):
-        """Updates the config for the app
+    def get_all(cls):
+        return cls.query.all()
+
+    @classmethod
+    def update(cls, settings, app=None):
+        """Updates the current_app's config and stores the changes in the
+        database.
+
+        :param config: A dictionary with configuration items.
+        """
+        updated_settings = {}
+        for key, value in settings.iteritems():
+            setting = cls.query.filter(Setting.key == key.lower()).first()
+
+            setting.value = value
+
+            updated_settings[setting.key.upper()] = setting.value
+
+            db.session.add(setting)
+            db.session.commit()
+
+        if app is not None:
+            app.config.update(updated_settings)
+
+    @classmethod
+    def as_dict(cls, upper=False):
+        """Returns the settings key and value as a dict.
 
-        :param app: The application.
+        :param upper: If upper is ``True``, the key will use upper-case
+                      letters. Defaults to ``False``.
         """
-        self.invalidate_cache()
+        settings = {}
+        for setting in cls.query.all():
+            if upper:
+                settings[setting.key.upper()] = setting.value
+            else:
+                settings[setting.key] = setting.value
 
-        app.config.update(self.config())
+        return settings
 
     def save(self):
         db.session.add(self)
         db.session.commit()
-
-    def invalidate_cache(self):
-        cache.delete_memoized(self.config, self)

+ 7 - 4
flaskbb/admin/views.py

@@ -61,11 +61,14 @@ def settings(slug=None):
         # or should we display an index with all available settingsgroups?
         form = Setting.get_form("general")
 
+    # TODO: Only get those settings from the group
+    #old_settings = Setting.as_dict()
+    #new_settings = {}
+
     if form.validate_on_submit():
-        # update the db rows
-        # invalidate the cache
-        # update the app config
-        pass
+        print "Passed"
+    else:
+        print "Not passed"
 
     return render_template("admin/settings.html", form=form,
                            settingsgroup=settingsgroup)

+ 1 - 1
flaskbb/app.py

@@ -135,7 +135,7 @@ def configure_extensions(app):
 
 def update_settings_from_db(app):
     with app.app_context():
-        app.config.update(Setting.config())
+        app.config.update(Setting.as_dict(upper=True))
 
 
 def configure_template_filters(app):

+ 9 - 6
flaskbb/templates/admin/settings.html

@@ -6,13 +6,20 @@
 
 <form class="form-horizontal" role="form" method="post">
 
+    {#
+    Form validation does work when doing it this way
+    {{ render_field(form.project_title) }}
+    {{ render_field(form.project_subtitle) }}
+    {{ render_field(form.posts_per_page) }}
+    #}
     {% for field in form %}
+        {# Form validation doesn't work when doing it this way #}
         {% if field.type in ["HiddenField", "CSRFTokenField"] %}
             {{ field() }}
         {% endif %}
         {% if field.type not in ["TextField", "IntegerField"] %}
             {% if field.type == "BooleanField" %}
-                {{ render_boolean_field }}
+                {{ render_boolean_field(field) }}
             {% endif %}
 
             {% if field.type in ["SelectField", "SelectMultipleField"] %}
@@ -23,11 +30,7 @@
         {% endif %}
     {%  endfor %}
 
-    <div class="form-group">
-        <div class="col-sm-offset-2 col-sm-10">
-            <button type="submit" class="btn btn-default">Save</button>
-        </div>
-    </div>
+    <button type="submit" class="btn btn-default">Save</button>
 
 </form>