Browse Source

Added a way to update the settings with a fixture

sh4nks 10 years ago
parent
commit
44cabcd7ac
2 changed files with 73 additions and 1 deletions
  1. 41 0
      flaskbb/utils/populate.py
  2. 32 1
      manage.py

+ 41 - 0
flaskbb/utils/populate.py

@@ -53,6 +53,47 @@ def create_settings_from_fixture(fixture):
             setting.save()
 
 
+def update_settings_from_fixture(fixture, overwrite_group=False,
+                                 overwrite_setting=False):
+    """
+    Updates the database settings from a fixture.
+    Returns the number of updated groups and settings.
+    """
+    groups_count = 0
+    settings_count = 0
+    for settingsgroup in fixture:
+
+        group = SettingsGroup.query.filter_by(key=settingsgroup[0]).first()
+
+        if group is not None and overwrite_group or group is None:
+            groups_count += 1
+            group = SettingsGroup(
+                key=settingsgroup[0],
+                name=settingsgroup[1]['name'],
+                description=settingsgroup[1]['description']
+            )
+
+            group.save()
+
+        for settings in settingsgroup[1]['settings']:
+
+            setting = Setting.query.filter_by(key=settings[0]).first()
+
+            if setting is not None and overwrite_setting or setting is None:
+                settings_count += 1
+                setting = Setting(
+                    key=settings[0],
+                    value=settings[1]['value'],
+                    value_type=settings[1]['value_type'],
+                    name=settings[1]['name'],
+                    description=settings[1]['description'],
+                    extra=settings[1].get('extra', ""),
+                    settingsgroup=group.key
+                )
+                setting.save()
+    return groups_count, settings_count
+
+
 def create_default_settings():
     """
     Creates the default settings

+ 32 - 1
manage.py

@@ -13,6 +13,7 @@
 import sys
 
 from flask import current_app
+from werkzeug.utils import import_string
 from sqlalchemy.exc import IntegrityError, OperationalError
 from flask.ext.script import (Manager, Shell, Server, prompt, prompt_pass,
                               prompt_bool)
@@ -22,7 +23,8 @@ from flaskbb import create_app
 from flaskbb.extensions import db
 from flaskbb.utils.populate import (create_test_data, create_welcome_forum,
                                     create_admin_user, create_default_groups,
-                                    create_default_settings)
+                                    create_default_settings,
+                                    update_settings_from_fixture)
 
 # Use the development configuration if available
 try:
@@ -60,6 +62,35 @@ def dropdb():
     db.drop_all()
 
 
+@manager.option('-s', '--settings', dest="settings")
+@manager.option('-f', '--force', dest="force")
+def update(settings=None, force=False):
+    """Updates the settings via a fixture. All fixtures have to be placed
+    in the `fixture`.
+    Usage: python manage.py update -s your_fixture
+    """
+    try:
+        fixture = import_string(
+            "flaskbb.fixtures.{}".format(settings)
+        )
+        fixture = fixture.fixture
+    except ImportError:
+        raise "{} fixture is not available".format(settings)
+
+    if force:
+        count = update_settings_from_fixture(fixture, overwrite_group=True,
+                                             overwrite_setting=True)
+        app.logger.info(
+            "{} groups and {} settings forcefully updated."
+            .format(count[0], count[1])
+        )
+    else:
+        count = update_settings_from_fixture(fixture)
+        app.logger.info(
+            "{} groups and {} settings updated.".format(count[0], count[1])
+        )
+
+
 @manager.command
 def createall(dropdb=False, createdb=False):
     """Creates the database with some testing content.