"first proto"
This commit is contained in:
parent
99181ffa08
commit
7332af1dc0
@ -1,3 +1,3 @@
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = True
|
||||
SQLALCHEMY_DATABASE_URI = "postgresql://tetawebapp:tetawebapp@localhost/tetawebapp"
|
||||
SQLALCHEMY_DATABASE_URI = "postgresql://participer_thsf:participer_thsf@localhost/participer_thsf"
|
||||
UPLOADED_FILES_DEST = "./upload"
|
||||
|
@ -25,7 +25,7 @@ app.debug = True
|
||||
# Various configuration settings belong here (optionnal)
|
||||
app.config.from_pyfile('config.local.py')
|
||||
# Generate a new key: head -n 40 /dev/urandom | md5sum | cut -d' ' -f1
|
||||
app.secret_key = 'ce1d1c9ff0ff388a838b3a1e3207dd27'
|
||||
app.secret_key = '9ac80548e3a8d8dfd1aefcd9a3a73473'
|
||||
# Feel free to use SQLAlchemy (or not)
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
@ -34,12 +34,19 @@ db = SQLAlchemy(app)
|
||||
# Sample user database
|
||||
########################################################################
|
||||
class Tetawebapp_users(db.Model):
|
||||
__tablename__ = 'tetawebapp_users'
|
||||
__tablename__ = 'participer_thsf_users'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
mail = db.Column(db.Text, nullable=False)
|
||||
password = db.Column(db.Text, nullable=False)
|
||||
name = db.Column(db.Text, nullable=False)
|
||||
name = db.Column(db.Text, nullable=True)
|
||||
phone = db.Column(db.Text, nullable=True)
|
||||
diet = db.Column(db.Text, nullable=True)
|
||||
|
||||
class Tetawebapp_roles(db.Model):
|
||||
__tablename__ = 'participer_thsf_roles'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
role = db.Column(db.Text, nullable=False)
|
||||
description = db.Column(db.Text, nullable=False)
|
||||
|
||||
########################################################################
|
||||
# Menu and navigation management
|
||||
@ -54,9 +61,11 @@ def get_menu(page):
|
||||
- One of the routes MUST match the route called by request
|
||||
- The int 0 is used to determine which menu entry is actally called.
|
||||
The value MUST be 0."""
|
||||
menu = [[u'Home', {u'/': [u'/']}, 0],
|
||||
[u'Articles', {u'/articles': [u'/articles', u'/articles/<ID>']}, 0],
|
||||
[u'Basics', {u'/basics': [u'/basics']}, 0],
|
||||
menu = [[u'Accueil', {u'/': [u'/']}, 0],
|
||||
[u'Mon compte', {u'/account': [u'/account', u'/account/<ID>']}, 0],
|
||||
[u'Mes quarts', {u'/turn': [u'/turn']}, 0],
|
||||
[u'Feuille de staff', {u'/staff_sheet': [u'/staff_sheet']}, 0],
|
||||
[u'Déconnexion', {u'/logout': [u'/logout']}, 0],
|
||||
[u'Inputs', {u'/inputs': [u'/inputs']}, 0],
|
||||
[u'Ajax', {u'/ajax': [u'/ajax']}, 0],
|
||||
[u'Database', {u'/database': [u'/database']}, 0],
|
||||
@ -116,11 +125,11 @@ def check_session(func):
|
||||
return func(*args, **kwargs)
|
||||
else:
|
||||
session['token'] = ''
|
||||
response = app.make_response(render_template('login.html', message=''))
|
||||
response = app.make_response(render_template('login_or_register.html', message=''))
|
||||
sync_cookies(response, session)
|
||||
return response
|
||||
except KeyError:
|
||||
return render_template('login.html', message='')
|
||||
return render_template('login_or_register.html', message='')
|
||||
return check
|
||||
|
||||
def check_login(login, password):
|
||||
@ -133,6 +142,11 @@ def check_login(login, password):
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_user_info():
|
||||
""" Check user info and send appropriate message if info are not complete"""
|
||||
message = "Vos informations personnelles ne sont pas totalement renseignées. N'oubliez pas de remplir votre fiche située dans la section 'Mon compte'"
|
||||
return message.decode('utf-8')
|
||||
|
||||
def gen_token():
|
||||
""" Generate a random token to be stored in session and cookie """
|
||||
token = binascii.hexlify(os.urandom(42))
|
||||
@ -151,6 +165,27 @@ def page_not_found(e):
|
||||
|
||||
@app.route("/login", methods=['GET', 'POST'])
|
||||
def login():
|
||||
login = request.form.get('login')
|
||||
password = request.form.get('password')
|
||||
if check_login(login, password):
|
||||
# Generate and store a token in session
|
||||
session['token'] = gen_token()
|
||||
# Return user to index page
|
||||
page = '/'
|
||||
menu = get_menu(page)
|
||||
message = check_user_info()
|
||||
response = app.make_response(render_template('index.html', menu=menu, message=message))
|
||||
# Push token to cookie
|
||||
sync_cookies(response, session)
|
||||
return response
|
||||
# Credentials are not valid
|
||||
response = app.make_response(render_template('login_or_register.html', message='Invalid user or password'))
|
||||
session['token'] = ''
|
||||
sync_cookies(response, session)
|
||||
return response
|
||||
|
||||
@app.route("/register", methods=['GET', 'POST'])
|
||||
def register():
|
||||
login = request.form.get('login')
|
||||
password = request.form.get('password')
|
||||
if check_login(login, password):
|
||||
@ -164,7 +199,7 @@ def login():
|
||||
sync_cookies(response, session)
|
||||
return response
|
||||
# Credentials are not valid
|
||||
response = app.make_response(render_template('login.html', message='Invalid user or password'))
|
||||
response = app.make_response(render_template('login_or_register.html', message='Invalid user or password'))
|
||||
session['token'] = ''
|
||||
sync_cookies(response, session)
|
||||
return response
|
||||
@ -175,26 +210,50 @@ def index():
|
||||
""" Index page """
|
||||
page = str(request.url_rule)
|
||||
menu = get_menu(page)
|
||||
return render_template('index.html', menu=menu)
|
||||
message = check_user_info()
|
||||
return render_template('index.html', menu=menu, message=message)
|
||||
|
||||
@app.route("/articles", methods=['GET', 'POST'])
|
||||
@app.route("/account", methods=['GET', 'POST'])
|
||||
@check_session
|
||||
def articles():
|
||||
def account():
|
||||
""" Arcticles page """
|
||||
page = str(request.url_rule)
|
||||
menu = get_menu(page)
|
||||
navbar = get_navbar(page, '')
|
||||
return render_template('articles.html', menu=menu, navbar=navbar)
|
||||
return render_template('account.html', menu=menu)
|
||||
|
||||
@app.route("/articles/<ID>", methods=['GET', 'POST'])
|
||||
@app.route("/account/<ID>", methods=['GET', 'POST'])
|
||||
@check_session
|
||||
def articles_by_id(ID):
|
||||
def account_by_id(ID):
|
||||
""" Arcticles page """
|
||||
page = str(request.url_rule)
|
||||
menu = get_menu(page)
|
||||
selected = page.replace('<ID>', ID)
|
||||
navbar = get_navbar(page, selected)
|
||||
return render_template('articles_by_id.html', menu=menu, navbar=navbar, ID=ID)
|
||||
return render_template('account_by_id.html', menu=menu, navbar=navbar, ID=ID)
|
||||
|
||||
@app.route("/logout", methods=['GET', 'POST'])
|
||||
@check_session
|
||||
def logout():
|
||||
""" Logout user """
|
||||
# Remove session token
|
||||
session['token'] = None
|
||||
# Return user to index page
|
||||
response = app.make_response(render_template('login_or_register.html', message=''))
|
||||
# Push token to cookie
|
||||
sync_cookies(response, session)
|
||||
return response
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@app.route("/basics", methods=['GET', 'POST'])
|
||||
@check_session
|
26
participer.redatomik.org.conf
Normal file
26
participer.redatomik.org.conf
Normal file
@ -0,0 +1,26 @@
|
||||
Define IP_ADDR 0.0.0.0
|
||||
Define TCP_PORT 80
|
||||
Define SRV_NAME participer.redatomik.org
|
||||
Define ROOT_DIR /var/www/participer.redatomik.org
|
||||
Define WSGI_ALIAS /var/www/participer.redatomik.org/participer.redatomik.org.wsgi
|
||||
Define DAEMON_PROCESS participer.redatomik.org
|
||||
Define APACHE_USER apache
|
||||
Define APACHE_GROUP apache
|
||||
Define THREAD_NUMBER 5
|
||||
<VirtualHost ${IP_ADDR}:${TCP_PORT}>
|
||||
ServerName ${SRV_NAME}
|
||||
ServerAdmin bofh@tetalab.org
|
||||
DocumentRoot ${ROOT_DIR}
|
||||
WSGIDaemonProcess ${DAEMON_PROCESS} user=${APACHE_USER} group=${APACHE_GROUP} threads=${THREAD_NUMBER}
|
||||
WSGIScriptAlias / ${WSGI_ALIAS}
|
||||
<Directory ${ROOT_DIR}>
|
||||
WSGIProcessGroup ${DAEMON_PROCESS}
|
||||
WSGIApplicationGroup %{GLOBAL}
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
ErrorLog /var/log/httpd/${SRV_NAME}.error.log
|
||||
CustomLog /var/log/httpd/${SRV_NAME}.access.log combined
|
||||
</VirtualHost>
|
26
participer.thsf.net.conf
Normal file
26
participer.thsf.net.conf
Normal file
@ -0,0 +1,26 @@
|
||||
Define IP_ADDR 0.0.0.0
|
||||
Define TCP_PORT 80
|
||||
Define SRV_NAME participer.thsf.net
|
||||
Define ROOT_DIR /var/www/participer.thsf.net
|
||||
Define WSGI_ALIAS /var/www/participer.thsf.net/participer.thsf.net.wsgi
|
||||
Define DAEMON_PROCESS participer.thsf.net
|
||||
Define APACHE_USER apache
|
||||
Define APACHE_GROUP apache
|
||||
Define THREAD_NUMBER 5
|
||||
<VirtualHost ${IP_ADDR}:${TCP_PORT}>
|
||||
ServerName ${SRV_NAME}
|
||||
ServerAdmin bofh@tetalab.org
|
||||
DocumentRoot ${ROOT_DIR}
|
||||
WSGIDaemonProcess ${DAEMON_PROCESS} user=${APACHE_USER} group=${APACHE_GROUP} threads=${THREAD_NUMBER}
|
||||
WSGIScriptAlias / ${WSGI_ALIAS}
|
||||
<Directory ${ROOT_DIR}>
|
||||
WSGIProcessGroup ${DAEMON_PROCESS}
|
||||
WSGIApplicationGroup %{GLOBAL}
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
ErrorLog /var/log/httpd/${SRV_NAME}.error.log
|
||||
CustomLog /var/log/httpd/${SRV_NAME}.access.log combined
|
||||
</VirtualHost>
|
19
static/scripts/participate.js
Normal file
19
static/scripts/participate.js
Normal file
@ -0,0 +1,19 @@
|
||||
function register() {
|
||||
var mail = document.getElementById('reg_mail').value;
|
||||
var password = document.getElementById('reg_password').value;
|
||||
var confirm = document.getElementById('reg_confirm').value;
|
||||
var regEmail = new RegExp('^[0-9a-z._-]+@{1}[0-9a-z.-]{2,}[.]{1}[a-z]{2,5}$','i');
|
||||
if (password.length < 8){
|
||||
alert("Le mot de passe doit avoir une longueur d'au moins 8 caractères");
|
||||
return false;
|
||||
}
|
||||
if (password != confirm){
|
||||
alert("Confirmation mot de passe incohérente");
|
||||
return false;
|
||||
}
|
||||
if (! regEmail.test(mail)){
|
||||
alert("Adresse email invalide");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
@ -14,8 +14,6 @@
|
||||
--text-color: #555555;
|
||||
--white: #FFFFFF;
|
||||
--black: #000000;
|
||||
--font-normal: url("/static/fonts/RobotoCondensed-Regular.ttf") format("truetype");
|
||||
--font-bold: url("/static/fonts/RobotoCondensed-Bold.ttf") format("truetype");
|
||||
--banner-logo: url(/static/images/logo.png);
|
||||
--add_icon: url(/static/images/add.png);
|
||||
--edit_icon: url(/static/images/edit.png);
|
||||
|
@ -6,15 +6,15 @@
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
font-family: "Roboto Condensed";
|
||||
font-family: 'Roboto Condensed';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: var(--font-normal);
|
||||
src: url(/static/fonts/RobotoCondensed-Regular.ttf) format('truetype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Roboto Condensed";
|
||||
font-family: 'Roboto Condensed';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: var(--font-bold);
|
||||
src: url(/static/fonts/RobotoCondensed-Bold.ttf) format('truetype');
|
||||
}
|
||||
|
5
static/styles/participate.css
Normal file
5
static/styles/participate.css
Normal file
@ -0,0 +1,5 @@
|
||||
main > article > p.note {
|
||||
color: var(--text-color);
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
}
|
@ -12,7 +12,7 @@
|
||||
|
||||
body {
|
||||
margin: 10px;
|
||||
font-family: "Roboto Condensed";
|
||||
font-family: 'Roboto Condensed';
|
||||
background-color: var(--dark-bg);
|
||||
}
|
||||
|
||||
@ -224,8 +224,8 @@ footer {
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
input[type="text"],
|
||||
input[type="password"],
|
||||
input[type='text'],
|
||||
input[type='password'],
|
||||
textarea,
|
||||
select,
|
||||
pre {
|
||||
@ -235,7 +235,7 @@ pre {
|
||||
background-color: var(--white);
|
||||
color: var(--text-color);
|
||||
padding: 5px;
|
||||
font-family: "Roboto Condensed";
|
||||
font-family: 'Roboto Condensed';
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
@ -244,8 +244,8 @@ pre {
|
||||
}
|
||||
|
||||
button,
|
||||
input[type="button"],
|
||||
input[type="submit"] {
|
||||
input[type='button'],
|
||||
input[type='submit'] {
|
||||
border-color: var(--dark-border);
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
@ -253,15 +253,15 @@ input[type="submit"] {
|
||||
color: var(--white);
|
||||
font-weight: bold;
|
||||
padding: 5px;
|
||||
font-family: "Roboto Condensed";
|
||||
font-family: 'Roboto Condensed';
|
||||
margin: 5px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
button:hover,
|
||||
input[type="button"]:hover,
|
||||
input[type="submit"]:hover,
|
||||
input[type="file"]:hover {
|
||||
input[type='button']:hover,
|
||||
input[type='submit']:hover,
|
||||
input[type='file']:hover {
|
||||
background-color: var(--light-coloured-bg);
|
||||
color: var(--text-color);
|
||||
cursor: pointer;
|
||||
@ -280,7 +280,7 @@ div.file_upload {
|
||||
border-color: var(--clear-bg);
|
||||
}
|
||||
|
||||
input[type="file"] {
|
||||
input[type='file'] {
|
||||
position: absolute;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
@ -368,3 +368,17 @@ input.upload {
|
||||
background-repeat: no-repeat;
|
||||
background-position: center center;
|
||||
}
|
||||
|
||||
form {
|
||||
width: 350px;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
form > label {
|
||||
float: left;
|
||||
}
|
||||
|
||||
form > input[type='text'], form > input[type='password'] {
|
||||
float: right;
|
||||
}
|
||||
|
28
templates/account.html
Normal file
28
templates/account.html
Normal file
@ -0,0 +1,28 @@
|
||||
{% extends "index.html" %}
|
||||
{% block title %}Articles{% endblock %}
|
||||
{% block main %}
|
||||
<article>
|
||||
<h3>Informations personnelles</h3>
|
||||
<p>
|
||||
Merci de bien vouloir remplir vos informations personnelles afin que l'équipe d'organisation
|
||||
du THSF puisse rester en contact avec vous avant et tout au long de l'évènement.
|
||||
</p>
|
||||
<p>
|
||||
Notez que:
|
||||
<ul>
|
||||
<li>Votre adresse mail doit être valide et consultée régulièrement si vous ne voulez pas manquez des informations importantes telels que les dates de réunions de staff</li>
|
||||
<li>Votre numéro de téléphone nous permettra de vous contacter pendant l'évènement</li>
|
||||
<li>Si vous avez un régime alimentaire particulier (intolérences, veganisme, religieux), merci de le préciser dans le champs prévu à cet effet</li>
|
||||
<li>Aucune des données que vous nous transmettrez ne sera fournie à un tiers</li>
|
||||
</ul>
|
||||
</p>
|
||||
<form method='POST' action='/account'>
|
||||
<label>Adresse email: </label><input id='login' name='login' type='text' /><br/>
|
||||
<label>Prénom ou pseudo: </label><input id='pseudo' name='pseudo' type='text' /><br/>
|
||||
<label>Nouveau mot de passe: </label><input id='password' name='password' type='password' /><br/>
|
||||
<label>Répetez mot de passe: </label><input id='confirm' name='confirm' type='password' /><br/>
|
||||
<label>Numéro de téléphone: </label><input id='phone' name='phone' type='text' /><br/>
|
||||
<label>Régime alimentaire: </label><input id='diet' name='diet' type='text' /><br/>
|
||||
<input type='submit' value='Update' onclick='javascript:return update_account();'>
|
||||
</article>
|
||||
{% endblock %}
|
@ -2,7 +2,7 @@
|
||||
{% block title %}Articles{% endblock %}
|
||||
{% block main %}
|
||||
<article>
|
||||
<h3>Choose your article</h3>
|
||||
<h3>Informations personnelles</h3>
|
||||
<p>
|
||||
Please select your article
|
||||
</p>
|
||||
|
@ -1,19 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='zxx'>
|
||||
<head>
|
||||
<title>TetaWebApp - {% block title %}Accueil{% endblock %}</title>
|
||||
<title>We Make THSF - {% block title %}Accueil{% endblock %}</title>
|
||||
<meta name="viewport" content="initial-scale=1.0" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="/static/styles/colors.css" />
|
||||
<link rel="stylesheet" type="text/css" href="/static/styles/fonts.css" />
|
||||
<link rel="stylesheet" type="text/css" href="/static/styles/tetawebapp.css" />
|
||||
<link rel="stylesheet" type="text/css" href="/static/styles/participate.css" />
|
||||
<link rel="icon" type="image/png" href="/static/images/favicon.png" />
|
||||
<script src="/static/scripts/tetawebapp.js"></script>
|
||||
<script src="/static/scripts/participate.js"></script>
|
||||
</head>
|
||||
{% block bodyheader %}
|
||||
<body>
|
||||
{% endblock %}
|
||||
<header>{% block banner %}TetaWebApp{% endblock %}</header>
|
||||
<header>{% block banner %}We Make THSF{% endblock %}</header>
|
||||
<div class='content'>
|
||||
{% block nav %}
|
||||
<nav class='vertical'>
|
||||
@ -46,54 +48,32 @@
|
||||
{% endif %}
|
||||
{% block main %}
|
||||
<article class='right'>
|
||||
<h3>TetaWebApp demo</h3>
|
||||
{% if message != '' %}
|
||||
<pre>{{ message }}</pre>
|
||||
{% endif %}
|
||||
<h3>We Make THSF</h3>
|
||||
<p>
|
||||
Welcome to the <strong>TetaWebApp</strong> demo
|
||||
Comme chaque année le <a href='https://www.thsf.net>'>Toulouse Hacker Space Factory</a> aura lieu à
|
||||
<a href='http://mixart-myrys.org'>Mix'Art Myrys</a>.
|
||||
</p>
|
||||
<p>
|
||||
TetaWebApp is a basic web application template based on <a href='http://flask.pocoo.org/'>Python/Flask</a>
|
||||
and <a href='https://www.w3schools.com/js/js_ajax_intro.asp'>AJAX</a> made by
|
||||
<a href='mailto:doug.letough@free.fr'>Doug Le Tough</a> from <a href='https://www.tetalab.org'>Tetalab</a>.
|
||||
Ce festival ne pourrait pas avoir lieu sans votre implication et cette année encore votre aide est la bienvenue et nous
|
||||
est précieuse.
|
||||
</p>
|
||||
<p>
|
||||
The goal of this project is to provide a basic framework to make any web application you need while
|
||||
letting you complete freedom on how to use or extend it <strong>without</strong> using any Google,
|
||||
Bootstrap or any other piece of <strong>shitty free spyware</strong>.
|
||||
</p>
|
||||
TetaWebApp will <strong>never</strong> download or upload anything in any way.
|
||||
<p>
|
||||
</p>
|
||||
<p>There is <strong>no</strong> limitation, you can use all or only parts of <strong>TetaWebApp</strong>
|
||||
and you can <strong title='bullshit inside'>virtually</strong> do any app you want with TetaWebApp.
|
||||
</p>
|
||||
<p>
|
||||
But be sure that freedom has a cost: You <strong>will</strong> need work to make it work ;-)
|
||||
</p>
|
||||
<p>
|
||||
<strong>TetaWebApp</strong> is released under the only real <strong>free</strong> license: The
|
||||
<a href='http://www.wtfpl.net/'><img src='http://www.wtfpl.net/wp-content/uploads/2012/12/wtfpl-badge-2.png'
|
||||
title='WTFPL' alt='WTFPL' /></a>.
|
||||
</p>
|
||||
<pre>
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
</pre>
|
||||
<p>
|
||||
Get a copy of <strong>TetaWebApp</strong>:<br/>
|
||||
<pre>
|
||||
git clone git://git.tetalab.org/tetalab/tetawebapp
|
||||
</pre>
|
||||
Ce site vous permettra:
|
||||
<ul>
|
||||
<li>
|
||||
de vous enregistrer afin de faire partie du "Staff", cette équipe de super-héros sans qui le THSF ne
|
||||
saurait être un moment agréable, sûr et convivial.
|
||||
</li>
|
||||
<li>
|
||||
de sélectionner le poste et les créneaux horaires pendant lesquels vous souhaitez vous rendre disponible.
|
||||
</li>
|
||||
<li>
|
||||
d'être tenu informé des évolutions de l'organisation et du déroulement du THSF via la mailing list du staff.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
</article>
|
||||
{% endblock %}
|
||||
|
@ -4,11 +4,6 @@
|
||||
{% block main %}
|
||||
<article class='login'>
|
||||
<h3>Login</h3>
|
||||
<p>The demo login is:</p>
|
||||
<ul>
|
||||
<li>Login: demo</li>
|
||||
<li>Password: demo</li>
|
||||
</ul>
|
||||
</article>
|
||||
{% if message != '' %}
|
||||
<pre>{{ message }}</pre>
|
||||
|
70
templates/login_or_register.html
Normal file
70
templates/login_or_register.html
Normal file
@ -0,0 +1,70 @@
|
||||
{% extends "index.html" %}
|
||||
{% block title %}Login{% endblock %}
|
||||
{% block nav %}{% endblock %}
|
||||
{% block main %}
|
||||
<article class='left'>
|
||||
<h3>We Make THSF</h3>
|
||||
<p>
|
||||
Comme chaque année le <a href='https://www.thsf.net>'>Toulouse Hacker Space Factory</a> aura lieu à
|
||||
<a href='http://mixart-myrys.org'>Mix'Art Myrys</a>.
|
||||
</p>
|
||||
<p>
|
||||
Ce festival ne pourrait pas avoir lieu sans votre implication et cette année encore votre aide est la bienvenue et nous
|
||||
est précieuse.
|
||||
</p>
|
||||
<p>
|
||||
Ce site vous permettra:
|
||||
<ul>
|
||||
<li>
|
||||
de vous enregistrer afin de faire partie du "Staff", cette équipe de super-héros sans qui le THSF ne
|
||||
saurait être un moment agréable, sûr et convivial.
|
||||
</li>
|
||||
<li>
|
||||
de sélectionner le poste et les créneaux horaires pendant lesquels vous souhaitez vous rendre disponible.
|
||||
</li>
|
||||
<li>
|
||||
d'être tenu informé des évolutions de l'organisation et du déroulement du THSF via la mailing list du staff.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
Nul besoin de compétences particulières pour rejoindre notre équipe sinon votre meilleure volonté et votre bonne humeur
|
||||
qui feront du THSF un moment unique de partage.
|
||||
</p>
|
||||
<p>
|
||||
Pour vous enregistrer, munissez vous de votre adresse email et renseignez les champs de la section "<strong>Inscription</strong>".
|
||||
</p>
|
||||
<p>
|
||||
Si vous vous être préalablement enregistré, renseignez uniquement les champs de la section "<strong>Connexion</strong>"
|
||||
</p>
|
||||
<p class='note'>Aucun électron n'a été maltraité lors de la mise au point de ce site.
|
||||
Par ailleurs ce site n'utilise ni ressources hébergées par des tiers, ni bullshitwares, ni trackers.</p>
|
||||
</article>
|
||||
{% if message != '' %}
|
||||
<pre>{{ message }}</pre>
|
||||
{% endif %}
|
||||
<hr/>
|
||||
<article class='login'>
|
||||
<h3>Connexion</h3>
|
||||
</article>
|
||||
<article class='left'>
|
||||
<form method='POST' action='/login'>
|
||||
<label>Adresse mail: </label><input id='login' name='login' type='text' /><br/>
|
||||
<label>Mot de passe: </label><input id='password' name='password' type='password' /><br/>
|
||||
<input type='submit' value='Log me in' onclick='javascript:return verify_login();'>
|
||||
</form>
|
||||
</article>
|
||||
<hr/>
|
||||
<article class='login'>
|
||||
<h3>Inscription</h3>
|
||||
</article>
|
||||
<article class='left'>
|
||||
<form method='POST' action='/register'>
|
||||
<label>Adresse mail: </label><input id='reg_mail' name='login' type='text' /><br/>
|
||||
<label>Mot de passe (8 char min.): </label><input id='reg_password' name='password' type='password' /><br/>
|
||||
<label>Confirmation: </label><input id='reg_confirm' name='confirm' type='password' /><br/>
|
||||
<input type='submit' value='Register me NOW !' onclick='javascript:return register();'>
|
||||
</form>
|
||||
</article>
|
||||
<hr/>
|
||||
{% endblock %}
|
19
templates/register.html
Normal file
19
templates/register.html
Normal file
@ -0,0 +1,19 @@
|
||||
{% extends "index.html" %}
|
||||
{% block title %}Register{% endblock %}
|
||||
{% block nav %}{% endblock %}
|
||||
{% block main %}
|
||||
<article class='login'>
|
||||
<h3>Register</h3>
|
||||
</article>
|
||||
{% if message != '' %}
|
||||
<pre>{{ message }}</pre>
|
||||
{% endif %}
|
||||
<article class='left'>
|
||||
<form method='POST' action='/login'>
|
||||
Login: <input id='login' name='login' type='text' />
|
||||
Password: <input id='password' name='password' type='password' />
|
||||
Confirm: <input id='password' name='password' type='password' />
|
||||
<input type='submit' value='Register me NOW !' onclick='javascript:return register();'>
|
||||
</form>
|
||||
</article>
|
||||
{% endblock %}
|
@ -1,48 +1,68 @@
|
||||
\echo ******************************
|
||||
\echo * Dropping database tetawebapp
|
||||
\echo * Dropping database participer_thsf
|
||||
\echo ******************************
|
||||
|
||||
\c postgres;
|
||||
drop database tetawebapp;
|
||||
drop database participer_thsf;
|
||||
|
||||
\echo **************************
|
||||
\echo * Dropping role tetawebapp
|
||||
\echo * Dropping role participer_thsf
|
||||
\echo **************************
|
||||
drop role tetawebapp;
|
||||
drop role participer_thsf;
|
||||
|
||||
\echo ***************************************************
|
||||
\echo * Creating role tetawebapp with password tetawebapp
|
||||
\echo * Creating role participer_thsf with password participer_thsf
|
||||
\echo ***************************************************
|
||||
create role tetawebapp with LOGIN ENCRYPTED PASSWORD 'tetawebapp';
|
||||
create role participer_thsf with LOGIN ENCRYPTED PASSWORD 'participer_thsf';
|
||||
|
||||
\echo ******************************
|
||||
\echo * Creating database tetawebapp
|
||||
\echo * Creating database participer_thsf
|
||||
\echo ******************************
|
||||
create database tetawebapp;
|
||||
create database participer_thsf;
|
||||
|
||||
\echo *******************************************
|
||||
\echo * Giving tetawebapp ownership to tetawebapp
|
||||
\echo * Giving participer_thsf ownership to participer_thsf
|
||||
\echo *******************************************
|
||||
alter database tetawebapp owner to tetawebapp;
|
||||
alter database participer_thsf owner to participer_thsf;
|
||||
|
||||
\echo *********************************
|
||||
\echo * Creating tetawebapp_users table
|
||||
\echo * Creating participer_thsf_users table
|
||||
\echo *********************************
|
||||
|
||||
\c tetawebapp;
|
||||
CREATE TABLE tetawebapp_users (
|
||||
\c participer_thsf;
|
||||
CREATE TABLE participer_thsf_users (
|
||||
id serial primary key,
|
||||
mail text not NULL,
|
||||
password text not NULL,
|
||||
name text not NULL
|
||||
name text,
|
||||
phone text,
|
||||
diet text
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE participer_thsf_roles (
|
||||
id serial primary key,
|
||||
role text not NULL,
|
||||
description text not NULL
|
||||
);
|
||||
|
||||
\echo *************************************************
|
||||
\echo * Giving tetawebapp_users ownership to tetawebapp
|
||||
\echo * Giving participer_thsf_users ownership to participer_thsf
|
||||
\echo *************************************************
|
||||
alter table tetawebapp_users owner to tetawebapp;
|
||||
alter table participer_thsf_users owner to participer_thsf;
|
||||
|
||||
\echo *********************************************************************
|
||||
\echo * Inserting user demo identified by password demo to tetawebapp_users
|
||||
\echo * Inserting user demo identified by password demo to participer_thsf_users
|
||||
\echo *********************************************************************
|
||||
insert into tetawebapp_users (mail, password, name) values ('demo', '$2b$12$yjv4QMctGJFj2HmmbF6u5uDq9ATIl/Y9Z96MbaqRrcG6AE0CGHKSS', 'demo');
|
||||
insert into participer_thsf_users (mail, password, name) values ('demo', '$2b$12$yjv4QMctGJFj2HmmbF6u5uDq9ATIl/Y9Z96MbaqRrcG6AE0CGHKSS', 'demo');
|
||||
|
||||
\echo *********************************************************************
|
||||
\echo * Inserting roles to participer_thsf_roles
|
||||
\echo *********************************************************************
|
||||
insert into participer_thsf_roles (role, description) values ('Préparation/Installation/signalétique', 'Fermeture des zones inaccessibles au public|Prépa buvette : allumage tireuses et frigos 4h avant ouverture + approvisionnement des bars en produits destinés à la vente|Préparation des différents postes / stands selon besoins : PLN, billetterie, T-Shirts...|Prépa toilettes public : aspiration/pompage, nettoyage à grandes eaux, remplissage du produit, changement poubelles, approvisionnement PQ|Nettoyage lieu, réapprovisionnement poubelles aux endroits stratégiques');
|
||||
insert into participer_thsf_roles (role, description) values ('Volante', 'veille à la sécurité du lieu : rondes, surveillance accès, gestion de crises, messager, remplaçant, etc... (collaboration avec référent staff)|Ramassage verre, check PQ, ménage ponctuel|Sur le dernier créneau horaire, nettoyage de deux blocs WC|Au moins une personne connaissant bien Myrys sur chaque créneau horaire');
|
||||
insert into participer_thsf_roles (role, description) values ('P.L.N', 'Accueil public, explication du concept de PLN, tampons (si besoin)|Informer et guider le public (prog, espaces, toilettes,...)|Comptage du public');
|
||||
insert into participer_thsf_roles (role, description) values ('Buvette','Service au bar et encaissement (caisse ou tickets boisson selon besoins)|Nettoyage régulier : bar, tireuses, cendriers, verres abandonnés...');
|
||||
insert into participer_thsf_roles (role, description) values ('Billeterie','Vente de tickets boisson / 1 ticket = 2,50 €|Poinçonnage des cartes VIP. 1 poinçon = 1 ticket = 1 euros|Tickets valables sur les 4 jours mais NON REMBOURSABLES');
|
||||
insert into participer_thsf_roles (role, description) values ('Catering', 'Vérification de l''accès au catering (badge)|Service à l''assiette si besoin, gestion des quantités, réapprovisionnement du buffet|Maintenir la propreté des espaces catering (cuisine, buffet, tables, salle d''AG, tables extérieures, jardins)|Informer / rappeler le principe d''autogestion pour la vaisselle');
|
||||
insert into participer_thsf_roles (role, description) values ('Ménage', 'Nettoyage général à la fermeture du lieu : ramasser verres / déchets / cendriers, sortir poubelles, cleaner surfaces (bar, stand,...) + balai');
|
||||
|
Loading…
Reference in New Issue
Block a user