From ec28417fef2b662736cb8b44762e5dd639ff3e05 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Thu, 21 Mar 2019 14:17:35 -0500 Subject: [PATCH] Database setup Started working on Db models (not functional right now) Schemas will need to be added to more as we go, but it's functional Updated the configuration for the other extensions that we are using Fixed the DB connection scheme in the config --- app/__init__.py | 23 ++++++---- app/configuration.py | 24 +++++++---- app/models.py | 99 ++++++++++++++++++++++++++++++++++++++++++++ app/schemas.py | 29 +++++++++++++ requirements.txt | 21 ++++++++++ 5 files changed, 182 insertions(+), 14 deletions(-) create mode 100644 app/models.py create mode 100644 app/schemas.py 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