Skip to content

Commit f633385

Browse files
Merge pull request #1 from py-package/feature/sqlalchemy
Feature/sqlalchemy
2 parents 3d02027 + b841c38 commit f633385

31 files changed

+353
-151
lines changed

README.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ A production-grade flask application that you can start your projects without he
55

66
**Features**
77
- [x] Factory Pattern
8-
- [x] Orator ORM module
8+
- [x] SQLAlchemy ORM
9+
- [x] Flask-Migrate for database migrations
10+
- [x] Flask-Seeder for database seed
911
- [x] Celery for background jobs
1012
- [x] Managed Routing using Blueprints
1113
- [x] Data and Route Caching using Flask-Cache
@@ -28,10 +30,13 @@ source venv/bin/activate
2830
pip install -r requirements.txt
2931

3032
# migrate database
31-
python db.py migrate
33+
flask db upgrade
34+
35+
# rollback database migrations
36+
flask db downgrade
3237

3338
# run database seeder, this will setup default admin credentials for our backend
34-
python db.py db:seed
39+
python seed run
3540
```
3641

3742
**Running Application**
@@ -43,7 +48,7 @@ You can run application using multiple methods:
4348
python wsgi.py
4449

4550
# gunicorn server
46-
gunicorn -w 4 wsgi:server -t 90 0.0.0.0:5000 --reload
51+
gunicorn -w 4 wsgi:app -t 90 0.0.0.0:5000 --reload
4752

4853
# using sh
4954
./run
@@ -55,16 +60,13 @@ This application uses orator orm. You can find details **[here](https://orator-o
5560

5661
```sh
5762
# Creating migration
58-
python db.py make:migration create_users_table --create --table=users
63+
flask db migrate -m "migration_message_here"
5964

6065
# Run migration
61-
python db.py migrate
66+
flask db upgrade
6267

6368
# Rollback migration
64-
python db.py migrate:rollback
65-
66-
# For more details run:
67-
python db.py
69+
flask db downgrade
6870
```
6971

7072
**Celery**

__init__.py

Lines changed: 0 additions & 2 deletions
This file was deleted.

app/__init__.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1-
from config import DevelopmentConfig, TestingConfig
21
from flask import Flask, render_template
2+
from flask_sqlalchemy import SQLAlchemy
3+
from flask_migrate import Migrate
4+
from flask_seeder import FlaskSeeder
35
from flask_mail import Mail
4-
from flask_orator import Orator
5-
from celery import Celery
6+
from flask_login import LoginManager
67
from flask_caching import Cache
8+
from celery import Celery
79
from depot.manager import DepotManager
8-
from flask_login import LoginManager
10+
from config import DevelopmentConfig, TestingConfig
911

1012
mail = Mail()
11-
db = Orator()
13+
db = SQLAlchemy()
14+
migrate = Migrate()
15+
seeder = FlaskSeeder()
1216
celery = Celery(__name__, broker=DevelopmentConfig.CELERY_BROKER_URL, result_backend=DevelopmentConfig.RESULT_BACKEND)
1317
cache = Cache()
1418
login_manager = LoginManager()
@@ -18,9 +22,8 @@
1822
}, prefix='depot.')
1923

2024

21-
def factory(config=DevelopmentConfig) -> Flask:
25+
def factory(config=DevelopmentConfig):
2226
app = Flask(__name__)
23-
2427
app.template_folder = 'views'
2528

2629
# load application configuration from config
@@ -40,6 +43,8 @@ def factory(config=DevelopmentConfig) -> Flask:
4043
# initialize database
4144
db.init_app(app)
4245
db.app = app
46+
migrate.init_app(app, db)
47+
seeder.init_app(app, db)
4348

4449
# initialize login_manager
4550
register_login_manager(app)
@@ -71,7 +76,8 @@ def register_login_manager(app):
7176
@login_manager.user_loader
7277
def load_user(user_id):
7378
from app.models.User import User
74-
return User.find(user_id)
79+
80+
return User.query.get(int(user_id))
7581

7682

7783
def register_blueprints(app):

app/controllers/AuthController.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from app.models.User import User
22
from app.forms import ForgotPasswordForm, LoginForm
33
from flask import render_template, redirect, request
4-
from flask_login import login_user, logout_user, login_required
4+
from flask_login import login_user, logout_user, login_required, current_user
55

66

77
class AuthController():
@@ -19,7 +19,7 @@ def login():
1919
email = form.data['email']
2020
password = form.data['password']
2121

22-
user = User.where("email", email).first()
22+
user = User.query.filter_by(email=email).first()
2323
if user is None:
2424
return render_template('pages/auth/login.html', title='Login', form=form, message="User not found!")
2525

@@ -45,7 +45,7 @@ def forgot_password():
4545
else:
4646
if form.validate_on_submit():
4747
email = form.data['email']
48-
user = User.where("email", email).first()
48+
user = User.query.filter_by(email=email).first()
4949
if user is None:
5050
return render_template('pages/auth/forgot_password.html', title="Forgot Password", form=form, message="User not found!")
5151
user.send_password_reset_email()
@@ -61,6 +61,7 @@ def logout():
6161
def profile():
6262
data = {
6363
'title': 'Profile',
64+
'user': current_user
6465
}
6566
return render_template('pages/auth/profile.html', **data)
6667

File renamed without changes.

app/forms/ForgotPasswordForm.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from flask_wtf import FlaskForm
2+
from wtforms import StringField, SubmitField
3+
from wtforms.validators import DataRequired, Email
4+
5+
6+
class ForgotPasswordForm(FlaskForm):
7+
email = StringField('Email', validators=[DataRequired(), Email()])
8+
submit = SubmitField('Send Reset Link')

app/forms/LoginForm.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from flask_wtf import FlaskForm
2+
from wtforms import StringField, PasswordField, SubmitField, BooleanField
3+
from wtforms.validators import DataRequired, Email
4+
5+
6+
class LoginForm(FlaskForm):
7+
email = StringField('Email', validators=[DataRequired(), Email()])
8+
password = PasswordField('Password', validators=[DataRequired()])
9+
remember = BooleanField('Remember Me')
10+
submit = SubmitField('Login')

app/forms/RegistrationForm.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from flask_wtf import FlaskForm
2+
from wtforms import StringField, PasswordField, SubmitField
3+
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
4+
from app.models.User import User
5+
6+
7+
class RegistrationForm(FlaskForm):
8+
9+
username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
10+
email = StringField('Email', validators=[DataRequired(), Email()])
11+
password = PasswordField('Password', validators=[DataRequired()])
12+
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
13+
submit = SubmitField('Sign Up')
14+
15+
def validate_username(self, username):
16+
user = User.where("username", username.data).first()
17+
if user:
18+
raise ValidationError('That username is taken. Please choose a different one.')
19+
20+
def validate_email(self, email):
21+
user = User.where("email", email.data).first()
22+
if user:
23+
raise ValidationError('That email is taken. Please choose a different one.')

app/forms/__init__.py

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,3 @@
1-
from flask_wtf import FlaskForm
2-
from wtforms import StringField, PasswordField, SubmitField, BooleanField, TextAreaField
3-
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
4-
from app.models.User import User
5-
6-
7-
class RegistrationForm(FlaskForm):
8-
9-
username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
10-
email = StringField('Email', validators=[DataRequired(), Email()])
11-
password = PasswordField('Password', validators=[DataRequired()])
12-
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
13-
submit = SubmitField('Sign Up')
14-
15-
def validate_username(self, username):
16-
user = User.where("username", username.data).first()
17-
if user:
18-
raise ValidationError('That username is taken. Please choose a different one.')
19-
20-
def validate_email(self, email):
21-
user = User.where("email", email.data).first()
22-
if user:
23-
raise ValidationError('That email is taken. Please choose a different one.')
24-
25-
26-
class LoginForm(FlaskForm):
27-
email = StringField('Email', validators=[DataRequired(), Email()])
28-
password = PasswordField('Password', validators=[DataRequired()])
29-
remember = BooleanField('Remember Me')
30-
submit = SubmitField('Login')
31-
32-
33-
class ForgotPasswordForm(FlaskForm):
34-
email = StringField('Email', validators=[DataRequired(), Email()])
35-
submit = SubmitField('Send Reset Link')
1+
from .LoginForm import LoginForm
2+
from .RegistrationForm import RegistrationForm
3+
from .ForgotPasswordForm import ForgotPasswordForm
File renamed without changes.

0 commit comments

Comments
 (0)