Commit de57f88f authored by Nicolas G.'s avatar Nicolas G.

Export iCalendar des rencontres ponctuelles et régulières

parent 27618cc8
# Generated by Django 2.0.3 on 2018-04-15 21:17
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('fj', '0004_auto_20170430_1519'),
]
operations = [
migrations.AlterField(
model_name='inscrits',
name='ville',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='fj.Ville'),
),
migrations.AlterField(
model_name='ville',
name='email',
field=models.TextField(default='Bonjour #PRENOM #NOM.\n\nVotre inscription a bien été prise en compte (pour #NB) :\n- Ville : #VILLE\n- Date : #DATE\n- Cette rencontre aura lieu à #LIEU\n- Adresse IP : #IP\n\nPour annuler votre inscription, vous pouvez cliquer sur le lien suivant : \n#URL_DEL', help_text="Les mots-clés suivants peuvent être utilisés :<br>#NOM : Nom de l'inscrit<br>#PRENOM : prénom de l'inscrit<br>#ASSO : Association<br>#VILLE : nom complet de la ville<br>#LIEU : Nom du lieu de la rencontre<br>#URL_LIEU : Lien vers les détails du lieu<br>#DATE : date de la rencontre<br>#HEURE_DEBUT : heure du début de la rencontre<br>#HEURE_FIN : heure de fin de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_ICAL : adresse vers le lien iCalendar<br>#URL_DEL : adresse de désinscription", verbose_name="Message sur le courriel de confirmation d'inscription"),
),
migrations.AlterField(
model_name='ville',
name='lieu',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='lieux.Lieu'),
),
]
......@@ -65,7 +65,7 @@ class Ville(models.Model):
email = models.TextField(
verbose_name=_("Message sur le courriel de confirmation d'inscription"),
default=_("Bonjour #PRENOM #NOM.\n\nVotre inscription a bien été prise en compte (pour #NB) :\n- Ville : #VILLE\n- Date : #DATE\n- Cette rencontre aura lieu à #LIEU\n- Adresse IP : #IP\n\nPour annuler votre inscription, vous pouvez cliquer sur le lien suivant : \n#URL_DEL"),
help_text=_("Les mots-clés suivants peuvent être utilisés :<br>#NOM : Nom de l'inscrit<br>#PRENOM : prénom de l'inscrit<br>#ASSO : Association<br>#VILLE : nom complet de la ville<br>#LIEU : Nom du lieu de la rencontre<br>#URL_LIEU : Lien vers les détails du lieu<br>#DATE : date de la rencontre<br>#HEURE_DEBUT : heure du début de la rencontre<br>#HEURE_FIN : heure de fin de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_DEL : adresse de désinscription")
help_text=_("Les mots-clés suivants peuvent être utilisés :<br>#NOM : Nom de l'inscrit<br>#PRENOM : prénom de l'inscrit<br>#ASSO : Association<br>#VILLE : nom complet de la ville<br>#LIEU : Nom du lieu de la rencontre<br>#URL_LIEU : Lien vers les détails du lieu<br>#DATE : date de la rencontre<br>#HEURE_DEBUT : heure du début de la rencontre<br>#HEURE_FIN : heure de fin de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_ICAL : adresse vers le lien iCalendar<br>#URL_DEL : adresse de désinscription")
)
numday = models.IntegerField(verbose_name=_("Jour de la semaine"),null=False, choices=JOURS)
numweek = models.IntegerField(verbose_name=_("nième semaine du mois"),null=False, validators=[pas_de_zero, pas_plus_de_cinq])
......
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Firstjeudy//FR
BEGIN:VEVENT
DTSTART:{{ jour }}T{{ ville.debut|time:"His" }}
DTEND:{{ jour }}T{{ ville.fin|time:"His" }}
SUMMARY:{{ ville.nom }}
DESCRIPTION:{{ ville.message|safe }}
URL: {{ url }}
LOCATION:{{ ville.lieu }}
BEGIN:VALARM
ACTION:AUDIO
TRIGGER:{{ veille|date:"Ymd" }}T{{ ville.debut|time:"His" }}
END:VALARM
END:VEVENT
END:VCALENDAR
......@@ -7,6 +7,7 @@
<h1>{{ jour }}
<sup>{% if perms.fj.change_ville %}<a href="{% url "admin:fj_ville_change" ville.id %}">Modifier</a>{% endif %}
{% if user.is_staff %}<a href="{% url 'fj:adl' ville.code %}">Envoyer à l'AdL</a> {% endif %}
<a href="{% url 'fj:ical' ville.code %}">Ajouter à mon agenda</a>
</sup>
</h1>
{% endblock %}
......
......@@ -2,7 +2,7 @@
from django.conf.urls import include, url
from django.urls import path
from fj.views import InscritsDelete, inscription, adl, adlxml
from fj.views import InscritsDelete, inscription, adl, adlxml, ical
#from ponctu.views import InscritsDeletePonctu
from django.contrib.admin.views.decorators import staff_member_required
......@@ -33,6 +33,11 @@ urlpatterns = [
adlxml,
name='adlxml'
),
# Fichier ICAL
path('<str:code>.ics',
ical,
name='ical'
),
#url(r'^(?P<code>.+)/stats$', 'fj.views.stats'),
# Page pour soumettre à l'Agenda du Libre
path('agenda/<str:code>',
......
......@@ -43,7 +43,7 @@ locale.setlocale(locale.LC_TIME, "fr_FR.utf8")
import datetime
# Export iCal
from django_ical.views import ICalFeed
#from django_ical.views import ICalFeed
# Envoi de courriels
from django.core.mail import send_mail
......@@ -150,6 +150,7 @@ def inscription(request, code):
corps = corps.replace(u"#HEURE_FIN",str(ville.fin))
corps = corps.replace(u"#IP",adresse_ip + " " + v6)
corps = corps.replace(u"#URL_DEL",'http://' + url_fj + '/del/' +unique)
corps = corps.replace(u"#URL_ICAL",'http://' + url_fj + '/' + ville.code + '.ics')
send_mail(
ville.nom +' du ' + humain,
corps,
......@@ -290,6 +291,34 @@ class InscritsDelete(DeleteView):
# ----------- Export iCal -------------------------
def ical(request, code):
""" Génération du fichier Ical (code.ics)
"""
# Pour la description de la ville :
ville = get_object_or_404(Ville, code=code)
jr = (
(0,SU(ville.numweek)),
(1,MO(ville.numweek)),
(2,TU(ville.numweek)),
(3,WE(ville.numweek)),
(4,TH(ville.numweek)),
(5,FR(ville.numweek)),
(6,SA(ville.numweek)),
)
jour = list(rrule(MONTHLY, count=1, byweekday=jr[ville.numday][1]))
for foo in jour:
if ville.debut:
jour = foo.strftime("%Y%m%d")
veille = foo-datetime.timedelta(1)
veille.strftime("%Y%m%d")
#contact_adl = settings.ADMINS[0][1]
url = "http://" + request.META["SERVER_NAME"] + "/" + ville.code
#url = "http://" + "www.perdu.com/" + ville.code
return render(request, "ical.ics", locals(), content_type='text/calendar')
#class Flux(ICalFeed):
# """
# Export des évènements au format iCal
......
# Generated by Django 2.0.3 on 2018-04-15 21:17
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('ponctu', '0004_auto_20170430_1519'),
]
operations = [
migrations.AlterField(
model_name='inscrits',
name='rencontre',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='ponctu.Rencontre'),
),
migrations.AlterField(
model_name='rencontre',
name='email',
field=models.TextField(default='Bonjour #PRENOM #NOM.\n\nVotre inscription (pour #NB) a bien été prise en compte :\n- Rencontre : #RENCONTRE\n- Date : #DATE\n- Lieu : #LIEU\n- Adresse IP : #IP\n\nPour annuler votre inscription, vous pouvez cliquer sur le lien suivant : \n#URL_DEL', help_text="Les mots-clés suivants peuvent être utilisés :<br>#NOM : Nom de l'inscrit<br>#PRENOM : prénom de l'inscrit<br>#ASSO : Association<br>#RENCONTRE : nom complet de la rencontre<br>#DATE : date de la rencontre<br>#HEURE_DEBUT : heure du début de la rencontre<br>#HEURE_FIN : heure de fin de la rencontre<br>#LIEU : Nom du lieu de la rencontre<br>#URL_LIEU : Lien vers les détails du lieu de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_ICAL : adresse vers le lien iCalendar<br>#URL_DEL : adresse de désinscription", verbose_name="Message sur le courriel de confirmation d'inscription"),
),
migrations.AlterField(
model_name='rencontre',
name='lieu',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='lieux.Lieu'),
),
]
......@@ -46,7 +46,7 @@ class Rencontre(models.Model):
description = tinymce_models.HTMLField(
verbose_name=_("Message plus court"), help_text=("Apparaît sur le résumé."),
)
email = models.TextField(verbose_name=_("Message sur le courriel de confirmation d'inscription"),default=_("Bonjour #PRENOM #NOM.\n\nVotre inscription (pour #NB) a bien été prise en compte :\n- Rencontre : #RENCONTRE\n- Date : #DATE\n- Lieu : #LIEU\n- Adresse IP : #IP\n\nPour annuler votre inscription, vous pouvez cliquer sur le lien suivant : \n#URL_DEL"), help_text=_("Les mots-clés suivants peuvent être utilisés :<br>#NOM : Nom de l'inscrit<br>#PRENOM : prénom de l'inscrit<br>#ASSO : Association<br>#RENCONTRE : nom complet de la rencontre<br>#DATE : date de la rencontre<br>#HEURE_DEBUT : heure du début de la rencontre<br>#HEURE_FIN : heure de fin de la rencontre<br>#LIEU : Nom du lieu de la rencontre<br>#URL_LIEU : Lien vers les détails du lieu de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_DEL : adresse de désinscription"))
email = models.TextField(verbose_name=_("Message sur le courriel de confirmation d'inscription"),default=_("Bonjour #PRENOM #NOM.\n\nVotre inscription (pour #NB) a bien été prise en compte :\n- Rencontre : #RENCONTRE\n- Date : #DATE\n- Lieu : #LIEU\n- Adresse IP : #IP\n\nPour annuler votre inscription, vous pouvez cliquer sur le lien suivant : \n#URL_DEL"), help_text=_("Les mots-clés suivants peuvent être utilisés :<br>#NOM : Nom de l'inscrit<br>#PRENOM : prénom de l'inscrit<br>#ASSO : Association<br>#RENCONTRE : nom complet de la rencontre<br>#DATE : date de la rencontre<br>#HEURE_DEBUT : heure du début de la rencontre<br>#HEURE_FIN : heure de fin de la rencontre<br>#LIEU : Nom du lieu de la rencontre<br>#URL_LIEU : Lien vers les détails du lieu de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_ICAL : adresse vers le lien iCalendar<br>#URL_DEL : adresse de désinscription"))
lieu = models.ForeignKey(Lieu, null=True, on_delete=models.PROTECT)
tag = models.CharField(verbose_name=_("Tags"), help_text=_("Utile pour la soumission à l'Agenda du Libre <br><em>Séparés par des espaces, ils ne peuvent contenir que des lettres minuscules, des chiffres et des tirets. Ajoutez le nom de la ou des organisations de l'événement, mais pas de la ville ou de la région.</em>"), max_length=364, null=True)
date = models.DateField(verbose_name=_("Date"),help_text=_('Saisissez donc la date !'), null=False)
......
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Firstjeudy/ponctu//FR
BEGIN:VEVENT
DTSTART:{{ debut|date:"Ymd" }}T{{ debut|time:"His" }}
DTEND:{{ fin|date:"Ymd" }}T{{ fin|time:"His" }}
SUMMARY:{{ rencontre.nom }}
DESCRIPTION:{{ rencontre.message|safe }}
URL: {{ url }}
LOCATION:{{ rencontre.lieu }}
BEGIN:VALARM
ACTION:AUDIO
TRIGGER:{{ rappel|date:"Ymd" }}T{{ rappel|time:"His" }}
END:VALARM
END:VEVENT
END:VCALENDAR
......@@ -7,6 +7,7 @@
<h1>{{ rencontre.date|date:"l j F Y"|capfirst }}
<sup>{% if perms.ponctu.change_rencontre %}<a href="{% url "admin:ponctu_rencontre_change" rencontre.id %}">Modifier</a>{% endif %}
{% if user.is_staff %}<a href="{% url 'ponctu:adl' rencontre.code %}">Envoyer à l'AdL</a> {% endif %}
<a href="{% url 'ponctu:ical' rencontre.code %}">Ajouter à mon agenda</a>
</sup>
</h1>
{% endblock %}
......
......@@ -2,7 +2,7 @@
from django.conf.urls import include, url
from django.urls import path
from ponctu.views import InscritsDeletePonctu, inscription, adl, adlxml
from ponctu.views import InscritsDeletePonctu, inscription, adl, adlxml, ical
from django.conf import settings
#from django.contrib.staticfiles.urls import staticfiles_urlpatterns
......@@ -23,6 +23,11 @@ urlpatterns = [
path('del/<str:unique>', InscritsDeletePonctu.as_view(), name='inscrit_delete_ponctu'),
# Fichier ICAL
path('<str:code>.ics',
ical,
name='ical'
),
# Génération du fichier XML pour la soumission à l'Agenda Du Libre
path('agenda/<str:code>.xml',
adlxml,
......
......@@ -121,6 +121,7 @@ def inscription(request, code):
+ str(rencontre.lieu.pk))
corps = corps.replace(u"#IP",adresse_ip + " " + v6)
corps = corps.replace(u"#URL_DEL",'http://' + url_fj + '/r/del/' +unique)
corps = corps.replace(u"#URL_ICAL",'http://' + url_fj + '/r/' + rencontre.code + '.ics')
send_mail(
rencontre.nom +' du ' + date,
corps,
......@@ -196,6 +197,25 @@ def adl(request, code):
# Le gabartit
return render(request, 'agenda2.html', locals())
# ----------- Export iCal -------------------------
def ical(request, code):
""" Génération du fichier Ical (code.ics)
"""
# Pour la description
rencontre = get_object_or_404(Rencontre, code=code, date__gte=datetime.date.today())
if rencontre.debut:
# On reconstitue la date/heure de l'évènement
debut = datetime.datetime(rencontre.date.year, rencontre.date.month, rencontre.date.day, rencontre.debut.hour, rencontre.debut.minute)
fin = datetime.datetime(rencontre.date.year, rencontre.date.month, rencontre.date.day, rencontre.fin.hour, rencontre.fin.minute)
rappel = debut-datetime.timedelta(1)
url = "http://" + request.META["SERVER_NAME"] + "/r/" + rencontre.code
return render(request, "ical2.ics", locals(), content_type='text/calendar')
# ------- Page de suppression ----------------
class InscritsDeletePonctu(DeleteView):
model = Inscrits
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment