from datetime import timedelta, date from django import template from django.conf import settings from django.utils import timezone 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.day == now.day and curday.month == now.month 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 '')), '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=["%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") 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, 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"))