This commit is contained in:
Dark-Storm 2017-07-12 23:13:34 +02:00
commit a849759521
22 changed files with 936 additions and 172 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.pyc

View File

@ -5,8 +5,8 @@ from django import forms
class LoginForm(forms.Form):
# no need for max_length, let's not make heavyer things that can be lighter
username = forms.CharField(label="Nom d'utilisateur")
password = forms.CharField(label="Mot de passe", widget=forms.PasswordInput)
username = forms.CharField(label="", widget=forms.TextInput(attrs={'placeholder':'Identifiant'}))
password = forms.CharField(label="", widget=forms.PasswordInput(attrs={'placeholder':'Mot de passe'}))
class InscriptionForm(forms.Form):
username = forms.CharField(label="Nom d'utilisateur", min_length=settings.USERNAME_MIN_LENGTH, max_length=settings.USERNAME_MAX_LENGTH)

View File

@ -1,18 +1,22 @@
#-*- coding: utf-8 -*-
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django.contrib.auth import login as a_login, logout as a_logout
from account.forms import *
from django.core.urlresolvers import reverse
from django.core.validators import validate_email
from django.conf import settings as s
from django.http import JsonResponse
from django.http import Http404
from account.forms import *
from home.views import homepage
def login(request):
error = False
form = LoginForm()
"""
Login validation
Only accessible with ajax POST from menu and return json
"""
form = LoginForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
username = form.cleaned_data["username"]
@ -20,20 +24,42 @@ def login(request):
user = authenticate(username=username, password=password)
if user:
a_login(request, user)
return redirect(reverse(homepage))
data = {
'login':True
}
else:
error = True
return render(request, 'login.html', locals())
data = {
'login':False
}
if(User.objects.filter(username=username).exists()):
data['error'] = 'Mauvais mot de passe'
else:
data['error'] = 'Identifiant inconnu'
if('HTTP_X_REQUESTED_WITH' in request.META and request.META['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'):
return JsonResponse(data)
return render(request, 'account/login.html', locals())
else:
#hack attempt, log it
print(request.POST)
elif request.method == "GET":
return render(request, 'account/login.html')
raise Http404
def logout(request):
"""
Logout user
with ajax POST from menu and reload page
"""
a_logout(request)
return redirect(reverse(homepage))
def signup(request):
error = False
"""
Signup user
with ajax POST from signup page and return json
"""
form = InscriptionForm()
if request.method == "POST":
if form.is_valid():
@ -42,25 +68,34 @@ def signup(request):
username = form.cleaned_data["username"]
email = form.cleaned_data["email"]
cgu = form.cleaned_data["cgu"]
if(
username.length < s.USERNAME_MIN_LENGTH or username.length > s.USERNAME_MAX_LENGTH or
password.length < s.PASSWORD_MIN_LENGTH or password.length > s.PASSWORD_MAX_LENGTH or
password1 != password2 or cgu==False
):
error = True
return render(request, 'signup.html', locals())
if(password1 != password2):
data = {
'registered':False,
'error':"Les mots de passe ne sont pas identique !"
}
elif(User.objects.filter(username=username).exists()):
data = {
'registered':False,
'error':"Ce nom d'utilisateur est déjà utilisé !"
}
elif(User.objects.filter(email=email).exists()):
data = {
'registered':False,
'error':"Cette adresse email est déjà utilisé !"
}
else:
create_user(username, email, password1)
authenticate(username, password1)
data = {
'registered':True
}
try:
validate_email(email)
except forms.ValidationError:
error = True
return render(request, 'signup.html', locals())
create_user(username, email, password1)
authenticate(username, password1)
return render(request, 'home.html', locals())
return render(request, 'signupt.html', locals())
if('HTTP_X_REQUESTED_WITH' in request.META and request.META['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'):
return JsonResponse(data)
return render(request, 'account/signup.html', locals())
elif request.method == "GET":
return render(request, 'account/signup.html', locals())
raise Http404
def account(request):
return render(request, 'account.html')
return render(request, 'account.html')

7
home/forms.py Normal file
View File

@ -0,0 +1,7 @@
from django.conf import settings
from django import forms
class ContactForm(forms.Form):
email = forms.EmailField(label="E-mail")
title = forms.CharField(label="Objet", min_length=settings.OBJECT_MIN_LENGTH, max_length=settings.OBJECT_MAX_LENGTH)
message = forms.CharField(label="Message", min_length=settings.MAILBODY_MIN_LENGTH, max_length=settings.MAILBODY_MAX_LENGTH)

View File

@ -2,5 +2,7 @@ from django.conf.urls import url
import home.views as v
urlpatterns = [
url(r'^$', v.homepage),
url(r'^$', v.homepage, name="homepage"),
url(r'^contact$', v.contact, name="contact"),
url(r'^articlê$', v.article, name="article")
]

View File

@ -1,6 +1,39 @@
#-*- coding: utf-8 -*-
from django.shortcuts import render
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, get_user
from django.contrib.auth.models import User
from django.http import Http404
from django.http import JsonResponse
from home.forms import *
def homepage(request):
return render(request, 'home/homepage.html')
"""
Render home page.
"""
return render(request, 'home/homepage.html', locals())
def contact(request):
"""
Form validation and contact page rendering.
"""
user = get_user(request)
form = ContactForm(request.POST or None, initial={'email': user.email if user.is_authenticated else ''})
if request.method == "POST":
if form.is_valid():
#TODO send email ? save into database ?
data = {
'sent':True
}
if('HTTP_X_REQUESTED_WITH' in request.META and request.META['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'):
return JsonResponse(data)
return render(request, 'home/contact.html', locals())
else:
#hack attempt, log it
print(request.POST)
elif request.method == "GET":
return render(request, 'home/contact.html', locals())
raise Http404
def article(request):
return render(request, 'home/article.html')

View File

@ -0,0 +1,8 @@
from django.conf import settings
from account.forms import LoginForm
def menu(request):
dictionnaire = {
'loginForm' : LoginForm(auto_id=False),
}
return dictionnaire

View File

@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/1.9/ref/settings/
"""
import os
from django.conf import global_settings
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@ -60,7 +61,7 @@ TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
'/home/darks/web/planete_casio/templates/',
os.path.join(BASE_DIR, 'templates/'),
],
'APP_DIRS': True,
'OPTIONS': {
@ -69,6 +70,7 @@ TEMPLATES = [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'planete_casio.context_processors.menu'
],
},
},
@ -136,16 +138,21 @@ APPEND_SLASH = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_URL = 'http://static.localhost/' # For dev css
# STATIC_URL = '/static/' # For Django admin css
# STATIC_URL = 'http://static.localhost/' # For dev css
STATIC_URL = '/sfiles/' # For Django admin css
# STATIC_ROOT = '/home/web/planete_casio/static/'
STATICFILES_DIRS = (
"/home/web/planete_casio/sfiles/",
os.path.join(BASE_DIR, "sfiles"),
)
USERNAME_MIN_LENGTH = 3
USERNAME_MAX_LENGTH = 30
PASSWORD_MIN_LENGTH = 8
PASSWORD_MAX_LENGTH = 72 # maximum number of characters for bcrypt
PASSWORD_MAX_LENGTH = 72 # maximum number of characters for bcrypt
OBJECT_MIN_LENGTH = 3
OBJECT_MAX_LENGTH = 255
MAILBODY_MIN_LENGTH = 3
MAILBODY_MAX_LENGTH = 10000

View File

@ -16,14 +16,14 @@ Including another URLconf
from django.conf import settings
from django.conf.urls import url, include
from django.contrib import admin
import account.views as v
import account.views as av
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('home.urls')),
url(r'^forum/', include('forum.urls')),
url(r'^account/', include('account.urls')),
url(r'^login', v.login),
url(r'^logout', v.logout),
url(r'^signup', v.signup)
url(r'^forum/', include('forum.urls'), name="forum"),
url(r'^account/', include('account.urls'), name="account"),
url(r'^login', av.login, name="login"),
url(r'^logout', av.logout, name="logout"),
url(r'^signup', av.signup, name="signup")
]

73
sfiles/css/container.css Executable file → Normal file
View File

@ -2,7 +2,7 @@
margin-left: 60px;
}
#container h1 {
/* #container h1 {
margin-left: 5%;
font-family: Raleway; font-size: 24px;
font-weight: 200; color: #242424;
@ -12,75 +12,6 @@
margin-left: 5%;
font-family: Raleway; font-size: 20px;
font-weight: 200; color: #242424;
}
article > div {
margin: 5px 15px;
text-align: justify;
}
article .flex-container {
display: flex;
}
article .flex-container > * {
flex-grow: 1;
max-width: 500px;
margin: 5px 10px;
}
article .flex-container > * .more {
display: block; margin-left: 10px;
font-family: NotoSans; font-size: 12px;
color: #ba1203;
transition: .15s ease;
}
article .flex-container > * .more:hover {
padding-left: 1 5px;
}
article p {
margin-bottom: 10px;
}
} */
/* tiles */
.tile-container {
display: flex; flex-wrap: wrap;
justify-content: space-around;
align-items: stretch;
}
.tile-container > div {
flex-grow: 1;
min-width: 300px;
margin: 10px 15px; padding: 0 10px;
/*border: 1px solid #cccccc;*/
border-radius: 3px;
box-shadow: 0px 1px 3px rgba(0, 0, 0, .3);
}
.tile-container table {
width: 100%;
}
.tile-container table td {
padding: 3px 5px;
display: flex;
}
.tile-container table input[type="text"],
.tile-container table input[type="date"] {
flex-grow: 1;
padding: 3px 10px;
border: 0; border-radius: 1px;
font-family: "Segoe UI", Helvetica, "Droid Sans", Arial,sans-serif;
box-shadow: 0 0 1px rgba(0, 0, 0, .4); transition: .15s ease;
}
.tile-container table input[type="text"]:focus,
.tile-container table input[type="date"]:focus {
box-shadow: 0 0 4px rgba(0, 102, 255, .9);
}
}
.tile-container table td:first-child {
/*text-align: right;*/
}

32
sfiles/css/global.css Executable file → Normal file
View File

@ -14,8 +14,8 @@
body {
margin: 0;
background: #ffffff;
font-family: sans-serif;
background: #fbfbfb;
font-family: 'DejaVu Sans', sans-serif;
}
@ -29,6 +29,9 @@ header {
background: #f8f8fa; border-bottom: 1px solid #d0d0d0;
}
header h1 {
font-family: Raleway; font-weight: 200;
}
header svg {
width: 24px; height: 24px; vertical-align: middle;
@ -69,6 +72,16 @@ header input[type="search"]:focus ~ a > svg > path {
}
footer {
margin: 20px 10% 5px 10%; padding: 10px 0;
text-align: center; font-size: 11px; font-style: italic;
color: #a0a0a0;
border-top: 1px solid rgba(0, 0, 0, .1);
}
footer p {
margin: 3px 0;
}
/*
links
*/
@ -159,3 +172,18 @@ input[type="search"]:focus,
input[type="password"]:focus {
}
section {
margin: 10px 5%;
}
section h1 {
border-bottom: 1px solid #a0a0a0;
font-family: Raleway; font-size: 24px;
font-weight: 200; color: #242424;
}
section * {
transition: .15s ease;
}

134
sfiles/css/homepage.css Normal file
View File

@ -0,0 +1,134 @@
/*
home-title
*/
.home-title {
margin: 20px 0; padding: 10px 5%;
background: #bf1c11; box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
border-top: 10px solid #ab170c;
}
.home-title h1 {
margin-top: 0;
color: #ffffff; border-color: #ffffff;
}
.home-title p {
margin-bottom: 0; text-align: justify;
color: #ffffff;
}
.home-title a {
color: inherit; text-decoration: underline;
}
/*
pinned-content
*/
.home-pinned-content > div {
display: flex; justify-content: space-between;
}
.home-pinned-content article {
flex-grow: 1; margin: 0 1px; padding: 0;
position: relative;
max-width: 250px; overflow: hidden;
}
.home-pinned-content a {
display: block;
}
.home-pinned-content img {
width: 100%; filter: blur(0px);
}
.home-pinned-content article div {
position: absolute; bottom: 0; z-index: 3;
width: 90%; margin: 0;
padding: 30px 5% 10px 5%;
color: #ffffff; text-shadow: 1px 1px 0 rgba(0,0,0,.6);
background-image: linear-gradient(180deg,transparent 0,rgba(0,0,0,.7) 40px,rgba(0,0,0,.8));
}
.home-pinned-content h2 {
display: block; margin: 5px 0;
font-size: 18px; font-family: NotoSans; font-weight: 200;
line-height: 20px;
}
/*
home-articles
*/
.home-articles {
display: flex; justify-content: space-between;
}
.home-articles > div {
flex-grow: 1; max-width: 48%;
}
.home-articles h1 {
display: flex; justify-content: space-between; align-items: center;
}
.home-articles h1 a {
padding: 0;
font-family: NotoSans; font-size: 16px;
font-weight: 400; color: /*#015078*/ /*#bf1c11*/ #234d5f;
}
.home-articles article {
padding: 10px; margin: 10px 0; display: flex; align-items: center;
background: #ffffff; border: 1px solid rgba(0, 0, 0, .2);
}
.home-articles article > img {
float: left; margin-right: 10px; flex-shrink: 0;
}
.home-articles article > img.screeshot {
width: 128px; height: 64px;
}
.home-articles article > div {
flex-shrink: 1;
}
.home-articles article h3 {
margin: 0;
color: #424242; font-weight: normal;
}
.home-articles p {
margin: 5px 0;
text-align: justify;
color: #808080;
}
.home-articles .metadata {
margin: 0;
color: #22292c;
}
.home-articles .metadata a {
color: #22292c; font-weight: 400; font-style: italic;
}
/*
hover rules
*/
.home-pinned-content a:hover img,
.home-pinned-content a:focus img {
filter: blur(3px);
}
.home-pinned-content a:hover div,
.home-pinned-content a:focus div {
padding: 200px 5% 10px 5%;
background-image: linear-gradient(180deg,transparent 0,rgba(0,0,0,.7) 40px,rgba(0,0,0,.8));
}
.home-articles h1 a:hover,
.home-articles h1 a:focus {
padding-right: 10px;
}
.home-articles article a:hover,
.home-articles article a:focus {
text-decoration: underline;
}

110
sfiles/css/light.css Executable file → Normal file
View File

@ -253,4 +253,114 @@ header input[type="search"] {
}
#spotlight a:hover, header #spotlight a:focus {
color: #404040;
}
/* Homepage */
section {
margin: 10px;
}
section h1 {
margin: 10px 0;
border-bottom: 1px solid #a0a0a0;
font-family: Raleway; font-size: 20px;
font-weight: 200; color: #242424;
}
section * {
transition: .15s ease;
}
.home-title {
margin: 20px 0; padding: 10px;
background: #bf1c11; box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
border-top: 10px solid #ab170c;
}
.home-title h1 {
margin: 0;
color: #ffffff; border-color: #ffffff;
}
.home-title p {
margin-bottom: 0; text-align: justify;
color: #ffffff; font-size: 14px;
}
.home-title a {
color: inherit; text-decoration: underline;
}
#shoutbox {
display: none;
}
.home-pinned-content {
margin-top: 30px;
}
.home-pinned-content article {
margin: 5px 0;
}
.home-pinned-content article > a {
width: 100%;
display: flex; align-items: center;
text-decoration: none;
}
.home-pinned-content img {
flex-shrink: 0;
width: 100px; height: 100px;
}
.home-pinned-content article div {
flex-grow: 1; margin-left: 10px;
}
.home-pinned-content h2 {
margin: 0;
font-family: Raleway; font-size: 18px;
font-weight: 400; color: #242424;
text-decoration: underline;
}
.home-pinned-content span {
color: #000000; font-size: 14px;
}
.home-articles > div {
margin-top: 30px;
}
.home-articles article {
margin-bottom: 15px;
display: flex; align-items: center;
}
.home-articles article > img {
flex-shrink: 0; width: 128px; height: 64px;
}
.home-articles article > div {
margin-left: 5px;
}
.home-articles h1 {
display: flex; justify-content: space-between; align-items: center;
}
.home-articles h1 > a {
font-size: 13px; color: #666666;
}
.home-articles h3 {
margin: 0;
color: #424242; font-weight: normal;
}
.home-articles p {
margin: 5px 0;
text-align: justify;
color: #808080; font-size: 14px;
}
/* Notifications */
.alert {
display: none;
}
/* Footer */
footer {
margin: 20px 10% 5px 10%; padding: 10px 0;
text-align: center; font-size: 11px; font-style: italic;
color: #a0a0a0;
border-top: 1px solid rgba(0, 0, 0, .1);
}
footer p {
margin: 3px 0;
}

46
sfiles/css/navbar.css Executable file → Normal file
View File

@ -62,7 +62,7 @@ nav a:focus {
display: flex; flex-direction: column; flex-grow: 1;
align-items: center; justify-content: center;
width: 100%; height: 100%;
-moz-transition: opacity .15s ease; /* because Chrome sucks */
transition: opacity .15s ease; /* because Chrome sucks */
}
#light-menu li > a > svg {
@ -75,12 +75,12 @@ nav a:focus {
#light-menu li > a::after {
content: attr(label);
position: fixed; display: none;
padding: 4px 8px; margin-top: -28px; left: 63px;
padding: 4px 8px; /*margin-top: -28px;*/ left: 63px;
font-family: NotoSans; border-radius: 3px;
background: rgba(0, 0, 0, 0.9);
}
#light-menu li > a:hover::after,
#light-menu li > a:focus::after {
#light-menu li:not(.opened) > a:hover::after,
#light-menu li:not(.opened) > a:focus::after {
display: block;
}
@ -96,21 +96,34 @@ nav a:focus {
/* Overlay */
#menu {
position: fixed; left: 60px; z-index: 5;
width: 0; height: 100%; overflow-x: hidden; overflow-y: auto;
position: fixed; z-index: 5;
left: -240px; width: 300px; /* left-to-right animation */
/*left: 60px; width: 0;*/ /* scroll animation */
height: 100%; overflow-x: hidden; overflow-y: auto;
font-family: NotoSans; font-size: 14px;
background: #22292c; box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
transition: .2s ease;
transition: 2s ease;
}
/*@media all and (max-width: 1266px) {
#menu {
left: 30px;
}
}*/
#menu.opened {
left: 60px; /* left-to-right animation */
/*width: 300px;*/ /* scroll animation */
}
#menu.scroll-animation {
left: 60px; width: 0;
}
#menu.scroll-animation.opened {
width: 300px;
}
#menu.left-to-right-animation {
left: -240px; width: 300px;
}
#menu.left-to-right-animation.opened {
left: 60px;
}
#menu > div {
width: 300px;
@ -169,14 +182,15 @@ nav a:focus {
#menu form input {
display: block; width: 80%;
margin: 5px auto; padding: 5px 10px;
font-size: 14px;
margin: 0 5%; padding: 5px 2%;
font-size: 14px; color: inherit;
background: #e8e8e8; transition: background .15s ease;
border: none;
}
#menu form input:focus {
background: #ffffff;
}
#menu form input:first-child {
#menu form.login input:first-child {
margin-bottom: 0; border-bottom: none;
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
@ -185,7 +199,7 @@ nav a:focus {
-webkit-border-top-right-radius: 5px;
-moz-border-top-right-radius: 5px;
}
#menu form input:nth-child(2) {
#menu form.login input:nth-child(2) {
margin-top: 0; border-top: 1px solid #dddddd;
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;

View File

@ -40,3 +40,14 @@
}
}
@media screen and (max-width: 1100px) {
.home-pinned-content article:nth-child(5) {
display: none;
}
}
@media screen and (max-width: 800px) {
.home-pinned-content article:nth-child(4) {
display: none;
}
}

34
sfiles/css/shoutbox.css Normal file
View File

@ -0,0 +1,34 @@
#shoutbox {
margin: 20px 5% 10px 5%;
/*box-shadow: 0 0 2px rgba(0, 0, 0, .4);*/
background: #ffffff;
/*border: 1px solid #999999;*/
}
#shoutbox > div {
margin: 0; padding: 0; height: 125px; width: 100%;
overflow-y: scroll; border-bottom: 1px solid #999999;
border-radius: 5px 5px 0 0;
border: 1px solid #999999;
}
#shoutbox > input {
width: 100%; padding: 5px 0;
border-radius: 0 0 5px 5px;
border: 1px solid #999999;
}
#shoutbox > input:focus {
border-color: #a12222;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(161, 34, 34, 0.6);
}
#shoutbox > div > div {
padding: 2px 10px;
border-bottom: 1px solid rgba(0, 0, 0, .3);
font-size: 11px;
}
#shoutbox > div > div:last-child {
border-bottom: none;
}
#shoutbox > div > div:hover {
background: #e0e0e0;
}

View File

@ -0,0 +1,3 @@
function contact(response){
alert(response)
}

View File

@ -0,0 +1,74 @@
function setCookie(name, value) {
var end = new Date();
end.setTime( end.getTime() + 3600 * 1000 );
var str=name+"="+escape(value)+"; expires="+end.toGMTString()+"; path=/";
document.cookie = str;
}
function getCookie(name) {
var debut = document.cookie.indexOf(name);
if( debut == -1 ) return null;
var end = document.cookie.indexOf( ";", debut+name.length+1 );
if( end == -1 ) end = document.cookie.length;
return unescape( document.cookie.substring( debut+name.length+1, end ) );
}
function close_important(element) {
element.style.opacity = 0;
setTimeout(function(){ element.parentNode.removeChild(element); }, 200);
}
/*
Send post ajax request to url defined in action.
Callback the function defined in the callback attribute from the submit type.
*/
function ajaxWrapper(evt){
evt.preventDefault();
var elems = evt.target;
var params = "";
// do not embed submit value (-1)
for(i = 0; i < elems.length-1; i++){
if(params) params += "&";
params += encodeURIComponent(elems[i].name)+"="+encodeURIComponent(elems[i].value);
}
const req = new XMLHttpRequest();
req.open("POST", evt.target.action, true);
req.setRequestHeader('Content-Type',"application/x-www-form-urlencoded");
req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
req.onreadystatechange = function(){
if(req.readyState == 4 && (req.status == 200 || req.status == 0)){
var fn = window[elems[elems.length-1].getAttribute("callback")];
if(typeof fn == 'function'){
fn(req.responseText);
}
}
}
req.send(params);
}
/*
Add event listener on submit for all form with class with-ajax.
*/
window.onload = function(){
var ele;
var elems = document.getElementsByClassName('with-ajax');
for(i = 0; i < elems.length; i++){
ele = elems[i];
if(ele.addEventListener){ // Normal people
ele.addEventListener("submit", ajaxWrapper, false);
}else if(ele.attachEvent){ // Retarded user using IE
ele.attachEvent("onsubmit", ajaxWrapper);
}
}
if(getCookie('pc_notif') == 'true')
document.getElementsByClassName('alert')[0].parentNode.removeChild(document.getElementsByClassName('alert')[0]);
if(getCookie('pc_notif_2') == 'true')
document.getElementsByClassName('alert')[0].parentNode.removeChild(document.getElementsByClassName('alert')[0]);
}
function login(response){
alert(response);
}

View File

@ -6,18 +6,19 @@
<article>
<h1>Formulaire de connexion</h1>
<div>
{% if error %}
<p><strong>Utilisateur inexistant ou mauvais de mot de passe.</strong></p>
{% if data != None and data.login == False %}
<p><strong>{{ data.error }}</strong></p>
{% endif %}
{% if user.is_authenticated %}
Vous êtes connecté, {{ user.username }} !
{% else %}
<form method="post" action=".">
<form method="post" action="/login" class="with-ajax">
{{ loginForm }}
{% csrf_token %}
{{ form.as_p }}
<input type="submit"/>
<input type="submit" callback="login_page" value="Connexion"/>
</form>
<a href="/password-forgotten">Mot de passe oublié ?</a>
{% endif %}
</div>
</article>

View File

@ -3,7 +3,7 @@
<!DOCTYPE html>
<html lang="fr-FR">
<head>
<title>{% block title %}Planète Casio : design template{% endblock %}</title>
<title>{% block title %}Planète Casio{% endblock %}</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -12,13 +12,12 @@
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href="{% static 'css/navbar.css' %}">
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href="{% static 'css/container.css' %}">
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href="{% static 'css/responsive.css' %}">
<link rel="stylesheet" media="all and (max-width: 699px)" type="text/css" href="{% static 'css/light.css' %}">
</head>
<body>
<nav>
<ul id="light-menu">
<a id="logo" href="{% url 'home.views.homepage' %}">
<a id="logo" href="{% url 'homepage' %}">
<img src="{% static 'images/logo_noshadow.png' %}" alt="logo"/>
</a>
@ -138,8 +137,12 @@
<h2>
Invité
</h2>
<a href="{% url 'account.views.login' %}">Connexion</a>
<a href="{% url 'account.views.login' %}">Inscription</a>
<form method="post" action="{% url 'login' %}" class="login with-ajax">
{{ loginForm }}
{% csrf_token %}
<input type="submit" callback="login" value="Connexion">
</form>
<a href="{% url 'signup' %}">Inscription</a>
</div>
{% endif %}
@ -355,34 +358,10 @@
</div> -->
</body>
{% block javascript %}
<script type="text/javascript" src="{% static 'scripts/trigger_menu.js' %}"></script>
<script type="text/javascript" src="{% static 'scripts/smartphone_patch.js' %}"></script>
<script type="text/javascript">
function setCookie(name, value) {
var end = new Date();
end.setTime( end.getTime() + 3600 * 1000 );
var str=name+"="+escape(value)+"; expires="+end.toGMTString()+"; path=/";
document.cookie = str;
}
function getCookie(name) {
var debut = document.cookie.indexOf(name);
if( debut == -1 ) return null;
var end = document.cookie.indexOf( ";", debut+name.length+1 );
if( end == -1 ) end = document.cookie.length;
return unescape( document.cookie.substring( debut+name.length+1, end ) );
}
if(getCookie('pc_notif') == 'true')
document.getElementsByClassName('alert')[0].parentNode.removeChild(document.getElementsByClassName('alert')[0]);
if(getCookie('pc_notif_2') == 'true')
document.getElementsByClassName('alert')[0].parentNode.removeChild(document.getElementsByClassName('alert')[0]);
function close_important(element) {
element.style.opacity = 0;
setTimeout(function(){ element.parentNode.removeChild(element); }, 200);
}
</script>
<script type="text/javascript" src="{% static 'scripts/pc-utils.js' %}"></script>
{% endblock %}
</html>

View File

@ -0,0 +1,19 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Planète Casio — Contact{% endblock %}
{% block content %}
<form method="post" action="{% url 'contact' %}" class="with-ajax">
{{ form }}
{% csrf_token %}
<input type="submit" callback="contact" value="Envoyer"/>
</form>
{% endblock %}
{% block javascript %}
{{ block.super }}
<script type="text/javascript" src="{% static 'scripts/contact.js' %}">
{% endblock %}

333
templates_dev/contact.html Normal file
View File

@ -0,0 +1,333 @@
<!DOCTYPE html>
<html lang="fr-FR">
<head>
<title>Planète Casio — Contact</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href="/sfiles/css/global.css">
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href="/sfiles/css/navbar.css">
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href="/sfiles/css/container.css">
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href="/sfiles/css/responsive.css">
<link rel="stylesheet" media="all and (max-width: 699px)" type="text/css" href="/sfiles/css/light.css">
</head>
<body>
<nav>
<ul id="light-menu">
<a id="logo" href="/">
<img src="/sfiles/images/logo_noshadow.png" alt="logo"/>
</a>
<li>
<a role="button" label="Compte" tabindex="0">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"></path>
</svg>
<div>Compte</div>
</a>
</li>
<li>
<a role="button" label="Actualités" tabindex="0">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M20,11H4V8H20M20,15H13V13H20M20,19H13V17H20M11,19H4V13H11M20.33,4.67L18.67,3L17,4.67L15.33,3L13.67,4.67L12,3L10.33,4.67L8.67,3L7,4.67L5.33,3L3.67,4.67L2,3V19A2,2 0 0,0 4,21H20A2,2 0 0,0 22,19V3L20.33,4.67Z"></path>
</svg>
<div>Actualités</div>
</a>
</li>
<li>
<a role="button" label="Forum" tabindex="0">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M17,12V3A1,1 0 0,0 16,2H3A1,1 0 0,0 2,3V17L6,13H16A1,1 0 0,0 17,12M21,6H19V15H6V17A1,1 0 0,0 7,18H18L22,22V7A1,1 0 0,0 21,6Z"></path>
</svg>
<div>Forum</div>
</a>
</li>
<li>
<a role="button" label="Programmes" tabindex="0">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M8,3A2,2 0 0,0 6,5V9A2,2 0 0,1 4,11H3V13H4A2,2 0 0,1 6,15V19A2,2 0 0,0 8,21H10V19H8V14A2,2 0 0,0 6,12A2,2 0 0,0 8,10V5H10V3M16,3A2,2 0 0,1 18,5V9A2,2 0 0,0 20,11H21V13H20A2,2 0 0,0 18,15V19A2,2 0 0,1 16,21H14V19H16V14A2,2 0 0,1 18,12A2,2 0 0,1 16,10V5H14V3H16Z"></path>
</svg>
<div>Programmes</div>
</a>
</li>
<li>
<a role="button" label="Tutoriels" tabindex="0">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,3L1,9L12,15L21,10.09V17H23V9M5,13.18V17.18L12,21L19,17.18V13.18L12,17L5,13.18Z"></path>
</svg>
<div>Tutoriels</div>
</a>
</li>
<li>
<a role="button" label="Sprites" tabindex="0">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M20.71,4.63L19.37,3.29C19,2.9 18.35,2.9 17.96,3.29L9,12.25L11.75,15L20.71,6.04C21.1,5.65 21.1,5 20.71,4.63M7,14A3,3 0 0,0 4,17C4,18.31 2.84,19 2,19C2.92,20.22 4.5,21 6,21A4,4 0 0,0 10,17A3,3 0 0,0 7,14Z"></path>
</svg>
<div>Sprites</div>
</a>
</li>
<li>
<a href="#" label="Outils">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M22.7,19L13.6,9.9C14.5,7.6 14,4.9 12.1,3C10.1,1 7.1,0.6 4.7,1.7L9,6L6,9L1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1C4.8,14 7.5,14.5 9.8,13.6L18.9,22.7C19.3,23.1 19.9,23.1 20.3,22.7L22.6,20.4C23.1,20 23.1,19.3 22.7,19Z"></path>
</svg>
<div>Outils</div>
</a>
</li>
</ul>
<div id="menu">
<div>
<h2>
Invité
</h2>
<form method="post" action="/login" class="login with-ajax">
<tr><th></th><td><input name="username" placeholder="Identifiant" type="text" required /></td></tr>
<tr><th></th><td><input name="password" placeholder="Mot de passe" type="password" required /></td></tr>
<input type='hidden' name='csrfmiddlewaretoken' value='0V7fuD52dM89FkLsYLaAZusaAbx59DMpj8HlXJgr6tCgqH6dM4xeaOqBKUvsEQQA' />
<input type="submit" callback="login" value="Connexion">
</form>
<a href="/signup">Inscription</a>
</div>
<div>
<h2>
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M20,11H4V8H20M20,15H13V13H20M20,19H13V17H20M11,19H4V13H11M20.33,4.67L18.67,3L17,4.67L15.33,3L13.67,4.67L12,3L10.33,4.67L8.67,3L7,4.67L5.33,3L3.67,4.67L2,3V19A2,2 0 0,0 4,21H20A2,2 0 0,0 22,19V3L20.33,4.67Z"></path>
</svg>
Actualités
</h2>
<a href="#">Casio</a>
<a href="#">Arduino</a>
<a href="#">Projets communautaires</a>
<a href="#">Divers</a>
<hr />
<h3>Derniers articles</h3>
<ul>
<li><a href="#">Un nouvel OS pour les Graph 75</a></li>
<li><a href="#">Les 7 Days CPC arrivent bientôt</a></li>
<li><a href="#">Résultats de jeu du mois de Février 2017</a></li>
<li><a href="#">Test du shield relai Sainsmart pour Arduino</a></li>
<li><a href="#">Un nouveau tutoriel sur le C-engine</a></li>
</ul>
</div>
<div>
<h2>
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M17,12V3A1,1 0 0,0 16,2H3A1,1 0 0,0 2,3V17L6,13H16A1,1 0 0,0 17,12M21,6H19V15H6V17A1,1 0 0,0 7,18H18L22,22V7A1,1 0 0,0 21,6Z"></path>
</svg>
Forum
</h2>
<a href="#">Vie communautaire</a>
<a href="#">Projets de programmation</a>
<a href="#">Questions et problèmes</a>
<a href="#">Discussions</a>
<a href="#">Administration</a>
<a href="#">CreativeCalc</a>
<hr />
<h3>Derniers commentaires</h3>
<ul>
<li><a href="#">Legolas</a> sur <a href="#">Bugs de la v5</a></li>
<li><a href="#">Dark Storm</a> sur <a href="#">fxSDK support</a></li>
<li><a href="#">Gollum</a> sur <a href="#">Le nom de topic qui fout le bordel car il est trop long…</a></li>
<li><a href="#">Lephenixnoir</a> sur <a href="#">fxSDK support</a></li>
<li><a href="#">Kristaba</a> sur <a href="#">FiXos, le retour</a></li>
</ul>
</div>
<div>
<h2>
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M8,3A2,2 0 0,0 6,5V9A2,2 0 0,1 4,11H3V13H4A2,2 0 0,1 6,15V19A2,2 0 0,0 8,21H10V19H8V14A2,2 0 0,0 6,12A2,2 0 0,0 8,10V5H10V3M16,3A2,2 0 0,1 18,5V9A2,2 0 0,0 20,11H21V13H20A2,2 0 0,0 18,15V19A2,2 0 0,1 16,21H14V19H16V14A2,2 0 0,1 18,12A2,2 0 0,1 16,10V5H14V3H16Z"></path>
</svg>
Programmes
</h2>
<a href="#">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M7,6H17A6,6 0 0,1 23,12A6,6 0 0,1 17,18C15.22,18 13.63,17.23 12.53,16H11.47C10.37,17.23 8.78,18 7,18A6,6 0 0,1 1,12A6,6 0 0,1 7,6M6,9V11H4V13H6V15H8V13H10V11H8V9H6M15.5,12A1.5,1.5 0 0,0 14,13.5A1.5,1.5 0 0,0 15.5,15A1.5,1.5 0 0,0 17,13.5A1.5,1.5 0 0,0 15.5,12M18.5,9A1.5,1.5 0 0,0 17,10.5A1.5,1.5 0 0,0 18.5,12A1.5,1.5 0 0,0 20,10.5A1.5,1.5 0 0,0 18.5,9Z"></path>
</svg>
Jeux
</a>
<a href="#">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M19,19H5V8H19M19,3H18V1H16V3H8V1H6V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M16.53,11.06L15.47,10L10.59,14.88L8.47,12.76L7.41,13.82L10.59,17L16.53,11.06Z"></path>
</svg>
Utilitaires
</a>
<a href="#">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M21,16H3V4H21M21,2H3C1.89,2 1,2.89 1,4V16A2,2 0 0,0 3,18H10V20H8V22H16V20H14V18H21A2,2 0 0,0 23,16V4C23,2.89 22.1,2 21,2Z"></path>
</svg>
Logiciels
</a>
<a href="#">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,15.39L8.24,17.66L9.23,13.38L5.91,10.5L10.29,10.13L12,6.09L13.71,10.13L18.09,10.5L14.77,13.38L15.76,17.66M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z"></path>
</svg>
Top 20
</a>
<hr />
<a href="#">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z" />
</svg>
Recherche avancée
</a>
<hr />
<h3>Sélection de la semaine</h3>
<ul>
<li><a href="#"><img src="/sfiles/images/fruit_ninja.gif">Fruit Ninja</a></li>
<li><a href="#"><img src="/sfiles/images/clonelab.gif">Clonelab</a></li>
<li><a href="#"><img src="/sfiles/images/gravity_duck.png">Gravity Duck</a></li>
<li><a href="#"><img src="/sfiles/images/calcraft.gif">Calcraft</a></li>
</ul>
<hr />
<h3>Coup de cœur</h3>
<ul>
<li><a href="#"><img src="/sfiles/images/fruit_ninja.gif">Fruit Ninja</a></li>
<li><a href="#"><img src="/sfiles/images/clonelab.gif">Clonelab</a></li>
<li><a href="#"><img src="/sfiles/images/gravity_duck.png">Gravity Duck</a></li>
<li><a href="#"><img src="/sfiles/images/calcraft.gif">Calcraft</a></li>
</ul>
</div>
<div>
<h2>
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M12,3L1,9L12,15L21,10.09V17H23V9M5,13.18V17.18L12,21L19,17.18V13.18L12,17L5,13.18Z"></path>
</svg>
Tutoriels
</h2>
<a href="#">Basic Casio</a>
<a href="#">C/C++ Casio</a>
<a href="#">Arduino</a>
<hr>
<a href="#">Foire aux questions (FAQ)</a>
</div>
<div>
<h2>
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M20.71,4.63L19.37,3.29C19,2.9 18.35,2.9 17.96,3.29L9,12.25L11.75,15L20.71,6.04C21.1,5.65 21.1,5 20.71,4.63M7,14A3,3 0 0,0 4,17C4,18.31 2.84,19 2,19C2.92,20.22 4.5,21 6,21A4,4 0 0,0 10,17A3,3 0 0,0 7,14Z"></path>
</svg>
Sprites
</h2>
<a href="#">Personnages</a>
<a href="#">Environnement</a>
<a href="#">Objets</a>
<a href="#">Interfaces</a>
<a href="#">Générateur</a>
</div>
<div>
<h2>
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M22.7,19L13.6,9.9C14.5,7.6 14,4.9 12.1,3C10.1,1 7.1,0.6 4.7,1.7L9,6L6,9L1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1C4.8,14 7.5,14.5 9.8,13.6L18.9,22.7C19.3,23.1 19.9,23.1 20.3,22.7L22.6,20.4C23.1,20 23.1,19.3 22.7,19Z"></path>
</svg>
Outils
</h2>
<a href="#">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M2.6,10.59L8.38,4.8L10.07,6.5C9.83,7.35 10.22,8.28 11,8.73V14.27C10.4,14.61 10,15.26 10,16A2,2 0 0,0 12,18A2,2 0 0,0 14,16C14,15.26 13.6,14.61 13,14.27V9.41L15.07,11.5C15,11.65 15,11.82 15,12A2,2 0 0,0 17,14A2,2 0 0,0 19,12A2,2 0 0,0 17,10C16.82,10 16.65,10 16.5,10.07L13.93,7.5C14.19,6.57 13.71,5.55 12.78,5.16C12.35,5 11.9,4.96 11.5,5.07L9.8,3.38L10.59,2.6C11.37,1.81 12.63,1.81 13.41,2.6L21.4,10.59C22.19,11.37 22.19,12.63 21.4,13.41L13.41,21.4C12.63,22.19 11.37,22.19 10.59,21.4L2.6,13.41C1.81,12.63 1.81,11.37 2.6,10.59Z"></path>
</svg>
Forge GitLab
</a>
<a href="#">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M14.97,18.95L12.41,12.92C11.39,14.91 10.27,17 9.31,18.95C9.3,18.96 8.84,18.95 8.84,18.95C7.37,15.5 5.85,12.1 4.37,8.68C4.03,7.84 2.83,6.5 2,6.5C2,6.4 2,6.18 2,6.05H7.06V6.5C6.46,6.5 5.44,6.9 5.7,7.55C6.42,9.09 8.94,15.06 9.63,16.58C10.1,15.64 11.43,13.16 12,12.11C11.55,11.23 10.13,7.93 9.71,7.11C9.39,6.57 8.58,6.5 7.96,6.5C7.96,6.35 7.97,6.25 7.96,6.06L12.42,6.07V6.47C11.81,6.5 11.24,6.71 11.5,7.29C12.1,8.53 12.45,9.42 13,10.57C13.17,10.23 14.07,8.38 14.5,7.41C14.76,6.76 14.37,6.5 13.29,6.5C13.3,6.38 13.3,6.17 13.3,6.07C14.69,6.06 16.78,6.06 17.15,6.05V6.47C16.44,6.5 15.71,6.88 15.33,7.46L13.5,11.3C13.68,11.81 15.46,15.76 15.65,16.2L19.5,7.37C19.2,6.65 18.34,6.5 18,6.5C18,6.37 18,6.2 18,6.05L22,6.08V6.1L22,6.5C21.12,6.5 20.57,7 20.25,7.75C19.45,9.54 17,15.24 15.4,18.95C15.4,18.95 14.97,18.95 14.97,18.95Z"></path>
</svg>
Casio Universal Wiki
</a>
<a href="#">
<svg viewBox="0 0 24 24">
<path fill="#ffffff" d="M19,8L15,12H18A6,6 0 0,1 12,18C11,18 10.03,17.75 9.2,17.3L7.74,18.76C8.97,19.54 10.43,20 12,20A8,8 0 0,0 20,12H23M6,12A6,6 0 0,1 12,6C13,6 13.97,6.25 14.8,6.7L16.26,5.24C15.03,4.46 13.57,4 12,4A8,8 0 0,0 4,12H1L5,16L9,12"></path>
</svg>
SH4 Compatibility Tool
</a>
</div>
</div>
</nav>
<div id="container">
<header>
<form>
<input type="search" placeholder="Recherche" />
<a role="button" onclick="this.parentNode.submit();" href="#" class="light-hidden">
<svg viewBox="0 0 24 24">
<path fill="#adb0b4"d="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z"></path>
</svg>
</a>
</form>
<div id="spotlight">
<a href="#">Concours</a>
<a href="#">Jeu du mois</a>
</div>
</header>
<form method="post" action="/contact" class="with-ajax">
<tr><th><label for="id_email">E-mail :</label></th><td><input id="id_email" name="email" type="email" required /></td></tr>
<tr><th><label for="id_title">Objet :</label></th><td><input id="id_title" maxlength="255" minlength="3" name="title" type="text" required /></td></tr>
<tr><th><label for="id_message">Message :</label></th><td><input id="id_message" maxlength="10000" minlength="3" name="message" type="text" required /></td></tr>
<input type='hidden' name='csrfmiddlewaretoken' value='0V7fuD52dM89FkLsYLaAZusaAbx59DMpj8HlXJgr6tCgqH6dM4xeaOqBKUvsEQQA' />
<input type="submit" callback="contact" value="Envoyer"/>
</form>
</div>
<!-- <div class="alert ok" style="top: 25px;" onclick="close_important(this)">
<svg style='width:24px;height:24px' viewBox='0 0 24 24'>
<path fill="#727272" d="M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z"></path>
</svg>
<span>
Votre message a bien été posté.
</span>
<input type="button" class="flat" value="MASQUER" onclick="setCookie('pc_notif', 'true');"></input>
</div>
<div class="alert error" style="top: 95px;" onclick="close_important(this)">
<svg style='width:24px;height:24px' viewBox='0 0 24 24'>
<path fill="#727272" d="M12,2L1,21H23M12,6L19.53,19H4.47M11,10V14H13V10M11,16V18H13V16"></path>
</svg>
<span>
Holy shit! Ceci est un grave problème ! Il faut s'en occuper dès que possible.
</span>
<input type="button" class="flat" value="MASQUER" onclick="setCookie('pc_notif_2', 'true');"></input>
</div> -->
</body>
<script type="text/javascript" src="/sfiles/scripts/trigger_menu.js"></script>
<script type="text/javascript" src="/sfiles/scripts/smartphone_patch.js"></script>
<script type="text/javascript" src="/sfiles/scripts/pc-utils.js"></script>
<script type="text/javascript" src="/sfiles/scripts/contact.js">
</html>