Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/ui v1 #1

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
2 changes: 2 additions & 0 deletions .flaskenv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
FLASK_APP=application
FLASK_ENV=development
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,7 @@ venv.bak/

# mypy
.mypy_cache/
.idea/
.idea/

# Credentials
*.pem
25 changes: 7 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,44 +1,33 @@
### Betfund
# Betfund Web Application

The best way to reproduce this is to do the following:

1. Clone the repository. Change into the `app` directory.
###### Clone the repository. Change into the `app` directory.

```
$ git checkout <branch>
$ cd app
```


2. Create a new `conda` environment from the `environment.yml` file.
###### Create a new `conda` environment from the `environment.yml` file.

```
$ conda env create environment.yml
$ conda activate betfund
```

3. Install the package (optionally, in editable mode).
###### Install the package.

```
$ pip install -e .
```

4. Export development environment variables

```
$ export FLASK_APP=application
$ export FLASK_ENV=development
```

5. Create the test database.
###### Create the database.

```
$ cd tests
$ python make_test_database.py
$ cd ..
$ flask db upgrade
```

6. Run the app.
###### Run the app.

```
$ flask run
Expand Down
86 changes: 63 additions & 23 deletions application/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,37 @@
from pathlib import Path

from flask import Flask
from werkzeug.utils import import_string

from flask_admin import Admin
from flask_login import LoginManager
from flask_mail import Mail
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import MetaData
from werkzeug.utils import import_string

# Possible configurations
# TODO :: Make production the default at some point
# TODO: Make production the default at some point
config_dict = {
"production": "application.config.ProductionConfig",
"testing": "application.config.TestConfig",
"default": "application.config.TestConfig"
"default": "application.config.TestConfig",
}

# Database index naming conventions
naming_convention = {
"ix": "ix_%(column_0_label)s",
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(column_0_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s",
}

# Set globals
db = SQLAlchemy()
migrate = Migrate()
admininstrator = Admin(name="Betfund")
db = SQLAlchemy(metadata=MetaData(naming_convention=naming_convention))
login_manager = LoginManager()
mail = Mail()
migrate = Migrate()


def create_app(test_config=True):
Expand All @@ -29,31 +42,58 @@ def create_app(test_config=True):
app = Flask(__name__, instance_relative_config=False)

# Get the appropriate configuration, and instantiate it
config_name = os.getenv('FLASK_CONFIGURATION', 'default')
config_name = os.getenv("FLASK_CONFIGURATION", "default")
config = import_string(config_dict[config_name])()
app.config.from_object(config)

# Initialize plug-ins
## Initialize plug-ins

# `flask-admin`
admininstrator.init_app(app)

# `flask-sqlalchemy`
db.init_app(app)
db.app = app
migrate.init_app(app, db)

# `flask-login`
login_manager.init_app(app)

# `flask-mail`
mail.init_app(app)

# `flask-migrate`
# TODO: `render_as_batch` only for SQLite..
migrate.init_app(app, db, render_as_batch=True)

with app.app_context():

# Import the the Blueprints
# (this has to happen inside the app context)
from application.home.home_routes import home_bp
from application.loggedin.loggedin_routes import loggedin_bp
from application.signup.signup_routes import signup_bp
from application.login.login_routes import login_bp
from application.admin.admin_routes import admin_bp

# Register Blueprints
app.register_blueprint(home_bp, url_prefix='/')
app.register_blueprint(loggedin_bp)
app.register_blueprint(signup_bp)
## Register the the Blueprints
# Home page
from application.views.home import home_bp
app.register_blueprint(home_bp, url_prefix="/")

# Login page
from application.views.auth import login_bp
app.register_blueprint(login_bp)
app.register_blueprint(admin_bp)

return app
# Signup page
from application.views.auth import signup_bp
app.register_blueprint(signup_bp)

# Dashboard page
from application.views.dashboard import dashboard_bp
app.register_blueprint(dashboard_bp)

# Funds page
from application.views.funds import funds_bp
app.register_blueprint(funds_bp)

# Transactions page
from application.views.transactions import transactions_bp
app.register_blueprint(transactions_bp)

# Import the Admin views
from application.views.admin import add_admin_views
add_admin_views(admininstrator)

return app
29 changes: 0 additions & 29 deletions application/admin/admin_routes.py

This file was deleted.

20 changes: 14 additions & 6 deletions application/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
from datetime import timedelta
from pathlib import Path

TOP_DIR = Path(__file__)
Expand All @@ -8,6 +9,8 @@ class Config:
DEBUG = False
TESTING = False

FLASK_ADMIN_SWATCH = "cyborg"


class ProductionConfig(Config):
pass
Expand All @@ -20,11 +23,16 @@ class TestConfig(Config):
TESTING = True

# get test database default
db_dir = TOP_DIR.parent / '..' / 'tests' / 'database'
db_dir = TOP_DIR.parent / ".." / "tests" / "database"
db_dir.mkdir(parents=True, exist_ok=True)
db_path = str(db_dir / 'test.db')
db_path = str(db_dir / "test.db")

# secret key for flask app
SECRET_KEY = os.environ.get("SECRET_KEY", "fake-news")

# sqlalchemy configs
SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", f"sqlite:///{db_path}")
SQLALCHEMY_TRACK_MODIFICATIONS = True

# Secret key for flask app
SECRET_KEY = os.environ.get('SECRET_KEY', 'fake-news')
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', f'sqlite:///{db_path}')
SQLALCHEMY_TRACK_MODIFICATIONS = False
# flask session configuration
PERMANENT_SESSION_LIFETIME = timedelta(hours=1)
66 changes: 11 additions & 55 deletions application/forms.py
Original file line number Diff line number Diff line change
@@ -1,56 +1,12 @@
from flask_wtf import FlaskForm
from wtforms import PasswordField, StringField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo


class SignUpForm(FlaskForm):
"""
Class to encapsulate sign up form
"""
first_name = StringField(
'First Name:',
validators=[DataRequired()]
)
last_name = StringField(
'Last Name:',
validators=[DataRequired()]
)
email_address = StringField(
'Email Address:',
validators=[
DataRequired(),
Email(message='Enter a valid email.')
]
)
password = PasswordField(
'Password:',
validators=[DataRequired()]
)
password_check = PasswordField(
'Reenter Password:',
validators=[
DataRequired(message="Please re-enter a password."),
EqualTo('password', message='Passwords must match.')
]
)

submit = SubmitField('Submit')


class LogInForm(FlaskForm):
"""
Class to encapsulate log in form
"""
email_address = StringField(
'Email Address:',
validators=[
DataRequired(),
Email(message='Enter a valid email.')
]
)
password = PasswordField(
'Password:',
validators=[DataRequired()]
)

submit = SubmitField('Log In')
from wtforms import (
DateTimeField,
FloatField,
PasswordField,
SelectField,
SelectMultipleField,
StringField,
SubmitField,
)
from wtforms.validators import DataRequired, Email, EqualTo, Length, NumberRange
from wtforms.widgets import TextArea
33 changes: 0 additions & 33 deletions application/home/home_routes.py

This file was deleted.

8 changes: 0 additions & 8 deletions application/home/templates/index.html

This file was deleted.

20 changes: 0 additions & 20 deletions application/loggedin/loggedin_routes.py

This file was deleted.

8 changes: 0 additions & 8 deletions application/loggedin/templates/dashboard.html

This file was deleted.

Loading