diff --git a/.gitignore b/.gitignore index 6245b64..f2f9b4f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,8 @@ app.db __pycache__/ app/__pycache__/ + +migrations/ + +venv/ +.venv/ diff --git a/README.md b/README.md index cee7f2c..0adee0e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Planète Casio v5 +# Fork de Planète Casio v5 ## Style de code -* L'indentation se fait avec des tabulations +* Merci d'essayer de respecter la PEP 8 * Merci d'essayer de respecter les 80 colonnes max diff --git a/V5.py b/V5.py index 3c32c5e..c26bf9e 100644 --- a/V5.py +++ b/V5.py @@ -4,4 +4,4 @@ from app.models import User, Post @app.shell_context_processor def make_shell_context(): - return {'db': db, 'User': User, 'Post': Post} + return {'db': db, 'User': User, 'Post': Post} diff --git a/app.db b/app.db index e69de29..a4fcc5a 100644 Binary files a/app.db and b/app.db differ diff --git a/app/forms.py b/app/forms.py index dfc523e..6486c06 100644 --- a/app/forms.py +++ b/app/forms.py @@ -5,25 +5,25 @@ from app.models import User class LoginForm(FlaskForm): - username = StringField('Pseudonyme :', validators=[DataRequired()]) - password = PasswordField('Mot de passe :', validators=[DataRequired()]) - remember_me = BooleanField('Se souvenir de moi :') - submit = SubmitField('Connexion') + username = StringField('Pseudonyme :', validators=[DataRequired()]) + password = PasswordField('Mot de passe :', validators=[DataRequired()]) + remember_me = BooleanField('Se souvenir de moi :') + submit = SubmitField('Connexion') class RegistrationForm(FlaskForm): - username = StringField('Pseudonyme :', validators=[DataRequired()]) - email = StringField('Adresse Email :', validators=[DataRequired(), Email()]) - password = PasswordField('Mot de passe :', validators=[DataRequired()]) - password2 = PasswordField('Répéter le mot de passe', validators=[DataRequired(), EqualTo('password')]) - submit = SubmitField('S\'enregistrer') + username = StringField('Pseudonyme :', validators=[DataRequired()]) + email = StringField('Adresse Email :', validators=[DataRequired(), Email()]) + password = PasswordField('Mot de passe :', validators=[DataRequired()]) + password2 = PasswordField('Répéter le mot de passe', validators=[DataRequired(), EqualTo('password')]) + submit = SubmitField('S\'enregistrer') - def validate_username(self, username): - user = User.query.filter_by(username=username.data).first() - if user is not None: - raise ValidationError('Pseudo indisponible.') + def validate_username(self, username): + user = User.query.filter_by(username=username.data).first() + if user is not None: + raise ValidationError('Pseudo indisponible.') - def validate_email(self, email): - user = User.query.filter_by(email=email.data).first() - if user is not None: - raise ValidationError('Adresse email déjà utilisé.') + def validate_email(self, email): + user = User.query.filter_by(email=email.data).first() + if user is not None: + raise ValidationError('Adresse email déjà utilisé.') diff --git a/app/models.py b/app/models.py index 5635627..29d565b 100644 --- a/app/models.py +++ b/app/models.py @@ -5,32 +5,32 @@ from werkzeug.security import generate_password_hash, check_password_hash class User(UserMixin, db.Model): - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String(64), index=True, unique=True) - email = db.Column(db.String(120), index=True, unique=True) - password_hash = db.Column(db.String(128)) - posts = db.relationship('Post', backref='author', lazy='dynamic') + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(64), index=True, unique=True) + email = db.Column(db.String(120), index=True, unique=True) + password_hash = db.Column(db.String(128)) + posts = db.relationship('Post', backref='author', lazy='dynamic') - def __repr__(self): - return ''.format(self.username) + def __repr__(self): + return ''.format(self.username) - def set_password(self, password): - self.password_hash = generate_password_hash(password) + 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) + def check_password(self, password): + return check_password_hash(self.password_hash, password) @login.user_loader def load_user(id): - return User.query.get(int(id)) + return User.query.get(int(id)) class Post(db.Model): - id = db.Column(db.Integer, primary_key=True) - body = db.Column(db.String(140)) - timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) - user_id = db.Column(db.Integer, db.ForeignKey('user.id')) + id = db.Column(db.Integer, primary_key=True) + body = db.Column(db.String(140)) + timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) + user_id = db.Column(db.Integer, db.ForeignKey('user.id')) - def __repr__(self): - return ''.format(self.body) + def __repr__(self): + return ''.format(self.body) diff --git a/app/routes.py b/app/routes.py index fe7f6f6..e8fd9b8 100644 --- a/app/routes.py +++ b/app/routes.py @@ -17,7 +17,7 @@ def index(): return redirect(url_for('index')) login_user(user, remember=form.remember_me.data) - return render_template('index.html', form=form) + return render_template('index.html.j2', form=form) @app.route('/logout/') @@ -32,6 +32,12 @@ def register(): return redirect(url_for('index')) form = LoginForm() form2 = RegistrationForm() + 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('pseudo ou mot de passe invalide') + return redirect(url_for('index')) + login_user(user, remember=form.remember_me.data) if form2.validate_on_submit(): user = User(username=form2.username.data, email=form2.email.data) user.set_password(form2.password.data) @@ -39,14 +45,59 @@ def register(): db.session.commit() flash('Congratulations, you are now a registered user!') return redirect(url_for('validation')) - return render_template('register.html', title='Register', form=form, form2 = form2) - - + return render_template('register.html.j2', title='Register', form=form, + form2=form2) @app.route('/register/validation/') def validation(): - if current_user.is_authenticated : + if current_user.is_authenticated: return redirect(url_for('index')) form = LoginForm() - return render_template('validation.html', form = form) + 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('pseudo ou mot de passe invalide') + return redirect(url_for('index')) + login_user(user, remember=form.remember_me.data) + return render_template('validation.html.j2', form=form) + + +@app.errorhandler(400) +@app.errorhandler(401) +@app.errorhandler(403) +@app.errorhandler(404) +@app.errorhandler(418) +@app.errorhandler(500) +@app.errorhandler(501) +@app.errorhandler(503) +def ma_page_erreur(error): + 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('pseudo ou mot de passe invalide') + return redirect(url_for('index')) + login_user(user, remember=form.remember_me.data) + return render_template("base/errors.html.j2", error_code=error.code, + form=form), error.code + + +@app.route('/error/') +def errors(error): + 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('pseudo ou mot de passe invalide') + return redirect(url_for('index')) + login_user(user, remember=form.remember_me.data) + if(error == 400 or error == 401 or error == 403 or error == 404 or + error == 418 or error == 500 or error == 501 or error == 503): + error_code = error + else: + error_code = 404 + error = 404 + + return render_template("base/errors.html.j2", error_code=error_code, + form=form), error diff --git a/app/templates/base/alerts.html b/app/templates/base/alerts.html.j2 similarity index 71% rename from app/templates/base/alerts.html rename to app/templates/base/alerts.html.j2 index aa24464..51d3b87 100644 --- a/app/templates/base/alerts.html +++ b/app/templates/base/alerts.html.j2 @@ -1,9 +1,15 @@ +{% with messages = get_flashed_messages() %} +{% if messages %} +{% for message in messages %}
- Identifiant ou mot de passe incorrect. + {{ message }}
+{% endfor %} +{% endif %} +{% endwith %} diff --git a/app/templates/base/base.html b/app/templates/base/base.html deleted file mode 100644 index fb755d1..0000000 --- a/app/templates/base/base.html +++ /dev/null @@ -1,16 +0,0 @@ - - - {% include "base/head.html" %} - - {% include "base/navbar.html" %} - - {% block container %} - {% endblock container %} - - {% include "base/footer.html" %} - - {% include "base/alerts.html" %} - - {% include "base/scripts.html" %} - - diff --git a/app/templates/base/base.html.j2 b/app/templates/base/base.html.j2 new file mode 100644 index 0000000..2650ee8 --- /dev/null +++ b/app/templates/base/base.html.j2 @@ -0,0 +1,16 @@ + + + {% include "base/head.html.j2" %} + + {% include "base/navbar.html.j2" %} + + {% block container %} + {% endblock container %} + + {% include "base/footer.html.j2" %} + + {% include "base/alerts.html.j2" %} + + {% include "base/scripts.html.j2" %} + + diff --git a/app/templates/base/container.html b/app/templates/base/container.html.j2 similarity index 63% rename from app/templates/base/container.html rename to app/templates/base/container.html.j2 index cf4302e..9cfa4f7 100644 --- a/app/templates/base/container.html +++ b/app/templates/base/container.html.j2 @@ -1,8 +1,8 @@ -{% extends "base/base.html" %} +{% extends "base/base.html.j2" %} {% block container %}
- {% include "base/header.html" %} + {% include "base/header.html.j2" %} {% block content %} {% endblock content %} diff --git a/app/templates/base/errors.html.j2 b/app/templates/base/errors.html.j2 new file mode 100644 index 0000000..24ce8ed --- /dev/null +++ b/app/templates/base/errors.html.j2 @@ -0,0 +1,52 @@ +{% extends "base/container.html.j2" %} + +{% block content %} +
+

+ Erreur {{ error_code }} +
+ {% if error_code == 400 %} + Bad Request : Votre requête semble mal formée. + {% elif error_code == 401 %} + Unauthorized : Une authentification est nécessaire pour accéder à la ressource. +
+ Veuillez vous connecter à l'aide du panneau sur la gauche. + {% elif error_code == 403 %} + Forbidden : Cette page vous est interdite. Désolé, si vous pensez que c'est une erreur ou que vous voulez avoir accès à cette page malgré tout veuillez contacter un administrateur. + {% elif error_code == 404 %} + Not Found : La page n'existe pas ou plus, si vous avez rentré l'url à la main vérifiez de ne pas vous être trompé. +

      /|   /‾‾‾‾‾‾‾\        /|     |\         |   /‾‾‾‾‾\   –––––––––
+     / |  /         \      / |     | \        |  /       \      |
+    /  |  |         |     /  |     |  \       | /         \     |
+   /   |  |         |    /   |     |   \      | |         |     |
+  /    |  |         |   /    |     |    \     | |         |     |
+ /     |  |         |  /     |     |     \    | |         |     |
+/______|_ |         | /______|_    |      \   | |         |     |
+       |  |         |        |     |       \  | \         /     |
+       |  \         /        |     |        \ |  \       /      |
+       |   \_______/         |     |         \|   \_____/       |
+
+|‾‾‾‾‾‾‾‾‾‾   /‾‾‾‾‾\   |         | |\         | |‾‾‾‾‾‾‾\
+|            /       \  |         | | \        | |        \
+|           /         \ |         | |  \       | |         \
+|           |         | |         | |   \      | |         |
+|–––––––    |         | |         | |    \     | |         |
+|           |         | |         | |     \    | |         |
+|           |         | |         | |      \   | |         |
+|           \         / \         / |       \  | |         /
+|            \       /   \       /  |        \ | |        /
+|             \_____/     \_____/   |         \| |_______/
+ {% elif error_code == 418 %} + Oups! Il semblerai que vous m'ayez demandé du café mais je suis une théière. +
+ Vous voulez une tasse de thé à la place de votre café? + {% elif error_code == 500 %} + Internal Server Error : Erreur interne du serveur. Rassurez vous vous n'êtes pas en cause c'est sans doute un développeur qui à fait l'imbécile. Si cette page s'affiche trop souvent essayez de contacter un administrateur par mail à devs@planet-casio.com. + {% elif error_code == 501 %} + Not Implemented : La fonctionnalité réclamée n'est pas supportée par le serveur. Désolé si cette fonctionnalité vous tient à cœur vous pouvez la proposer sur le forum. + {% elif error_code == 503 %} + Service Unavailable : Service temporairement indisponible ou en maintenance. Patientez! + {% endif %} +

+
+{% endblock %} diff --git a/app/templates/base/footer.html b/app/templates/base/footer.html.j2 similarity index 100% rename from app/templates/base/footer.html rename to app/templates/base/footer.html.j2 diff --git a/app/templates/base/head.html b/app/templates/base/head.html.j2 similarity index 100% rename from app/templates/base/head.html rename to app/templates/base/head.html.j2 diff --git a/app/templates/base/header.html b/app/templates/base/header.html.j2 similarity index 100% rename from app/templates/base/header.html rename to app/templates/base/header.html.j2 diff --git a/app/templates/base/navbar.html b/app/templates/base/navbar.html deleted file mode 100644 index bd61bac..0000000 --- a/app/templates/base/navbar.html +++ /dev/null @@ -1,329 +0,0 @@ - diff --git a/app/templates/base/navbar.html.j2 b/app/templates/base/navbar.html.j2 new file mode 100644 index 0000000..967f2b9 --- /dev/null +++ b/app/templates/base/navbar.html.j2 @@ -0,0 +1,90 @@ + diff --git a/app/templates/base/navbar/account.html b/app/templates/base/navbar/account.html.j2 similarity index 99% rename from app/templates/base/navbar/account.html rename to app/templates/base/navbar/account.html.j2 index 4ca29aa..7794e84 100644 --- a/app/templates/base/navbar/account.html +++ b/app/templates/base/navbar/account.html.j2 @@ -31,7 +31,7 @@
- + diff --git a/app/templates/base/navbar/forum.html b/app/templates/base/navbar/forum.html deleted file mode 100644 index 491a272..0000000 --- a/app/templates/base/navbar/forum.html +++ /dev/null @@ -1,25 +0,0 @@ - diff --git a/app/templates/base/navbar/forum.html.j2 b/app/templates/base/navbar/forum.html.j2 new file mode 100644 index 0000000..abbf80a --- /dev/null +++ b/app/templates/base/navbar/forum.html.j2 @@ -0,0 +1,25 @@ + diff --git a/app/templates/base/navbar/news.html b/app/templates/base/navbar/news.html.j2 similarity index 100% rename from app/templates/base/navbar/news.html rename to app/templates/base/navbar/news.html.j2 diff --git a/app/templates/base/navbar/programs.html b/app/templates/base/navbar/programs.html.j2 similarity index 100% rename from app/templates/base/navbar/programs.html rename to app/templates/base/navbar/programs.html.j2 diff --git a/app/templates/base/navbar/sprites.html b/app/templates/base/navbar/sprites.html.j2 similarity index 100% rename from app/templates/base/navbar/sprites.html rename to app/templates/base/navbar/sprites.html.j2 diff --git a/app/templates/base/navbar/tools.html b/app/templates/base/navbar/tools.html.j2 similarity index 98% rename from app/templates/base/navbar/tools.html rename to app/templates/base/navbar/tools.html.j2 index 1f08e77..dc1c4f4 100644 --- a/app/templates/base/navbar/tools.html +++ b/app/templates/base/navbar/tools.html.j2 @@ -6,7 +6,7 @@ Outils - + diff --git a/app/templates/base/navbar/tutorials.html b/app/templates/base/navbar/tutorials.html.j2 similarity index 50% rename from app/templates/base/navbar/tutorials.html rename to app/templates/base/navbar/tutorials.html.j2 index 0fe2d66..8b09976 100644 --- a/app/templates/base/navbar/tutorials.html +++ b/app/templates/base/navbar/tutorials.html.j2 @@ -5,9 +5,9 @@ Tutoriels - Basic Casio - C/C++ Casio - Arduino + Basic Casio + C/C++ Casio + Arduino
- Foire aux questions (FAQ) + Foire aux questions (FAQ)
diff --git a/app/templates/base/scripts.html b/app/templates/base/scripts.html.j2 similarity index 100% rename from app/templates/base/scripts.html rename to app/templates/base/scripts.html.j2 diff --git a/app/templates/index.html b/app/templates/index.html.j2 similarity index 61% rename from app/templates/index.html rename to app/templates/index.html.j2 index 4905fee..0a99b9e 100644 --- a/app/templates/index.html +++ b/app/templates/index.html.j2 @@ -1,9 +1,9 @@ -{% extends "base/container.html" %} +{% extends "base/container.html.j2" %} {% block content %}
-

du contenu....

+

du contenu....

{% endblock %} diff --git a/app/templates/login.html b/app/templates/login.html.j2 similarity index 95% rename from app/templates/login.html rename to app/templates/login.html.j2 index 64e5f6a..c0d5405 100644 --- a/app/templates/login.html +++ b/app/templates/login.html.j2 @@ -1,4 +1,4 @@ -{% extends "container.html" %} +{% extends "container.html.j2" %} {% block content %}

Sign In

diff --git a/app/templates/register.html b/app/templates/register.html.j2 similarity index 96% rename from app/templates/register.html rename to app/templates/register.html.j2 index 2eb4771..ab20a74 100644 --- a/app/templates/register.html +++ b/app/templates/register.html.j2 @@ -1,4 +1,4 @@ -{% extends "base/container.html" %} +{% extends "base/container.html.j2" %} {% block content %}
diff --git a/app/templates/validation.html b/app/templates/validation.html.j2 similarity index 86% rename from app/templates/validation.html rename to app/templates/validation.html.j2 index cf2108b..552266f 100644 --- a/app/templates/validation.html +++ b/app/templates/validation.html.j2 @@ -1,4 +1,4 @@ -{% extends "base/container.html" %} +{% extends "base/container.html.j2" %} {% block content %}
diff --git a/config.py b/config.py index 7b3ee64..b8f5717 100644 --- a/config.py +++ b/config.py @@ -3,7 +3,7 @@ basedir = os.path.abspath(os.path.dirname(__file__)) class Config(object): - SECRET_KEY = os.environ.get('SECRET_KEY') or 'a-random-secret-key' - SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ - 'sqlite:///' + os.path.join(basedir, 'app.db') - SQLALCHEMY_TRACK_MODIFICATIONS = False + SECRET_KEY = os.environ.get('SECRET_KEY') or 'a-random-secret-key' + SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ + 'sqlite:///' + os.path.join(basedir, 'app.db') + SQLALCHEMY_TRACK_MODIFICATIONS = False