2019-01-06 00:17:57 +01:00
|
|
|
from datetime import date, timedelta
|
2017-08-20 00:39:19 +02:00
|
|
|
|
2019-01-06 00:17:57 +01:00
|
|
|
from django import template
|
|
|
|
from django.utils import formats, timezone
|
2022-06-29 16:09:50 +02:00
|
|
|
from django.utils.translation import gettext as _
|
2018-01-28 23:44:48 +01:00
|
|
|
|
2019-02-04 22:50:27 +01:00
|
|
|
from ..models import COFActuPage, COFRootPage
|
2017-08-19 01:32:26 +02:00
|
|
|
|
|
|
|
register = template.Library()
|
|
|
|
|
2019-01-06 00:17:57 +01:00
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
@register.filter()
|
|
|
|
def obfuscate_mail(value):
|
2019-01-06 00:25:41 +01:00
|
|
|
val = value.replace("", "-").replace("@", "arbre").replace(".", "pont")[1:]
|
2017-08-19 01:32:26 +02:00
|
|
|
return val
|
2017-08-20 00:39:19 +02:00
|
|
|
|
2019-01-06 00:17:57 +01:00
|
|
|
|
2018-01-28 23:44:48 +01:00
|
|
|
@register.inclusion_tag("cofcms/calendar.html", takes_context=True)
|
|
|
|
def calendar(context, month=None, year=None):
|
2017-08-20 00:39:19 +02:00
|
|
|
now = timezone.now()
|
2018-01-28 23:44:48 +01:00
|
|
|
if month is None:
|
|
|
|
month_start = date(now.year, now.month, 1)
|
|
|
|
else:
|
|
|
|
month_start = date(year, month, 1)
|
2017-08-20 00:39:19 +02:00
|
|
|
next_month = month_start + timedelta(days=32)
|
|
|
|
next_month = date(next_month.year, next_month.month, 1)
|
2018-01-28 23:44:48 +01:00
|
|
|
prev_month = month_start - timedelta(days=2)
|
2017-08-22 00:58:18 +02:00
|
|
|
month_prestart = month_start - timedelta(days=month_start.weekday())
|
2019-01-06 00:17:57 +01:00
|
|
|
month_postend = next_month + timedelta(days=(next_month.weekday() + 6) % 7)
|
2019-01-06 00:25:41 +01:00
|
|
|
events = (
|
|
|
|
COFActuPage.objects.live()
|
|
|
|
.filter(date_start__range=[month_prestart, month_postend], is_event=True)
|
|
|
|
.order_by("-date_start")
|
|
|
|
)
|
2017-08-20 00:39:19 +02:00
|
|
|
events = list(events)
|
|
|
|
weeks = []
|
|
|
|
curday = month_prestart
|
|
|
|
deltaday = timedelta(days=1)
|
2019-01-06 00:17:57 +01:00
|
|
|
while curday < next_month and len(weeks) < 10:
|
2017-08-20 00:39:19 +02:00
|
|
|
week = []
|
|
|
|
for k in range(7):
|
|
|
|
curevents = []
|
2019-01-06 00:17:57 +01:00
|
|
|
for k in range(len(events) - 1, -1, -1):
|
2017-08-20 00:39:19 +02:00
|
|
|
e = events[k]
|
2019-01-06 00:17:57 +01:00
|
|
|
if e.date_start.date() > curday:
|
|
|
|
break
|
2017-08-20 00:39:19 +02:00
|
|
|
if (e.date_start if e.date_end is None else e.date_end).date() < curday:
|
|
|
|
del events[k]
|
|
|
|
else:
|
|
|
|
curevents.append(e)
|
2019-01-06 00:25:41 +01:00
|
|
|
day = {
|
|
|
|
"day": curday.day,
|
|
|
|
"date": curday,
|
|
|
|
"class": (
|
|
|
|
("today " if curday == now.date() else "")
|
|
|
|
+ (
|
|
|
|
"in "
|
|
|
|
if (
|
|
|
|
curday.month == month_start.month
|
|
|
|
and curday.year == month_start.year
|
|
|
|
)
|
|
|
|
else "out "
|
|
|
|
)
|
|
|
|
+ ("hasevent" if len(curevents) > 0 else "")
|
|
|
|
),
|
|
|
|
"events": curevents,
|
|
|
|
}
|
2017-08-20 00:39:19 +02:00
|
|
|
week.append(day)
|
|
|
|
curday += deltaday
|
|
|
|
weeks.append(week)
|
2017-08-22 00:58:18 +02:00
|
|
|
|
2018-01-28 23:44:48 +01:00
|
|
|
# Calendar next/prev urls
|
2017-08-26 18:05:20 +02:00
|
|
|
try:
|
2019-02-04 22:50:27 +01:00
|
|
|
utilpage = COFRootPage.objects.live()[0]
|
|
|
|
except COFRootPage.DoesNotExist:
|
2018-01-28 23:44:48 +01:00
|
|
|
utilpage = None
|
2019-01-06 00:25:41 +01:00
|
|
|
request = context["request"]
|
2019-02-04 22:50:27 +01:00
|
|
|
burl = utilpage.get_url(request)
|
2019-01-06 00:25:41 +01:00
|
|
|
prev_url = burl + utilpage.reverse_subpage(
|
|
|
|
"calendar", args=[str(prev_month.year), str(prev_month.month)]
|
|
|
|
)
|
|
|
|
next_url = burl + utilpage.reverse_subpage(
|
|
|
|
"calendar", args=[str(next_month.year), str(next_month.month)]
|
|
|
|
)
|
|
|
|
context.push(
|
|
|
|
{
|
|
|
|
"events": events,
|
|
|
|
"weeks": weeks,
|
|
|
|
"this_month": month_start,
|
|
|
|
"prev_month": prev_url,
|
|
|
|
"next_month": next_url,
|
|
|
|
}
|
|
|
|
)
|
2018-01-28 23:44:48 +01:00
|
|
|
return context
|
|
|
|
|
2019-01-06 00:17:57 +01:00
|
|
|
|
2018-01-28 23:44:48 +01:00
|
|
|
@register.inclusion_tag("cofcms/mini_calendar.html")
|
|
|
|
def mini_calendar(event):
|
2017-08-22 00:58:18 +02:00
|
|
|
days = []
|
|
|
|
today = timezone.now().date()
|
|
|
|
date_start = event.date_start.date()
|
|
|
|
date_end = event.date_end.date() if event.date_end else date_start
|
|
|
|
week_start = date_start - timedelta(days=date_start.weekday())
|
|
|
|
curday = week_start
|
|
|
|
for i in range(7):
|
2019-01-06 00:25:41 +01:00
|
|
|
days.append(
|
|
|
|
{
|
|
|
|
"day": curday.day,
|
|
|
|
"hasevent": curday >= date_start and curday <= date_end,
|
|
|
|
"today": curday == today,
|
|
|
|
}
|
|
|
|
)
|
2017-08-22 00:58:18 +02:00
|
|
|
curday += timedelta(days=1)
|
|
|
|
return {"days": days}
|
2018-01-28 23:44:48 +01:00
|
|
|
|
|
|
|
|
|
|
|
@register.filter()
|
2018-10-14 15:50:55 +02:00
|
|
|
def dates(event):
|
|
|
|
def factorize_suffix(a, b):
|
|
|
|
i = -1
|
2019-01-06 00:25:41 +01:00
|
|
|
imin = -min(len(a), len(b))
|
2019-01-06 00:17:57 +01:00
|
|
|
while i > imin and a[i] == b[i]:
|
2018-10-14 15:50:55 +02:00
|
|
|
i -= 1
|
|
|
|
if i == -1:
|
2019-01-06 00:25:41 +01:00
|
|
|
return (a, b, "")
|
2018-01-28 23:44:48 +01:00
|
|
|
else:
|
2019-01-06 00:25:41 +01:00
|
|
|
return (a[: i + 1], b[: i + 1], a[i + 1 :])
|
2019-01-06 00:17:57 +01:00
|
|
|
|
2018-10-14 15:50:55 +02:00
|
|
|
datestart_string = formats.date_format(event.date_start)
|
|
|
|
timestart_string = formats.time_format(event.date_start)
|
2018-01-28 23:44:48 +01:00
|
|
|
if event.date_end:
|
|
|
|
if event.date_end.date() == event.date_start.date():
|
|
|
|
if event.all_day:
|
2020-03-29 16:11:02 +02:00
|
|
|
return _("le {datestart}").format(datestart=datestart_string)
|
2018-01-28 23:44:48 +01:00
|
|
|
else:
|
2020-03-29 16:11:02 +02:00
|
|
|
return _("le {datestart} de {timestart} à {timeend}").format(
|
|
|
|
datestart=datestart_string,
|
|
|
|
timestart=timestart_string,
|
|
|
|
timeend=formats.time_format(event.date_end),
|
2019-01-06 00:25:41 +01:00
|
|
|
)
|
2018-01-28 23:44:48 +01:00
|
|
|
else:
|
2018-10-14 15:50:55 +02:00
|
|
|
dateend_string = formats.date_format(event.date_end)
|
2019-01-06 00:25:41 +01:00
|
|
|
diffstart, diffend, common = factorize_suffix(
|
|
|
|
datestart_string, dateend_string
|
|
|
|
)
|
2018-01-28 23:44:48 +01:00
|
|
|
if event.all_day:
|
2020-03-29 16:11:02 +02:00
|
|
|
return _("du {datestart} au {dateend}{common}").format(
|
2020-05-08 15:52:13 +02:00
|
|
|
datestart=diffstart, dateend=diffend, common=common
|
|
|
|
)
|
2018-10-14 15:50:55 +02:00
|
|
|
|
2018-01-28 23:44:48 +01:00
|
|
|
else:
|
2020-05-08 15:52:13 +02:00
|
|
|
return _(
|
|
|
|
"du {datestart}{common} à {timestart} au {dateend} à {timeend}"
|
|
|
|
).format(
|
2020-03-29 16:11:02 +02:00
|
|
|
datestart=diffstart,
|
|
|
|
common=common,
|
|
|
|
timestart=timestart_string,
|
|
|
|
dateend=diffend,
|
|
|
|
timeend=formats.time_format(event.date_end),
|
2019-01-06 00:25:41 +01:00
|
|
|
)
|
2018-01-28 23:44:48 +01:00
|
|
|
else:
|
|
|
|
if event.all_day:
|
2020-03-29 16:11:02 +02:00
|
|
|
return _("le {datestart}").format(datestart=datestart_string)
|
2018-01-28 23:44:48 +01:00
|
|
|
else:
|
2020-03-29 16:11:02 +02:00
|
|
|
return _("le {datestart} à {timestart}").format(
|
2020-05-08 15:52:13 +02:00
|
|
|
datestart=datestart_string, timestart=timestart_string
|
|
|
|
)
|