Alec Nikolas Reiter 7 лет назад
Родитель
Сommit
f50355997a

+ 2 - 2
flaskbb/app.py

@@ -15,7 +15,7 @@ from functools import partial
 
 
 from sqlalchemy import event
 from sqlalchemy import event
 from sqlalchemy.engine import Engine
 from sqlalchemy.engine import Engine
-from sqlalchemy.exc import OperationalError
+from sqlalchemy.exc import OperationalError, ProgrammingError
 from flask import Flask, request
 from flask import Flask, request
 from flask_login import current_user
 from flask_login import current_user
 
 
@@ -370,7 +370,7 @@ def load_plugins(app):
         with app.app_context():
         with app.app_context():
             plugins = PluginRegistry.query.all()
             plugins = PluginRegistry.query.all()
 
 
-    except OperationalError:
+    except (OperationalError, ProgrammingError):
         return
         return
 
 
     for plugin in plugins:
     for plugin in plugins:

+ 2 - 2
flaskbb/management/models.py

@@ -11,7 +11,7 @@
 from flaskbb._compat import iteritems
 from flaskbb._compat import iteritems
 from flaskbb.extensions import db, cache
 from flaskbb.extensions import db, cache
 from flaskbb.utils.database import CRUDMixin
 from flaskbb.utils.database import CRUDMixin
-from flaskbb.utils.forms import generate_settings_form
+from flaskbb.utils.forms import generate_settings_form, SettingsValueTypes
 
 
 
 
 class SettingsGroup(db.Model, CRUDMixin):
 class SettingsGroup(db.Model, CRUDMixin):
@@ -45,7 +45,7 @@ class Setting(db.Model, CRUDMixin):
     description = db.Column(db.Text, nullable=False)
     description = db.Column(db.Text, nullable=False)
 
 
     # Available types: string, integer, float, boolean, select, selectmultiple
     # Available types: string, integer, float, boolean, select, selectmultiple
-    value_type = db.Column(db.String(20), nullable=False)
+    value_type = db.Column(db.Enum(SettingsValueTypes), nullable=False)
 
 
     # Extra attributes like, validation things (min, max length...)
     # Extra attributes like, validation things (min, max length...)
     # For Select*Fields required: choices
     # For Select*Fields required: choices

+ 2 - 4
flaskbb/plugins/models.py

@@ -15,16 +15,14 @@ from sqlalchemy.orm.collections import attribute_mapped_collection
 
 
 from flaskbb.extensions import db
 from flaskbb.extensions import db
 from flaskbb.utils.database import CRUDMixin
 from flaskbb.utils.database import CRUDMixin
-from flaskbb.utils.forms import generate_settings_form
-
+from flaskbb.utils.forms import generate_settings_form, SettingsValueTypes
 
 
 class PluginStore(CRUDMixin, db.Model):
 class PluginStore(CRUDMixin, db.Model):
     id = db.Column(db.Integer, primary_key=True)
     id = db.Column(db.Integer, primary_key=True)
     key = db.Column(db.Unicode(255), nullable=False)
     key = db.Column(db.Unicode(255), nullable=False)
     value = db.Column(db.PickleType, nullable=False)
     value = db.Column(db.PickleType, nullable=False)
-    # Enum?
     # Available types: string, integer, float, boolean, select, selectmultiple
     # Available types: string, integer, float, boolean, select, selectmultiple
-    value_type = db.Column(db.Unicode(20), nullable=False)
+    value_type = db.Column(db.Enum(SettingsValueTypes), nullable=False)
     # Extra attributes like, validation things (min, max length...)
     # Extra attributes like, validation things (min, max length...)
     # For Select*Fields required: choices
     # For Select*Fields required: choices
     extra = db.Column(db.PickleType, nullable=True)
     extra = db.Column(db.PickleType, nullable=True)

+ 17 - 8
flaskbb/utils/forms.py

@@ -12,6 +12,15 @@ from wtforms import (TextField, IntegerField, FloatField, BooleanField,
                      SelectField, SelectMultipleField, validators)
                      SelectField, SelectMultipleField, validators)
 from flask_wtf import FlaskForm
 from flask_wtf import FlaskForm
 from flaskbb._compat import text_type
 from flaskbb._compat import text_type
+from enum import Enum
+
+class SettingsValueTypes(Enum):
+    string = 0
+    integer = 1
+    float = 3
+    boolean = 4
+    select = 5
+    selectmultiple = 6
 
 
 
 
 def generate_settings_form(settings):
 def generate_settings_form(settings):
@@ -24,9 +33,9 @@ def generate_settings_form(settings):
     for setting in settings:
     for setting in settings:
         field_validators = []
         field_validators = []
 
 
-        if setting.value_type in ("integer", "float"):
+        if setting.value_type in {SettingsValueTypes.integer, SettingsValueTypes.float}:
             validator_class = validators.NumberRange
             validator_class = validators.NumberRange
-        elif setting.value_type == "string":
+        elif setting.value_type == SettingsValueTypes.string:
             validator_class = validators.Length
             validator_class = validators.Length
 
 
         # generate the validators
         # generate the validators
@@ -44,14 +53,14 @@ def generate_settings_form(settings):
 
 
         # Generate the fields based on value_type
         # Generate the fields based on value_type
         # IntegerField
         # IntegerField
-        if setting.value_type == "integer":
+        if setting.value_type == SettingsValueTypes.integer:
             setattr(
             setattr(
                 SettingsForm, setting.key,
                 SettingsForm, setting.key,
                 IntegerField(setting.name, validators=field_validators,
                 IntegerField(setting.name, validators=field_validators,
                              description=setting.description)
                              description=setting.description)
             )
             )
         # FloatField
         # FloatField
-        elif setting.value_type == "float":
+        elif setting.value_type == SettingsValueTypes.float:
             setattr(
             setattr(
                 SettingsForm, setting.key,
                 SettingsForm, setting.key,
                 FloatField(setting.name, validators=field_validators,
                 FloatField(setting.name, validators=field_validators,
@@ -59,7 +68,7 @@ def generate_settings_form(settings):
             )
             )
 
 
         # TextField
         # TextField
-        elif setting.value_type == "string":
+        elif setting.value_type == SettingsValueTypes.string:
             setattr(
             setattr(
                 SettingsForm, setting.key,
                 SettingsForm, setting.key,
                 TextField(setting.name, validators=field_validators,
                 TextField(setting.name, validators=field_validators,
@@ -67,7 +76,7 @@ def generate_settings_form(settings):
             )
             )
 
 
         # SelectMultipleField
         # SelectMultipleField
-        elif setting.value_type == "selectmultiple":
+        elif setting.value_type == SettingsValueTypes.selectmultiple:
             # if no coerce is found, it will fallback to unicode
             # if no coerce is found, it will fallback to unicode
             if "coerce" in setting.extra:
             if "coerce" in setting.extra:
                 coerce_to = setting.extra['coerce']
                 coerce_to = setting.extra['coerce']
@@ -85,7 +94,7 @@ def generate_settings_form(settings):
             )
             )
 
 
         # SelectField
         # SelectField
-        elif setting.value_type == "select":
+        elif setting.value_type == SettingsValueTypes.select:
             # if no coerce is found, it will fallback to unicode
             # if no coerce is found, it will fallback to unicode
             if "coerce" in setting.extra:
             if "coerce" in setting.extra:
                 coerce_to = setting.extra['coerce']
                 coerce_to = setting.extra['coerce']
@@ -102,7 +111,7 @@ def generate_settings_form(settings):
             )
             )
 
 
         # BooleanField
         # BooleanField
-        elif setting.value_type == "boolean":
+        elif setting.value_type == SettingsValueTypes.boolean:
             setattr(
             setattr(
                 SettingsForm, setting.key,
                 SettingsForm, setting.key,
                 BooleanField(setting.name, description=setting.description)
                 BooleanField(setting.name, description=setting.description)

+ 48 - 0
migrations/1214305c96eb_make_setting_value_types_enum.py

@@ -0,0 +1,48 @@
+"""Make setting value types enum
+
+Revision ID: 1214305c96eb
+Revises: 7c3fcf8a3335
+Create Date: 2017-09-10 10:29:54.334710
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '1214305c96eb'
+down_revision = '7c3fcf8a3335'
+branch_labels = ()
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('plugin_store', schema=None) as batch_op:
+        batch_op.alter_column('description',
+               existing_type=sa.TEXT(),
+               nullable=True)
+        batch_op.alter_column('extra',
+               existing_type=sa.BLOB(),
+               nullable=True)
+        batch_op.alter_column('value',
+               existing_type=sa.BLOB(),
+               nullable=False)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('plugin_store', schema=None) as batch_op:
+        batch_op.alter_column('value',
+               existing_type=sa.BLOB(),
+               nullable=True)
+        batch_op.alter_column('extra',
+               existing_type=sa.BLOB(),
+               nullable=False)
+        batch_op.alter_column('description',
+               existing_type=sa.TEXT(),
+               nullable=False)
+
+    # ### end Alembic commands ###

+ 1 - 0
requirements.txt

@@ -5,6 +5,7 @@ billiard==3.5.0.2
 blinker==1.4
 blinker==1.4
 celery==4.0.2
 celery==4.0.2
 click==6.7
 click==6.7
+enum34==1.1.6
 Flask==0.12.1
 Flask==0.12.1
 Flask-Alembic==2.0.1
 Flask-Alembic==2.0.1
 flask-allows==0.2.0
 flask-allows==0.2.0

+ 1 - 0
setup.py

@@ -68,6 +68,7 @@ setup(
         'blinker',
         'blinker',
         'celery',
         'celery',
         'click',
         'click',
+        'enum34',
         'Flask',
         'Flask',
         'Flask-Alembic',
         'Flask-Alembic',
         'flask-allows',
         'flask-allows',