commit 98e3ff6a10675ed36dc3a255279dd9031d7a0327 Author: Dark-Storm Date: Sun Oct 2 17:07:47 2016 +0200 First commit! diff --git a/account/__init__.py b/account/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/account/__pycache__/__init__.cpython-35.pyc b/account/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..2650115 Binary files /dev/null and b/account/__pycache__/__init__.cpython-35.pyc differ diff --git a/account/__pycache__/admin.cpython-35.pyc b/account/__pycache__/admin.cpython-35.pyc new file mode 100644 index 0000000..3a3e614 Binary files /dev/null and b/account/__pycache__/admin.cpython-35.pyc differ diff --git a/account/__pycache__/forms.cpython-35.pyc b/account/__pycache__/forms.cpython-35.pyc new file mode 100644 index 0000000..5131f5f Binary files /dev/null and b/account/__pycache__/forms.cpython-35.pyc differ diff --git a/account/__pycache__/models.cpython-35.pyc b/account/__pycache__/models.cpython-35.pyc new file mode 100644 index 0000000..717874a Binary files /dev/null and b/account/__pycache__/models.cpython-35.pyc differ diff --git a/account/__pycache__/urls.cpython-35.pyc b/account/__pycache__/urls.cpython-35.pyc new file mode 100644 index 0000000..35d3030 Binary files /dev/null and b/account/__pycache__/urls.cpython-35.pyc differ diff --git a/account/__pycache__/views.cpython-35.pyc b/account/__pycache__/views.cpython-35.pyc new file mode 100644 index 0000000..6e76a20 Binary files /dev/null and b/account/__pycache__/views.cpython-35.pyc differ diff --git a/account/admin.py b/account/admin.py new file mode 100644 index 0000000..ea98da5 --- /dev/null +++ b/account/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from account.models import Member + +admin.site.register(Member) \ No newline at end of file diff --git a/account/apps.py b/account/apps.py new file mode 100644 index 0000000..f7b1d19 --- /dev/null +++ b/account/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AccountConfig(AppConfig): + name = 'account' diff --git a/account/forms.py b/account/forms.py new file mode 100644 index 0000000..4d0366c --- /dev/null +++ b/account/forms.py @@ -0,0 +1,8 @@ +#-*- coding: utf-8 -*- + +from django.conf import settings +from django import forms + +class LoginForm(forms.Form): + username = forms.CharField(label="Nom d'utilisateur", max_length=settings.USERNAME_LENGTH) + password = forms.CharField(label="Mot de passe", widget=forms.PasswordInput) \ No newline at end of file diff --git a/account/migrations/__init__.py b/account/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/account/migrations/__pycache__/__init__.cpython-35.pyc b/account/migrations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..2dc8d3a Binary files /dev/null and b/account/migrations/__pycache__/__init__.cpython-35.pyc differ diff --git a/account/models.py b/account/models.py new file mode 100644 index 0000000..d2dc57b --- /dev/null +++ b/account/models.py @@ -0,0 +1,16 @@ +#-*- coding: utf-8 -*- + +from django.db import models +from django.contrib.auth.models import User + +class Member(models.Model): + user = models.OneToOneField(User) + + website = models.URLField(null=True, blank=True) + # avatar = models.ImageField(null=True, blank=True, upload_to="avatars/") + signature = models.TextField(null=True, blank=True) + + somedata = models.BooleanField(default=False) + + def __str__(self): + return "Profil de {0}".format(self.user.username) \ No newline at end of file diff --git a/account/tests.py b/account/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/account/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/account/urls.py b/account/urls.py new file mode 100644 index 0000000..a09323e --- /dev/null +++ b/account/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls import patterns, url + +import account.views as v + +urlpatterns = [ + url(r'^$', v.account), # Index + url(r'^login/$', v.login), + url(r'^logout/$', v.logout), +] \ No newline at end of file diff --git a/account/views.py b/account/views.py new file mode 100644 index 0000000..5021c34 --- /dev/null +++ b/account/views.py @@ -0,0 +1,33 @@ +from django.shortcuts import render, redirect +from django.contrib.auth import authenticate +from django.contrib.auth import login as a_login, logout as a_logout +from account.forms import LoginForm +from django.core.urlresolvers import reverse + +from home.views import homepage + +def login(request): + error = False + + if request.method == "POST": + form = LoginForm(request.POST) + if form.is_valid(): + username = form.cleaned_data["username"] + password = form.cleaned_data["password"] + user = authenticate(username=username, password=password) + if user: + a_login(request, user) + return redirect(reverse(homepage)) + else: + error = True + else: + form = LoginForm() + + return render(request, 'account/login.html',locals()) + +def logout(request): + a_logout(request) + return redirect(reverse(homepage)) + +def account(request): + pass \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000..b42c545 Binary files /dev/null and b/db.sqlite3 differ diff --git a/forum/__init__.py b/forum/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/forum/__pycache__/__init__.cpython-35.pyc b/forum/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..5ca1d29 Binary files /dev/null and b/forum/__pycache__/__init__.cpython-35.pyc differ diff --git a/forum/__pycache__/admin.cpython-35.pyc b/forum/__pycache__/admin.cpython-35.pyc new file mode 100644 index 0000000..3a0e5d8 Binary files /dev/null and b/forum/__pycache__/admin.cpython-35.pyc differ diff --git a/forum/__pycache__/models.cpython-35.pyc b/forum/__pycache__/models.cpython-35.pyc new file mode 100644 index 0000000..6435606 Binary files /dev/null and b/forum/__pycache__/models.cpython-35.pyc differ diff --git a/forum/__pycache__/urls.cpython-35.pyc b/forum/__pycache__/urls.cpython-35.pyc new file mode 100644 index 0000000..b2ad964 Binary files /dev/null and b/forum/__pycache__/urls.cpython-35.pyc differ diff --git a/forum/__pycache__/views.cpython-35.pyc b/forum/__pycache__/views.cpython-35.pyc new file mode 100644 index 0000000..e08ee20 Binary files /dev/null and b/forum/__pycache__/views.cpython-35.pyc differ diff --git a/forum/admin.py b/forum/admin.py new file mode 100644 index 0000000..882d572 --- /dev/null +++ b/forum/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from forum.models import * + +admin.site.register(Forum) +admin.site.register(Topic) +admin.site.register(Message) \ No newline at end of file diff --git a/forum/apps.py b/forum/apps.py new file mode 100644 index 0000000..99ee7e7 --- /dev/null +++ b/forum/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ForumConfig(AppConfig): + name = 'forum' diff --git a/forum/migrations/0001_initial.py b/forum/migrations/0001_initial.py new file mode 100644 index 0000000..ea947b3 --- /dev/null +++ b/forum/migrations/0001_initial.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.9 on 2016-09-26 16:03 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Forum', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, verbose_name='Nom du forum')), + ('description', models.CharField(max_length=200, verbose_name='Description du forum')), + ], + ), + migrations.CreateModel( + name='Topic', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='Titre du topic')), + ('date', models.DateTimeField(auto_now_add=True, verbose_name='Date de création')), + ('m_date', models.DateTimeField(auto_now_add=True, verbose_name='Dernière date de modification')), + ], + ), + ] diff --git a/forum/migrations/0002_auto_20160926_1811.py b/forum/migrations/0002_auto_20160926_1811.py new file mode 100644 index 0000000..794ced2 --- /dev/null +++ b/forum/migrations/0002_auto_20160926_1811.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.9 on 2016-09-26 16:11 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('forum', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='topic', + name='forum', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='forum.Forum'), + preserve_default=False, + ), + migrations.AlterField( + model_name='topic', + name='m_date', + field=models.DateTimeField(auto_now=True, verbose_name='Dernière date de modification'), + ), + ] diff --git a/forum/migrations/__init__.py b/forum/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/forum/migrations/__pycache__/0001_initial.cpython-35.pyc b/forum/migrations/__pycache__/0001_initial.cpython-35.pyc new file mode 100644 index 0000000..2fa9372 Binary files /dev/null and b/forum/migrations/__pycache__/0001_initial.cpython-35.pyc differ diff --git a/forum/migrations/__pycache__/0002_auto_20160926_1811.cpython-35.pyc b/forum/migrations/__pycache__/0002_auto_20160926_1811.cpython-35.pyc new file mode 100644 index 0000000..96f3b5a Binary files /dev/null and b/forum/migrations/__pycache__/0002_auto_20160926_1811.cpython-35.pyc differ diff --git a/forum/migrations/__pycache__/__init__.cpython-35.pyc b/forum/migrations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..b5b2408 Binary files /dev/null and b/forum/migrations/__pycache__/__init__.cpython-35.pyc differ diff --git a/forum/models.py b/forum/models.py new file mode 100644 index 0000000..73ee892 --- /dev/null +++ b/forum/models.py @@ -0,0 +1,36 @@ +#-*- coding: utf-8 -*- + +from django.db import models +from account.models import Member + +class Forum(models.Model): + name = models.CharField(max_length=100, verbose_name="Nom du forum") + description = models.CharField(max_length=200, verbose_name="Description du forum") + canAccess = [] + + def __str__(self): + return "Forum : {}".format(self.name) + +class Topic(models.Model): + title = models.CharField(max_length=100, verbose_name="Titre du topic") + forum = models.ForeignKey(Forum) + + # TODO : solve problem of OneToOne relation combined to ForeignKey + + def __str__(self): + return "Topic : {}".format(self.title) + +class Message(models.Model): + topic = models.ForeignKey(Topic) + author = models.ForeignKey(Member, null=True) + pseudo = models.CharField(max_length=50, verbose_name="Nom de l'invité", null=True) + + ip = models.GenericIPAddressField() + + date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création") + m_date = models.DateTimeField(auto_now_add=False, auto_now=True, verbose_name="Dernière date de modification") + + content = models.TextField(null=True, blank=True) + + def __str__(self): + return "Message : {}".format(self.content[0:50]) \ No newline at end of file diff --git a/forum/tests.py b/forum/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/forum/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/forum/urls.py b/forum/urls.py new file mode 100644 index 0000000..949b215 --- /dev/null +++ b/forum/urls.py @@ -0,0 +1,10 @@ +from django.conf.urls import patterns, url + +import forum.views as v + +urlpatterns = [ + url(r'^$', v.index), # Index + url(r'^(?P\d+)/$', v.forum), # List of topics + url(r'^(?P\d+)/(?P\d+)/$', v.topic), # See a topic + url(r'^(?P\d+)/(?P\d+)/(?P\d+|(last))/$', v.topic), # See a page of a topic +] \ No newline at end of file diff --git a/forum/views.py b/forum/views.py new file mode 100644 index 0000000..8f7d3a5 --- /dev/null +++ b/forum/views.py @@ -0,0 +1,22 @@ +#-*- coding: utf-8 -*- + +from django.http import Http404 +from django.shortcuts import render, get_object_or_404 + +from forum.models import * + +def index(request): + return render(request, 'forum/index.html', {'forums': Forum.objects.all()}) + +def forum(request, id_forum): + forum = get_object_or_404(Forum, id=id_forum) + return render(request, 'forum/forum.html', {'forum': forum}) + +def topic(request, id_forum, id_topic, page = 1): + if page != 'last': + page = int(page) + + topic = get_object_or_404(Topic, id=id_topic) + + text = "Vous êtes sur la page {} du topic {} du forum {}.".format(page, id_topic, id_forum) + return HttpResponse(text) \ No newline at end of file diff --git a/home/__init__.py b/home/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/home/__pycache__/__init__.cpython-35.pyc b/home/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..e933d59 Binary files /dev/null and b/home/__pycache__/__init__.cpython-35.pyc differ diff --git a/home/__pycache__/admin.cpython-35.pyc b/home/__pycache__/admin.cpython-35.pyc new file mode 100644 index 0000000..436f4ae Binary files /dev/null and b/home/__pycache__/admin.cpython-35.pyc differ diff --git a/home/__pycache__/models.cpython-35.pyc b/home/__pycache__/models.cpython-35.pyc new file mode 100644 index 0000000..cc0dae3 Binary files /dev/null and b/home/__pycache__/models.cpython-35.pyc differ diff --git a/home/__pycache__/urls.cpython-35.pyc b/home/__pycache__/urls.cpython-35.pyc new file mode 100644 index 0000000..07ea799 Binary files /dev/null and b/home/__pycache__/urls.cpython-35.pyc differ diff --git a/home/__pycache__/views.cpython-35.pyc b/home/__pycache__/views.cpython-35.pyc new file mode 100644 index 0000000..c6d00c2 Binary files /dev/null and b/home/__pycache__/views.cpython-35.pyc differ diff --git a/home/admin.py b/home/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/home/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/home/apps.py b/home/apps.py new file mode 100644 index 0000000..90dc713 --- /dev/null +++ b/home/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class HomeConfig(AppConfig): + name = 'home' diff --git a/home/migrations/__init__.py b/home/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/home/migrations/__pycache__/__init__.cpython-35.pyc b/home/migrations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..675a784 Binary files /dev/null and b/home/migrations/__pycache__/__init__.cpython-35.pyc differ diff --git a/home/models.py b/home/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/home/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/home/tests.py b/home/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/home/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/home/urls.py b/home/urls.py new file mode 100644 index 0000000..64d84e4 --- /dev/null +++ b/home/urls.py @@ -0,0 +1,6 @@ +from django.conf.urls import patterns, url + +import home.views as v +urlpatterns = [ + url(r'^$', v.homepage), +] \ No newline at end of file diff --git a/home/views.py b/home/views.py new file mode 100644 index 0000000..7016fa5 --- /dev/null +++ b/home/views.py @@ -0,0 +1,6 @@ +#-*- coding: utf-8 -*- + +from django.shortcuts import render + +def homepage(request): + return render(request, 'home/homepage.html') \ No newline at end of file diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..1effb7e --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planete_casio.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/planete_casio/__init__.py b/planete_casio/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/planete_casio/__pycache__/__init__.cpython-35.pyc b/planete_casio/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..0d21acb Binary files /dev/null and b/planete_casio/__pycache__/__init__.cpython-35.pyc differ diff --git a/planete_casio/__pycache__/settings.cpython-35.pyc b/planete_casio/__pycache__/settings.cpython-35.pyc new file mode 100644 index 0000000..cff03bc Binary files /dev/null and b/planete_casio/__pycache__/settings.cpython-35.pyc differ diff --git a/planete_casio/__pycache__/urls.cpython-35.pyc b/planete_casio/__pycache__/urls.cpython-35.pyc new file mode 100644 index 0000000..2f6fbce Binary files /dev/null and b/planete_casio/__pycache__/urls.cpython-35.pyc differ diff --git a/planete_casio/__pycache__/wsgi.cpython-35.pyc b/planete_casio/__pycache__/wsgi.cpython-35.pyc new file mode 100644 index 0000000..367cc33 Binary files /dev/null and b/planete_casio/__pycache__/wsgi.cpython-35.pyc differ diff --git a/planete_casio/settings.py b/planete_casio/settings.py new file mode 100644 index 0000000..d84b350 --- /dev/null +++ b/planete_casio/settings.py @@ -0,0 +1,148 @@ +""" +Django settings for planete_casio project. + +Generated by 'django-admin startproject' using Django 1.9.9. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.9/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '-gud%6mib@5feg!)!q3ubk%gl3@yav2j!zycwwhdav8zqp5odo' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] +# ALLOWED_HOSTS = ['172.0.0.1', 'localhost'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + # User apps + 'forum', + 'home', + 'account', +] + +MIDDLEWARE_CLASSES = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'planete_casio.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + '/home/darks/web/planete_casio/templates/', + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'planete_casio.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.9/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.postgresql', +# 'NAME': 'db_name', +# 'USER': 'db_user', +# 'PASSWORD': 'db_user_password', +# 'HOST': '', +# 'PORT': 'db_port_number', +# } +# } + +# Password validation +# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.9/topics/i18n/ + +LANGUAGE_CODE = 'fr-FR' + +TIME_ZONE = 'Europe/Paris' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + +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_ROOT = '/home/web/planete_casio/static/' + +STATICFILES_DIRS = ( + "/home/web/planete_casio/sfiles/", +) + +USERNAME_LENGTH = 30 diff --git a/planete_casio/urls.py b/planete_casio/urls.py new file mode 100644 index 0000000..4d1fe19 --- /dev/null +++ b/planete_casio/urls.py @@ -0,0 +1,25 @@ +"""planete_casio URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.9/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf import settings +from django.conf.urls import url, include +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', admin.site.urls), + url(r'^', include('home.urls')), + url(r'^forum/', include('forum.urls')), + url(r'^account/', include('account.urls')), +] diff --git a/planete_casio/views.py b/planete_casio/views.py new file mode 100644 index 0000000..a2c0598 --- /dev/null +++ b/planete_casio/views.py @@ -0,0 +1,8 @@ +#-*- coding: utf-8 -*- + +from django.http import HttpResponse, Http404 + +def home(request): + text = """

Bienvenue sur Planète Casio !

+

Vous êtes actuellement sur la page d'accueil.

""" + return HttpResponse(text) \ No newline at end of file diff --git a/planete_casio/wsgi.py b/planete_casio/wsgi.py new file mode 100644 index 0000000..5b3f91c --- /dev/null +++ b/planete_casio/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for planete_casio project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planete_casio.settings") + +application = get_wsgi_application() diff --git a/sfiles/admin b/sfiles/admin new file mode 120000 index 0000000..e61f70c --- /dev/null +++ b/sfiles/admin @@ -0,0 +1 @@ +/usr/lib/python3.5/site-packages/django/contrib/admin/static/admin/ \ No newline at end of file diff --git a/sfiles/container.css b/sfiles/container.css new file mode 100755 index 0000000..bd1d3cf --- /dev/null +++ b/sfiles/container.css @@ -0,0 +1,86 @@ +#container { + margin-left: 60px; +} + +#container h1 { + margin-left: 5%; + font-family: Raleway; font-size: 24px; + font-weight: 200; color: #242424; +} + +#container h2 { + 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/container.css b/sfiles/css/container.css new file mode 100755 index 0000000..bd1d3cf --- /dev/null +++ b/sfiles/css/container.css @@ -0,0 +1,86 @@ +#container { + margin-left: 60px; +} + +#container h1 { + margin-left: 5%; + font-family: Raleway; font-size: 24px; + font-weight: 200; color: #242424; +} + +#container h2 { + 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 new file mode 100755 index 0000000..de78188 --- /dev/null +++ b/sfiles/css/global.css @@ -0,0 +1,161 @@ +/* + fonts +*/ + +@font-face { font-family: NotoSans; src: url(../fonts/noto_sans.ttf); } +@font-face { font-family: Raleway; font-weight: 200; src: url(../fonts/raleway_200.ttf); } +@font-face { font-family: Raleway; font-weight: 300; src: url(../fonts/raleway_300.ttf); } + + + +/* + body +*/ + +body { + margin: 0; + background: #ffffff; + font-family: sans-serif; +} + + +/* + header +*/ + +header { + height: 50px; margin: 0; padding: 0 30px; + display: flex; align-items: center; justify-content: space-between; + background: #f8f8fa; border-bottom: 1px solid #d0d0d0; +} + + +header svg { + width: 24px; height: 24px; vertical-align: middle; + transition: .15s ease; +} +header a:hover > svg, header a:focus > svg { + filter: brightness(.5); +} + +header input[type="search"] { + width: 250px; + padding: 5px 35px 5px 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; +} +header input[type="search"] ~ a { + position: relative; left: -33px; +} +header input[type="search"]:focus { + box-shadow: 0 0 4px rgba(0, 102, 255, .9); +} +header input[type="search"] ~ a > svg > path { + fill: #cccccc; transition: .15s ease; +} +header input[type="search"]:focus ~ a > svg > path { + fill: #333333; +} + +#spotlight a { + padding: 8px 18px 6px 18px; + color: #727272; font-size: 15px; + border-bottom: 2px solid rgba(93, 123, 141, 0); + transition: border .15s ease; +} +#spotlight a:hover, header #spotlight a:focus { + border-bottom: 2px solid rgba(93, 123, 141, 1); +} + + +/* + links +*/ + +a { + text-decoration: none; +} +a:focus { + outline: none; +} + + + +/* + alert overlay +*/ + +.alert { + position: fixed; left: 15%; + display: flex; align-items: center; + width: 70%; z-index: 10; + font-family: NotoSans; font-size: 14px; color: #212121; + background: #ffffff; + border-bottom: 5px solid #4caf50; + border-radius: 1px; box-shadow: 0 1px 12px rgba(0, 0, 0, 0.3); + transition: opacity .15s ease; +} +.alert.ok { + border-color: #4caf50; +} +.alert.error { + border-color: #f44336; +} +.alert span { + flex-grow: 1; margin: 15px 10px 10px 0; +} +.alert input[type="button"] { + margin: 3px 30px 0 0; +} + +.alert svg { + margin: 15px 20px 10px 30px; +} + + + +/* + buttons +*/ + +input[type="button"] { + font-family: NotoSans; font-size: 14px; /*font-weight: bold;*/ + text-align: center; + padding: 5px 15px; + transition: .1s ease; +} + +/* flat */ +input[type="button"].flat { + border: none; + background: rgba(0, 0, 0, 0); color: #727272; +} +input[type="button"].flat:hover { + background: rgba(0, 0, 0, .1); +} +input[type="button"].flat:focus { + background: rgba(0, 0, 0, .2); +} + +/* raised */ +input[type="button"].raised { + border: none; + background: #e0e0e0; color: #212121; + box-shadow: 0 1px 2px rgba(0, 0, 0, .3); +} +input[type="button"].raised:hover, +input[type="button"].raised:focus { + background: #d5d5d5; +} +input[type="button"].raised:active { + background: #d6d6d6; + box-shadow: 0 1px 8px rgba(0, 0, 0, .3); +} + +/* Input text */ +input[type="text"]:focus, +input[type="search"]:focus, +input[type="password"]:focus { + +} diff --git a/sfiles/css/light.css b/sfiles/css/light.css new file mode 100755 index 0000000..5c76a91 --- /dev/null +++ b/sfiles/css/light.css @@ -0,0 +1,256 @@ +/* + fonts +*/ + +@font-face { font-family: NotoSans; src: url(../fonts/noto_sans.ttf); } +@font-face { font-family: Raleway; font-weight: 200; src: url(../fonts/raleway_200.ttf); } +@font-face { font-family: Raleway; font-weight: 300; src: url(../fonts/raleway_300.ttf); } + + +/* Global */ + +body { + margin: 0; + background: #ffffff; + font-family: sans-serif; +} + +nav a { + color: #ffffff; opacity: .7; + text-decoration: none; + transition: opacity .15s ease; +} +nav a:hover, +nav a:focus { + opacity: 1; +} + +.light-hidden { + display: none; +} + +/* Menu */ + +#light-menu { + list-style: none; + display: flex; flex-direction: row; align-items: center; + width: 100%; height: 40px; + overflow-x: auto; overflow-y: hidden; + margin: 0; padding: 0; + text-indent: 0; + background: #22292c; box-shadow: 0 0 2px rgba(0, 0, 0, 0.3); +} + +#logo { + position: relative; display: block; + height: 100%; opacity: 1; + background: -moz-linear-gradient(left, #bf1c11, #ba1203); + background: -webkit-linear-gradient(left, #bf1c11, #ba1203); +} +/*#logo::after { + position: absolute; left: 100%; top: 50%; + height: 0; width: 0; + border: solid transparent; content: " "; + border-left-color: #ba1203; + border-width: 4px; + margin-top: -4px; +}*/ +#logo img { + width: 40px; + margin: 0; padding: 0; + margin-bottom: -4.5px; + filter: drop-shadow(0 0 2px rgba(0, 0, 0, .0)); + transition: filter .15s ease; +} +#logo:hover img, +#logo:focus img { + filter: drop-shadow(0 0 2px rgba(0, 0, 0, .7)); +} + +#light-menu > li { + display: flex; flex-direction: column; + align-items: center; flex-grow: 1; + height: 100%; + text-align: center; + font-family: Raleway; font-size: 13px; + color: #ffffff; +} +#light-menu li { + padding: 0 2px; +} +#light-menu li > a { + display: flex; flex-direction: column; + align-items: center; justify-content: center; + width: 100%; height: 100%; +} +#light-menu li > a > div { + display: none; + font-size: 12px; +} + +#light-menu li > a > svg { + display: block; width: 20px; flex-shrink: 0; + margin: 0 auto 5px auto; +} + +#light-menu li span[notifications]:not([notifications="0"])::before { + content: attr(notifications); + display: inline-block; margin-right: 6px; + vertical-align: middle; + padding: 0 5px 0 4px; border-radius: 5px; + font-family: NotoSans; + background: #ffffff; color: #000000; +} + + +#menu { + width: 100%; height: 0; overflow-x: hidden; + font-family: NotoSans; font-size: 12px; + background: #22292c; box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); + transition: .1s ease; +} +#menu.opened { + height: 100%; + overflow-y: auto; +} + +#menu > div { + width: 100%; + display: none; +} +#menu > div.opened { + display: block; +} +#menu h2 { + margin: 10px 0 10px 40px; + font-family: Raleway; font-size: 15px; + color: #ffffff; +} +#menu h2 > svg { + width: 30px; vertical-align: middle; +} +#menu h2 > img { + width: 64px; margin-right: 10px; + vertical-align: middle; border-radius: 50%; +} + +#menu h3 { + margin: 10px 0 10px 40px; + font-family: Raleway; font-size: 13px; + color: #ffffff; +} +#menu hr { + margin: 10px 15px 0 15px; + border: none; + border-bottom: 1px solid rgba(0, 0, 0, .15); +} + +#menu > div > a, +#menu span { + display: block; margin: 10px 15px; +} +#menu span { + /*font-style: italic;*/ color: #b8b8b8; + font-size: 10px; +} +#menu span > a { + display: inline; + margin: 0; font-style: normal; + font-size: 12px; +} +#menu a > img { + vertical-align: middle; + margin-right: 15px; +} +#menu a > svg { + width: 20px; height: 20px; vertical-align: middle; + margin-right: 10px; +} +#menu ul { + list-style: none; + margin: 10px 15px; padding: 0; + color: #b8b8b8; +} +#menu li { + margin: 5px 0; +} + +@media all and (min-width: 550px) { + #light-menu { + height: 60px; + } + #logo img { + width: 60px; + } + #light-menu li > a > div { + display: block; + } +} + +#menu form input { + display: block; + margin: 5px 15px; padding: 5px 10px; + font-size: 14px; + background: #e8e8e8; transition: background .15s ease; +} +#menu form input:focus { + background: #ffffff; +} +#menu form input:first-child { + margin-bottom: 0; border-bottom: none; + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-top-left-radius: 5px; + border-top-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-top-right-radius: 5px; +} +#menu form input:nth-child(2) { + margin-top: 0; border-top: 1px solid #dddddd; + border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-bottom-right-radius: 5px; +} +#menu form a { + display: block; margin-left: 15px; +} + + +/* Header */ + +header { + padding: 10px 10px 0px 10px; + background: #f8f8fa; border-bottom: 1px solid #d0d0d0; +} +header svg { + width: 24px; height: 24px; vertical-align: middle; + transition: .15s ease; +} +header a:hover > svg, header a:focus > svg { + filter: brightness(.5); +} + +header input[type="search"] { + width: 100%; + 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; +} + +#spotlight { + display: flex; + align-items: center; justify-content: space-around; +} +#spotlight a { + padding: 5px 10px; margin: 5px 0; + color: #727272; font-size: 14px; + /*border-bottom: 2px solid rgba(93, 123, 141, .5);*/ + transition: border .15s ease; + text-decoration: none; +} +#spotlight a:hover, header #spotlight a:focus { + color: #404040; +} \ No newline at end of file diff --git a/sfiles/css/navbar.css b/sfiles/css/navbar.css new file mode 100755 index 0000000..465ecca --- /dev/null +++ b/sfiles/css/navbar.css @@ -0,0 +1,196 @@ +nav a { + color: #ffffff; + opacity: .7; + cursor: pointer; +} +nav a:hover, +nav a:focus { + opacity: 1; +} + + +/* Menu */ + +#logo { + position: relative; display: block; + width: 100%; + margin-bottom: 10px; + opacity: 1; + background: -moz-linear-gradient(top, #bf1c11, #ba1203); + background: -webkit-linear-gradient(top, #bf1c11, #ba1203); + background: #bf1c11; + transition: .15s ease; +} +/* Flèche */ +/*nav #logo::after { + content: ""; + position: absolute; + top: 100%; left: 50%; + height: 0; width: 0; + border: solid transparent; + border-top-color: #ba1203; + border-width: 12px; margin-left: -12px; +}*/ +#logo img { + width: 100%; + margin: 0; padding: 0; + margin-bottom: -4.5px; + filter: drop-shadow(0 0 2px rgba(0, 0, 0, .0)); + transition: filter .15s ease; +} +#logo:hover, +#logo:focus { + background: #d72411; +} + +#light-menu { + position: fixed; z-index: 10; + list-style: none; + width: 60px; + height: 100%; overflow-y: auto; + margin: 0; padding: 0; + text-indent: 0; + background: #22292c; box-shadow: 0 0 2px rgba(0, 0, 0, 0.3); +} +#light-menu li { + width: 100%; height: 45px; + text-align: center; + font-family: Raleway; font-size: 13px; + color: #ffffff; +} +#light-menu li > a { + 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 */ +} + +#light-menu li > a > svg { + display: block; width: 35%; flex-shrink: 0; + margin: 0 auto 5px auto; +} +#light-menu li div { + display: none; +} +#light-menu li > a::after { + content: attr(label); + position: fixed; display: none; + 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 { + display: block; +} + +/*nav li span[notifications]:not([notifications="0"])::before { + content: attr(notifications); + display: inline-block; margin-right: 6px; + vertical-align: middle; + padding: 0 5px 0 4px; border-radius: 5px; + font-family: NotoSans; + background: #ffffff; color: #000000; +}*/ + + +/* Overlay */ +#menu { + position: fixed; left: 60px; z-index: 5; + width: 0; 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; +} +/*@media all and (max-width: 1266px) { + #menu { + left: 30px; + } +}*/ + +#menu.opened { + width: 300px; +} + +#menu > div { + width: 300px; + display: none; +} +#menu > div.opened { + display: block; +} + +#menu h2 { + margin: 5% 0 20px 40px; + font-family: Raleway; font-size: 18px; + color: #ffffff; +} +#menu h2 > svg { + width: 42px; vertical-align: middle; +} +#menu h2 img { + width: 64px; border-radius: 50%; vertical-align: middle; margin-right: 10px; +} + +#menu h3 { + margin: 20px 0 20px 40px; + font-family: Raleway; font-size: 14px; + color: #ffffff; +} +#menu hr { + margin: 15px; + border: none; + border-bottom: 1px solid rgba(0, 0, 0, .15); +} + +#menu ul { + margin: 0; padding: 0; list-style: none; +} +#menu a, +#menu li { + display: block; margin: 10px 15px; + transition: opacity .15s ease; +} +#menu li { + color: #b8b8b8; +} +#menu li > a { + display: inline; + margin: 0; font-style: normal; +} +#menu a > img { + vertical-align: middle; + margin-right: 15px; +} +#menu a > svg { + width: 20px; height: 20px; vertical-align: middle; + margin-right: 10px; +} + +#menu form input { + display: block; width: 80%; + margin: 5px auto; padding: 5px 10px; + font-size: 14px; + background: #e8e8e8; transition: background .15s ease; +} +#menu form input:focus { + background: #ffffff; +} +#menu form input:first-child { + margin-bottom: 0; border-bottom: none; + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-top-left-radius: 5px; + border-top-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-top-right-radius: 5px; +} +#menu form input:nth-child(2) { + margin-top: 0; border-top: 1px solid #dddddd; + border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-bottom-right-radius: 5px; +} diff --git a/sfiles/css/responsive.css b/sfiles/css/responsive.css new file mode 100644 index 0000000..bb9b435 --- /dev/null +++ b/sfiles/css/responsive.css @@ -0,0 +1,42 @@ +/* + Responsives rules +*/ + +@media all and (max-width: 1399px) { + body { + font-size: 13px; + } + + /*header form { + border-bottom: 1px solid #adb0b4; + }*/ + header input[type="search"] { + font-size: 14px; + } + + #menu li { + font-size: 10px; + } + #menu a { + font-size: 13px; + } +} + + +@media all and (min-width: 1400px) { + body { + font-size: 14px; + } + + header input[type="search"] { + font-size: 14px; + } + + #menu li { + font-size: 11px; + } + #menu a { + font-size: 14px; + } +} + diff --git a/sfiles/fonts/noto_sans.ttf b/sfiles/fonts/noto_sans.ttf new file mode 100755 index 0000000..9dd1019 Binary files /dev/null and b/sfiles/fonts/noto_sans.ttf differ diff --git a/sfiles/fonts/raleway_200.ttf b/sfiles/fonts/raleway_200.ttf new file mode 100755 index 0000000..7520b76 Binary files /dev/null and b/sfiles/fonts/raleway_200.ttf differ diff --git a/sfiles/fonts/raleway_300.ttf b/sfiles/fonts/raleway_300.ttf new file mode 100755 index 0000000..9ff67e7 Binary files /dev/null and b/sfiles/fonts/raleway_300.ttf differ diff --git a/sfiles/global.css b/sfiles/global.css new file mode 100755 index 0000000..de78188 --- /dev/null +++ b/sfiles/global.css @@ -0,0 +1,161 @@ +/* + fonts +*/ + +@font-face { font-family: NotoSans; src: url(../fonts/noto_sans.ttf); } +@font-face { font-family: Raleway; font-weight: 200; src: url(../fonts/raleway_200.ttf); } +@font-face { font-family: Raleway; font-weight: 300; src: url(../fonts/raleway_300.ttf); } + + + +/* + body +*/ + +body { + margin: 0; + background: #ffffff; + font-family: sans-serif; +} + + +/* + header +*/ + +header { + height: 50px; margin: 0; padding: 0 30px; + display: flex; align-items: center; justify-content: space-between; + background: #f8f8fa; border-bottom: 1px solid #d0d0d0; +} + + +header svg { + width: 24px; height: 24px; vertical-align: middle; + transition: .15s ease; +} +header a:hover > svg, header a:focus > svg { + filter: brightness(.5); +} + +header input[type="search"] { + width: 250px; + padding: 5px 35px 5px 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; +} +header input[type="search"] ~ a { + position: relative; left: -33px; +} +header input[type="search"]:focus { + box-shadow: 0 0 4px rgba(0, 102, 255, .9); +} +header input[type="search"] ~ a > svg > path { + fill: #cccccc; transition: .15s ease; +} +header input[type="search"]:focus ~ a > svg > path { + fill: #333333; +} + +#spotlight a { + padding: 8px 18px 6px 18px; + color: #727272; font-size: 15px; + border-bottom: 2px solid rgba(93, 123, 141, 0); + transition: border .15s ease; +} +#spotlight a:hover, header #spotlight a:focus { + border-bottom: 2px solid rgba(93, 123, 141, 1); +} + + +/* + links +*/ + +a { + text-decoration: none; +} +a:focus { + outline: none; +} + + + +/* + alert overlay +*/ + +.alert { + position: fixed; left: 15%; + display: flex; align-items: center; + width: 70%; z-index: 10; + font-family: NotoSans; font-size: 14px; color: #212121; + background: #ffffff; + border-bottom: 5px solid #4caf50; + border-radius: 1px; box-shadow: 0 1px 12px rgba(0, 0, 0, 0.3); + transition: opacity .15s ease; +} +.alert.ok { + border-color: #4caf50; +} +.alert.error { + border-color: #f44336; +} +.alert span { + flex-grow: 1; margin: 15px 10px 10px 0; +} +.alert input[type="button"] { + margin: 3px 30px 0 0; +} + +.alert svg { + margin: 15px 20px 10px 30px; +} + + + +/* + buttons +*/ + +input[type="button"] { + font-family: NotoSans; font-size: 14px; /*font-weight: bold;*/ + text-align: center; + padding: 5px 15px; + transition: .1s ease; +} + +/* flat */ +input[type="button"].flat { + border: none; + background: rgba(0, 0, 0, 0); color: #727272; +} +input[type="button"].flat:hover { + background: rgba(0, 0, 0, .1); +} +input[type="button"].flat:focus { + background: rgba(0, 0, 0, .2); +} + +/* raised */ +input[type="button"].raised { + border: none; + background: #e0e0e0; color: #212121; + box-shadow: 0 1px 2px rgba(0, 0, 0, .3); +} +input[type="button"].raised:hover, +input[type="button"].raised:focus { + background: #d5d5d5; +} +input[type="button"].raised:active { + background: #d6d6d6; + box-shadow: 0 1px 8px rgba(0, 0, 0, .3); +} + +/* Input text */ +input[type="text"]:focus, +input[type="search"]:focus, +input[type="password"]:focus { + +} diff --git a/sfiles/images/3864.png b/sfiles/images/3864.png new file mode 100755 index 0000000..5eadf61 Binary files /dev/null and b/sfiles/images/3864.png differ diff --git a/sfiles/images/account-circle.svg b/sfiles/images/account-circle.svg new file mode 100755 index 0000000..4adef78 --- /dev/null +++ b/sfiles/images/account-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sfiles/images/calc.png b/sfiles/images/calc.png new file mode 100755 index 0000000..2822c3b Binary files /dev/null and b/sfiles/images/calc.png differ diff --git a/sfiles/images/calcraft.gif b/sfiles/images/calcraft.gif new file mode 100755 index 0000000..ad205a4 Binary files /dev/null and b/sfiles/images/calcraft.gif differ diff --git a/sfiles/images/clonelab.gif b/sfiles/images/clonelab.gif new file mode 100755 index 0000000..bf38bca Binary files /dev/null and b/sfiles/images/clonelab.gif differ diff --git a/sfiles/images/courses.png b/sfiles/images/courses.png new file mode 100755 index 0000000..4a2a03f Binary files /dev/null and b/sfiles/images/courses.png differ diff --git a/sfiles/images/email.svg b/sfiles/images/email.svg new file mode 100755 index 0000000..3f0d76e --- /dev/null +++ b/sfiles/images/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sfiles/images/fa_124.png b/sfiles/images/fa_124.png new file mode 100755 index 0000000..4c2b0f1 Binary files /dev/null and b/sfiles/images/fa_124.png differ diff --git a/sfiles/images/fruit_ninja.gif b/sfiles/images/fruit_ninja.gif new file mode 100755 index 0000000..029939f Binary files /dev/null and b/sfiles/images/fruit_ninja.gif differ diff --git a/sfiles/images/gravity_duck.png b/sfiles/images/gravity_duck.png new file mode 100755 index 0000000..9937ceb Binary files /dev/null and b/sfiles/images/gravity_duck.png differ diff --git a/sfiles/images/inbox.svg b/sfiles/images/inbox.svg new file mode 100755 index 0000000..c5a004a --- /dev/null +++ b/sfiles/images/inbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sfiles/images/laptop.png b/sfiles/images/laptop.png new file mode 100755 index 0000000..a6afed9 Binary files /dev/null and b/sfiles/images/laptop.png differ diff --git a/sfiles/images/legolas.gif b/sfiles/images/legolas.gif new file mode 100755 index 0000000..0cb1edf Binary files /dev/null and b/sfiles/images/legolas.gif differ diff --git a/sfiles/images/logo.png b/sfiles/images/logo.png new file mode 100755 index 0000000..54b65d2 Binary files /dev/null and b/sfiles/images/logo.png differ diff --git a/sfiles/images/logo_noshadow.png b/sfiles/images/logo_noshadow.png new file mode 100755 index 0000000..4583e89 Binary files /dev/null and b/sfiles/images/logo_noshadow.png differ diff --git a/sfiles/images/message-text.svg b/sfiles/images/message-text.svg new file mode 100755 index 0000000..f72ca43 --- /dev/null +++ b/sfiles/images/message-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sfiles/light.css b/sfiles/light.css new file mode 100755 index 0000000..5c76a91 --- /dev/null +++ b/sfiles/light.css @@ -0,0 +1,256 @@ +/* + fonts +*/ + +@font-face { font-family: NotoSans; src: url(../fonts/noto_sans.ttf); } +@font-face { font-family: Raleway; font-weight: 200; src: url(../fonts/raleway_200.ttf); } +@font-face { font-family: Raleway; font-weight: 300; src: url(../fonts/raleway_300.ttf); } + + +/* Global */ + +body { + margin: 0; + background: #ffffff; + font-family: sans-serif; +} + +nav a { + color: #ffffff; opacity: .7; + text-decoration: none; + transition: opacity .15s ease; +} +nav a:hover, +nav a:focus { + opacity: 1; +} + +.light-hidden { + display: none; +} + +/* Menu */ + +#light-menu { + list-style: none; + display: flex; flex-direction: row; align-items: center; + width: 100%; height: 40px; + overflow-x: auto; overflow-y: hidden; + margin: 0; padding: 0; + text-indent: 0; + background: #22292c; box-shadow: 0 0 2px rgba(0, 0, 0, 0.3); +} + +#logo { + position: relative; display: block; + height: 100%; opacity: 1; + background: -moz-linear-gradient(left, #bf1c11, #ba1203); + background: -webkit-linear-gradient(left, #bf1c11, #ba1203); +} +/*#logo::after { + position: absolute; left: 100%; top: 50%; + height: 0; width: 0; + border: solid transparent; content: " "; + border-left-color: #ba1203; + border-width: 4px; + margin-top: -4px; +}*/ +#logo img { + width: 40px; + margin: 0; padding: 0; + margin-bottom: -4.5px; + filter: drop-shadow(0 0 2px rgba(0, 0, 0, .0)); + transition: filter .15s ease; +} +#logo:hover img, +#logo:focus img { + filter: drop-shadow(0 0 2px rgba(0, 0, 0, .7)); +} + +#light-menu > li { + display: flex; flex-direction: column; + align-items: center; flex-grow: 1; + height: 100%; + text-align: center; + font-family: Raleway; font-size: 13px; + color: #ffffff; +} +#light-menu li { + padding: 0 2px; +} +#light-menu li > a { + display: flex; flex-direction: column; + align-items: center; justify-content: center; + width: 100%; height: 100%; +} +#light-menu li > a > div { + display: none; + font-size: 12px; +} + +#light-menu li > a > svg { + display: block; width: 20px; flex-shrink: 0; + margin: 0 auto 5px auto; +} + +#light-menu li span[notifications]:not([notifications="0"])::before { + content: attr(notifications); + display: inline-block; margin-right: 6px; + vertical-align: middle; + padding: 0 5px 0 4px; border-radius: 5px; + font-family: NotoSans; + background: #ffffff; color: #000000; +} + + +#menu { + width: 100%; height: 0; overflow-x: hidden; + font-family: NotoSans; font-size: 12px; + background: #22292c; box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); + transition: .1s ease; +} +#menu.opened { + height: 100%; + overflow-y: auto; +} + +#menu > div { + width: 100%; + display: none; +} +#menu > div.opened { + display: block; +} +#menu h2 { + margin: 10px 0 10px 40px; + font-family: Raleway; font-size: 15px; + color: #ffffff; +} +#menu h2 > svg { + width: 30px; vertical-align: middle; +} +#menu h2 > img { + width: 64px; margin-right: 10px; + vertical-align: middle; border-radius: 50%; +} + +#menu h3 { + margin: 10px 0 10px 40px; + font-family: Raleway; font-size: 13px; + color: #ffffff; +} +#menu hr { + margin: 10px 15px 0 15px; + border: none; + border-bottom: 1px solid rgba(0, 0, 0, .15); +} + +#menu > div > a, +#menu span { + display: block; margin: 10px 15px; +} +#menu span { + /*font-style: italic;*/ color: #b8b8b8; + font-size: 10px; +} +#menu span > a { + display: inline; + margin: 0; font-style: normal; + font-size: 12px; +} +#menu a > img { + vertical-align: middle; + margin-right: 15px; +} +#menu a > svg { + width: 20px; height: 20px; vertical-align: middle; + margin-right: 10px; +} +#menu ul { + list-style: none; + margin: 10px 15px; padding: 0; + color: #b8b8b8; +} +#menu li { + margin: 5px 0; +} + +@media all and (min-width: 550px) { + #light-menu { + height: 60px; + } + #logo img { + width: 60px; + } + #light-menu li > a > div { + display: block; + } +} + +#menu form input { + display: block; + margin: 5px 15px; padding: 5px 10px; + font-size: 14px; + background: #e8e8e8; transition: background .15s ease; +} +#menu form input:focus { + background: #ffffff; +} +#menu form input:first-child { + margin-bottom: 0; border-bottom: none; + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-top-left-radius: 5px; + border-top-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-top-right-radius: 5px; +} +#menu form input:nth-child(2) { + margin-top: 0; border-top: 1px solid #dddddd; + border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-bottom-right-radius: 5px; +} +#menu form a { + display: block; margin-left: 15px; +} + + +/* Header */ + +header { + padding: 10px 10px 0px 10px; + background: #f8f8fa; border-bottom: 1px solid #d0d0d0; +} +header svg { + width: 24px; height: 24px; vertical-align: middle; + transition: .15s ease; +} +header a:hover > svg, header a:focus > svg { + filter: brightness(.5); +} + +header input[type="search"] { + width: 100%; + 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; +} + +#spotlight { + display: flex; + align-items: center; justify-content: space-around; +} +#spotlight a { + padding: 5px 10px; margin: 5px 0; + color: #727272; font-size: 14px; + /*border-bottom: 2px solid rgba(93, 123, 141, .5);*/ + transition: border .15s ease; + text-decoration: none; +} +#spotlight a:hover, header #spotlight a:focus { + color: #404040; +} \ No newline at end of file diff --git a/sfiles/navbar.css b/sfiles/navbar.css new file mode 100755 index 0000000..465ecca --- /dev/null +++ b/sfiles/navbar.css @@ -0,0 +1,196 @@ +nav a { + color: #ffffff; + opacity: .7; + cursor: pointer; +} +nav a:hover, +nav a:focus { + opacity: 1; +} + + +/* Menu */ + +#logo { + position: relative; display: block; + width: 100%; + margin-bottom: 10px; + opacity: 1; + background: -moz-linear-gradient(top, #bf1c11, #ba1203); + background: -webkit-linear-gradient(top, #bf1c11, #ba1203); + background: #bf1c11; + transition: .15s ease; +} +/* Flèche */ +/*nav #logo::after { + content: ""; + position: absolute; + top: 100%; left: 50%; + height: 0; width: 0; + border: solid transparent; + border-top-color: #ba1203; + border-width: 12px; margin-left: -12px; +}*/ +#logo img { + width: 100%; + margin: 0; padding: 0; + margin-bottom: -4.5px; + filter: drop-shadow(0 0 2px rgba(0, 0, 0, .0)); + transition: filter .15s ease; +} +#logo:hover, +#logo:focus { + background: #d72411; +} + +#light-menu { + position: fixed; z-index: 10; + list-style: none; + width: 60px; + height: 100%; overflow-y: auto; + margin: 0; padding: 0; + text-indent: 0; + background: #22292c; box-shadow: 0 0 2px rgba(0, 0, 0, 0.3); +} +#light-menu li { + width: 100%; height: 45px; + text-align: center; + font-family: Raleway; font-size: 13px; + color: #ffffff; +} +#light-menu li > a { + 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 */ +} + +#light-menu li > a > svg { + display: block; width: 35%; flex-shrink: 0; + margin: 0 auto 5px auto; +} +#light-menu li div { + display: none; +} +#light-menu li > a::after { + content: attr(label); + position: fixed; display: none; + 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 { + display: block; +} + +/*nav li span[notifications]:not([notifications="0"])::before { + content: attr(notifications); + display: inline-block; margin-right: 6px; + vertical-align: middle; + padding: 0 5px 0 4px; border-radius: 5px; + font-family: NotoSans; + background: #ffffff; color: #000000; +}*/ + + +/* Overlay */ +#menu { + position: fixed; left: 60px; z-index: 5; + width: 0; 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; +} +/*@media all and (max-width: 1266px) { + #menu { + left: 30px; + } +}*/ + +#menu.opened { + width: 300px; +} + +#menu > div { + width: 300px; + display: none; +} +#menu > div.opened { + display: block; +} + +#menu h2 { + margin: 5% 0 20px 40px; + font-family: Raleway; font-size: 18px; + color: #ffffff; +} +#menu h2 > svg { + width: 42px; vertical-align: middle; +} +#menu h2 img { + width: 64px; border-radius: 50%; vertical-align: middle; margin-right: 10px; +} + +#menu h3 { + margin: 20px 0 20px 40px; + font-family: Raleway; font-size: 14px; + color: #ffffff; +} +#menu hr { + margin: 15px; + border: none; + border-bottom: 1px solid rgba(0, 0, 0, .15); +} + +#menu ul { + margin: 0; padding: 0; list-style: none; +} +#menu a, +#menu li { + display: block; margin: 10px 15px; + transition: opacity .15s ease; +} +#menu li { + color: #b8b8b8; +} +#menu li > a { + display: inline; + margin: 0; font-style: normal; +} +#menu a > img { + vertical-align: middle; + margin-right: 15px; +} +#menu a > svg { + width: 20px; height: 20px; vertical-align: middle; + margin-right: 10px; +} + +#menu form input { + display: block; width: 80%; + margin: 5px auto; padding: 5px 10px; + font-size: 14px; + background: #e8e8e8; transition: background .15s ease; +} +#menu form input:focus { + background: #ffffff; +} +#menu form input:first-child { + margin-bottom: 0; border-bottom: none; + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-top-left-radius: 5px; + border-top-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-top-right-radius: 5px; +} +#menu form input:nth-child(2) { + margin-top: 0; border-top: 1px solid #dddddd; + border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-bottom-right-radius: 5px; +} diff --git a/sfiles/responsive.css b/sfiles/responsive.css new file mode 100644 index 0000000..bb9b435 --- /dev/null +++ b/sfiles/responsive.css @@ -0,0 +1,42 @@ +/* + Responsives rules +*/ + +@media all and (max-width: 1399px) { + body { + font-size: 13px; + } + + /*header form { + border-bottom: 1px solid #adb0b4; + }*/ + header input[type="search"] { + font-size: 14px; + } + + #menu li { + font-size: 10px; + } + #menu a { + font-size: 13px; + } +} + + +@media all and (min-width: 1400px) { + body { + font-size: 14px; + } + + header input[type="search"] { + font-size: 14px; + } + + #menu li { + font-size: 11px; + } + #menu a { + font-size: 14px; + } +} + diff --git a/sfiles/scripts/smartphone_patch.js b/sfiles/scripts/smartphone_patch.js new file mode 100644 index 0000000..83b01ec --- /dev/null +++ b/sfiles/scripts/smartphone_patch.js @@ -0,0 +1,11 @@ +/* Smartphone patch for menu */ +/* It don't work if links haven't any href attribute */ + +var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0) + +if(w < 700) { + var buttons = document.getElementById('light-menu').getElementsByTagName('li'); + for(var i = 0; i < buttons.length; i++) { + buttons[i].getElementsByTagName('a')[0].setAttribute('href', '#'); + } +} \ No newline at end of file diff --git a/sfiles/scripts/trigger_menu.js b/sfiles/scripts/trigger_menu.js new file mode 100644 index 0000000..3311cf0 --- /dev/null +++ b/sfiles/scripts/trigger_menu.js @@ -0,0 +1,72 @@ +/* Trigger actions for the menu */ + +/* Initialization */ +var b = document.getElementById('light-menu').getElementsByTagName('a') +for(var i = 1; i < b.length; i++) { + b[i].setAttribute('onfocus', "this.setAttribute('f', 'true');"); + b[i].setAttribute('onblur', "this.setAttribute('f', 'false');"); +} + +var trigger_menu = function(active) { + var display = function(element) { + element.classList.add('opened'); + } + var hide = function(element) { + element.classList.remove('opened'); + } + + var menu = document.getElementById('menu'); + var buttons = document.getElementById('light-menu').getElementsByTagName('li'); + var menus = document.getElementById('menu').getElementsByTagName('div'); + + if(active == -1 || buttons[active].classList.contains('opened')) { + hide(menu); + for(i = 0; i < buttons.length; i++) { + hide(buttons[i]); + } + } + else { + for(i = 0; i < buttons.length; i++) { + if(i != active) { + hide(buttons[i]); + hide(menus[i]); + } + } + display(buttons[active]); + display(menus[active]); + display(menu); + } +} + +var mouse_trigger = function(event) { + var menu = document.getElementById('menu'); + var buttons = document.getElementById('light-menu').getElementsByTagName('li'); + + if(!menu.contains(event.target)) { + var active = -1; + + for(i = 0; i < buttons.length; i++) { + if(buttons[i].contains(event.target)) + active = i; + buttons[i].getElementsByTagName('a')[0].blur(); + } + + trigger_menu(active); + } +} + +var keyboard_trigger = function(event) { + var menu = document.getElementById('menu'); + var buttons = document.getElementById('light-menu').getElementsByTagName('li'); + + if(event.keyCode == 13) { + for(var i = 0; i < buttons.length; i++) { + if(buttons[i].getElementsByTagName('a')[0].getAttribute('f') == 'true') { + trigger_menu(i); + } + } + } +} + +document.onclick = mouse_trigger; +document.onkeypress = keyboard_trigger; diff --git a/templates/account/login.html b/templates/account/login.html new file mode 100644 index 0000000..0362eb0 --- /dev/null +++ b/templates/account/login.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block title %}Planète Casio — Connexion{% endblock %} + +{% block content %} +
+

Formulaire de connexion

+
+ {% if error %} +

Utilisateur inexistant ou mauvais de mot de passe.

+ {% endif %} + + {% if user.is_authenticated %} + Vous êtes connecté, {{ user.username }} ! + {% else %} +
+ {% csrf_token %} + {{ form.as_p }} + +
+ {% endif %} +
+
+{% endblock %} diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..f728d03 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,388 @@ +{% load static %} + + + + + {% block title %}Planète Casio : design template{% endblock %} + + + + + + + + + + + + + + +
+
+
+ + + + + + +
+ + +
+ + {% block content %} +
Lorem ipsum
+ {% endblock %} + +
+ + + + + + + + + + diff --git a/templates/forum/forum.html b/templates/forum/forum.html new file mode 100644 index 0000000..c47968b --- /dev/null +++ b/templates/forum/forum.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}Planète Casio — {{ forum.name }}{% endblock %} + +{% block content %} +
+

Forum {{ forum.name }}

+
+ {{ forum.description }} +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/forum/index.html b/templates/forum/index.html new file mode 100644 index 0000000..745cbea --- /dev/null +++ b/templates/forum/index.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} + +{% block title %}Planète Casio — Index des forums{% endblock %} + +{% block content %} +
+

Index des forums

+
+
    + {% for f in forums %} +
  • +

    {{ f.name }}

    + {{ f.description }} +
  • + {% empty %} +
  • Pas de forum disponible actuellement

  • + {% endfor %} +
+
+
+{% endblock %} \ No newline at end of file diff --git a/templates/home/homepage.html b/templates/home/homepage.html new file mode 100644 index 0000000..9454138 --- /dev/null +++ b/templates/home/homepage.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} + +{% block title %}Planète Casio — Jeux, cours et tutos{% endblock %} + +{% block content %} +
+

Informations sur le développement

+
+

Tous les onglets sont fonctionnels, cliquez sur une icone pour afficher, sur une autre pour modifier, deux fois de suite pour fermer. Sinon cliquez à coté.

+

Les onglets Tutoriels et Sprites ne sont pas encore remplis, c'est normal qu'ils fassent un peu vide. L'avantage de ce menu est qu'on peut le remplir comme on veut, dans le pire des cas ça déclenche le scrolling (c'est pas exemple le cas pour l'onglet "Programmes", qui est beaucoup trop rempli). \o/

+

Le header contient une barre de recherche ainsi que des liens de type "spotlight" : ils servent à mettre en valeur un évènement ou une partie du site. On peut bien évidemment remplacer par autre chose, mais je trouvais que cela était intéressant de pouvoir attirer l'attention de cette manière.

+

Ne faites pas attention au contenu principal de la page, il n'est absolument pas définitif ! De même pour le positionnement des alertes. Toutefois, à part les entrées des sous-menus, ceux-ci sont en version quasi‑finale.

+

Nous sommes ouverts à toute suggestion et amélioration ! Si vous souhaitez participer au développement du site, n'hésitez pas à nous contacter à l'adresse suivante : contact@planet-casio.com. N'oubliez pas de préciser « [v5] » dans l'en-tête pour que nous puissions facilement traiter le message. Vous pouvez aussi ajouter des fichiers, tels que des exemples de html/css, des schémas d'organisation, ou encore des captures d'écran en cas de problème d'affichage. Dans le cas où vous signalez un bug, merci de préciser : +

    +
  • votre plateforme (PC, tablette ou smartphone)
  • +
  • votre système d'exploitation (nom et version)
  • +
  • votre navigateur (nom et version)
  • +
  • la taille de votre écran en pixel (pour les smartphones, essayez d'ajouter le viewport correspondant)
  • +
  • le problème rencontré
  • +
+ Merci pour votre participation ! +

+
+
+ +
+

Lorem ipsum

+
+

Etiam ut metus mollis, molestie leo vel, finibus orci. Praesent in orci diam. Nullam laoreet rutrum elit, id luctus neque. Integer egestas, leo ut porta sodales, lacus enim sollicitudin risus, congue pharetra est dui ac arcu. Nunc egestas eu erat vitae volutpat. In non lorem cursus, viverra nisl vel, feugiat sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc lacinia, nibh vel vulputate aliquam, nunc diam blandit massa, vel imperdiet velit ante eget ligula. Suspendisse vestibulum purus quis ligula cursus semper. Quisque efficitur ultrices dignissim.

+

Maecenas vel mauris ligula. Proin faucibus, magna eget euismod ullamcorper, felis risus hendrerit dui, in ultrices nunc tortor at nulla. Mauris eu pharetra ligula. Aliquam at arcu leo. Donec ipsum felis, tristique nec bibendum nec, bibendum ut nisi. In hac habitasse platea dictumst. Duis in ante magna. Sed lacinia suscipit enim vitae tempus. Mauris porta orci at tortor faucibus, a volutpat ligula imperdiet. Cras nisi ex, consectetur in orci at, sollicitudin faucibus quam. Fusce eget leo accumsan, dictum nunc et, sodales nisl.

+

Nullam ut purus suscipit, elementum magna quis, molestie lorem. Integer erat dui, pellentesque nec odio dignissim, semper elementum nunc. Aenean nec tristique ex, et vehicula dolor. Quisque quis urna ut sapien tristique placerat. Nunc pellentesque tincidunt leo eu porta. Maecenas sollicitudin ullamcorper diam, vel ultricies elit. Praesent lorem risus, ornare eu malesuada vitae, accumsan in lacus.

+

Vivamus at tortor vel arcu scelerisque interdum a et sem. Morbi pellentesque, velit quis malesuada fringilla, risus turpis mollis magna, et mattis arcu orci sit amet mauris. Donec ac tincidunt ipsum. Mauris at quam sit amet nibh varius auctor. In dictum dui sed justo semper tempor. Vivamus vitae sem id nibh vulputate tincidunt. Praesent quis finibus metus. Nulla at imperdiet ex. Suspendisse potenti. Nullam nec tortor sapien. Vestibulum bibendum enim vel lectus cursus, id fringilla sapien malesuada. Sed vitae tellus eu lectus laoreet malesuada at nec dui. Mauris varius, purus at scelerisque accumsan, turpis magna vehicula diam, a suscipit erat metus at diam.

+

Aenean mattis in leo viverra rutrum. Etiam et nulla in ipsum ornare consectetur. Quisque bibendum, metus nec ultrices efficitur, dui risus rhoncus lectus, a imperdiet nibh elit ut ipsum. Quisque convallis lacus elementum dolor dignissim sollicitudin. Maecenas dapibus dolor quis tellus imperdiet, hendrerit vestibulum lacus tempor. Nam quis risus non nulla euismod semper. Suspendisse commodo aliquam aliquet. Nullam nec varius felis. Nullam velit erat, interdum ac vehicula nec, efficitur in enim. Morbi sodales ante quis nunc vehicula, non eleifend lacus congue. Maecenas a imperdiet nunc.

+
+
+{% endblock %} \ No newline at end of file