This commit is contained in:
lucien 2017-09-22 16:49:10 +02:00
commit b4497bea18
20 changed files with 563 additions and 227 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

1
.gitignore vendored
View File

@ -4,6 +4,7 @@
.env
__pycache__
afpy.egg-info
static/css/*.map
# PyCharm project files
.idea

View File

@ -19,7 +19,7 @@ check-outdated:
$(PIP) list --outdated --format=columns
test:
$(PYTEST) tests.py --flake8 --isort --cov=afpy --cov=tests
$(PYTEST) tests.py --flake8 --isort --cov=afpy --cov=tests --cov-report=term-missing
serve:
$(VENV)/bin/afpy.py

38
afpy.py
View File

@ -1,9 +1,14 @@
import datetime
import locale
import docutils.core
import docutils.writers.html5_polyglot
import feedparser
from flask import Flask, abort, render_template
from jinja2 import TemplateNotFound
locale.setlocale(locale.LC_ALL, 'fr_FR')
app = Flask(__name__)
FEEDS = {
@ -12,8 +17,14 @@ FEEDS = {
}
MEETUPS = {
'nantes': 'http://nantes.afpy.org/feeds/all.atom.xml',
'bruxelles': (
'https://www.meetup.com/fr-FR/'
'Belgium-Python-Meetup-aka-AperoPythonBe/events/rss/'),
'grenoble': (
'https://www.meetup.com/fr-FR/'
'Groupe-dutilisateurs-Python-Grenoble/events/rss/'),
'lyon': 'https://www.meetup.com/fr-FR/Python-AFPY-Lyon/events/rss/',
'nantes': 'http://nantes.afpy.org/feeds/all.atom.xml',
}
for city, url in MEETUPS.items():
@ -40,24 +51,35 @@ def pages(name='index'):
@app.route('/docs/<name>')
def rest(name):
with open(f'templates/{name}.rst') as fd:
parts = docutils.core.publish_parts(
source=fd.read(),
writer=docutils.writers.html5_polyglot.Writer(),
settings_overrides={'initial_header_level': 2})
try:
with open(f'templates/{name}.rst') as fd:
parts = docutils.core.publish_parts(
source=fd.read(),
writer=docutils.writers.html5_polyglot.Writer(),
settings_overrides={'initial_header_level': 2})
except FileNotFoundError:
abort(404)
return render_template(
'rst.html', body_id=name, html=parts['body'], title=parts['title'])
@app.route('/feed/<name>')
def feed(name):
feed = feedparser.parse(FEEDS[name])
try:
feed = feedparser.parse(FEEDS[name])
except KeyError:
abort(404)
return render_template(
'feed.html', body_id=name, entries=feed.entries,
title=feed.feed.get('title'))
if __name__ == '__main__':
@app.template_filter('datetime')
def format_datetime(time_struct, format_):
return datetime.datetime(*time_struct[:6]).strftime(format_)
if __name__ == '__main__': # pragma: no cover
from sassutils.wsgi import SassMiddleware
app.wsgi_app = SassMiddleware(
app.wsgi_app, {'afpy': ('sass', 'static/css', '/static/css')})

View File

@ -5,33 +5,80 @@ $action: #2e5cfd
$action-secondary: #ffcd05
$text: #eaeaea
a
color: $action-secondary
font-size: .8em
font-weight: 700
text-decoration: none
text-transform: uppercase
transition: color 250ms
&:hover
color: lighten($action-secondary, 10%)
input[type="submit"]
background: $action
border: 0
color: #fff
cursor: pointer
font-family: 'Hind', sans-serif
outline: transparent
padding: 1em 2em
text-transform: uppercase
transition: background 250ms
&:hover
background: lighten($action, 5%)
code
background: $header
border-bottom: 1px solid $action-secondary
display: block
padding: 2em
iframe
border: 0
height: 450px
width: 100%
body
background: $bkg
color: $text
display: flex
flex-wrap: wrap
flex-direction: column
font-family: 'Hind', sans-serif
font-size: .9em
font-weight: 300
margin: 0
min-height: 100vh
padding: 0
header
background: $header
order: 1
width: 100%
nav
flex: 1 100%
align-items: center
display: flex
justify-content: center
min-height: 70px
order: 0
ul
display: flex
justify-content: center
list-style: none
margin: 0
padding-left: 0
li
&:first-child
a::before
content: url(../images/logo.svg)
left: 3em
position: absolute
top: 10px
a
color: $text
display: block
@ -39,14 +86,34 @@ nav
padding: 1em
text-decoration: none
.active a
color: $action-secondary
main
margin: 0 auto
flex-grow: 1
margin: 1em auto 0
max-width: 1200px
order: 3
width: 100%
footer
background: $header
margin-top: 2em
order: 4
ul
display: flex
justify-content: center
list-style: none
padding: 0
a
color: inherit
text-decoration: inherit
padding: 1em
h1
color: $action-secondary
flex: 1 100%
font-weight: 300
margin: 2em auto
max-width: 1200px
@ -62,25 +129,51 @@ h1
display: block
h2
font-size: 2em
font-weight: 400
.simple
dd
margin-left: 1em
p:before
content: ''
display: inline
time
display: block
#planet main, #emplois main, #index-news
box-sizing: border-box
display: flex
flex-wrap: wrap
dt
article
background: lighten($bkg, 5%)
border: 1px solid $bkg
box-sizing: border-box
display: flex
flex-direction: column
line-height: 50px
text-align: center
padding: 1em
width: 300px
flex: 1 50%
padding: 2em
dd
box-sizing: border-box
margin-left: -300px
padding: 3em 0 0
text-align: center
width: 300px
a
color: $action-secondary
font-size: .8em
font-weight: 700
text-decoration: none
text-transform: uppercase
transition: color 250ms
&:hover
color: lighten($action-secondary, 10%)
h2
flex: 1 100%
article
background: lighten($bkg, 5%)
border: 1px solid $bkg
box-sizing: border-box
flex: 1 50%
padding: 2em
h2
font-size: 1.2em
font-weight: 600

BIN
static/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -1,44 +1,103 @@
@charset "UTF-8";
@import url("https://fonts.googleapis.com/css?family=Hind:300,400,600,700");
a {
color: #ffcd05;
font-size: .8em;
font-weight: 700;
text-decoration: none;
text-transform: uppercase;
transition: color 250ms; }
a:hover {
color: #ffd738; }
input[type="submit"] {
background: #2e5cfd;
border: 0;
color: #fff;
cursor: pointer;
font-family: 'Hind', sans-serif;
outline: transparent;
padding: 1em 2em;
text-transform: uppercase;
transition: background 250ms; }
input[type="submit"]:hover {
background: #4770fd; }
code {
background: #1d1e23;
border-bottom: 1px solid #ffcd05;
display: block;
padding: 2em; }
iframe {
border: 0;
height: 450px;
width: 100%; }
body {
background: #25252D;
color: #eaeaea;
display: flex;
flex-wrap: wrap;
flex-direction: column;
font-family: 'Hind', sans-serif;
font-size: .9em;
font-weight: 300;
margin: 0;
min-height: 100vh;
padding: 0; }
header {
background: #1d1e23;
order: 1;
width: 100%; }
order: 1; }
nav {
flex: 1 100%;
align-items: center;
display: flex;
justify-content: center;
min-height: 70px;
order: 0; }
nav ul {
display: flex;
justify-content: center;
list-style: none;
margin: 0;
padding-left: 0; }
nav ul li:first-child a::before {
content: url(../images/logo.svg);
left: 3em;
position: absolute;
top: 10px; }
nav ul a {
color: #eaeaea;
display: block;
font-weight: 600;
padding: 1em;
text-decoration: none; }
nav ul .active a {
color: #ffcd05; }
main {
margin: 0 auto;
flex-grow: 1;
margin: 1em auto 0;
max-width: 1200px;
order: 3; }
order: 3;
width: 100%; }
footer {
background: #1d1e23;
margin-top: 2em;
order: 4; }
footer ul {
display: flex;
justify-content: center;
list-style: none;
padding: 0; }
footer ul a {
color: inherit;
text-decoration: inherit;
padding: 1em; }
h1 {
color: #ffcd05;
flex: 1 100%;
font-weight: 300;
margin: 2em auto;
max-width: 1200px; }
@ -52,25 +111,46 @@ h1 {
display: block; }
h2 {
font-size: 2em;
font-weight: 400; }
.simple {
dd {
margin-left: 1em; }
dd p:before {
content: '→ ';
display: inline; }
time {
display: block; }
#planet main, #emplois main, #index-news {
box-sizing: border-box;
display: flex;
flex-wrap: wrap; }
.simple dt {
#planet main article, #emplois main article, #index-news article {
background: #31313b;
border: 1px solid #25252D;
box-sizing: border-box;
display: flex;
flex-direction: column;
line-height: 50px;
text-align: center;
padding: 1em;
width: 300px; }
.simple dd {
box-sizing: border-box;
margin-left: -300px;
padding: 3em 0 0;
text-align: center;
width: 300px; }
flex: 1 50%;
padding: 2em; }
#planet main article a, #emplois main article a, #index-news article a {
color: #ffcd05;
font-size: .8em;
font-weight: 700;
text-decoration: none;
text-transform: uppercase;
transition: color 250ms; }
#planet main article a:hover, #emplois main article a:hover, #index-news article a:hover {
color: #ffd738; }
#planet main article h2, #emplois main article h2, #index-news article h2 {
flex: 1 100%; }
#planet main article article, #emplois main article article, #index-news article article {
background: #31313b;
border: 1px solid #25252D;
box-sizing: border-box;
flex: 1 50%;
padding: 2em; }
#planet main article article h2, #emplois main article article h2, #index-news article article h2 {
font-size: 1.2em;
font-weight: 600; }
/*# sourceMappingURL=../static/css/style.sass.css.map */

View File

@ -6,4 +6,4 @@
],
"names": [],
"mappings": "AAAA,OAAO,CAAC,mEAAI;AAOZ,AAAA,IAAI,CAAC;EACH,UAAU,EAPN,OAAO;EAQX,KAAK,EAJA,OAAO;EAKZ,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,kBAAkB;EAC/B,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC,GAAI;;AAEhB,AAAA,MAAM,CAAC;EACL,UAAU,EAjBH,OAAO;EAkBd,KAAK,EAAE,CAAC;EACR,KAAK,EAAE,IAAI,GAAI;;AAEjB,AAAA,GAAG,CAAC;EACF,IAAI,EAAE,MAAM;EACZ,KAAK,EAAE,CAAC,GAcyB;EAhBnC,AAIE,GAJC,CAID,EAAE,CAAC;IACD,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,MAAM;IACvB,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,CAAC;IACT,YAAY,EAAE,CAAC,GAOc;IAhBjC,AAWI,GAXD,CAID,EAAE,CAOA,CAAC,CAAC;MACA,KAAK,EA9BJ,OAAO;MA+BR,OAAO,EAAE,KAAK;MACd,WAAW,EAAE,GAAG;MAChB,OAAO,EAAE,GAAG;MACZ,eAAe,EAAE,IAAI,GAAI;;AAE/B,AAAA,IAAI,CAAC;EACH,MAAM,EAAE,MAAM;EACd,SAAS,EAAE,MAAM;EACjB,KAAK,EAAE,CAAC,GAAI;;AAEd,AAAA,EAAE,CAAC;EACD,KAAK,EA3CY,OAAO;EA4CxB,IAAI,EAAE,MAAM;EACZ,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,QAAQ;EAChB,SAAS,EAAE,MAAM,GAUK;EAfxB,AAOE,EAPA,AAOA,OAAQ,CAAC;IACP,UAAU,EAlDK,OAAO;IAmDtB,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,IAAI,GAAI;EAZnB,AAcE,EAdA,CAcA,IAAI,CAAC;IACH,OAAO,EAAE,KAAK,GAAI;;AAEtB,AAAA,EAAE,CAAC;EACD,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,GAAG,GAAI;;AAEtB,AAAA,OAAO,CAAC;EACN,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI,GAgBK;EAlBtB,AAIE,OAJK,CAIL,EAAE,CAAC;IACD,UAAU,EAAE,UAAU;IACtB,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,KAAK,GAAI;EAXpB,AAaE,OAbK,CAaL,EAAE,CAAC;IACD,UAAU,EAAE,UAAU;IACtB,WAAW,EAAE,MAAM;IACnB,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,MAAM;IAClB,KAAK,EAAE,KAAK,GAAI"
}
}

BIN
static/images/.DS_Store vendored Normal file

Binary file not shown.

50
static/images/logo.svg Normal file
View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="50px" height="50px" viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
<g id="g2894" transform="matrix(0.6745946,0,0,0.6745946,-109.00393,-38.014)">
<path id="path2896" fill="#FFFFFF" d="
M232.658,307.102c-56.779-42.106-68.673-122.269-26.566-179.048c42.109-56.777,122.27-68.671,179.049-26.564
c56.779,42.106,68.673,122.269,26.568,179.048c-42.106,56.775-122.259,68.673-179.038,26.578"/>
<path id="path2898" fill="#FF6F32" d="M309.282,203.137l-87.73,111.1
c48.834,38.695,114.96,41.116,166.467,6.057L309.282,203.137L309.282,203.137z"/>
<path id="path2900" fill="#84326B" d="M309.282,203.137
l76.913,118.409c52.698-34.653,75.588-97.834,57.316-158.199L309.282,203.137z"/>
<path id="path2902" fill="#32ADA9" d="M309.282,203.137
l134.999-37.289c-17.225-61.021-71.138-102.043-134.542-102.42L309.282,203.137L309.282,203.137z"/>
<path id="path2904" fill="#EBFF32" d="M309.282,203.137L313.2,63.523
c-63.294-1.913-118.602,36.98-138.097,97.228L309.282,203.137z"/>
<path id="path2906" fill="#327BD6" d="M309.282,203.137
l-133.506-44.214c-19.853,58.614-0.277,121.24,49.431,158.102L309.282,203.137L309.282,203.137z"/>
<path id="path2908" fill="#FFFFFF" d="M296.151,83.274c-20.598,0.107-49.162,5.941-52.404,30.453
c-1.665,8.082,0.413,18.038-1.215,25.028c-24.511-2.627-51.848,12.411-55.157,38.309c-6.81,29.067-5.168,66.718,20.653,85.775
c10.108,6.897,25.056,4.019,34.422,6.315c-2.613,20.801,6.443,44.468,28.673,49.733c31.432,11.943,72.42,10.254,96.95-14.825
c8.516-9.855,5.253-26.06,7.616-35.719c19.698,2.507,44.072-3.946,49.891-25.187c13.572-30.675,11.665-71.89-12.231-96.869
c-10.615-9.098-27.766-5.859-38.391-8.099c2.791-20.97-6.322-45.369-28.594-50.946C330.359,82.006,312.806,82.582,296.151,83.274z"
/>
<g id="g2910" transform="matrix(0.7960788,0,0,0.7636835,323.11888,330.11106)">
<linearGradient id="path2912_1_" gradientUnits="userSpaceOnUse" x1="697.1569" y1="-1591.3921" x2="979.7098" y2="-1834.491" gradientTransform="matrix(0.3021 0 0 -0.2926 -379.5969 -767.7481)">
<stop offset="0" style="stop-color:#5A9FD4"/>
<stop offset="1" style="stop-color:#306998"/>
</linearGradient>
<path id="path2912" fill="url(#path2912_1_)" d="M-19.578-310.392
c-11.879,0.057-23.223,1.069-33.206,2.835c-29.408,5.196-34.748,16.071-34.748,36.126v26.483h69.492v8.829h-69.492h-26.08
c-20.198,0-37.881,12.14-43.412,35.234c-6.382,26.469-6.665,42.987,0,70.627c4.939,20.577,16.736,35.231,36.932,35.231h23.893
v-31.747c0-22.939,19.847-43.171,43.415-43.171h69.41c19.323,0,34.749-15.911,34.749-35.315v-66.171
c0-18.835-15.888-32.981-34.749-36.126C4.692-309.544-7.693-310.446-19.578-310.392z M-57.158-289.088
c7.178,0,13.039,5.957,13.039,13.282c0,7.301-5.861,13.201-13.039,13.201c-7.204,0-13.041-5.9-13.041-13.201
C-70.199-283.132-64.362-289.088-57.158-289.088z"/>
<linearGradient id="path2914_1_" gradientUnits="userSpaceOnUse" x1="1426.6962" y1="-2348.8525" x2="1325.799" y2="-2206.1003" gradientTransform="matrix(0.3021 0 0 -0.2926 -379.5969 -767.7481)">
<stop offset="0" style="stop-color:#FFD43B"/>
<stop offset="1" style="stop-color:#FFE873"/>
</linearGradient>
<path id="path2914" fill="url(#path2914_1_)" d="M60.044-236.119v30.859
c0,23.924-20.287,44.06-43.417,44.06h-69.41c-19.013,0-34.748,16.277-34.748,35.315v66.173c0,18.833,16.376,29.91,34.748,35.311
c21.996,6.47,43.092,7.639,69.41,0c17.495-5.061,34.749-15.259,34.749-35.311v-26.485h-69.415v-8.83h69.415H86.12
c20.196,0,27.722-14.084,34.751-35.231c7.254-21.769,6.946-42.704,0-70.627c-4.997-20.106-14.526-35.234-34.751-35.234H60.044z
M21-68.54c7.206,0,13.04,5.905,13.04,13.201c0,7.326-5.834,13.28-13.04,13.28c-7.174,0-13.036-5.954-13.036-13.28
C7.963-62.635,13.826-68.54,21-68.54z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -12,17 +12,44 @@
</header>
<nav>
<ul>
<li><a href="{{ url_for('pages') }}">Accueil</a></li>
<li><a href="{{ url_for('rest', name='a-propos') }}">Qui sommes-nous ?</a></li>
<li><a href="{{ url_for('feed', name='planet') }}">Actualités</a></li>
<li><a href="{{ url_for('feed', name='emplois') }}">Offres d'emplois</a></li>
<li><a href="{{ url_for('pages', name='communaute') }}">Communauté</a></li>
<li><a href="{{ url_for('pages', name='clavardage') }}">Clavardage</a></li>
<li><a href="{{ url_for('pages', name='adhesions') }}">Adhésions</a></li>
<li{% if body_id == 'index' %} class="active"{% endif %}>
<a href="{{ url_for('pages') }}">Accueil</a>
</li>
<li{% if body_id == 'a-propos' %} class="active"{% endif %}>
<a href="{{ url_for('rest', name='a-propos') }}">Qui sommes-nous ?</a>
</li>
<li{% if body_id == 'planet' %} class="active"{% endif %}>
<a href="{{ url_for('feed', name='planet') }}">Actualités</a>
</li>
<li{% if body_id == 'emplois' %} class="active"{% endif %}>
<a href="{{ url_for('feed', name='emplois') }}">Offres d'emplois</a>
</li>
<li{% if body_id == 'communaute' %} class="active"{% endif %}>
<a href="{{ url_for('pages', name='communaute') }}">Communauté</a>
</li>
<li{% if body_id == 'clavardage' %} class="active"{% endif %}>
<a href="{{ url_for('pages', name='clavardage') }}">Clavardage</a>
</li>
<li{% if body_id == 'adhesions' %} class="active"{% endif %}>
<a href="{{ url_for('pages', name='adhesions') }}">Adhésions</a>
</li>
</ul>
</nav>
<main>
{% block main %}{% endblock main %}
</main>
<footer>
<ul>
<li>
<a href="{{ url_for('rest', name='contact') }}">Contact</a>
</li>
<li>
<a href="{{ url_for('rest', name='charte') }}">Charte</a>
</li>
<li>
<a href="{{ url_for('rest', name='legal') }}">Mentions légales</a>
</li>
</ul>
</footer>
</body>
</html>

View File

@ -11,140 +11,19 @@ décembre 2004 sous le régime de la loi du 1er juillet 1901 a pour but la
vulgarisation auprès dun public francophone du langage de programmation python
et de ses applications.
Cette rubrique contient toutes les informations concernant lassociation, ses
moyens, ses ambitions et ses résultats.
Bureau 2016
===========
Les membres du bureau 2016 sont :
Président (president at afpy dot org)
Président (president@afpy.org)
Jean-Philippe Camguilhem
Secrétaire (secretaire at afpy dot org)
Secrétaire (secretaire@afpy.org)
?
Vice-Secrétaire
?
Trésorier (tresorerie at afpy dot org)
Trésorier (tresorerie@afpy.org)
Arthur Vuillard
Vice-Trésorier
?
Charte AFPy
===========
Le but de l'Association Francophone Python (AFPy) est d'assurer la promotion du
langage de programmation Python auprès du plus large public possible.
Nous diffusons nos connaissances et sommes ouverts aux apports extérieurs car
la diversité, l'écoute réciproque, la solidarité et la démocratie élargissent
les horizons et accroissent le potentiel de l'AFPy et de chacun de ses
membres. En conséquence, nous encourageons donc la participation aux divers
évènements que nous (co-)organisons de toutes les personnes de la communauté
Python ou souhaitant en faire partie. Dans ce cadre, l'AFPy souhaite que toute
personne intéressée soit accueillie de manière agréable et enrichissante.
L'AFPy s'attend donc à ce que chaque membre de l'association fasse preuve de
respect et de courtoisie envers les autres membres de l'association et les
personnes rencontrées dans le cadre de tout évènement organisé (formellement ou
non) par l'association.
Ce texte est notamment inspiré par le code de conduite établi par l'Ada
Initiative et par la loi française de lutte contre les discriminations.
La version « courte »
=====================
L'AFPy souhaite éviter tout type de discrimination, que ce soit sur le sexe,
l'orientation sexuelle, le handicap, l'apparence physique, l'origine ou la
religion, et sous quelque forme que ce soit (parole, image, texte et
autre). Bien évidemment, ceci n'est pas une liste exhaustive.
L'AFPy reconnaît cependant la légitimité de minorités qui voudraient mener des
actions de soutien à destination de leurs propres membres, en vue de favoriser
le rééquilibrage de leur représentation au sein de la communauté entière.
Bien que l'AFPy ait pour but la promotion de Python dans le monde francophone,
l'association s'engage à accueillir chacun, quelle que soit son langage de
programmation ou sa langue maternelle.
L'AFPy attend de ses membres un langage et un style adaptés à une audience
variée. Les allusions sexuelles ou à caractère raciste ne sont en aucun cas
tolérées, quel que soit leur support.
Soyez poli(e). N'insultez personne. Discrimination et harcèlement sont à
exclure aussi bien dans les écrits, les visuels, les paroles et les actes, et
ce quelle que soit leur nature (sexuelle, raciste, religieuse, sociale…).
Le non respect de ces règles de bienséance pourra entraîner l'exclusion de
l'évènement, à la seule discrétion d'un ou plusieurs organisateurs, ou de
l'association, après délibération du comité directeur, ainsi que de tout
service proposé par l'AFPy (planète AFPy, blog, canaux IRC).
La version « longue »
=====================
Champ d'application
-------------------
Ces bonnes pratiques s'appliquent dans le cadre de tout évènement (co-)organisé
par l'AFPy de manière directe ou indirecte à savoir :
- les conférences (PyconFR, évènement à la cantine et autre),
- les canaux IRC ou XMPP ou autre messagerie instantanée,
- planète Python,
- le blog,
- la liste de diffusion,
- tout évènement ou vous représentez l'AFPy, y compris les rencontres
informelles (notamment AFPyros).
Définition de la discrimination
-------------------------------
La discrimination inclut, selon la loi française, « la situation dans laquelle,
sur le fondement de son appartenance ou de sa non-appartenance, vraie ou
supposée, à une ethnie ou une race, sa religion, ses convictions, son âge, son
handicap, son orientation ou identité sexuelle ou son sexe, une personne est
traitée de manière moins favorable qu'une autre ne l'est, ne l'a été ou ne
l'aura été dans une situation comparable ».
Sont donc proscrits :
- « tout agissement à connotation sexuelle, [subi] par une personne et ayant
pour objet ou pour effet de porter atteinte à sa dignité ou de créer un
environnement intimidant, hostile, dégradant, humiliant ou offensant » ;
- « le fait d'enjoindre à quiconque d'adopter un [tel] comportement ».
Comportements à éviter (proscrire ?)
------------------------------------
En référence à la définition qui précède, nous vous invitons à vous abstenir :
- de toute expression ou attitude inappropriées,
- de présenter des images sexuelles ou choquantes (notamment violentes),
- d'intimidation délibérée, de harcèlement, des contacts physiques
inconvenants et non consentis.
Traitement des incidents
------------------------
En cas de harcèlement ou de discrimination commis par un participant, les
organisateurs de l'évènement ou membres du comité directeur pourront prendre
immédiatement les mesures qu'ils jugent appropriées et qui peuvent aller
jusqu'à l'exclusion temporaire ou définitive d'un évènement.
Signaler
=========
Si vous êtes harcelé(e) ou victime de discrimination, ou si vous êtes témoin de
harcèlement ou de discrimination à l'égard d'autre(s) participant(e-s), ou si
vous craignez la survenue d'un incident, contactez sans attendre un membre
organisateur (dans le cas d'un évènement) ou un membre du comité directeur de
l'AFPy.
Contact : diversite at afpy dot org.

117
templates/charte.rst Normal file
View File

@ -0,0 +1,117 @@
=============
Charte AFPy
=============
Le but de l'Association Francophone Python (AFPy) est d'assurer la promotion du
langage de programmation Python auprès du plus large public possible.
Nous diffusons nos connaissances et sommes ouverts aux apports extérieurs car
la diversité, l'écoute réciproque, la solidarité et la démocratie élargissent
les horizons et accroissent le potentiel de l'AFPy et de chacun de ses
membres. En conséquence, nous encourageons donc la participation aux divers
évènements que nous (co-)organisons de toutes les personnes de la communauté
Python ou souhaitant en faire partie. Dans ce cadre, l'AFPy souhaite que toute
personne intéressée soit accueillie de manière agréable et enrichissante.
L'AFPy s'attend donc à ce que chaque membre de l'association fasse preuve de
respect et de courtoisie envers les autres membres de l'association et les
personnes rencontrées dans le cadre de tout évènement organisé (formellement ou
non) par l'association.
Ce texte est notamment inspiré par le code de conduite établi par l'Ada
Initiative et par la loi française de lutte contre les discriminations.
La version « courte »
=====================
L'AFPy souhaite éviter tout type de discrimination, que ce soit sur le sexe,
l'orientation sexuelle, le handicap, l'apparence physique, l'origine ou la
religion, et sous quelque forme que ce soit (parole, image, texte et
autre). Bien évidemment, ceci n'est pas une liste exhaustive.
L'AFPy reconnaît cependant la légitimité de minorités qui voudraient mener des
actions de soutien à destination de leurs propres membres, en vue de favoriser
le rééquilibrage de leur représentation au sein de la communauté entière.
Bien que l'AFPy ait pour but la promotion de Python dans le monde francophone,
l'association s'engage à accueillir chacun, quelle que soit son langage de
programmation ou sa langue maternelle.
L'AFPy attend de ses membres un langage et un style adaptés à une audience
variée. Les allusions sexuelles ou à caractère raciste ne sont en aucun cas
tolérées, quel que soit leur support.
Soyez poli(e). N'insultez personne. Discrimination et harcèlement sont à
exclure aussi bien dans les écrits, les visuels, les paroles et les actes, et
ce quelle que soit leur nature (sexuelle, raciste, religieuse, sociale…).
Le non respect de ces règles de bienséance pourra entraîner l'exclusion de
l'évènement, à la seule discrétion d'un ou plusieurs organisateurs, ou de
l'association, après délibération du comité directeur, ainsi que de tout
service proposé par l'AFPy (planète AFPy, blog, canaux IRC).
La version « longue »
=====================
Champ d'application
-------------------
Ces bonnes pratiques s'appliquent dans le cadre de tout évènement (co-)organisé
par l'AFPy de manière directe ou indirecte à savoir :
- les conférences (PyconFR, évènement à la cantine et autre),
- les canaux IRC ou XMPP ou autre messagerie instantanée,
- planète Python,
- le blog,
- la liste de diffusion,
- tout évènement ou vous représentez l'AFPy, y compris les rencontres
informelles (notamment AFPyros).
Définition de la discrimination
-------------------------------
La discrimination inclut, selon la loi française, « la situation dans laquelle,
sur le fondement de son appartenance ou de sa non-appartenance, vraie ou
supposée, à une ethnie ou une race, sa religion, ses convictions, son âge, son
handicap, son orientation ou identité sexuelle ou son sexe, une personne est
traitée de manière moins favorable qu'une autre ne l'est, ne l'a été ou ne
l'aura été dans une situation comparable ».
Sont donc proscrits :
- « tout agissement à connotation sexuelle, [subi] par une personne et ayant
pour objet ou pour effet de porter atteinte à sa dignité ou de créer un
environnement intimidant, hostile, dégradant, humiliant ou offensant » ;
- « le fait d'enjoindre à quiconque d'adopter un [tel] comportement ».
Comportements à éviter (proscrire ?)
------------------------------------
En référence à la définition qui précède, nous vous invitons à vous abstenir :
- de toute expression ou attitude inappropriées,
- de présenter des images sexuelles ou choquantes (notamment violentes),
- d'intimidation délibérée, de harcèlement, des contacts physiques
inconvenants et non consentis.
Traitement des incidents
------------------------
En cas de harcèlement ou de discrimination commis par un participant, les
organisateurs de l'évènement ou membres du comité directeur pourront prendre
immédiatement les mesures qu'ils jugent appropriées et qui peuvent aller
jusqu'à l'exclusion temporaire ou définitive d'un évènement.
Signaler
=========
Si vous êtes harcelé(e) ou victime de discrimination, ou si vous êtes témoin de
harcèlement ou de discrimination à l'égard d'autre(s) participant(e-s), ou si
vous craignez la survenue d'un incident, contactez sans attendre un membre
organisateur (dans le cas d'un évènement) ou un membre du comité directeur de
l'AFPy.
Vous pouvez également écrire à l'adresse diversite@afpy.org.

View File

@ -8,39 +8,37 @@
<p>Depuis cette page web vous pouvez</p>
<ul>
<li>venir discuter avec l'association, sur le canal <a href="#tchatafpy">#afpy</a></li>
<li>venir discuter avec l'association sur le canal <a href="#tchatafpy">#afpy</a></li>
<li>parler Python en français sur le canal <a href="#tchatpython">#python-fr</a></li>
</ul>
<h2>Bon à savoir</h2>
<p>
IRC (Internet Relay Chat) permet d'utiliser plusieurs canaux de discussion en simultané. Si vous vous trouvez sur #afpy et souhaitez rejoindre #python-fr, rien de plus simple, tapez : <br/>
IRC (Internet Relay Chat) permet d'utiliser plusieurs canaux de discussion en simultané. Si vous vous trouvez sur #afpy et souhaitez rejoindre #python-fr, rien de plus simple, tapez :
<code>/join #python-fr</code>
</p>
<p>
Si vous souhaitez changer de surnom après connexion : <br />
Si vous souhaitez changer de surnom après connexion :
<code>/nick nouveaunom</code>
</p>
<h2 id="tchatafpy">Discuter avec l'AFPy (organisation de la communauté)</h2>
<iframe src="https://kiwiirc.com/client/irc.freenode.net/?nick=afpy_user|?&theme=basic#afpy" style="border:0; width:100%; height:450px;"></iframe>
<iframe src="https://kiwiirc.com/client/irc.freenode.net/?nick=afpy_user|?&theme=basic#afpy"></iframe>
<p>
Vous pouvez aussi accéder au T'chat via un client irc : <a href="irc://irc.freenode.net/afpy">irc://irc.freenode.net/afpy</a>.<br />
Les archives irc du canal #afpy sont disponibles <a href="http://logs.afpy.org/">ici</a>.
Vous pouvez aussi accéder au T'chat via un client IRC : <a href="irc://irc.freenode.net/afpy">irc://irc.freenode.net/afpy</a>.
Nous stockons <a href="http://logs.afpy.org/">les archives IRC du canal #afpy</a>.
</p>
<h2 id="tchatpython">Clavarder autour de Python</h2>
<iframe src="https://kiwiirc.com/client/irc.freenode.net/?nick=afpy_user|?&theme=basic#python-fr" style="border:0; width:100%; height:450px;"></iframe>
<iframe src="https://kiwiirc.com/client/irc.freenode.net/?nick=afpy_user|?&theme=basic#python-fr"></iframe>
<p>
Vous pouvez aussi accéder au T'chat via un client irc : <a href="irc://irc.freenode.net/python-fr">irc://irc.freenode.net/python-fr</a>.
Vous pouvez aussi accéder au T'chat via un client IRC : <a href="irc://irc.freenode.net/python-fr">irc://irc.freenode.net/python-fr</a>.
</p>
<iframe src="http://webchat.freenode.net/?nick=afpy_user&channels=afpy&prompt=1" width="100%" height="400"></iframe>
{% endblock main %}

View File

@ -5,24 +5,36 @@
{% endblock header %}
{% block main %}
<section>
<div>
<h2>April</h2>
<a href="http://april.org/campagne/">April</a>
</div>
<div>
<div>
<h2>Meetups</h2>
<ul>
{% for meetup in meetups %}
<li><a href="{{ url_for('feed', name='meetup_{}'.format(meetup)) }}">{{ meetup }}</a><li>
{% endfor %}
</ul>
</div>
<div>
<h2>Pycon</h2>
<a href="https://www.pycon.fr/">Pyconfr</a>
</div>
</div>
</section>
<h2>Meetups</h2>
<p>
Afin de partager autour du langage Python, de ses pratiques, de sa technique et de son écosystème,
des évènements sont organisés régulièrement dans divers lieux.
Vous pouvez retrouver ces évènements sur les groupes MeetUp :
</p>
<ul>
{% for meetup in meetups %}
<li><a href="{{ url_for('feed', name='meetup_{}'.format(meetup)) }}">{{ meetup | capitalize }}</a></li>
{% endfor %}
</ul>
<h2>PyConFr</h2>
<p>
La PyConFr est un évènement organisé chaque année depuis 10+ ans par l'AFPy.
Cette conférence est gratuite, entièrement organisée par des bénévoles et
regroupe développeu·ses·rs, chercheu·ses·rs, étudiant·e·s et amat·rices·eurs
autour d'une même passion pour le langage de programmation Python.
</p>
<p>
<a href="https://www.pycon.fr/">PyConFr</a>
</p>
<h2>April</h2>
<p>
Pionnière du logiciel libre en France, l'April est depuis 1996 un acteur majeur de la démocratisation
et de la diffusion du logiciel libre et des standards ouverts auprès du grand public,
des professionnels et des institutions dans l'espace francophone.
</p>
<p>
<a href="http://april.org/campagne/">April</a>
</p>
{% endblock main %}

25
templates/contact.rst Normal file
View File

@ -0,0 +1,25 @@
=======
Contact
=======
Contactez les membres
=====================
Vous pouvez contacter les membres du bureau aux adresses :
- president@afpy.org
- secretaire@afpy.org
- tresorerie@afpy.org
Signalez un comportement inapproprié
====================================
Si vous êtes harcelé(e) ou victime de discrimination, ou si vous êtes témoin de
harcèlement ou de discrimination à l'égard d'autre(s) participant(e-s), ou si
vous craignez la survenue d'un incident, contactez sans attendre un membre
organisateur (dans le cas d'un évènement) ou un membre du comité directeur de
l'AFPy.
Vous pouvez également écrire à l'adresse diversite@afpy.org.

View File

@ -8,6 +8,9 @@
{% for entry in entries %}
<article>
<h2>{{ entry.title }}</h2>
<time pubdate datetime="{{ entry.updated_parsed | datetime('%Y-%m-%d') }}">
{{ entry.updated_parsed | datetime('%x') }}
</time>
{{ entry.summary | safe }}
<p><a href="{{ entry.link }}">Lire la suite…</a></p>
</article>

View File

@ -6,20 +6,27 @@
{% block main %}
<h2>AFPy</h2>
<p>{{ lipsum(1) }}</p>
<p>
Créée en décembre 2004, l'AFPy (Association Francophone Python) a pour but de promouvoir le langage Python, que ce soit auprès d'un public averti ou débutant.
Pour ce faire, des <a href="{{ url_for('pages', name='communaute') }}">évènements</a> sont organisés régulièrement au niveau local et d'autres évènements à un niveau plus général.
</p>
<h2>Adhérer</h2>
<p>{{ lipsum(1) }}</p>
<form>
<p>
Il est possible de soutenir le développement de l'AFPy en cotisant ou en effectuant un don. Une cotisation = un panda roux sauvé.
</p>
<form action="{{ url_for('pages', name='adhesions') }}">
<input type="submit" value="S'inscrire" />
</form>
<h2>Actualités</h2>
{% for entry in entries[:4] %}
<article>
<h3>{{ entry.title }}</h3>
{{ entry.summary | safe }}
<p><a href="{{ entry.link }}">Lire la suite…</a></p>
</article>
{% endfor %}
<section id="index-news">
{% for entry in entries[:4] %}
<article>
<h3>{{ entry.title }}</h3>
{{ entry.summary | safe }}
<p><a href="{{ entry.link }}">Lire la suite…</a></p>
</article>
{% endfor %}
</section>
{% endblock main %}

6
templates/legal.rst Normal file
View File

@ -0,0 +1,6 @@
================
Mentions légales
================
Mentions légales.

View File

@ -3,17 +3,33 @@ import pytest
from afpy import app
def test_no_arguments():
def test_home():
response = app.test_client().get('/')
assert response.status_code == 200
@pytest.mark.parametrize('name', ['index', 'communaute'])
def test_with_arguments(name):
def test_html(name):
response = app.test_client().get(f'/{name}')
assert response.status_code == 200
@pytest.mark.parametrize('name', ['charte', 'a-propos'])
def test_rest(name):
response = app.test_client().get(f'/docs/{name}')
assert response.status_code == 200
@pytest.mark.parametrize('name', ['planet', 'meetup_lyon'])
def test_feed(name):
response = app.test_client().get(f'/feed/{name}')
assert response.status_code == 200
def test_404():
response = app.test_client().get('/unknown')
assert response.status_code == 404
response = app.test_client().get('/docs/unknown')
assert response.status_code == 404
response = app.test_client().get('/feed/unknown')
assert response.status_code == 404