Calendrier dynamique + sympa + jolies dates
This commit is contained in:
parent
f8952225d6
commit
ba87044638
13 changed files with 414 additions and 102 deletions
33
gestioncof/cms/migrations/0003_auto_20180128_2215.py
Normal file
33
gestioncof/cms/migrations/0003_auto_20180128_2215.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.9 on 2018-01-28 21:15
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import wagtail.contrib.wagtailroutablepage.models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('wagtailcore', '0039_collectionviewrestriction'),
|
||||||
|
('cofcms', '0002_auto_20180128_1717'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='COFUtilPage',
|
||||||
|
fields=[
|
||||||
|
('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name_plural': 'Pages utilitaires',
|
||||||
|
'verbose_name': 'Page utilitaire',
|
||||||
|
},
|
||||||
|
bases=(wagtail.contrib.wagtailroutablepage.models.RoutablePageMixin, 'wagtailcore.page'),
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='cofdirectoryentrypage',
|
||||||
|
options={'verbose_name': "Entrée d'annuaire", 'verbose_name_plural': "Entrées d'annuaire"},
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,15 +1,16 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from wagtail.wagtailcore.models import Page, Orderable
|
|
||||||
|
|
||||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||||
from wagtail.wagtailcore.fields import RichTextField, StreamField
|
|
||||||
from wagtail.wagtailcore import blocks
|
|
||||||
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
|
|
||||||
from wagtail.wagtailimages.blocks import ImageChooserBlock
|
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
|
from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route
|
||||||
from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
|
from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
|
||||||
|
from wagtail.wagtailcore import blocks
|
||||||
|
from wagtail.wagtailcore.fields import RichTextField, StreamField
|
||||||
|
from wagtail.wagtailcore.models import Page, Orderable
|
||||||
|
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
|
||||||
|
from wagtail.wagtailimages.blocks import ImageChooserBlock
|
||||||
from wagtail.wagtailsnippets.models import register_snippet
|
from wagtail.wagtailsnippets.models import register_snippet
|
||||||
|
|
||||||
# Page pouvant afficher des actualités
|
# Page pouvant afficher des actualités
|
||||||
|
@ -18,7 +19,7 @@ class COFActuIndexMixin():
|
||||||
def actus(self):
|
def actus(self):
|
||||||
actus = COFActuPage.objects.live().order_by('-date_start').descendant_of(self)
|
actus = COFActuPage.objects.live().order_by('-date_start').descendant_of(self)
|
||||||
return actus
|
return actus
|
||||||
|
|
||||||
# Racine du site du COF
|
# Racine du site du COF
|
||||||
class COFRootPage(Page, COFActuIndexMixin):
|
class COFRootPage(Page, COFActuIndexMixin):
|
||||||
introduction = RichTextField("Introduction")
|
introduction = RichTextField("Introduction")
|
||||||
|
@ -27,11 +28,12 @@ class COFRootPage(Page, COFActuIndexMixin):
|
||||||
FieldPanel('introduction', classname="full"),
|
FieldPanel('introduction', classname="full"),
|
||||||
]
|
]
|
||||||
|
|
||||||
subpage_types = ['COFActuIndexPage', 'COFPage', 'COFDirectoryPage']
|
subpage_types = ['COFActuIndexPage', 'COFPage', 'COFDirectoryPage', 'COFUtilPage']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Racine site du COF"
|
verbose_name = "Racine site du COF"
|
||||||
verbose_name_plural = "Racines site du COF"
|
verbose_name_plural = "Racines site du COF"
|
||||||
|
|
||||||
|
|
||||||
# Page lambda du site
|
# Page lambda du site
|
||||||
class COFPage(Page):
|
class COFPage(Page):
|
||||||
|
@ -77,7 +79,7 @@ class COFActuIndexPage(Page, COFActuIndexMixin):
|
||||||
context['actus'] = actus
|
context['actus'] = actus
|
||||||
return context
|
return context
|
||||||
|
|
||||||
class COFActuPage(Page):
|
class COFActuPage(RoutablePageMixin, Page):
|
||||||
chapo = models.TextField("Description rapide", blank=True)
|
chapo = models.TextField("Description rapide", blank=True)
|
||||||
body = RichTextField("Contenu")
|
body = RichTextField("Contenu")
|
||||||
image = models.ForeignKey(
|
image = models.ForeignKey(
|
||||||
|
@ -104,49 +106,6 @@ class COFActuPage(Page):
|
||||||
subpage_types = []
|
subpage_types = []
|
||||||
parent_page_types = ['COFActuIndexPage']
|
parent_page_types = ['COFActuIndexPage']
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Actualité simple"
|
|
||||||
verbose_name_plural = "Actualités simples"
|
|
||||||
|
|
||||||
@property
|
|
||||||
def dates(self):
|
|
||||||
if self.date_end:
|
|
||||||
if self.date_end.date() == self.date_start.date():
|
|
||||||
if self.all_day:
|
|
||||||
return self.date_start.strftime(_("le %A %d %B %Y"))
|
|
||||||
else:
|
|
||||||
return _("le %s de %s à %s") % \
|
|
||||||
(self.date_start.strftime("%A %d %B %Y"),
|
|
||||||
self.date_start.strftime(_("%Hh%M")),
|
|
||||||
self.date_end.strftime(_("%Hh%M")))
|
|
||||||
else:
|
|
||||||
tmpl = "%A %d %B %Y"
|
|
||||||
diff_i = len(tmpl)
|
|
||||||
if self.date_end.year != self.date_start.year:
|
|
||||||
diff_i = len(tmpl)
|
|
||||||
elif self.date_end.month != self.date_start.month:
|
|
||||||
diff_i = len(tmpl) - 3
|
|
||||||
elif self.date_end.day != self.date_start.day:
|
|
||||||
diff_i = len(tmpl) - 6
|
|
||||||
common = tmpl[diff_i:]
|
|
||||||
diff = tmpl[:diff_i]
|
|
||||||
if self.all_day:
|
|
||||||
return _("du %s au %s %s") % \
|
|
||||||
(self.date_start.strftime(diff),
|
|
||||||
self.date_end.strftime(diff),
|
|
||||||
self.date_end.strftime(common))
|
|
||||||
else:
|
|
||||||
return _("du %s %s à %s au %s à %s") % \
|
|
||||||
(self.date_start.strftime(diff),
|
|
||||||
self.date_start.strftime(common),
|
|
||||||
self.date_start.strftime("%Hh%M"),
|
|
||||||
self.date_end.strftime(diff),
|
|
||||||
self.date_end.strftime("%Hh%M"))
|
|
||||||
else:
|
|
||||||
if self.all_day:
|
|
||||||
return self.date_start.strftime(_("le %A %d %B %Y"))
|
|
||||||
else:
|
|
||||||
return self.date_start.strftime(_("le %A %d %B %Y à %Hh%M"))
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Actualité"
|
verbose_name = "Actualité"
|
||||||
verbose_name_plural = "Actualités"
|
verbose_name_plural = "Actualités"
|
||||||
|
@ -207,5 +166,28 @@ class COFDirectoryEntryPage(Page, Orderable):
|
||||||
parent_page_types = ['COFDirectoryPage']
|
parent_page_types = ['COFDirectoryPage']
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Éntrée d'annuaire"
|
verbose_name = "Entrée d'annuaire"
|
||||||
verbose_name_plural = "Éntrées d'annuaire"
|
verbose_name_plural = "Entrées d'annuaire"
|
||||||
|
|
||||||
|
# Pour le calendrier et le sympa, ne doit pas être pris par ModelTranslation
|
||||||
|
class COFUtilPage(RoutablePageMixin, Page):
|
||||||
|
# Protection pour le serveur des mailing listes
|
||||||
|
@route(r'^sympa/$')
|
||||||
|
def sympa(self, request):
|
||||||
|
from .views import sympa_view
|
||||||
|
return sympa_view(request)
|
||||||
|
|
||||||
|
# Mini calendrier
|
||||||
|
@route(r'^calendar/(\d+)/(\d+)/$')
|
||||||
|
def calendar(self, request, year, month):
|
||||||
|
from .views import raw_calendar_view
|
||||||
|
return raw_calendar_view(request, int(year), int(month))
|
||||||
|
|
||||||
|
def debugged_get_url(self, request):
|
||||||
|
parent = COFRootPage.objects.parent_of(self).live().first()
|
||||||
|
burl = parent.relative_url(request.site)
|
||||||
|
return burl + self.slug
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = "Page utilitaire"
|
||||||
|
verbose_name_plural = "Pages utilitaires"
|
||||||
|
|
|
@ -402,45 +402,107 @@ article:last-child {
|
||||||
max-width: 70%;
|
max-width: 70%;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* line 335, ../sass/screen.scss */
|
/* line 334, ../sass/screen.scss */
|
||||||
|
.calendar {
|
||||||
|
color: rgba(0, 0, 0, 0.8);
|
||||||
|
}
|
||||||
|
/* line 337, ../sass/screen.scss */
|
||||||
.calendar td, .calendar th {
|
.calendar td, .calendar th {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
vertical-align: center;
|
vertical-align: middle;
|
||||||
border: 2px solid transparent;
|
border: 2px solid transparent;
|
||||||
padding: 1px;
|
padding: 1px;
|
||||||
}
|
}
|
||||||
/* line 342, ../sass/screen.scss */
|
/* line 344, ../sass/screen.scss */
|
||||||
.calendar th {
|
.calendar th {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
/* line 346, ../sass/screen.scss */
|
/* line 348, ../sass/screen.scss */
|
||||||
.calendar td {
|
.calendar td {
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
width: 25px;
|
width: 28px;
|
||||||
height: 30px;
|
height: 28px;
|
||||||
}
|
}
|
||||||
/* line 351, ../sass/screen.scss */
|
/* line 353, ../sass/screen.scss */
|
||||||
.calendar td.out {
|
.calendar td.out {
|
||||||
opacity: 0.3;
|
opacity: 0.3;
|
||||||
}
|
}
|
||||||
/* line 354, ../sass/screen.scss */
|
/* line 356, ../sass/screen.scss */
|
||||||
.calendar td.today {
|
.calendar td.today {
|
||||||
border-bottom-color: #000;
|
border-bottom-color: #000;
|
||||||
}
|
}
|
||||||
/* line 357, ../sass/screen.scss */
|
/* line 359, ../sass/screen.scss */
|
||||||
.calendar td:nth-child(7) {
|
.calendar td:nth-child(7), .calendar td:nth-child(6) {
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
/* line 360, ../sass/screen.scss */
|
|
||||||
.calendar td:nth-child(6) {
|
|
||||||
background: rgba(0, 0, 0, 0.2);
|
background: rgba(0, 0, 0, 0.2);
|
||||||
}
|
}
|
||||||
/* line 363, ../sass/screen.scss */
|
/* line 362, ../sass/screen.scss */
|
||||||
.calendar td.hasevent {
|
.calendar td.hasevent {
|
||||||
|
position: relative;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #997000;
|
color: #90001C;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
/* line 368, ../sass/screen.scss */
|
||||||
|
.calendar td.hasevent > a {
|
||||||
|
padding: 3px;
|
||||||
|
color: #90001C !important;
|
||||||
|
}
|
||||||
|
/* line 373, ../sass/screen.scss */
|
||||||
|
.calendar td.hasevent ul.cal-events {
|
||||||
|
text-align: left;
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 2;
|
||||||
|
background: #fff;
|
||||||
|
width: 150px;
|
||||||
|
left: -30px;
|
||||||
|
margin-top: 10px;
|
||||||
|
padding: 5px;
|
||||||
|
background-color: #90001C;
|
||||||
|
}
|
||||||
|
/* line 386, ../sass/screen.scss */
|
||||||
|
.calendar td.hasevent ul.cal-events .datename {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
/* line 389, ../sass/screen.scss */
|
||||||
|
.calendar td.hasevent ul.cal-events:before {
|
||||||
|
top: -12px;
|
||||||
|
left: 38px;
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-bottom-color: #90001C;
|
||||||
|
}
|
||||||
|
/* line 397, ../sass/screen.scss */
|
||||||
|
.calendar td.hasevent ul.cal-events a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
/* line 402, ../sass/screen.scss */
|
||||||
|
.calendar td.hasevent > a:hover {
|
||||||
|
background-color: #90001C;
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
/* line 406, ../sass/screen.scss */
|
||||||
|
.calendar td.hasevent > a:hover + ul.cal-events {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* line 414, ../sass/screen.scss */
|
||||||
|
#calendar-wrap .details {
|
||||||
|
border-top: 1px solid #90001C;
|
||||||
|
margin-top: 15px;
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
/* line 419, ../sass/screen.scss */
|
||||||
|
#calendar-wrap .details li.datename {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.1em;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
/* line 420, ../sass/screen.scss */
|
||||||
|
#calendar-wrap .details li.datename:after {
|
||||||
|
content: " :";
|
||||||
|
}
|
||||||
|
|
||||||
/* line 1, ../sass/_responsive.scss */
|
/* line 1, ../sass/_responsive.scss */
|
||||||
header .minimenu {
|
header .minimenu {
|
||||||
|
|
32
gestioncof/cms/static/cofcms/js/calendar.js
Normal file
32
gestioncof/cms/static/cofcms/js/calendar.js
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
$(function(){
|
||||||
|
var mem = {};
|
||||||
|
var ctt = $("#calendar-wrap");
|
||||||
|
makeInteractive();
|
||||||
|
|
||||||
|
function makeInteractive () {
|
||||||
|
$(".cal-btn").on("click", loadCalendar);
|
||||||
|
$(".hasevent a").on("click", showEvents);
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadCalendar () {
|
||||||
|
var url = $(this).attr("cal-dest");
|
||||||
|
if (mem[url] != undefined) {
|
||||||
|
ctt.html(mem[url]);
|
||||||
|
makeInteractive();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ctt.innerText = "Chargement...";
|
||||||
|
ctt.load(url, function () {
|
||||||
|
mem[url] = this.innerHTML;
|
||||||
|
makeInteractive();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showEvents() {
|
||||||
|
ctt.find(".details").remove();
|
||||||
|
ctt.append(
|
||||||
|
$("<div>", {class:"details"})
|
||||||
|
.html(this.nextElementSibling.outerHTML)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
|
@ -332,9 +332,11 @@ article {
|
||||||
}
|
}
|
||||||
|
|
||||||
.calendar {
|
.calendar {
|
||||||
|
color: rgba(#000, 0.8);
|
||||||
|
|
||||||
td, th {
|
td, th {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
vertical-align: center;
|
vertical-align: middle;
|
||||||
border: 2px solid transparent;
|
border: 2px solid transparent;
|
||||||
padding: 1px;
|
padding: 1px;
|
||||||
}
|
}
|
||||||
|
@ -345,8 +347,8 @@ article {
|
||||||
|
|
||||||
td {
|
td {
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
width: 25px;
|
width: 28px;
|
||||||
height: 30px;
|
height: 28px;
|
||||||
|
|
||||||
&.out {
|
&.out {
|
||||||
opacity: 0.3;
|
opacity: 0.3;
|
||||||
|
@ -354,18 +356,74 @@ article {
|
||||||
&.today {
|
&.today {
|
||||||
border-bottom-color: #000;
|
border-bottom-color: #000;
|
||||||
}
|
}
|
||||||
&:nth-child(7) {
|
&:nth-child(7), &:nth-child(6) {
|
||||||
background: rgba(#000, 0.3);
|
|
||||||
}
|
|
||||||
&:nth-child(6) {
|
|
||||||
background: rgba(#000, 0.2);
|
background: rgba(#000, 0.2);
|
||||||
}
|
}
|
||||||
&.hasevent {
|
&.hasevent {
|
||||||
|
position: relative;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: darken($lien, 10%);
|
color: $sousbandeau;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
|
|
||||||
|
& > a {
|
||||||
|
padding: 3px;
|
||||||
|
color: $sousbandeau !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.cal-events {
|
||||||
|
|
||||||
|
text-align: left;
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 2;
|
||||||
|
background: #fff;
|
||||||
|
width: 150px;
|
||||||
|
left: -30px;
|
||||||
|
margin-top: 10px;
|
||||||
|
padding: 5px;
|
||||||
|
background-color: $sousbandeau;
|
||||||
|
|
||||||
|
.datename {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
&:before {
|
||||||
|
top: -12px;
|
||||||
|
left: 38px;
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
border: 6px solid transparent;
|
||||||
|
border-bottom-color: $sousbandeau;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > a:hover {
|
||||||
|
background-color: $sousbandeau;
|
||||||
|
color: #fff !important;
|
||||||
|
|
||||||
|
& + ul.cal-events {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#calendar-wrap .details {
|
||||||
|
border-top: 1px solid $sousbandeau;
|
||||||
|
margin-top: 15px;
|
||||||
|
padding-top: 10px;
|
||||||
|
|
||||||
|
li.datename {
|
||||||
|
&:after {
|
||||||
|
content: " :";
|
||||||
|
}
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.1em;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@import "_responsive";
|
@import "_responsive";
|
||||||
|
|
|
@ -1,11 +1,25 @@
|
||||||
|
{% load wagtailcore_tags wagtailroutablepage_tags static %}
|
||||||
<table class="calendar">
|
<table class="calendar">
|
||||||
<tbody>
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th><a href="javascript:void(0);" cal-dest="{{ prev_month }}" class="cal-btn"><</a></th>
|
||||||
|
<th colspan="5">{{ this_month|date:"F Y" }}</th>
|
||||||
|
<th><a href="javascript:void(0);" cal-dest="{{ next_month }}" class="cal-btn">></a></th>
|
||||||
|
</tr>
|
||||||
<tr><th>L</th><th>M</th><th>M</th><th>J</th><th>V</th><th>S</th><th>D</th></tr>
|
<tr><th>L</th><th>M</th><th>M</th><th>J</th><th>V</th><th>S</th><th>D</th></tr>
|
||||||
{% for week in weeks %}
|
{% for week in weeks %}
|
||||||
<tr>
|
<tr>
|
||||||
{% for day in week %}
|
{% for day in week %}
|
||||||
<td class="{{ day.class }}">
|
<td class="{{ day.class }}">
|
||||||
{% if day.events %}<a href="javascript:void(0)">{{ day.day }}</a>{% else %}{{ day.day }}{% endif %}
|
{% if day.events %}
|
||||||
|
<a href="javascript:void(0)">{{ day.day }}</a>
|
||||||
|
<ul class="cal-events">
|
||||||
|
<li class="datename">Le {{ day.date|date:"d F Y" }}</li>
|
||||||
|
{% for event in day.events %}
|
||||||
|
<li><a href="{% pageurl event %}">{{ event.title }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}{{ day.day }}{% endif %}
|
||||||
</td>
|
</td>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tr>
|
</tr>
|
||||||
|
|
2
gestioncof/cms/templates/cofcms/calendar_raw.html
Normal file
2
gestioncof/cms/templates/cofcms/calendar_raw.html
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
{% load cofcms_tags %}
|
||||||
|
{% calendar month year %}
|
|
@ -1,12 +1,21 @@
|
||||||
{% extends "cofcms/base_aside.html" %}
|
{% extends "cofcms/base_aside.html" %}
|
||||||
{% load wagtailimages_tags cofcms_tags wagtailcore_tags %}
|
{% load wagtailimages_tags cofcms_tags wagtailcore_tags static i18n %}
|
||||||
|
|
||||||
|
{% block extra_head %}
|
||||||
|
{{ block.super }}
|
||||||
|
<script src="{% static "js/jquery.min.js" %}"></script>
|
||||||
|
<script src="{% static "cofcms/js/calendar.js" %}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block aside_title %}Calendrier{% endblock %}
|
{% block aside_title %}Calendrier{% endblock %}
|
||||||
{% block aside %}
|
{% block aside %}
|
||||||
{% calendar %}
|
<div id="calendar-wrap">
|
||||||
|
{% calendar %}
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
{% get_current_language as curlang %}
|
||||||
<section class="intro">
|
<section class="intro">
|
||||||
<h1>{{ page.title }}</h1>
|
<h1>{{ page.title }}</h1>
|
||||||
<div>{{ page.introduction|safe }}</div>
|
<div>{{ page.introduction|safe }}</div>
|
||||||
|
@ -26,7 +35,7 @@
|
||||||
<div class="actu-infos">
|
<div class="actu-infos">
|
||||||
<h2><a href="{% pageurl actu %}">{{ actu.title }}</a></h2>
|
<h2><a href="{% pageurl actu %}">{{ actu.title }}</a></h2>
|
||||||
{% if actu.is_event %}
|
{% if actu.is_event %}
|
||||||
<p><span class="actu-dates">{{ actu.dates|capfirst }}</span><br />{{ actu.chapo }}</p>
|
<p><span class="actu-dates">{{ actu|dates:curlang|capfirst }}</span><br />{{ actu.chapo }}</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ actu.body|safe|truncatewords_html:15 }}
|
{{ actu.body|safe|truncatewords_html:15 }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{% extends "cofcms/base.html" %}
|
{% extends "cofcms/base.html" %}
|
||||||
{% load wagtailimages_tags cofcms_tags %}
|
{% load wagtailimages_tags cofcms_tags i18n %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
{% get_current_language as curlang %}
|
||||||
<section class="intro">
|
<section class="intro">
|
||||||
<h1>{{ page.title }}</h1>
|
<h1>{{ page.title }}</h1>
|
||||||
<p class="date">A lieu {{ page.dates }}</p>
|
<p class="date">A lieu {{ page|dates:curlang }}</p>
|
||||||
<p>{{ page.chapo }}</p>
|
<p>{{ page.chapo }}</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,22 @@
|
||||||
{% extends "cofcms/base_aside.html" %}
|
{% extends "cofcms/base_aside.html" %}
|
||||||
{% load static cofcms_tags wagtailimages_tags i18n wagtailcore_tags %}
|
{% load static cofcms_tags wagtailimages_tags wagtailroutablepage_tags i18n wagtailcore_tags %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block extra_head %}
|
||||||
|
{{ block.super }}
|
||||||
|
<script src="{% static "js/jquery.min.js" %}"></script>
|
||||||
|
<script src="{% static "cofcms/js/calendar.js" %}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block aside_title %}Agenda{% endblock %}
|
{% block aside_title %}Agenda{% endblock %}
|
||||||
{% block aside %}
|
{% block aside %}
|
||||||
{% calendar %}
|
<div id="calendar-wrap">
|
||||||
|
{% calendar %}
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
{% get_current_language as curlang %}
|
||||||
<section class="intro">
|
<section class="intro">
|
||||||
<h1>{{ page.title }}</h1>
|
<h1>{{ page.title }}</h1>
|
||||||
<div>{{ page.introduction|safe }}</div>
|
<div>{{ page.introduction|safe }}</div>
|
||||||
|
@ -20,8 +30,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="actu-misc">
|
<div class="actu-misc">
|
||||||
{% if actu.is_event %}
|
{% if actu.is_event %}
|
||||||
{% get_current_language as curlang %}
|
<span class="actu-minical">{% mini_calendar actu %}</span><span class="actu-dates">{{ actu|dates:curlang }}</span>
|
||||||
<span class="actu-minical">{% mini_calendar actu curlang %}</span><span class="actu-dates">{{ actu.dates }}</span>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ actu.body|safe|truncatewords_html:10 }}
|
{{ actu.body|safe|truncatewords_html:10 }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
26
gestioncof/cms/templates/cofcms/sympa.html
Normal file
26
gestioncof/cms/templates/cofcms/sympa.html
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{% extends "cofcms/base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<section class="intro">
|
||||||
|
<h1>{% trans "Listes mail" %}</h1>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="pagecontent">
|
||||||
|
<article class="paragraph">
|
||||||
|
{% blocktrans %}
|
||||||
|
Tous les abonnements aux listes de diffusion de mail à l'ENS se gèrent sur le serveur de mail SYMPA
|
||||||
|
|
||||||
|
Pour y accéder : Merci de répondre à cette question anti-robots.
|
||||||
|
{% endblocktrans %}
|
||||||
|
</article>
|
||||||
|
<article class="paragraph">
|
||||||
|
<form method="POST" action="">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% if erreur %}<p class="erreur">{% trans erreur %}</p>{% endif %}
|
||||||
|
<p>{% blocktrans %}Comment s'appellent les poissons du bassin ?{% endblocktrans %}</p>
|
||||||
|
<input type="text" name="bassin" />
|
||||||
|
<input type="submit" />
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
|
@ -4,7 +4,9 @@ from django.conf import settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
import locale
|
import locale
|
||||||
|
|
||||||
from ..models import COFActuPage
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
|
from ..models import COFActuPage, COFUtilPage
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
@ -15,17 +17,22 @@ def obfuscate_mail(value):
|
||||||
val = value.replace('', '-').replace('@', 'arbre').replace('.', 'pont')[1:]
|
val = value.replace('', '-').replace('@', 'arbre').replace('.', 'pont')[1:]
|
||||||
return val
|
return val
|
||||||
|
|
||||||
@register.inclusion_tag("cofcms/calendar.html")
|
@register.inclusion_tag("cofcms/calendar.html", takes_context=True)
|
||||||
def calendar():
|
def calendar(context, month=None, year=None):
|
||||||
now = timezone.now()
|
now = timezone.now()
|
||||||
month_start = date(now.year, now.month, 1)
|
if month is None:
|
||||||
|
month_start = date(now.year, now.month, 1)
|
||||||
|
else:
|
||||||
|
month_start = date(year, month, 1)
|
||||||
next_month = month_start + timedelta(days=32)
|
next_month = month_start + timedelta(days=32)
|
||||||
next_month = date(next_month.year, next_month.month, 1)
|
next_month = date(next_month.year, next_month.month, 1)
|
||||||
|
prev_month = month_start - timedelta(days=2)
|
||||||
month_prestart = month_start - timedelta(days=month_start.weekday())
|
month_prestart = month_start - timedelta(days=month_start.weekday())
|
||||||
month_postend = next_month + timedelta(days=(next_month.weekday()+6)%7)
|
month_postend = next_month + timedelta(days=(next_month.weekday()+6)%7)
|
||||||
events = COFActuPage.objects.live()\
|
events = COFActuPage.objects.live()\
|
||||||
.filter(date_start__range=[month_prestart,
|
.filter(date_start__range=[month_prestart,
|
||||||
month_postend])\
|
month_postend],
|
||||||
|
is_event=True)\
|
||||||
.order_by('-date_start')
|
.order_by('-date_start')
|
||||||
events = list(events)
|
events = list(events)
|
||||||
weeks = []
|
weeks = []
|
||||||
|
@ -43,22 +50,39 @@ def calendar():
|
||||||
else:
|
else:
|
||||||
curevents.append(e)
|
curevents.append(e)
|
||||||
day = {'day': curday.day,
|
day = {'day': curday.day,
|
||||||
|
'date': curday,
|
||||||
'class': (('today ' if (curday.day == now.day
|
'class': (('today ' if (curday.day == now.day
|
||||||
and curday.month == now.month) else '')
|
and curday.month == now.month
|
||||||
+ ('in ' if curday.month == now.month else 'out')
|
and curday.year == now.year) else '')
|
||||||
|
+ ('in ' if (curday.month == month_start.month
|
||||||
|
and curday.year == month_start.year)
|
||||||
|
else 'out ')
|
||||||
+ ('hasevent' if len(curevents) > 0 else '')),
|
+ ('hasevent' if len(curevents) > 0 else '')),
|
||||||
'events': curevents}
|
'events': curevents}
|
||||||
week.append(day)
|
week.append(day)
|
||||||
curday += deltaday
|
curday += deltaday
|
||||||
weeks.append(week)
|
weeks.append(week)
|
||||||
return {"events": events, "weeks": weeks}
|
|
||||||
|
|
||||||
|
# Calendar next/prev urls
|
||||||
|
try:
|
||||||
|
utilpage = COFUtilPage.objects.live()[0]
|
||||||
|
except COFUtilPage.DoesNotExist:
|
||||||
|
utilpage = None
|
||||||
|
request = context['request']
|
||||||
|
burl = utilpage.debugged_get_url(request) + "/"
|
||||||
|
prev_url = burl + utilpage.reverse_subpage("calendar",
|
||||||
|
args=["%d" % (prev_month.year,),
|
||||||
|
"%d" % (prev_month.month,)])
|
||||||
|
next_url = burl + utilpage.reverse_subpage("calendar",
|
||||||
|
args=["%d" % (next_month.year,),
|
||||||
|
"%d" % (next_month.month,)])
|
||||||
|
context.push({"events": events, "weeks": weeks, "this_month": month_start,
|
||||||
|
"prev_month": prev_url, "next_month": next_url})
|
||||||
|
return context
|
||||||
|
|
||||||
@register.inclusion_tag("cofcms/mini_calendar.html")
|
@register.inclusion_tag("cofcms/mini_calendar.html")
|
||||||
def mini_calendar(event, loc):
|
def mini_calendar(event):
|
||||||
try:
|
|
||||||
locale.setlocale(locale.LC_TIME, loc)
|
|
||||||
except locale.Error:
|
|
||||||
pass
|
|
||||||
days = []
|
days = []
|
||||||
today = timezone.now().date()
|
today = timezone.now().date()
|
||||||
date_start = event.date_start.date()
|
date_start = event.date_start.date()
|
||||||
|
@ -71,3 +95,51 @@ def mini_calendar(event, loc):
|
||||||
'today': curday == today})
|
'today': curday == today})
|
||||||
curday += timedelta(days=1)
|
curday += timedelta(days=1)
|
||||||
return {"days": days}
|
return {"days": days}
|
||||||
|
|
||||||
|
|
||||||
|
@register.filter()
|
||||||
|
def dates(event, loc=None):
|
||||||
|
try:
|
||||||
|
if loc == "fr":
|
||||||
|
locale.setlocale(locale.LC_TIME, "fr_FR.UTF-8")
|
||||||
|
else:
|
||||||
|
locale.setlocale(locale.LC_TIME, "en_US.UTF-8")
|
||||||
|
except locale.Error as e:
|
||||||
|
pass
|
||||||
|
if event.date_end:
|
||||||
|
if event.date_end.date() == event.date_start.date():
|
||||||
|
if event.all_day:
|
||||||
|
return event.date_start.strftime(_("le %A %d %B %Y"))
|
||||||
|
else:
|
||||||
|
return _("le %s de %s à %s") % \
|
||||||
|
(event.date_start.strftime("%A %d %B %Y"),
|
||||||
|
event.date_start.strftime(_("%Hh%M")),
|
||||||
|
event.date_end.strftime(_("%Hh%M")))
|
||||||
|
else:
|
||||||
|
tmpl = "%A %d %B %Y"
|
||||||
|
diff_i = len(tmpl)
|
||||||
|
if event.date_end.year != event.date_start.year:
|
||||||
|
diff_i = len(tmpl)
|
||||||
|
elif event.date_end.month != event.date_start.month:
|
||||||
|
diff_i = len(tmpl) - 3
|
||||||
|
elif event.date_end.day != event.date_start.day:
|
||||||
|
diff_i = len(tmpl) - 6
|
||||||
|
common = tmpl[diff_i:]
|
||||||
|
diff = tmpl[:diff_i]
|
||||||
|
if event.all_day:
|
||||||
|
return _("du %s au %s %s") % \
|
||||||
|
(event.date_start.strftime(diff),
|
||||||
|
event.date_end.strftime(diff),
|
||||||
|
event.date_end.strftime(common))
|
||||||
|
else:
|
||||||
|
return _("du %s %s à %s au %s à %s") % \
|
||||||
|
(event.date_start.strftime(diff),
|
||||||
|
event.date_start.strftime(common),
|
||||||
|
event.date_start.strftime("%Hh%M"),
|
||||||
|
event.date_end.strftime(diff),
|
||||||
|
event.date_end.strftime("%Hh%M"))
|
||||||
|
else:
|
||||||
|
if event.all_day:
|
||||||
|
return event.date_start.strftime(_("le %A %d %B %Y"))
|
||||||
|
else:
|
||||||
|
return event.date_start.strftime(_("le %A %d %B %Y à %Hh%M"))
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
from django.http.response import HttpResponseRedirect
|
||||||
|
import re
|
||||||
|
|
||||||
# Create your views here.
|
def raw_calendar_view(request, year, month):
|
||||||
|
return render(request, "cofcms/calendar_raw.html", {"month": month, "year": year})
|
||||||
|
|
||||||
|
def sympa_view(request):
|
||||||
|
erreur = None
|
||||||
|
if request.POST and "bassin" in request.POST:
|
||||||
|
if re.match(r'\s*(les|the)\s*ernests?\s*', request.POST["bassin"],
|
||||||
|
re.IGNORECASE):
|
||||||
|
return HttpResponseRedirect("https://lists.ens.fr/wws")
|
||||||
|
erreur = "Réponse invalide"
|
||||||
|
return render(request, "cofcms/sympa.html", {"erreur": erreur})
|
||||||
|
|
Loading…
Reference in a new issue