Commit 54787b67 authored by Nicolas G.'s avatar Nicolas G.

Génération d'un fichier XML pour la soumission à l'Agenda Du Libre

parent 3b16a0bf
......@@ -16,7 +16,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.conf.urls import include, url
from fj.views import liste_villes
from fj.views import liste_villes, Flux
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
......
......@@ -36,7 +36,7 @@ class FormEmailTextArea(forms.ModelForm):
class VilleAdmin(LeafletGeoAdmin, SummernoteModelAdmin):
fields = ('code', 'nom', 'message', 'description', 'email',
'lieu',
'lieu', 'tag',
('numday', 'numweek', 'debut', 'fin', 'limite'),
'autorise_inscription'
)
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2017-03-25 21:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('fj', '0002_separation_lieux_table_specifique'),
]
operations = [
migrations.AddField(
model_name='ville',
name='tag',
field=models.CharField(max_length=364, null=True, verbose_name="Tags (utile pour la soumission à l'Agenda du Libre <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>"),
),
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>#DATE : date de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_DEL : adresse de désinscription", verbose_name="Message sur le courriel de confirmation d'inscription"),
),
]
......@@ -60,6 +60,7 @@ class Ville(models.Model):
verbose_name=_("Message plus court"), help_text=_("Apparaît sur le résumé."),
)
lieu = models.ForeignKey(Lieu, null=True)
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)
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>#DATE : date de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<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])
......
<?xml version="1.0" encoding="UTF-8"?>
<event>
<title>{{ ville.nom }}</title>
<start-date>{{ date_adl }}</start-date>
<start-hour>{{ ville.debut }}</start-hour>
<end-hour>{{ ville.fin }}</end-hour>
<description><![CDATA[
{{ ville.message|safe }}
]]></description>
<place_name>{{ ville.lieu.nom }}</place_name>
<address>{{ ville.lieu.adresse_adl }}</address>
<city>{{ ville.lieu.ville_adl }}</city>
<region>{{ ville.lieu.region_adl }}</region>
<url>{{ url }}</url>
<contact>{{ contact_adl }}</contact>
<tags>{{ ville.tag }}</tags>
</event>
......@@ -5,7 +5,9 @@
{% block header %}
<h1>{{ jour }}
<sup>{% if perms.fj.change_ville %}<a href="{% url "admin:fj_ville_change" ville.id %}">Modifier</a>{% endif %}</sup>
<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 %}
</sup>
</h1>
{% endblock %}
......@@ -18,7 +20,7 @@
{% if ok %} <p class="infos">{% trans "Votre inscription a été prise en compte !" %}<br>
{% trans "Adresse IP" %} : {{ adresse_ip }} {{ v6 }}<br>
<br> {% trans "Pour la supprimer" %} : <a href='{% url "inscrit_delete" unique %}'>{% trans "cliquez-ici" %}</a></p>{% endif %}
<br> {% trans "Pour la supprimer" %} : <a href='{% url "fj:inscrit_delete" unique %}'>{% trans "cliquez-ici" %}</a></p>{% endif %}
<script type="text/javascript">
......
#-*- coding: utf-8 -*-
from django.conf.urls import include, url
from fj.views import InscritsDelete, inscription
from fj.views import InscritsDelete, inscription, adl
#from ponctu.views import InscritsDeletePonctu
from django.contrib.admin.views.decorators import staff_member_required
from django.views.generic.base import TemplateView
from django.conf import settings
#from django.conf.urls.static import static
......@@ -11,6 +14,7 @@ from django.conf import settings
#from django.contrib.gis import admin as geoadmin
#admin.autodiscover()
app_name = 'fj'
urlpatterns = [
# Examples:
# url(r'^$', 'firstjeudy.views.home', name='home'),
......@@ -23,9 +27,14 @@ urlpatterns = [
# Page de désinscription pour les régulières
url(r'^del/(?P<unique>.+)$', InscritsDelete.as_view(), name='inscrit_delete'),
# Génération du fichier XML pour la soumission à l'Agenda Du Libre
url(r'^agenda/(?P<code>.+)\.xml$',
adl,
name='adl'
),
#url(r'^(?P<code>.+)/stats$', 'fj.views.stats'),
# Page d'une ville : inscription
url(r'^(?P<code>.+)$', inscription, name="voir_ville"),
#url(r'^(?P<code>.+)/stats$', 'fj.views.stats'),
]
......@@ -165,6 +165,36 @@ def inscription(request, code):
# Le gabartit
return render(request, 'ville.html', locals())
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def adl(request, code):
""" Génération du XML pour l'Agenda Du Libre
"""
# 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:
date_adl = foo.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, "adl.xml", locals())
# ------- Page de suppression ----------------
class InscritsDelete(DeleteView):
......@@ -177,7 +207,27 @@ class InscritsDelete(DeleteView):
unique = self.kwargs.get('unique', None)
return get_object_or_404(Inscrits, unique=unique)
# ----------- Export iCal -------------------------
class Flux(ICalFeed):
"""
Export des évènements au format iCal
"""
product_id = '-//Firstjeudi.org//Evenements//FR'
timezone = 'UTC'
file_name = "firstjeudi.ics"
def items(self):
return Rencontre.objects.all()
def item_title(self, item):
return item.nom
def item_description(self, item):
return item.description
def item_start_datetime(self, item):
return item.date
# ------- Page des statistiques ----------------
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2017-03-25 21:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lieux', '0001_separation_lieux_table_specifique'),
]
operations = [
migrations.AddField(
model_name='lieu',
name='adresse_adl',
field=models.CharField(help_text="Indiquer la ville (utile pour la soumission à l'Agenda du Libre", max_length=352, null=True, verbose_name='Adresse (2)'),
),
migrations.AddField(
model_name='lieu',
name='region_adl',
field=models.CharField(default='Bretagne', help_text="Indiquer la région (utile pour la soumission à l'Agenda du Libre", max_length=70, verbose_name='Région'),
preserve_default=False,
),
migrations.AddField(
model_name='lieu',
name='ville_adl',
field=models.CharField(help_text="Indiquer la ville (utile pour la soumission à l'Agenda du Libre", max_length=70, null=True, verbose_name='Ville'),
),
migrations.AlterField(
model_name='lieu',
name='adresse',
field=models.TextField(help_text='Indiquer les informations complètes du lieu (nom, adresse) du lieu. Ce champ apparaît sur le site', verbose_name='Adresse'),
),
migrations.AlterField(
model_name='lieu',
name='nom',
field=models.CharField(help_text="Ce champ apparaît sur la page d'accueil (récapitulatif) et dans le courriel envoyé lors d'une inscription.", max_length=30, unique=True, verbose_name='Nom'),
),
]
......@@ -25,8 +25,22 @@ class Lieu(models.Model):
""" Les lieux des évènements """
nom = models.CharField(verbose_name=_("Nom"), max_length=30, unique=True, null=False, help_text=_("Ce champ apparaît sur la page d'accueil (récapitulatif) et dans le courriel envoyé lors d'une inscription."))
adresse = models.TextField(
verbose_name=_("Adresse"), help_text=_("Indiquer les informations complètes du lieu (nom, adresse) du lieu."),
verbose_name=_("Adresse"), help_text=_("Indiquer les informations complètes du lieu (nom, adresse) du lieu. Ce champ apparaît sur le site"),
)
adresse_adl = models.CharField(
verbose_name=_("Adresse (2)"), help_text=_("Indiquer l'adresse (utile pour la soumission à l'Agenda du Libre)"),
null=True,
max_length=352,
)
ville_adl = models.CharField(
verbose_name=_("Ville"), help_text=_("Indiquer la ville (utile pour la soumission à l'Agenda du Libre"),
max_length=70,
null=True,
)
region_adl = models.CharField(
verbose_name=_("Région"), help_text=_("Indiquer la région (utile pour la soumission à l'Agenda du Libre"),
max_length=70,
)
champGeo = PointField(verbose_name=_("Lieu"), help_text=_("Cliquer sur le marqueur puis cliquer sur la carte pour indiquer le lieu de l'évènement."))
zoom = models.FloatField(verbose_name=_("Zoom de la carte"), null=False, default=13, validators=[MinValueValidator(0), MaxValueValidator(19)])
def __str__ (self):
......
......@@ -38,7 +38,7 @@ class FormEmailTextArea(forms.ModelForm):
class RencontreAdmin(LeafletGeoAdmin, SummernoteModelAdmin):
fields = ('code', 'nom', 'message', 'description', 'email',
'lieu',
'lieu', 'tag',
('date', 'debut', 'fin', 'limite'),
'autorise_inscription'
)
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2017-03-26 19:27
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ponctu', '0002_separation_lieux_table_specifique'),
]
operations = [
migrations.AddField(
model_name='rencontre',
name='tag',
field=models.CharField(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, verbose_name='Tags'),
),
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>#LIEU : Nom du lieu de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_DEL : adresse de désinscription", verbose_name="Message sur le courriel de confirmation d'inscription"),
),
]
......@@ -46,6 +46,7 @@ class Rencontre(models.Model):
)
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>#LIEU : Nom du lieu de la rencontre<br>#NB : nombre d'inscrit<br>#IP : adresse IP de l'inscrit<br>#URL_DEL : adresse de désinscription"))
lieu = models.ForeignKey(Lieu, null=True)
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)
debut = models.TimeField(verbose_name=_("Heure de début"), null=True, blank=True)
fin = models.TimeField(verbose_name=_("Heure de fin"), null=True, blank=True)
......
<?xml version="1.0" encoding="UTF-8"?>
<event>
<title>{{ rencontre.nom }}</title>
<start-date>{{ rencontre.date|date:"Y-m-d" }}</start-date>
<start-hour>{{ rencontre.debut }}</start-hour>
<end-hour>{{ rencontre.fin }}</end-hour>
<description><![CDATA[
{{ rencontre.message|safe }}
]]></description>
<place_name>{{ rencontre.lieu.nom }}</place_name>
<address>{{ rencontre.lieu.adresse_adl }}</address>
<city>{{ rencontre.lieu.ville_adl }}</city>
<region>{{ rencontre.lieu.region_adl }}</region>
<url>{{ url }}</url>
<contact>{{ contact_adl }}</contact>
<tags>{{ rencontre.tag }}</tags>
</event>
......@@ -5,7 +5,9 @@
{% block header %}
<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 %}</sup>
<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 %}
</sup>
</h1>
{% endblock %}
......@@ -18,7 +20,7 @@
{% if ok %} <p class="infos">{% trans "Votre inscription a été prise en compte !" %}<br>
{% trans "Adresse IP" %} : {{ adresse_ip }} {{ v6 }}<br>
<br> {% trans "Pour la supprimer" %} : <a href='{% url "inscrit_delete_ponctu" unique %}'>{% trans "cliquez-ici" %}</a></p>{% endif %}
<br> {% trans "Pour la supprimer" %} : <a href='{% url "ponctu:inscrit_delete_ponctu" unique %}'>{% trans "cliquez-ici" %}</a></p>{% endif %}
<script type="text/javascript">
......
......@@ -2,7 +2,7 @@
from django.conf.urls import include, url
#from fj.views import InscritsDelete
from ponctu.views import InscritsDeletePonctu, inscription
from ponctu.views import InscritsDeletePonctu, inscription, adl
from django.conf import settings
#from django.contrib.staticfiles.urls import staticfiles_urlpatterns
......@@ -12,6 +12,7 @@ from django.conf import settings
#from django.contrib import admin
#from django.contrib.gis import admin as geoadmin
#admin.autodiscover()
app_name = 'ponctu'
urlpatterns = [
# Examples:
......@@ -21,6 +22,12 @@ urlpatterns = [
# Page de désinscription pour les ponctuelles
url(r'^del/?(?P<unique>.+)$', InscritsDeletePonctu.as_view(), name='inscrit_delete_ponctu'),
# Génération du fichier XML pour la soumission à l'Agenda Du Libre
url(r'^agenda/(?P<code>.+)\.xml$',
adl,
name='adl'
),
# Page d'une recontre : inscription
url(r'^(?P<code>.+)$', inscription, name="voir_rencontre"),
......
......@@ -140,6 +140,19 @@ def inscription(request, code):
# Le gabartit
return render(request, 'rencontre.html', locals())
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def adl(request, code):
""" Génération du XML pour l'Agenda Du Libre
"""
# Pour la description de la ville :
rencontre = get_object_or_404(Rencontre, code=code, date__gte=datetime.date.today())
contact_adl = settings.ADMINS[0][1]
url = "http://" + request.META["SERVER_NAME"] + "/r/" + rencontre.code
#url = "http://" + "www.perdu.com/r/" + rencontre.code
return render(request, "adl2.xml", locals())
# ------- Page de suppression ----------------
class InscritsDeletePonctu(DeleteView):
......
......@@ -21,14 +21,14 @@
<li><a href="/">{% trans "Accueil" %}</a></li>
{% for une_ville in liste_villes %}
<li{% if une_ville.code == ville.code %} class="actif"{% endif %}>
<a href='{% url "voir_ville" une_ville.code %}'> {{ une_ville.nom }}</a>
<a href='{% url "fj:voir_ville" une_ville.code %}'> {{ une_ville.nom }}</a>
</li>
{% endfor %}
</ul>
<ul>
{% for une_rencontre in liste_rencontres %}
<li{% if une_rencontre.code == rencontre.code %} class="actif"{% endif %}>
<a href='{% url "voir_rencontre" une_rencontre.code %}'> {{ une_rencontre.nom }}</a>
<a href='{% url "ponctu:voir_rencontre" une_rencontre.code %}'> {{ une_rencontre.nom }}</a>
</li>
{% endfor %}
</ul>
......
......@@ -29,7 +29,7 @@
{% elif ville.numday == 6 %} samedi
{% endif %} du mois</p>
<p class="lieu">{{ ville.lieu|safe }}<p>
<p class="inscription"><a href='{% url "voir_ville" ville.code %}'>{% trans "Inscription" %}</a></p>
<p class="inscription"><a href='{% url "fj:voir_ville" ville.code %}'>{% trans "Inscription" %}</a></p>
</div>
{% empty %}
<p>{% trans "Il n'y a rien pour l'instant !" %}</p>
......@@ -39,7 +39,7 @@
<h2>{{ rencontre.nom }} </h2>
<p> {{ rencontre.description|safe}}</p>
<p class="date">{{ rencontre.date|date:"l d F Y"|capfirst }}</p>
<p class="inscription"><a href='{% url 'voir_rencontre' rencontre.code %}'>{% trans "Inscription" %}</a></p>
<p class="inscription"><a href='{% url 'ponctu:voir_rencontre' rencontre.code %}'>{% trans "Inscription" %}</a></p>
</div>
{% endfor %}
</div>
......
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