diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..08b6533 --- /dev/null +++ b/README.rst @@ -0,0 +1,12 @@ +JabberFR +======== + +Ce package contient le site de JabberFR (WIP), avec plusieurs hôtes différents : + +- jabberfr.org +- irc.jabberfr.org +- chat.jabberfr.org + + +(le package django-hosts est utilisé pour avoir des sites différents par hôte +en une seule application) diff --git a/jabberfr/__init__.py b/jabberfr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jabberfr/asgi.py b/jabberfr/asgi.py new file mode 100644 index 0000000..a6497f3 --- /dev/null +++ b/jabberfr/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for jabberfr project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jabberfr.settings') + +application = get_asgi_application() diff --git a/jabberfr/hosts.py b/jabberfr/hosts.py new file mode 100644 index 0000000..cfc119a --- /dev/null +++ b/jabberfr/hosts.py @@ -0,0 +1,12 @@ +""" +Multi-hosts configuration +""" +from django.conf import settings +from django_hosts import patterns, host + +host_patterns = patterns( + '', + host('', settings.ROOT_URLCONF, name='jabberfr'), + host('chat', 'jabberfr.subsites.chat_urls', name='chat'), + host('irc', 'jabberfr.subsites.irc_urls', name='irc') +) diff --git a/jabberfr/settings.py b/jabberfr/settings.py new file mode 100644 index 0000000..d412e93 --- /dev/null +++ b/jabberfr/settings.py @@ -0,0 +1,116 @@ +""" +Django settings for jabberfr project. + +Generated by 'django-admin startproject' using Django 3.1.7. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.1/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '75w04*h42egcf0u7)n81)3z*n$3a_0vp=^&72+&egk$gbttv6f' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ROOT_DOMAIN = 'jabberfr.org' + +ALLOWED_HOSTS = [ + 'jabberfr.org', + 'irc.jabberfr.org', + 'chat.jabberfr.org', +] + +DEFAULT_HOST = 'jabberfr' + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django_hosts', +] + +MIDDLEWARE = [ + 'django_hosts.middleware.HostsRequestMiddleware', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django_hosts.middleware.HostsResponseMiddleware', +] + +ROOT_URLCONF = 'jabberfr.urls' + +ROOT_HOSTCONF = 'jabberfr.hosts' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + Path(BASE_DIR, 'templates'), + Path(BASE_DIR, 'jabberfr', 'templates'), + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'jabberfr.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Internationalization +# https://docs.djangoproject.com/en/3.1/topics/i18n/ + +LANGUAGE_CODE = 'fr-fr' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.1/howto/static-files/ + +STATIC_URL = '/static/' + +STATICFILES_DIRS = [ + BASE_DIR / 'static' +] diff --git a/jabberfr/subsites/__init__.py b/jabberfr/subsites/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jabberfr/subsites/chat_urls.py b/jabberfr/subsites/chat_urls.py new file mode 100644 index 0000000..78144f4 --- /dev/null +++ b/jabberfr/subsites/chat_urls.py @@ -0,0 +1,7 @@ +from django.views.generic import TemplateView +from django.urls import path +from jabberfr.views import get_chat_index + +urlpatterns = [ + path('', get_chat_index), +] diff --git a/jabberfr/subsites/irc_urls.py b/jabberfr/subsites/irc_urls.py new file mode 100644 index 0000000..8024bfe --- /dev/null +++ b/jabberfr/subsites/irc_urls.py @@ -0,0 +1,6 @@ +from django.views.generic import TemplateView +from django.urls import path + +urlpatterns = [ + path('', TemplateView.as_view(template_name='irc/index.html')) +] diff --git a/jabberfr/templates/chat/index.html b/jabberfr/templates/chat/index.html new file mode 100644 index 0000000..144c4b0 --- /dev/null +++ b/jabberfr/templates/chat/index.html @@ -0,0 +1,20 @@ +{% extends "page_model.html" %} + +{% block content %} + +
+

Les salons les plus fréquentés

+ +{{ rooms | safe }} + +
+ +
+

Salons de discussion de JabberFR.org.

+

Ce service permet de discuter à plusieurs en utilisant un client Jabber. Pour ce faire, suivez les instructions du Wiki de JabberFR.

+

Vous pouvez aussi rejoindre directement un salon en cliquant sur la bulle dans la liste à droite.

+ +
+ + +{% endblock %} diff --git a/jabberfr/templates/contact.html b/jabberfr/templates/contact.html new file mode 100644 index 0000000..444313e --- /dev/null +++ b/jabberfr/templates/contact.html @@ -0,0 +1,19 @@ +{% extends "page_model.html" %} + +{% block content %} +
+

Nous contacter

+

Nous sommes disponibles sur Jabber bien sûr, notamment :

+ + +

Si vous devez contacter l’un des administrateurs en privé, voici qui nous sommes :

+ +
+{% endblock %} diff --git a/jabberfr/templates/index.html b/jabberfr/templates/index.html new file mode 100644 index 0000000..7438185 --- /dev/null +++ b/jabberfr/templates/index.html @@ -0,0 +1,29 @@ +{% extends "page_model.html" %} +{% load static %} + +{% block content %} + +
+ +
+ + +
+

Qu'est-ce que JabberFR ?

+

JabberFR est le site de la communauté francophone des utilisateurs de Jabber.
Ce site a pour but de regrouper tous les utilisateurs francophones de Jabber.
Plus d'informations sur JabberFR

+
+ + +
+

Nos salons les plus fréquentés

+ +{{ rooms | safe }} + +
+ +{% endblock %} diff --git a/jabberfr/templates/irc/index.html b/jabberfr/templates/irc/index.html new file mode 100644 index 0000000..6c2e514 --- /dev/null +++ b/jabberfr/templates/irc/index.html @@ -0,0 +1,12 @@ +{% extends "page_model.html" %} + +{% block content %} +

Passerelle IRC

+

+Passerelle IRC publique utilisant biboumi. +

+ +

+Pour rejoindre un canal IRC, rejoignez #le-canal%le-serveur-irc@irc.jabberfr.org avec votre client Jabber préféré comme tout autre salon de discussion. +

+{% endblock %} diff --git a/jabberfr/templates/legal.html b/jabberfr/templates/legal.html new file mode 100644 index 0000000..f1d1401 --- /dev/null +++ b/jabberfr/templates/legal.html @@ -0,0 +1,11 @@ +{% extends "page_model.html" %} + +{% block content %} + +

Informations légales

+ +

Les images du menu illustrant le wiki, le forum, le chat, les news et le planet sont dans le domaine public.

+

L'image illustrant l'annuaire est sous licence Creative Commons Attribution ShareAlike 2.5 issu du projet tango et légèrement modifié.

+

Le logo de JabberFR est sous licence Creative Commons Attribution ShareAlike 2.0, d’après un design de Maurice Svay.

+ +{% endblock %} diff --git a/jabberfr/urls.py b/jabberfr/urls.py new file mode 100644 index 0000000..054aa02 --- /dev/null +++ b/jabberfr/urls.py @@ -0,0 +1,35 @@ +"""jabberfr URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/3.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.urls import path +from django.views.generic import TemplateView + +from jabberfr.views import get_root_index + + +PAGES = [ + ('legal', 'legal.html'), + ('contact', 'contact.html'), + ('inscription', 'inscription.html'), +] + +urlpatterns = [ + path('', get_root_index) +] + +urlpatterns += [ + path(url, TemplateView.as_view(template_name=template_name)) + for url, template_name in PAGES +] diff --git a/jabberfr/views.py b/jabberfr/views.py new file mode 100644 index 0000000..96bebdf --- /dev/null +++ b/jabberfr/views.py @@ -0,0 +1,49 @@ +from aiohttp import ClientSession, ClientError, ClientTimeout +from django.shortcuts import render + +BASE_MUC_URL = 'http://[::1]:5280/muc_list/?' + + +TABLE_END = """ + Voir plus… + + +""" + +async def get_chatrooms(*, limit: int = 25, order: str = 'users') -> str: + params = { + 'limit': str(limit), + 'order': order, + 'class': 'lastposts', + } + params_str = ';'.join(f'{key}={value}' for key, value in params.items()) + url = BASE_MUC_URL + params_str + + async with ClientSession(raise_for_status=True, timeout=ClientTimeout(total=10)) as session: + async with session.get(url) as resp: + return await resp.text() + + +async def get_root_index(request): + try: + rooms = await get_chatrooms(limit=6) + rooms = rooms[:-9] + TABLE_END + except ClientError: + rooms = '

Impossible de récupérer la liste des salons !

' + context = { + 'rooms': rooms, + } + return render(request, 'index.html', context) + + +async def get_chat_index(request): + try: + rooms = await get_chatrooms() + except ClientError: + rooms = '

Impossible de récupérer la liste des salons !

' + context = { + 'title': 'Salons de discussion de JabberFR', + 'rooms': rooms, + } + + return render(request, 'chat/index.html', context=context) diff --git a/jabberfr/wsgi.py b/jabberfr/wsgi.py new file mode 100644 index 0000000..918de3e --- /dev/null +++ b/jabberfr/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for jabberfr 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/3.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jabberfr.settings') + +application = get_wsgi_application() diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..198a576 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jabberfr.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..4cf97be --- /dev/null +++ b/poetry.lock @@ -0,0 +1,301 @@ +[[package]] +name = "aiohttp" +version = "3.7.4.post0" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +async-timeout = ">=3.0,<4.0" +attrs = ">=17.3.0" +chardet = ">=2.0,<5.0" +multidict = ">=4.5,<7.0" +typing-extensions = ">=3.6.5" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotlipy", "cchardet"] + +[[package]] +name = "asgiref" +version = "3.3.4" +description = "ASGI specs, helper code, and adapters" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"] + +[[package]] +name = "async-timeout" +version = "3.0.1" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.5.3" + +[[package]] +name = "attrs" +version = "20.3.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "django" +version = "3.2" +description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +asgiref = ">=3.3.2,<4" +pytz = "*" +sqlparse = ">=0.2.2" + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "django-hosts" +version = "4.0" +description = "Dynamic and static host resolving for Django. Maps hostnames to URLconfs." +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "idna" +version = "3.1" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.4" + +[[package]] +name = "multidict" +version = "5.1.0" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pytz" +version = "2021.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "sqlparse" +version = "0.4.1" +description = "A non-validating SQL parser." +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "typing-extensions" +version = "3.7.4.3" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "yarl" +version = "1.6.3" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "6bca8de172437c18c63f1d86e85165c736cd120b4cb2ffc7c20874106a85db98" + +[metadata.files] +aiohttp = [ + {file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-win32.whl", hash = "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-win32.whl", hash = "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-win32.whl", hash = "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl", hash = "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-win32.whl", hash = "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-win_amd64.whl", hash = "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe"}, + {file = "aiohttp-3.7.4.post0.tar.gz", hash = "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf"}, +] +asgiref = [ + {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, + {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, +] +async-timeout = [ + {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, + {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, +] +attrs = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +django = [ + {file = "Django-3.2-py3-none-any.whl", hash = "sha256:0604e84c4fb698a5e53e5857b5aea945b2f19a18f25f10b8748dbdf935788927"}, + {file = "Django-3.2.tar.gz", hash = "sha256:21f0f9643722675976004eb683c55d33c05486f94506672df3d6a141546f389d"}, +] +django-hosts = [ + {file = "django-hosts-4.0.tar.gz", hash = "sha256:59a870d453f113c889a7888bae5408888870350e83e362740f382dad569c2281"}, + {file = "django_hosts-4.0-py2.py3-none-any.whl", hash = "sha256:136ac225f34e7f2c007294441a38663ec2bba9637d870ad001def81bca87e390"}, +] +idna = [ + {file = "idna-3.1-py3-none-any.whl", hash = "sha256:5205d03e7bcbb919cc9c19885f9920d622ca52448306f2377daede5cf3faac16"}, + {file = "idna-3.1.tar.gz", hash = "sha256:c5b02147e01ea9920e6b0a3f1f7bb833612d507592c837a6c49552768f4054e1"}, +] +multidict = [ + {file = "multidict-5.1.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da"}, + {file = "multidict-5.1.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224"}, + {file = "multidict-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26"}, + {file = "multidict-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6"}, + {file = "multidict-5.1.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9"}, + {file = "multidict-5.1.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37"}, + {file = "multidict-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5"}, + {file = "multidict-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632"}, + {file = "multidict-5.1.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a"}, + {file = "multidict-5.1.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea"}, + {file = "multidict-5.1.0-cp38-cp38-win32.whl", hash = "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656"}, + {file = "multidict-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3"}, + {file = "multidict-5.1.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841"}, + {file = "multidict-5.1.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda"}, + {file = "multidict-5.1.0-cp39-cp39-win32.whl", hash = "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80"}, + {file = "multidict-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359"}, + {file = "multidict-5.1.0.tar.gz", hash = "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5"}, +] +pytz = [ + {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, + {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, +] +sqlparse = [ + {file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"}, + {file = "sqlparse-0.4.1.tar.gz", hash = "sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"}, +] +typing-extensions = [ + {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, + {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, + {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, +] +yarl = [ + {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, + {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, + {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, + {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, + {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, + {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, + {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, + {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, + {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, + {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, + {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, + {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, + {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6295c2c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,18 @@ +[tool.poetry] +name = "jabberfr" +version = "0.1.0" +description = "Site de jabberfr" +authors = ["mathieui "] +license = "MPL-2.0" + +[tool.poetry.dependencies] +python = "^3.9" +Django = "^3.2" +django-hosts = "^4.0" +aiohttp = "^3.7.4" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/static/default.css b/static/default.css new file mode 100644 index 0000000..5bbe4af --- /dev/null +++ b/static/default.css @@ -0,0 +1,506 @@ +:root { + --body-background: #fbfbfb; + --body-color: black; + --content-border: 1px #CCC solid; + --content-color: white; + --header-color: var(--link); + --header-footer: #f0f0f0; + --header-footer-link: #696969; + --leftcontent-link-hover: white; + --mainmenu: inherit; + --mainmenu-hover: #eeeee2; + --footer-link: #8e8e8e; + --link: #c26a00; + --link-decoration: none; + --link-hover: #e07f0b; + --link-hover-decoration: none; + --table-header: #ffffd1; + --table-body: #fffff2; + --table-outline: 1px solid black; + --table-separator: 1px dotted black; + --dl-background: lavender; + --submit-color: #eee; +} + +@media (prefers-color-scheme: dark) { + :root { + --body-background: #161616; + --body-color: #ccc; + --content-border: 1px #282828 solid; + --content-background: #1c1c1c; + --header-color: white; + --header-footer: #161616; + --header-footer-link: #ffb015; + --leftcontent-link-hover: black; + --mainmenu: #282828; + --mainmenu-hover: #333333; + --footer-link: #ffb015; + --link: #ffb015; + --link-decoration: none; + --link-hover: #ffb015; + --link-hover-decoration: underline; + --table-header: #282828; + --table-body: #282828; + --table-outline: 1px solid #282828; + --table-separator: 1px dotted #444; + --dl-background: #282828; + --submit-color: #282828; + } +} + +* { + border: 0; + margin: 0; + padding: 0; + font-family: "DejaVu sans", Verdana, sans-serif; + font-size: 1.0em; + background: transparent; +} + +code { + font-family: monospace; +} + +.center { + text-align: center; +} + +ul.mainmenu { + border:0px; + margin-bottom:50px; +} + + +ul.mainmenu { + list-style-type: none; + max-width: 800px; + margin: auto; +} + +ul.mainmenu li{ + float:left; + margin: 1ex; + width: 15em; + height: 29ex; + position:relative; + text-align: center; + font-family: sans-serif; + font-size: 75%; + background-color: var(--mainmenu); + padding: 1ex; +} + +ul.mainmenu li a { + padding-top:2ex; + display: block; + text-decoration: var(--link-decoration); + height: 27ex; +} + +ul.mainmenu li a:hover { + background-color: var(--mainmenu-hover); +} + +@font-face { + font-family: CantaReg; + src: url('Cantarell-Regular.otf'); +} + +body { + background-color: var(--body-background); + color: var(--body-color); + display: grid; + grid-template-columns: 200px 1fr; + grid-template-rows: min-content 1fr min-content; +} + +a:link, a:visited { + color: var(--link); + background: transparent; + text-decoration: var(--link-decoration); +} + +a:hover { + color: var(--link-hover); + background: transparent; + text-decoration: var(--link-hover-decoration); +} + +#header { + grid-column: 1 / span 2; + grid-row: 1; + padding-right: 10px; + background-color: var(--header-footer); + border-bottom: var(--content-border); +} + +#header img { + position: absolute; + width: 170px; + margin-left: 30px; + margin-top: 10px; + margin-bottom: 5px; +} + +#header h1 { + position: relative; + margin-left: 220px; + padding-top: 12px;/*15*/ + color: var(--link); + text-align: center; + font-family: "CantaReg", "Cantarell"; + font-size: 1.7em; +} + +#header ul { + float: right; + list-style-image: none; + list-style-type: none; + margin-right: 30px; +} + +#header ul li { + float: left; +} + +#header ul li a { + line-height: 48px; + font-size: 0.88em; + font-weight: bold; + letter-spacing: -1px; + text-decoration: var(--link-decoration); + color: var(--link); + text-shadow: var(--header-footer) 0px 0px 10px; + -moz-transition: color 250ms ease-out; + transition: color 250ms ease-out; + padding-left: 20px; +} + +#header ul li a:hover { + color: var(--link-hover); +} + +#header h1 { + /*width: 500px;*/ +} + +#leftcontent { + grid-column: 1; + grid-row: 2; + padding-top: 20px; + border-bottom: var(--content-border); +} + +#leftcontent ul { + padding-bottom: 20px; + list-style-image: none; + list-style-type: none; + margin-left: 25px; +} + +#leftcontent ul li a { + display: block; + padding-top: 7px; + padding-bottom: 7px; + padding-left: 7px; + color: var(--header-footer-link); + font-size: 0.9em; +} + +#leftcontent ul li a:hover { + color: var(--leftcontent-link-hover); + background-color: var(--header-footer-link); +} + +#content { + grid-column: 2; + grid-row: 2; + border-left: var(--content-border); + border-bottom: var(--content-border); + position: relative; + min-height: 400px; + background-color: var(--content-background); +} + +#content .palette { + height: 1px; + width: auto; +} + +#content #page { + /*margin-top: 10px;*/ + padding-top: 20px; + margin-left: 15px; + margin-right: 15px; + padding-bottom: 20px; + font-size: 0.95em; +} + +#content ul { + padding-top: 10px; + padding-left: 48px; +} + +h1 { + color: #B00000; + margin-left: 10px; + font-weight: bold; + margin-bottom: 10px; + font-size: 1.2em; +} + +h2 { + color: var(--link); + margin-left: 5px; + font-weight: bold; + margin: 30px; + font-size: 1.05em; +} + +p { + margin-top: 10px; +} + +#footer { + grid-column: 1 / span 2; + grid-row: 3; + width: 100%; + padding-bottom: 20px; + background-color: var(--header-footer); + padding-top: 10px; +} + +#footer h1 { + font-size: 1.2em; + color: #363636; +} + +#footer ul { + list-style-image: none; + list-style-type: none; + text-align: center; +} + +#footer ul li { + display: inline; +} + +#footer ul li a { + font-size: 0.88em; + letter-spacing: -1px; + text-decoration: var(--link-decoration); + color: var(--footer-link); + margin-right: 20px; +} + +#footer ul li a:hover { + color: var(--header-footer-link); +} + +#footer img { + float: right; + padding-right: 10px; +} + +table.lastposts { + border: var(--table-outline); + margin-top: 5px; + margin-left: auto; + margin-right: auto; + text-align: center; + border-collapse: collapse; +} + +table.lastposts td { + border: var(--table-separator); + padding: 1px 10px 1px 10px; +} + +table.lastposts td a { + text-decoration: var(--link-decoration); +} + +table.lastposts td a:hover { + text-decoration: underline; +} + + +table { + background-color: var(--table-body); + border: var(--table-outline); + margin-top: 5px; + margin-left: auto; + margin-right: auto; + text-align: center; + border-collapse: collapse; +} + +table th { + border: var(--table-separator); + padding: 2px 5px 2px 5px; + background-color: var(--table-header); +} + +table td { + border: var(--table-separator); + padding: 2px 5px 2px 5px; +} + +div.rows { + margin: 20px 20px 20px 20px; + padding: 10px 10px 10px 10px; + display: flex; + flex-flow: column nowrap; + align-items: center; +} + +div.row { + margin: 20px 20px 20px 20px; + padding: 10px 10px 10px 10px; +} + +div.row .hash { + word-wrap: break-word; + overflow-wrap: break-word; + font-family: mono; + /* color: black; */ +} + +figure { + width: 60vw; +} + +figcaption { + display: block; + /* background-color: lavender; */ +} + +dl { + background-color: var(--dl-background); +} + +dt { + font-weight: bold; +} + +dd { + margin-top: .5em; + margin-bottom: 1em; +} + + +p.error { + border: 2px var(--link) solid; + margin-top: 20px; + margin-bottom: 20px; + width: 500px; + display: block; + margin-left: auto; + margin-right: auto; + text-align: center; + padding: 20px; +} + +form { + margin: 10px; + padding: 10px; + max-width: 800px; + background-color: var(--table-body); + border: var(--table-outline); +} + +label { + width: 14em; + display: inline-block; + font-weight: bold; +} + +input, select { + border: 1px var(--link) solid; + padding: 5px; + color: var(--body-color); +} + +input[type="submit"] { + background-color: var(--link); + color: var(--submit-color); +} + +textarea { + border: var(--table-outline); + color: var(--body-color); + background-color: var(--table-body); + border: 1px solid black; + margin-top: 5px; + width: 100%; + height: 100px; +} + +@media (max-width: 800px) { + body { + grid-template-columns: 1fr; + grid-template-rows: min-content 1fr min-content min-content; + } + + #header > a { + margin-left: auto; + margin-right: auto; + } + + #header img { + position: inherit; + } + + #header h1 { + margin-left: inherit; + padding-top: inherit; + } + + #leftcontent { + grid-column: 1; + grid-row: 3; + padding-top: 20px; + } + + #content { + grid-column: 1; + grid-row: 2; + } + + #content img { + width: 40px; + height: 40px; + } + + #footer { + grid-row: 4; + } +} + +@media (max-width: 640px) { + #liste > table tr > td:nth-child(3), + #liste > table tr > th:nth-child(2) { + display: none; + } +} + +@media (max-width: 440px) { + #liste > table tr > td:nth-child(4), + #liste > table tr > th:nth-child(3) { + display: none; + } +} + +/* +h1 { +color: #B00000; +} + +#footer h1 { +color: #363636; +} + +input { +color: #B00000; +} +*/ diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..acf51c0 Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/favicon.ico.gz b/static/favicon.ico.gz new file mode 100644 index 0000000..f7a0f6a Binary files /dev/null and b/static/favicon.ico.gz differ diff --git a/static/favicon.svg b/static/favicon.svg new file mode 100644 index 0000000..0b01608 --- /dev/null +++ b/static/favicon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/favicon.svg.gz b/static/favicon.svg.gz new file mode 100644 index 0000000..e194c0e Binary files /dev/null and b/static/favicon.svg.gz differ diff --git a/static/img/annuaire.png b/static/img/annuaire.png new file mode 100644 index 0000000..c1371cb Binary files /dev/null and b/static/img/annuaire.png differ diff --git a/static/img/chat.png b/static/img/chat.png new file mode 100644 index 0000000..2af92c7 Binary files /dev/null and b/static/img/chat.png differ diff --git a/static/img/forum.png b/static/img/forum.png new file mode 100644 index 0000000..a3941a3 Binary files /dev/null and b/static/img/forum.png differ diff --git a/static/img/news.png b/static/img/news.png new file mode 100644 index 0000000..fbc0edf Binary files /dev/null and b/static/img/news.png differ diff --git a/static/img/planet.png b/static/img/planet.png new file mode 100644 index 0000000..26a046a Binary files /dev/null and b/static/img/planet.png differ diff --git a/static/img/wiki.png b/static/img/wiki.png new file mode 100644 index 0000000..82008db Binary files /dev/null and b/static/img/wiki.png differ diff --git a/static/logo.svg b/static/logo.svg new file mode 100644 index 0000000..1e0ac96 --- /dev/null +++ b/static/logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/footer.html b/templates/footer.html new file mode 100644 index 0000000..6c2ca5c --- /dev/null +++ b/templates/footer.html @@ -0,0 +1,14 @@ + + + diff --git a/templates/header.html b/templates/header.html new file mode 100644 index 0000000..91232be --- /dev/null +++ b/templates/header.html @@ -0,0 +1,36 @@ +{% load static %} + + {{ title | default:"JabberFR : informations et entraide francophone sur Jabber" }} + + + + + + + + + + + + + + diff --git a/templates/page_model.html b/templates/page_model.html new file mode 100644 index 0000000..f7ce653 --- /dev/null +++ b/templates/page_model.html @@ -0,0 +1,11 @@ + + +{% include "header.html" %} +
+
+ {% block content %} + {% endblock %} +
+
+{% include "footer.html" %} +