forked from AFPy/afpy.org
merge
This commit is contained in:
commit
b4497bea18
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -4,6 +4,7 @@
|
|||
.env
|
||||
__pycache__
|
||||
afpy.egg-info
|
||||
static/css/*.map
|
||||
|
||||
# PyCharm project files
|
||||
.idea
|
||||
|
|
2
Makefile
2
Makefile
|
@ -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
38
afpy.py
|
@ -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')})
|
||||
|
|
135
sass/style.sass
135
sass/style.sass
|
@ -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
BIN
static/.DS_Store
vendored
Normal file
Binary file not shown.
|
@ -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 */
|
|
@ -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
BIN
static/images/.DS_Store
vendored
Normal file
Binary file not shown.
50
static/images/logo.svg
Normal file
50
static/images/logo.svg
Normal 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 |
|
@ -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>
|
||||
|
|
|
@ -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 d’un public francophone du langage de programmation python
|
||||
et de ses applications.
|
||||
|
||||
Cette rubrique contient toutes les informations concernant l’association, 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
117
templates/charte.rst
Normal 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.
|
|
@ -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 %}
|
||||
|
|
|
@ -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
25
templates/contact.rst
Normal 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.
|
|
@ -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>
|
||||
|
|
|
@ -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
6
templates/legal.rst
Normal file
|
@ -0,0 +1,6 @@
|
|||
================
|
||||
Mentions légales
|
||||
================
|
||||
|
||||
|
||||
Mentions légales.
|
20
tests.py
20
tests.py
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user