diff --git a/app/__init__.py b/app/__init__.py index 2c70530..424f916 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,6 +1,8 @@ from flask import Flask from flask_assets import Environment from webassets import Bundle +from app.models import db, migrate +from app.schemas import ma from app.configuration import AppConfiguration @@ -18,21 +20,28 @@ def create_app(): app = Flask(__name__, instance_relative_config=True) app.config.from_object(config.flask_config) - # register_extensions(app) + register_extensions(app) register_blueprints(app) + return app + + +def register_extensions(app): + """Register extensions for Flask app + + Args: + app (Flask): Flask app to register for + """ + db.init_app(app) + migrate.init_app(app=app, db=db) + ma.init_app(app) + assets = Environment(app) assets.url = app.static_url_path scss = Bundle('scss/site.scss', filters='libsass', output='site.css') assets.register('scss_all', scss) - return app -# def register_extensions(app): -# db.init_app(app) -# migrate.init_app(app=app, db=db) -# ma.init_app(app) - def register_blueprints(app): """Register blueprints for Flask app diff --git a/app/configuration.py b/app/configuration.py index fd888e3..0a5267f 100644 --- a/app/configuration.py +++ b/app/configuration.py @@ -6,7 +6,7 @@ from distutils.version import LooseVersion class AppConfiguration(object): """Configuration Version""" - CONFIG_VERSION = '1.0' + CONFIG_VERSION = '2.0' def __init__(self): """Creates/Parses the config.ini""" @@ -33,17 +33,27 @@ class AppConfiguration(object): config['CONFIG'] = { 'version': self.CONFIG_VERSION } - config['DATABASE'] = { - 'host': 'localhost', - 'name': 'msstate_etd', - 'user': 'msstate_etd', - 'pass': 'password', - 'type': 'postgresql' + config['SQLALCHEMY'] = { + 'SQLALCHEMY_DATABASE_URI': 'postgresql://user:password@host:port/database', + 'SQLALCHEMY_TRACK_MODIFICATIONS': 'False', } config['FLASK'] = { 'mode': 'default', 'secret_key': 'SECRET_KEY_NOT_SET' } + config['FLASK-MAIL'] = { + 'MAIL_SERVER': 'smtp.gmail.com', + 'MAIL_PORT': '587', + 'MAIL_USE_SSL': 'False', + 'MAIL_USE_TLS': 'True', + 'MAIL_USERNAME': 'yourname@gmail.com', + 'MAIL_PASSWORD': 'password', + } + config['FLASK-USER'] = { + 'USER_APP_NAME': 'MSState Library ETD', + 'USER_EMAIL_SENDER_NAME': 'MSState', + 'USER_EMAIL_SENDER_EMAIL': 'yourname@gmail.com', + } # write the config. config_path = os.path.dirname(os.path.abspath(__file__)) diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..e650bf7 --- /dev/null +++ b/app/models.py @@ -0,0 +1,99 @@ +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate +import enum + +from sqlalchemy_utils import ArrowType +from sqlalchemy.sql.expression import func + +import arrow +import random + + +db = SQLAlchemy() +migrate = Migrate() + + +class SubmissionType(enum.Enum): + worldwide = 1 + restricted = 2 + embargoed = 3 + + +class User(db.Model): + __tablename__ = 'user' + + msuid = db.Column(db.Text, primary_key=True, nullable=False, unique=True) + netid = db.Column(db.Text, nullable=False) + department = db.Column(db.Text, nullable=False) + professor = db.Column(db.Text, nullable=False) + + role = db.Column(,nullable=False) + + first_name = db.Column(db.Text, nullable=False) + middle_name = db.Column(db.Text, nullable=False) + last_name = db.Column(db.Text, nullable=False) + + prim_email = db.Column(db.Text, nullable=False) + sec_email = db.Column(db.Text, nullable=False) + + prim_phone = db.Column(db.Text, nullable=False) + sec_phone = db.Column(db.Text, nullable=False) + + country = db.Column(db.Text, nullable=False) + administrative_area = db.Column(db.Text, nullable=False) + locality = db.Column(db.Text, nullable=False) + postal_code = db.Column(db.Text, nullable=False) + thoroughfare = db.Column(db.Text, nullable=False) + premise = db.Column(db.Text, nullable=False) + + preffirst_name = db.Column(db.Text) + prefmiddle_name = db.Column(db.Text) + preflast_name = db.Column(db.Text) + + maiden_name = db.Column(db.Text, nullable=False) + + birth_date = db.Column(db.Text, nullable=False) + + +class Notifications(db.Model): + __tablename__ = 'notifications' + + id = db.Column(db.Integer, primary_key=True) + netID = db.Column(db.Text, db.ForeignKey('user.netid'), nullable=False) + text = db.Column(db.Text, nullable=False) + state = db.Column(db.Boolean, default=False) + + +class Submission(db.Model): + __tablename__ = 'submission' + + id = db.Column(db.Integer, primary_key=True) + netid = db.Column(db.Text, db.ForeignKey('user.netid'), nullable=False) + title = db.Column(db.Text) + abstract = db.Column(db.Text) + type = db.Column(db.Text) + release_type = db.Column(Enum(SubmissionType)) + ww_length = db.Column(db.Text) + signature_file = db.Column(db.Text) + + state = db.Column(db.Boolean, default=False) + approved_date = db.Column(db.Text) + + +class Revision(db.Model): + __tablename__ = 'revision' + + id = db.Column(db.Integer, primary_key=True) + sub_id = db.Column(db.Text) + file = db.Column(db.Text) + rev_num = db.Column(db.Text) + state = db.Column(db.Boolean, default=False) + + +class Review(db.Model): + __tablename__ = 'review' + + id = db.Column(db.Integer, primary_key=True) + rev_id = db.Column(db.Integer) + reviewer_netID = db.Column(db.Text, db.ForeignKey('user.netid'), nullable=False) + # put the checklist for it and figure out how to store checklist in a not dumb way diff --git a/app/schemas.py b/app/schemas.py new file mode 100644 index 0000000..72e493d --- /dev/null +++ b/app/schemas.py @@ -0,0 +1,29 @@ +from flask_marshmallow import Marshmallow +from .models import User, Notifications, Submission, Revision, Review + +ma = Marshmallow() + + +class UserSchema(ma.ModelSchema): + class Meta: + model = User + + +class NotificationsSchema(ma.ModelSchema): + class Meta: + model = Notifications + + +class SubmissionSchema(ma.ModelSchema): + class Meta: + model = Submission + + +class RevisionSchema(ma.ModelSchema): + class Meta: + model = Revision + + +class ReviewSchema(ma.ModelSchema): + class Meta: + model = Review diff --git a/requirements.txt b/requirements.txt index ed16525..ac4d5b7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,31 @@ +alembic==1.0.8 +arrow==0.13.1 +asn1crypto==0.24.0 +blinker==1.4 +cffi==1.12.2 Click==7.0 +cryptography==2.6.1 Flask==1.0.2 Flask-Assets==0.12 +Flask-Login==0.4.1 +Flask-Mail==0.9.1 +flask-marshmallow==0.10.0 +Flask-Migrate==2.4.0 +Flask-SQLAlchemy==2.3.2 +Flask-User==1.0.1.5 +Flask-WTF==0.14.2 itsdangerous==1.1.0 Jinja2==2.10 libsass==0.17.0 +Mako==1.0.7 MarkupSafe==1.1.0 +marshmallow==2.19.1 +passlib==1.7.1 +pycparser==2.19 +python-dateutil==2.8.0 +python-editor==1.0.4 six==1.12.0 +SQLAlchemy==1.3.1 webassets==0.12.1 Werkzeug==0.14.1 +WTForms==2.2.1