Просмотр исходного кода

It isn't nice atm, but it is working. WIP

sh4nks 11 лет назад
Родитель
Сommit
975cc15dfb
4 измененных файлов с 188 добавлено и 21 удалено
  1. 76 2
      flaskbb/admin/models.py
  2. 39 2
      flaskbb/admin/views.py
  3. 63 7
      flaskbb/templates/admin/settings.html
  4. 10 10
      flaskbb/utils/populate.py

+ 76 - 2
flaskbb/admin/models.py

@@ -2,6 +2,53 @@ from flask import current_app
 from flaskbb.extensions import db
 
 
+def convert_to(value, value_type="text"):
+    """Converts a value to a specified value type.
+    Available value types are: string, int, boolean, list.
+    A boolean type is handled as 0 for false and 1 for true.
+    Raises a exception if the value couldn't be converted
+
+    :param value: The value which should be converted.
+    :param value_type: The value_type.
+    """
+    print "converting..."
+    if value_type == "text":
+        print "text %s" % value
+        if isinstance(value, str):
+            return value
+        else:
+            try:
+                value = str(value)
+            except ValueError:
+                raise ValueError("Couldn't convert value to {}"
+                                 .format(value_type))
+            return value
+
+    elif value_type == "int":
+        print "int %s" % value
+        try:
+            value = int(value)
+        except ValueError:
+            raise ValueError("Couldn't convert value to {}"
+                             .format(value_type))
+        print type(value)
+        return value
+
+    elif value_type == "boolean":
+        try:
+            value = int(value)
+
+            if value < 0 or value > 1:
+                raise ValueError("Value is not a boolean!. Value must be "
+                                 "between 0 and 1.")
+            else:
+                return value
+
+        except ValueError:
+            raise ValueError("Couldn't convert value to {}"
+                             .format(value_type))
+
+
 class Settings(db.Model):
     __tablename__ = "settings"
 
@@ -9,16 +56,43 @@ class Settings(db.Model):
     key = db.Column(db.String, unique=True)
     value = db.Column(db.String)
 
+    # Available types: string, int, boolean
+    value_type = db.Column(db.String)
+
     def save(self):
         db.session.add(self)
         db.session.commit()
 
     @classmethod
-    def update(cls):
-        current_app.config.update(cls.get_all())
+    def update(cls, configs):
+        """Updates the current_app's config and stores the changes in the
+        database.
+
+        :param config: A dictionary with configuration items.
+        """
+        result = []
+        updated_configs = {}
+        for key, value in configs.iteritems():
+            config = cls.query.filter(Settings.key == key.lower()).first()
+
+            value = convert_to(value, config.value_type)
+            config.value = value
+
+            updated_configs[config.key.upper()] = config.value
+            result.append(config)
+
+            print "{}: {}".format(config.key, config.value)
+            db.session.add(config)
+            db.session.commit()
+
+        print updated_configs
+        current_app.config.update(updated_configs)
 
     @classmethod
     def get_all(cls):
+        """Returns all settings as a dictionary
+        The key is the same as in the config files.
+        """
         settings = {}
         all_settings = cls.query.all()
         for setting in all_settings:

+ 39 - 2
flaskbb/admin/views.py

@@ -15,8 +15,11 @@ from flask import (Blueprint, current_app, request, redirect, url_for, flash,
                    __version__ as flask_version)
 from flask.ext.login import current_user
 from flask.ext.plugins import get_plugins_list, get_plugin
+from flask.ext.themes2 import get_themes_list
 
 from flaskbb import __version__ as flaskbb_version
+from flaskbb.admin.models import Settings
+from flaskbb.configs.default import DefaultConfig
 from flaskbb.forum.forms import UserSearchForm
 from flaskbb.utils.helpers import render_template
 from flaskbb.utils.decorators import admin_required
@@ -47,10 +50,44 @@ def overview():
                            post_count=post_count)
 
 
-@admin.route("/settings")
+@admin.route("/settings", methods=["GET", "POST"])
 @admin_required
 def settings():
-    return render_template("admin/settings.html")
+    default_config = {}
+
+    config_obj = DefaultConfig()
+    for key in dir(config_obj):
+        if key.isupper():
+            default_config[key] = getattr(config_obj, key)
+
+    config = Settings.get_all()
+
+    # I also need the name (not only the identifier) for
+    # the current default theme
+    current_theme = None
+    themes = []
+    for theme in get_themes_list():
+        if theme.identifier == config["DEFAULT_THEME"]:
+            current_theme = theme
+        else:
+            themes.append(theme)
+
+    config["DEFAULT_THEME"] = current_theme
+
+    if request.method == "POST":
+        form_items = request.form.to_dict()
+        print form_items
+
+        for key, value in form_items.iteritems():
+            config[key.upper()] = value
+
+        print config
+        Settings.update(config)
+        return redirect(url_for("admin.settings"))
+
+    return render_template("admin/settings.html", config=config,
+                           default_config=default_config,
+                           themes=themes)
 
 
 @admin.route("/users", methods=['GET', 'POST'])

+ 63 - 7
flaskbb/templates/admin/settings.html

@@ -4,25 +4,80 @@
 
 <legend>Settings</legend>
 
-<form class="form-horizontal" role="form">
+<form class="form-horizontal" role="form" method="post">
 
   <div class="form-group">
-    <label for="projectTitle" class="col-sm-2 control-label">Project title</label>
+    <label for="project_title" class="col-sm-2 control-label">Project title</label>
     <div class="col-sm-10">
-      <input type="email" class="form-control" id="projectTitle">
-      <span class="help-block">A block of help text that breaks onto a new line and may extend beyond one line.</span>
+      <input type="text" class="form-control" name="project_title", id="project_title", value="{{ config['PROJECT_TITLE'] }}">
+      <span class="help-block">The name of your project</span>
+    </div>
+  </div>
+
+  <div class="form-group">
+    <label for="project_subtitle" class="col-sm-2 control-label">Project subtitle</label>
+    <div class="col-sm-10">
+      <input type="text" class="form-control" name="project_subtitle", id="project_subtitle", value="{{ config['PROJECT_SUBTITLE'] }}">
+      <span class="help-block">The subtitle of your project (if any).</span>
+    </div>
+  </div>
+
+  <div class="form-group">
+    <label class="col-sm-2 control-label" for="default_theme">Default theme</label>
+    <div class="col-sm-10">
+      <select class="form-control" id="default_theme" name="default_theme">
+        <option selected value="{{ config['DEFAULT_THEME'].identifier }}">{{ config['DEFAULT_THEME'].name }}</option>
+        {% for theme in themes %}
+          <option value="{{ theme.identifier }}">{{ theme.name }}</option>
+        {% endfor %}
+      </select>
+      <span class="help-block">The default theme for FlaskBB.</span>
+    </div>
+  </div>
+
+  <div class="form-group">
+    <label class="col-sm-2 control-label" for="tracker_length">Tracker length</label>
+    <div class="col-sm-10">
+    <input type="text" class="form-control" name="tracker_length" id="tracker_length", value="{{ config['TRACKER_LENGTH'] }}">
+      <span class="help-block">The tracker length defines how long the topics will stay as unread. <b>0</b> to disable it.</span>
+    </div>
+  </div>
+
+  <div class="form-group">
+    <label class="col-sm-2 control-label" for="users_per_page">Users Per Page</label>
+    <div class="col-sm-10">
+    <input type="text" class="form-control" name="users_per_page" id="users_per_page", value="{{ config['USERS_PER_PAGE'] }}">
+      <span class="help-block">How many users per page are displayed.</span>
+    </div>
+  </div>
+
+  <div class="form-group">
+    <label class="col-sm-2 control-label" for="topics_per_page">Topics Per Page</label>
+    <div class="col-sm-10">
+    <input type="text" class="form-control" name="topics_per_page" id="topics_per_page", value="{{ config['TOPICS_PER_PAGE'] }}">
+      <span class="help-block">How many topics per page are displayed.</span>
+    </div>
+  </div>
+
+  <div class="form-group">
+    <label class="col-sm-2 control-label" for="posts_per_page">Posts Per Page</label>
+    <div class="col-sm-10">
+    <input type="text" class="form-control" name="posts_per_page" id="posts_per_page", value="{{ config['POSTS_PER_PAGE'] }}">
+      <span class="help-block">How many posts per page are displayed.</span>
     </div>
   </div>
 
   <div class="form-group">
-    <label for="projectDescription" class="col-sm-2 control-label">Project description</label>
+    <label class="col-sm-2 control-label" for="online_last_minutes">Online Last Minutes</label>
     <div class="col-sm-10">
-      <input type="email" class="form-control" id="projectDescription">
+    <input type="text" class="form-control" name="online_last_minutes" id="online_last_minutes", value="{{ config['ONLINE_LAST_MINUTES'] }}">
+      <span class="help-block">How long the use can be inactive before he is marked as offline.</span>
     </div>
   </div>
 
+  <!--
   <div class="form-group">
-    <label for="projectTitle" class="col-sm-2 control-label">Simple yes/no</label>
+    <label for="optionsRadio" class="col-sm-2 control-label">Simple yes/no</label>
     <div class="col-sm-10">
       <label class="radio-inline">
         <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked> Yes
@@ -33,6 +88,7 @@
       <span class="help-block">A block of help text that breaks onto a new line and may extend beyond one line.</span>
     </div>
   </div>
+  -->
 
   <div class="form-group">
     <div class="col-sm-offset-2 col-sm-10">

+ 10 - 10
flaskbb/utils/populate.py

@@ -116,21 +116,21 @@ GROUPS = OrderedDict((
 
 
 DEFAULT_SETTINGS = {
-    "project_title": "FlaskBB",
-    "project_subtitle": "A lightweight forum software in flask",
-    "default_theme": "bootstrap3",
-    "tracker_length": 7,
-    "title_length": 15,
-    "online_last_minutes": 15,
-    "users_per_page": 10,
-    "topics_per_page": 10,
-    "posts_per_page": 10
+    "project_title": ("FlaskBB", "text"),
+    "project_subtitle": ("A lightweight forum software in flask", "text"),
+    "default_theme": ("bootstrap3", "text"),
+    "tracker_length": (7, "int"),
+    "title_length": (15, "int"),
+    "online_last_minutes": (15, "int"),
+    "users_per_page": (10, "int"),
+    "topics_per_page": (10, "int"),
+    "posts_per_page": (10, "int")
 }
 
 
 def create_default_settings():
     for key, value in DEFAULT_SETTINGS.items():
-            setting = Settings(key=key, value=value)
+            setting = Settings(key=key, value=value[0], value_type=value[1])
             setting.save()