From 8737cdb6bef4f27ac9048e191c34ff5073fa9401 Mon Sep 17 00:00:00 2001 From: Filoji Date: Tue, 23 Jun 2020 16:11:01 +0200 Subject: [PATCH] =?UTF-8?q?Transf=C3=A9rer=20les=20fichiers=20vers=20'app'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/__init__.py | 32 +++++++++++++++ app/forms.py | 28 +++++++++++++ app/models.py | 25 +++++++++++ app/routes.py | 107 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 192 insertions(+) create mode 100644 app/__init__.py create mode 100644 app/forms.py create mode 100644 app/models.py create mode 100644 app/routes.py diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..54ea968 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,32 @@ +from flask import Flask +from config import Config +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate +from flask_login import LoginManager + +app = Flask(__name__) +app.config.from_object(Config) +db = SQLAlchemy(app) +migrate = Migrate(app, db) +login = LoginManager(app) + +# There is the dictionnary, which can be usefull when you want to change the language. +words = { + 'nameApp' : 'Pycloud', + 'nameHome' : 'Home', + 'nameUpload' : 'Upload', + 'nameLogin' : 'Login', + 'nameRegister' : 'Register', + 'termLogout' : 'Logout', + 'termSubmit' : 'Submit', + 'termUsername' : 'Username', + 'termPassword' : 'Password', + 'termRepeatPassword' : 'Repeat Password', + 'termRememberMe' : 'Remember Me', + 'termIsAdmin' : 'Is Admin?', + 'termRegistered' : 'Registered: ', + 'ErrorInvalid' : 'Invalid Password or Username', + 'ErrorUsername' : 'Username already used' +} + +from app import routes, models \ No newline at end of file diff --git a/app/forms.py b/app/forms.py new file mode 100644 index 0000000..573fbb2 --- /dev/null +++ b/app/forms.py @@ -0,0 +1,28 @@ +from app import words +from flask_wtf import FlaskForm +from flask_wtf.file import FileField, FileRequired +from wtforms import SubmitField, PasswordField, StringField, BooleanField +from wtforms.validators import DataRequired, EqualTo, ValidationError +from app.models import User + +class UploadForm(FlaskForm): + uploadfile = FileField(validators=[FileRequired()]) + submit = SubmitField(words['termSubmit']) + +class LoginForm(FlaskForm): + username = StringField(words['termUsername'], validators=[DataRequired()]) + password = PasswordField(words['termPassword'], validators=[DataRequired()]) + remember_me = BooleanField(words['termRememberMe']) + submit = SubmitField(words['termSubmit']) + +class RegisterForm(FlaskForm): + username = StringField(words['termUsername'], validators=[DataRequired()]) + password = PasswordField(words['termPassword'], validators=[DataRequired()]) + repeatpassword = PasswordField(words['termRepeatPassword'], validators=[DataRequired(), EqualTo('password')]) + isAdmin = BooleanField(words['termIsAdmin']) + submit = SubmitField(words['termSubmit']) + + def validate_username(self, username): + user = User.query.filter_by(username=username.data).first() + if user is not None: + raise ValidationError(words['ErrorUsername']) \ No newline at end of file diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..90c846b --- /dev/null +++ b/app/models.py @@ -0,0 +1,25 @@ +from werkzeug.security import generate_password_hash, check_password_hash +from app import db, login +from flask_login import UserMixin + +class User(UserMixin, db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(64), index=True, unique=True) + password_hash = db.Column(db.String(128)) + isAdmin = db.Column(db.Boolean) + files = db.relationship('File', backref='user', lazy='dynamic') + + def set_password(self, password): + self.password_hash = generate_password_hash(password) + + def check_password(self, password): + return check_password_hash(self.password_hash, password) + +class File(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.Text) + user_id = db.Column(db.Integer, db.ForeignKey('user.id')) + +@login.user_loader +def load_user(id): + return User.query.get(int(id)) \ No newline at end of file diff --git a/app/routes.py b/app/routes.py new file mode 100644 index 0000000..27c0a1a --- /dev/null +++ b/app/routes.py @@ -0,0 +1,107 @@ +import os +from app import app, words, db +from flask import render_template, redirect, url_for, flash, send_from_directory +from app.forms import UploadForm, LoginForm, RegisterForm +from werkzeug.utils import secure_filename +from flask_login import current_user, login_user, logout_user +from app.models import User + +# =================================================== +# How to use the render_template in this application: +# =================================================== +# return render_template(parameters) +# Parameters: +# 'page.html' +# dico=words (Usefull to translate all the site with one dictionary) +# userloged=current_user (Usefull to know if the user is logged in, and if yes, his name) +# title='title' (Optional: If you want to change the title of the page, You can also use words['pageTitle'] to change faster when you want to translate) + +# Home page +# The title page +@app.route('/') +@app.route('/home') +def home(): + return render_template('home.html', title=words['nameHome'], dico=words, userloged=current_user) + +# Login page +# Use it to login +# Redirect automatically to the home page if the user is already logged in +@app.route('/login', methods=['GET', 'POST']) +def login(): + if current_user.is_authenticated: + return redirect(url_for('home')) + form = LoginForm() + if form.validate_on_submit(): + user = User.query.filter_by(username=form.username.data).first() + if user is None or not user.check_password(form.password.data): + flash(words['ErrorInvalid']) + return redirect(url_for('login')) + login_user(user, remember=form.remember_me.data) + return redirect(url_for('home')) + return render_template('login.html', title=words['nameLogin'], dico=words, form=form, userloged=current_user) + +# Logout page +# Use it to logout +# Redirect automatically to the home page if the user isn't logged in +@app.route('/logout') +def logout(): + logout_user() + return redirect(url_for('home')) + +# Register page +# Use it to create a new user +# Redirect automatically to the home page if the user isn't logged in or isn't an Admin +@app.route('/register', methods=['GET', 'POST']) +def register(): + if not current_user.is_authenticated: + return redirect(url_for('home')) + if current_user.isAdmin == False: + return redirect(url_for('home')) + form = RegisterForm() + if form.validate_on_submit(): + user = User(username = form.username.data, isAdmin = form.isAdmin.data) + user.set_password(form.password.data) + db.session.add(user) + db.session.commit() + flash(words['termRegistered'] + form.username.data) + return redirect(url_for('home')) + return render_template('register.html', title=words['nameRegister'], dico=words, form=form, userloged=current_user) + +# Upload page +# Use it to upload a file +# Redirect automatically to the home page if the user isn't logged in +# If the user isn't an Admin, it will upload directly to the right folder +# If the user is an Admin, it will ask to the user to choose the right folder +@app.route('/upload', methods=['GET', 'POST']) +def upload(): + if not current_user.is_authenticated: + return redirect(url_for('home')) + form = UploadForm() + if form.validate_on_submit(): + f = form.uploadfile.data + filename = secure_filename(f.filename) + f.save(os.path.join(app.config['FILES_DIR'], filename)) + return redirect(url_for('home')) + return render_template('upload.html', title=words['nameUpload'], dico=words, form=form, userloged=current_user) + +# Admin's download pages +# Use it to download a file +# Redirect automatically to the home page if the user isn't logged in or isn't an Admin +# If the user or the id is'nt reconized, redirect automatically to the home page +@app.route('/downloadAdmin//') +def downloadAdmin(user, id): + if not current_user.is_authenticated: + return redirect(url_for('home')) + if current_user.isAdmin == False: + return redirect(url_for('home')) + +# Users' download pages +# Use it to download a file +# Redirect automatically to the home page if the user isn't logged in or is an Admin +# If the id is'nt reconized, redirect automatically to the home page +@app.route('/downloadUser/') +def downloadUser(id): + if not current_user.is_authenticated: + return redirect(url_for('home')) + if current_user.isAdmin == True: + return redirect(url_for('home')) \ No newline at end of file