QUB SMART Reconstruction Plan
QUB SMART Reconstruction Plan
This document will guide us through recreating the QUB_SMART Flask application step by step.
We'll mirror the original structure and functionality, from environment setup to deployment.
## Project Overview
## Step-by-Step Outline
---
## Step 1: Set Up Development Environment
---
---
1. **Create `config.py`**:
```python
import os
from dotenv import load_dotenv
basedir = os.path.abspath(os.path.dirname(__file__))
load_dotenv(os.path.join(basedir, '.env'))
class Config:
SECRET_KEY = os.getenv('SECRET_KEY', 'you-will-never-guess')
SQLALCHEMY_DATABASE_URI = (
os.getenv('DATABASE_URL') or
'sqlite:///' + os.path.join(basedir, 'app.db')
)
SQLALCHEMY_TRACK_MODIFICATIONS = False
```
2. **Environment variables**:
- Create a `.env` file with:
```text
SECRET_KEY=your-secret-key
DATABASE_URL=
```
3. **Commit configuration**:
```bash
git add config.py .env
git commit -m "Add application configuration"
```
---
1. **`app/__init__.py`**:
```python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from config import Config
db = SQLAlchemy()
migrate = Migrate()
login = LoginManager()
login.login_view = 'login'
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
migrate.init_app(app, db)
login.init_app(app)
return app
```
2. **`run.py`**:
```python
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
```
3. **Commit initialization**:
```bash
git add app/__init__.py run.py
git commit -m "Initialize Flask application"
```
---
1. **User model**:
```python
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from app import db, login
@login.user_loader
def load_user(id):
return User.query.get(int(id))
```
2. **Commit models**:
```bash
git add app/models.py
git commit -m "Define database models"
```
---
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
password2 = PasswordField(
'Repeat Password', validators=[DataRequired(), EqualTo('password')]
)
submit = SubmitField('Register')
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
remember_me = BooleanField('Remember Me')
submit = SubmitField('Sign In')
```
2. **Commit forms**:
```bash
git add app/forms.py
git commit -m "Add WTForms forms"
```
---
1. **Basic routes**:
```python
from flask import render_template, flash, redirect, url_for, request
from flask_login import current_user, login_user, logout_user, login_required
from werkzeug.urls import url_parse
from app import app, db
from app.forms import RegistrationForm, LoginForm
from app.models import User
@app.route('/')
@app.route('/index')
def index():
return render_template('index.html', title='Home')
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
@app.route('/profile')
@login_required
def profile():
return render_template('profile.html', title='Profile')
```
2. **Commit routes**:
```bash
git add app/routes.py
git commit -m "Implement application routes"
```
---
---
---
## Step 10: Set Up Migrations Folder
1. **Initialize migrations**:
```bash
flask db init
```
2. **Create initial migration**:
```bash
flask db migrate -m "Initial migration"
```
3. **Apply migration**:
```bash
flask db upgrade
```
4. **Commit migrations**:
```bash
git add migrations
git commit -m "Set up database migrations"
```
---
---
1. **Run locally**:
```bash
flask run
```
or
```bash
python run.py
```
2. **Test functionality**:
- Register a new user
- Log in and log out
- View profile page
3. **Automated tests (optional)**:
- Create tests under `tests/` and run with `pytest`.
---