From b9f0c34469f729e97383825bc6567e8ed9603734 Mon Sep 17 00:00:00 2001 From: Xavier59 Date: Sun, 2 Apr 2017 14:40:38 +0200 Subject: [PATCH 1/8] docstring et petites ameliorations --- .gitignore | 1 + account/views.py | 57 ++++++++++++++++++++++++++++----------- home/urls.py | 2 +- home/views.py | 6 +++-- planete_casio/settings.py | 3 ++- planete_casio/urls.py | 12 ++++----- 6 files changed, 56 insertions(+), 25 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e99e36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc \ No newline at end of file diff --git a/account/views.py b/account/views.py index 3fa98ae..381edd6 100644 --- a/account/views.py +++ b/account/views.py @@ -6,12 +6,15 @@ 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 home.views import homepage - +from django.http import HttpResponseNotFound def login(request): - error = False + """ + Login validation + Only accessible with ajax POST from menu and return json + """ form = LoginForm() if request.method == "POST": if form.is_valid(): @@ -20,19 +23,34 @@ def login(request): user = authenticate(username=username, password=password) if user: a_login(request, user) - return redirect(reverse(homepage)) + data = { + 'login':True + } + return JsonResponse(data) else: - error = True + data = { + 'login':False, + 'error':'Mauvais identifiant ou mot de passe' + } + return JsonResponse(data) - return render(request, 'login.html', locals()) + return HttpResponseNotFound() def logout(request): + """ + Logout user + with ajax POST from menu and reload page + """ a_logout(request) return redirect(reverse(homepage)) def signup(request): + """ + Signup user + with ajax POST from signup page and return json + """ error = False form = InscriptionForm() if request.method == "POST": @@ -43,24 +61,33 @@ def signup(request): 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 + s.USERNAME_MAX_LENGTH < username.length < s.USERNAME_MIN_LENGTH or + s.PASSWORD_MAX_LENGTH < password.length < s.PASSWORD_MIN_LENGTH or + password1 != password2 or cgu is False ): - error = True - return render(request, 'signup.html', locals()) + data = { + signed:False, + error:"Désolé ! Nous ne sommes pas assez bête pour ne pas faire de verification server side !" + } + return JsonResponse(data) try: validate_email(email) except forms.ValidationError: - error = True - return render(request, 'signup.html', locals()) + data = { + signed:False, + error:"Mauvais format d'e-mail" + } + return JsonResponse(data) create_user(username, email, password1) authenticate(username, password1) - return render(request, 'home.html', locals()) + data = { + signed:True + } + return JsonResponse(data) - return render(request, 'signupt.html', locals()) + return render(request, 'signup.html', locals()) def account(request): return render(request, 'account.html') \ No newline at end of file diff --git a/home/urls.py b/home/urls.py index c5759d9..fa87bef 100644 --- a/home/urls.py +++ b/home/urls.py @@ -2,5 +2,5 @@ from django.conf.urls import url import home.views as v urlpatterns = [ - url(r'^$', v.homepage), + url(r'^$', v.homepage, name="homepage"), ] diff --git a/home/views.py b/home/views.py index 7016fa5..dd30ddc 100644 --- a/home/views.py +++ b/home/views.py @@ -1,6 +1,8 @@ #-*- coding: utf-8 -*- -from django.shortcuts import render +from django.shortcuts import render, redirect +from django.contrib.auth import authenticate +from django.http import HttpResponse, Http404 def homepage(request): - return render(request, 'home/homepage.html') \ No newline at end of file + return render(request, 'home/homepage.html', locals()) \ No newline at end of file diff --git a/planete_casio/settings.py b/planete_casio/settings.py index d114006..d68867b 100644 --- a/planete_casio/settings.py +++ b/planete_casio/settings.py @@ -60,7 +60,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': { @@ -145,6 +145,7 @@ STATICFILES_DIRS = ( "/home/web/planete_casio/sfiles/", ) + USERNAME_MIN_LENGTH = 3 USERNAME_MAX_LENGTH = 30 PASSWORD_MIN_LENGTH = 8 diff --git a/planete_casio/urls.py b/planete_casio/urls.py index a65614e..36e34b7 100644 --- a/planete_casio/urls.py +++ b/planete_casio/urls.py @@ -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") ] From 9b596dd784d764b6788518c6d86fb14fdf455413 Mon Sep 17 00:00:00 2001 From: Xavier59 Date: Mon, 3 Apr 2017 01:21:34 +0200 Subject: [PATCH 2/8] connexion --- account/forms.py | 4 +- account/views.py | 18 ++-- home/views.py | 1 + planete_casio/context_processors.py | 8 ++ planete_casio/settings.py | 8 +- sfiles/css/container.css | 73 +-------------- sfiles/css/global.css | 32 ++++++- sfiles/css/homepage.css | 134 ++++++++++++++++++++++++++++ sfiles/css/light.css | 110 +++++++++++++++++++++++ sfiles/css/navbar.css | 46 ++++++---- sfiles/css/responsive.css | 11 +++ sfiles/css/shoutbox.css | 34 +++++++ sfiles/scripts/pc-utils.js | 60 +++++++++++++ templates/base.html | 31 +++---- 14 files changed, 451 insertions(+), 119 deletions(-) create mode 100644 planete_casio/context_processors.py mode change 100755 => 100644 sfiles/css/container.css mode change 100755 => 100644 sfiles/css/global.css create mode 100644 sfiles/css/homepage.css mode change 100755 => 100644 sfiles/css/light.css mode change 100755 => 100644 sfiles/css/navbar.css create mode 100644 sfiles/css/shoutbox.css create mode 100644 sfiles/scripts/pc-utils.js diff --git a/account/forms.py b/account/forms.py index 5c75d96..0c3fb6c 100644 --- a/account/forms.py +++ b/account/forms.py @@ -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) diff --git a/account/views.py b/account/views.py index 381edd6..0e1c06d 100644 --- a/account/views.py +++ b/account/views.py @@ -15,7 +15,7 @@ def login(request): Login validation Only accessible with ajax POST from menu and return json """ - form = LoginForm() + form = LoginForm(request.POST or None) if request.method == "POST": if form.is_valid(): username = form.cleaned_data["username"] @@ -26,16 +26,24 @@ def login(request): data = { 'login':True } - return JsonResponse(data) else: data = { 'login':False, 'error':'Mauvais identifiant ou mot de passe' } + if('HTTP_X_REQUESTED_WITH' in request.META and request.META['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'): return JsonResponse(data) - - return HttpResponseNotFound() - + else: + # TODO + return render(request, 'login.html', locals()) + else: + print(request.POST) + elif request.method == "GET": + # TODO + # BREIZH WILL DO IT BECAUSE HE WANT IT TO WORK WITHOUT JAVASCRIPT + return render(request, 'login.html') + else: + return HttpResponseNotFound(); def logout(request): """ diff --git a/home/views.py b/home/views.py index dd30ddc..baec0b4 100644 --- a/home/views.py +++ b/home/views.py @@ -5,4 +5,5 @@ from django.contrib.auth import authenticate from django.http import HttpResponse, Http404 def homepage(request): + return render(request, 'home/homepage.html', locals()) \ No newline at end of file diff --git a/planete_casio/context_processors.py b/planete_casio/context_processors.py new file mode 100644 index 0000000..e520530 --- /dev/null +++ b/planete_casio/context_processors.py @@ -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 \ No newline at end of file diff --git a/planete_casio/settings.py b/planete_casio/settings.py index d68867b..c0aa499 100644 --- a/planete_casio/settings.py +++ b/planete_casio/settings.py @@ -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__))) @@ -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,13 +138,13 @@ 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"), ) diff --git a/sfiles/css/container.css b/sfiles/css/container.css old mode 100755 new mode 100644 index bd1d3cf..4e2176b --- a/sfiles/css/container.css +++ b/sfiles/css/container.css @@ -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;*/ -} \ No newline at end of file diff --git a/sfiles/css/global.css b/sfiles/css/global.css old mode 100755 new mode 100644 index de78188..6fe5e6f --- a/sfiles/css/global.css +++ b/sfiles/css/global.css @@ -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; +} \ No newline at end of file diff --git a/sfiles/css/homepage.css b/sfiles/css/homepage.css new file mode 100644 index 0000000..b5eb580 --- /dev/null +++ b/sfiles/css/homepage.css @@ -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; +} diff --git a/sfiles/css/light.css b/sfiles/css/light.css old mode 100755 new mode 100644 index 5c76a91..ba80eb1 --- a/sfiles/css/light.css +++ b/sfiles/css/light.css @@ -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; } \ No newline at end of file diff --git a/sfiles/css/navbar.css b/sfiles/css/navbar.css old mode 100755 new mode 100644 index 465ecca..5dec525 --- a/sfiles/css/navbar.css +++ b/sfiles/css/navbar.css @@ -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; diff --git a/sfiles/css/responsive.css b/sfiles/css/responsive.css index bb9b435..c96f7a5 100644 --- a/sfiles/css/responsive.css +++ b/sfiles/css/responsive.css @@ -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; + } +} diff --git a/sfiles/css/shoutbox.css b/sfiles/css/shoutbox.css new file mode 100644 index 0000000..9725b29 --- /dev/null +++ b/sfiles/css/shoutbox.css @@ -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; +} \ No newline at end of file diff --git a/sfiles/scripts/pc-utils.js b/sfiles/scripts/pc-utils.js new file mode 100644 index 0000000..31d8020 --- /dev/null +++ b/sfiles/scripts/pc-utils.js @@ -0,0 +1,60 @@ +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. +*/ +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); + } +} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index f728d03..1bc285f 100644 --- a/templates/base.html +++ b/templates/base.html @@ -3,7 +3,7 @@ - {% block title %}Planète Casio : design template{% endblock %} + {% block title %}Planète Casio{% endblock %} @@ -18,7 +18,7 @@