First version of the website, with most static pages
12
README.rst
Normal file
@ -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)
|
0
jabberfr/__init__.py
Normal file
16
jabberfr/asgi.py
Normal file
@ -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()
|
12
jabberfr/hosts.py
Normal file
@ -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')
|
||||
)
|
116
jabberfr/settings.py
Normal file
@ -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'
|
||||
]
|
0
jabberfr/subsites/__init__.py
Normal file
7
jabberfr/subsites/chat_urls.py
Normal file
@ -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),
|
||||
]
|
6
jabberfr/subsites/irc_urls.py
Normal file
@ -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'))
|
||||
]
|
20
jabberfr/templates/chat/index.html
Normal file
@ -0,0 +1,20 @@
|
||||
{% extends "page_model.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div id="liste">
|
||||
<h2>Les salons les plus fréquentés</h2>
|
||||
|
||||
{{ rooms | safe }}
|
||||
|
||||
</div>
|
||||
|
||||
<div id="intro">
|
||||
<h2>Salons de discussion de <a href="//jabberfr.org/">JabberFR.org</a>.</h2>
|
||||
<p>Ce service permet de discuter à plusieurs en utilisant un client Jabber. Pour ce faire, suivez les instructions du <a href="//wiki.jabberfr.org/MUC">Wiki de JabberFR</a>.</p>
|
||||
<p>Vous pouvez aussi rejoindre directement un salon en cliquant sur la bulle dans la liste à droite.</p>
|
||||
<!--<p>L'<a href="logs/">historique des discussions est disponible</a> si vous l'avez configuré pour votre salle.</p>-->
|
||||
</div>
|
||||
|
||||
|
||||
{% endblock %}
|
19
jabberfr/templates/contact.html
Normal file
@ -0,0 +1,19 @@
|
||||
{% extends "page_model.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div style="margin-left: 50px">
|
||||
<h2>Nous contacter</h2>
|
||||
<p>Nous sommes disponibles sur Jabber bien sûr, notamment :</p>
|
||||
<ul style="margin-left: 30px; margin-top: 10px">
|
||||
<li>pour toute question sur l’association, <a href="xmpp:association@chat.jabberfr.org?join">association@chat.jabberfr.org</a> (<a href="https://candy.jabberfr.org/association@chat.jabberfr.org">web chat</a>) ;</li>
|
||||
<li>pour les questions générales, <a href="xmpp:jabberfr@chat.jabberfr.org?join">jabberfr@chat.jabberfr.org</a> (<a href="https://candy.jabberfr.org/jabberfr@chat.jabberfr.org">web chat</a>) ;</li>
|
||||
<li>si vous avez une question privée, notamment de sécurité, <a href="mailto:admins@jabberfr.org">admins@jabberfr.org</a>.</li>
|
||||
</ul>
|
||||
|
||||
<p>Si vous devez contacter l’un des administrateurs en privé, voici qui nous sommes :</p>
|
||||
<ul style="margin-left: 30px; margin-top: 10px">
|
||||
<li>Link Mauve (JID : <a href="xmpp:linkmauve@linkmauve.fr">linkmauve@linkmauve.fr</a>) ;</li>
|
||||
<li>mathieui (JID : <a href="xmpp:mathieui@mathieui.net">mathieui@mathieui.net</a>).</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endblock %}
|
29
jabberfr/templates/index.html
Normal file
@ -0,0 +1,29 @@
|
||||
{% extends "page_model.html" %}
|
||||
{% load static %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div style="width:100%;margin-left:auto;margin-right:auto;">
|
||||
<ul class="mainmenu">
|
||||
<li><a href="//wiki.jabberfr.org/"><img src="{% static "/img/wiki.png" %}" alt="Wiki"/><br/> Un Wiki pour découvrir Jabber</a></li>
|
||||
<li><a href="//chat.jabberfr.org/"><img src="{% static "/img/chat.png" %}" alt="Chat"/><br/> Un serveur de salons de discussion pour discuter à plusieurs.</a></li>
|
||||
<li><a href="//news.jabberfr.org/"><img src="{% static "/img/news.png" %}" alt="News" /><br/>Un site de nouvelles sur Jabber</a></li>
|
||||
<li><a href="//planet.jabberfr.org/"><img src="{% static "/img/planet.png" %}" alt="Planet" /><br/>Un agrégateur de blogs francophones sur Jabber</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="center" style="clear:both">
|
||||
<h2>Qu'est-ce que JabberFR ?</h2>
|
||||
<p>JabberFR est le site de la communauté francophone des utilisateurs de Jabber.<br/> Ce site a pour but de regrouper tous les utilisateurs francophones de Jabber.<br/><a href="//wiki.jabberfr.org/JabberFR">Plus d'informations sur JabberFR</a></p>
|
||||
</div>
|
||||
|
||||
|
||||
<div style="clear:both;" class="center" id="liste">
|
||||
<h2>Nos salons les plus fréquentés</h2>
|
||||
|
||||
{{ rooms | safe }}
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
12
jabberfr/templates/irc/index.html
Normal file
@ -0,0 +1,12 @@
|
||||
{% extends "page_model.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h2>Passerelle IRC</h2>
|
||||
<p>
|
||||
Passerelle IRC publique utilisant <a href="https://biboumi.louiz.org/">biboumi</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Pour rejoindre un <a href="https://fr.wikipedia.org/wiki/Internet_Relay_Chat">canal IRC</a>, rejoignez #le-canal%le-serveur-irc@irc.jabberfr.org avec votre <a href="https://wiki.jabberfr.org/Clients">client Jabber</a> préféré comme tout autre <a href="https://wiki.jabberfr.org/MUC">salon de discussion</a>.
|
||||
</p>
|
||||
{% endblock %}
|
11
jabberfr/templates/legal.html
Normal file
@ -0,0 +1,11 @@
|
||||
{% extends "page_model.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h2>Informations légales</h2>
|
||||
|
||||
<p>Les images du menu illustrant le wiki, le forum, le chat, les news et le planet sont dans le domaine public.</p>
|
||||
<p>L'image illustrant l'annuaire est sous licence <a href="https://creativecommons.org/licenses/by-sa/2.5/deed.fr">Creative Commons Attribution ShareAlike 2.5</a> issu du <a href="http://tango-project.org">projet tango</a> et légèrement modifié.</p>
|
||||
<p>Le logo de JabberFR est sous licence <a href="https://creativecommons.org/licenses/by-sa/2.0/fr/">Creative Commons Attribution ShareAlike 2.0</a>, d’après un design de <a href="https://svay.com/">Maurice Svay</a>.</p>
|
||||
|
||||
{% endblock %}
|
35
jabberfr/urls.py
Normal file
@ -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
|
||||
]
|
49
jabberfr/views.py
Normal file
@ -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 = """
|
||||
<td colspan="5"><a href="//chat.jabberfr.org" style="display: table-cell; font-weight: bold; line-height: 2em">Voir plus…</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
"""
|
||||
|
||||
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 = '<p>Impossible de récupérer la liste des salons !</p>'
|
||||
context = {
|
||||
'rooms': rooms,
|
||||
}
|
||||
return render(request, 'index.html', context)
|
||||
|
||||
|
||||
async def get_chat_index(request):
|
||||
try:
|
||||
rooms = await get_chatrooms()
|
||||
except ClientError:
|
||||
rooms = '<p>Impossible de récupérer la liste des salons !</p>'
|
||||
context = {
|
||||
'title': 'Salons de discussion de JabberFR',
|
||||
'rooms': rooms,
|
||||
}
|
||||
|
||||
return render(request, 'chat/index.html', context=context)
|
16
jabberfr/wsgi.py
Normal file
@ -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()
|
22
manage.py
Executable file
@ -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()
|
301
poetry.lock
generated
Normal file
@ -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"},
|
||||
]
|
18
pyproject.toml
Normal file
@ -0,0 +1,18 @@
|
||||
[tool.poetry]
|
||||
name = "jabberfr"
|
||||
version = "0.1.0"
|
||||
description = "Site de jabberfr"
|
||||
authors = ["mathieui <mathieui@mathieui.net>"]
|
||||
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"
|
506
static/default.css
Normal file
@ -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;
|
||||
}
|
||||
*/
|
BIN
static/favicon.ico
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
static/favicon.ico.gz
Normal file
15
static/favicon.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="jabberfr" viewBox="205 -30 170 170">
|
||||
<path fill="white" d="m225.48077 20.641025 12.17949 60.096154 37.5 12.98077 7.37179 15.544871 L300 95.961538 l48.55769 -6.891025 8.01282 -10.256411 3.04488 -50 -16.34616 -18.269231 -92.94872 -5.6089739 z"/>
|
||||
<path fill="#b00000" d="M248.47266 0 222 19.40625 v53.882812 l20.04102 20.367188 29.60156 2.654297 -2.64281 32.105473 32.25781 -30.548832 39.66797 1.419921 L360.0293 83.5 364 27.248047 345.54492 4.2207031 Z m6.79492 8.6796875 86.45117 3.8886715 15.63236 18.08428 -3.7183 46.927439 -12.91797 10.572266 -40.24218 -1.417969 -17.17969 17.751955 2.4043 -18.123049 L249.5 82.951172 236.28711 68.691406 235.00781 23.5 Z"/>
|
||||
<g fill="#ffb015">
|
||||
<path d="m272.59358 59.371657 -6.48395 3.342246 3.47593 3.074867 4.54546 -4.411765 z"/>
|
||||
<path d="m273.93048 38.114973 -6.48396 -2.473262 -0.6016 3.81016 6.21658 0.40107 z"/>
|
||||
<path d="m286.1631 21.537433 -4.67914 -4.74599 -2.07219 2.339573 4.74598 3.275401 z"/>
|
||||
<path d="m306.75134 19.398395 1.60428 -4.879679 3.20855 0.735294 -2.6738 4.946524 z"/>
|
||||
<path d="m325.66845 30.561497 5.34759 -5.080214 2.27273 2.406417 -6.35027 4.411765 z"/>
|
||||
<path d="m330.14706 50.681818 7.82086 0.467914 -1.3369 3.676471 -6.81819 -1.804813 z"/>
|
||||
<path d="m321.99198 64.318181 5.08021 4.21123 -2.67379 2.740642 -3.74332 -5.213904 z"/>
|
||||
<path d="M300.58398 28.605469 C296.45631 28.48849 292.04521 29.557904 287.83398 33.234375 C279.41152 40.587316 278.47637 53.021975 287.43359 61.578125 L287.57031 69.787109 289.93359 72.90625 C289.17732 80.752488 299.38589 84.628297 302.31641 75.269531 L306.19141 72.529297 309.40625 65.439453 309.18164 65.400391 C315.28389 61.897121 319.6569 53.927534 320.45508 48.074219 C321.25722 42.191866 317.78059 33.234741 311.63086 31.095703 C308.55599 30.026185 304.71166 28.722447 300.58398 28.605469 z M300.62109 34.353516 C300.98491 34.365037 301.3581 34.393497 301.73828 34.439453 C313.90405 35.910042 315.10635 39.518236 314.97266 45.667969 C314.83897 51.817702 311.49779 57.165734 305.88281 58.101562 C305.6394 58.142131 305.40074 58.171766 305.16211 58.203125 L302.13867 67.193359 298.5293 69.867188 295.85547 66.123047 295.85547 57.433594 C286.01255 49.792383 289.34279 33.996346 300.62109 34.353516 z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
BIN
static/favicon.svg.gz
Normal file
BIN
static/img/annuaire.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
static/img/chat.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
static/img/forum.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
BIN
static/img/news.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
static/img/planet.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
static/img/wiki.png
Normal file
After Width: | Height: | Size: 9.8 KiB |
22
static/logo.svg
Normal file
After Width: | Height: | Size: 13 KiB |
14
templates/footer.html
Normal file
@ -0,0 +1,14 @@
|
||||
<footer id="footer">
|
||||
<ul>
|
||||
<li><a href="//jabberfr.org/legal">Mentions légales</a></li>
|
||||
<li><a href="//wiki.jabberfr.org/CGU">Conditions Générales d’Utilisation</a></li>
|
||||
<li><a href="//jabberfr.org/contact/">Contact</a></li>
|
||||
<li><a href="//statut.jabberfr.org">Statut</a></li>
|
||||
<li><a href="//stats.jabberfr.org">Statistiques</a></li>
|
||||
<li><a href="//jabberfr.org/certificats">Certificats</a></li>
|
||||
<!--<li><a href="/privacy">Vie Privée</a></li>-->
|
||||
<li><a href="https://www.chatons.org">CHATONS</a></li>
|
||||
</ul>
|
||||
</footer>
|
||||
|
||||
</body>
|
36
templates/header.html
Normal file
@ -0,0 +1,36 @@
|
||||
{% load static %}
|
||||
<head>
|
||||
<title>{{ title | default:"JabberFR : informations et entraide francophone sur Jabber" }}</title>
|
||||
<!-- Titre alternatif : « JabberFR, même Cédric a compris comment faire ! » -->
|
||||
<meta name="keywords" content="jabber, xmpp, aide, francais, france, francophone"/>
|
||||
<meta name="description" content="JabberFR : informations et entraide francophone sur Jabber"/>
|
||||
<meta name="author" content="Erwan Briand"/>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
|
||||
<link href="{% static "/default.css" %}" rel="stylesheet" type="text/css" />
|
||||
<link href="{% static "/favicon.ico" %}" rel="shortcut icon" />
|
||||
</head>
|
||||
<body>
|
||||
<header id="header">
|
||||
<a title="Accueil" href="//jabberfr.org"><img src="{% static "/logo.svg" %}" alt="JabberFR"/></a>
|
||||
|
||||
<h1>{{ title | default:"JabberFR : informations et entraide francophone sur Jabber" }}</h1>
|
||||
</header>
|
||||
|
||||
<nav id="leftcontent">
|
||||
<ul>
|
||||
<li><a href="//jabberfr.org">Accueil</a></li>
|
||||
<li><a href="//news.jabberfr.org">Actualités</a></li>
|
||||
<li><a href="//planet.jabberfr.org">Agrégateur de blogs</a></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a href="//wiki.jabberfr.org">Documentation</a></li>
|
||||
<li><a href="//chat.jabberfr.org">Salons de discussion</a></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a href="//wiki.jabberfr.org/JabberFR">L'association</a></li>
|
||||
<li><a href="//jabberfr.org/adhesion/">Adhésion</a></li>
|
||||
<li><a href="/inscription/">Inscription</a></li>
|
||||
</ul>
|
||||
</nav>
|
11
templates/page_model.html
Normal file
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr_FR" xml:lang="fr_FR">
|
||||
{% include "header.html" %}
|
||||
<article id="content">
|
||||
<div id="page">
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
</article>
|
||||
{% include "footer.html" %}
|
||||
</html>
|