kpsul/gestioncof/cms/templatetags/cofcms_tags.py
2018-10-14 15:50:55 +02:00

139 lines
5.3 KiB
Python

from datetime import timedelta, date
from django import template
from django.conf import settings
from django.utils import timezone, formats
import locale
from django.utils.translation import ugettext as _
from ..models import COFActuPage, COFUtilPage
import re
register = template.Library()
@register.filter()
def obfuscate_mail(value):
val = value.replace('', '-').replace('@', 'arbre').replace('.', 'pont')[1:]
return val
@register.inclusion_tag("cofcms/calendar.html", takes_context=True)
def calendar(context, month=None, year=None):
now = timezone.now()
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 = 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_postend = next_month + timedelta(days=(next_month.weekday()+6)%7)
events = COFActuPage.objects.live()\
.filter(date_start__range=[month_prestart,
month_postend],
is_event=True)\
.order_by('-date_start')
events = list(events)
weeks = []
curday = month_prestart
deltaday = timedelta(days=1)
while curday < next_month and len(weeks)<10:
week = []
for k in range(7):
curevents = []
for k in range(len(events)-1, -1, -1):
e = events[k]
if e.date_start.date() > curday: break
if (e.date_start if e.date_end is None else e.date_end).date() < curday:
del events[k]
else:
curevents.append(e)
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}
week.append(day)
curday += deltaday
weeks.append(week)
# 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=[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})
return context
@register.inclusion_tag("cofcms/mini_calendar.html")
def mini_calendar(event):
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):
days.append({'day': curday.day,
'hasevent': curday >= date_start and curday <= date_end,
'today': curday == today})
curday += timedelta(days=1)
return {"days": days}
@register.filter()
def dates(event):
def factorize_suffix(a, b):
i = -1
imin = -min(len(a), len(b))
while i>imin and a[i] == b[i]:
i -= 1
if i == -1:
return (a, b, '')
else:
return (a[:i+1], b[:i+1], a[i+1:])
datestart_string = formats.date_format(event.date_start)
timestart_string = formats.time_format(event.date_start)
if event.date_end:
if event.date_end.date() == event.date_start.date():
if event.all_day:
return _("le %s") % datestart_string
else:
return _("le %s de %s à %s") % \
(datestart_string,
timestart_string,
formats.time_format(event.date_end))
else:
dateend_string = formats.date_format(event.date_end)
timeend_string = formats.time_format(event.date_end)
diffstart, diffend, common = factorize_suffix(datestart_string,
dateend_string)
if event.all_day:
return _("du %s au %s%s") % \
(diffstart, diffend, common)
else:
return _("du %s%s à %s au %s à %s") % \
(diffstart, common, timestart_string,
diffend, formats.time_format(event.date_end))
else:
if event.all_day:
return _("le %s") % datestart_string
else:
return _("le %s à %s") % (datestart_string, timestart_string)