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

Intégration Mastodon

parent a73cf447
......@@ -38,6 +38,11 @@ Par exemple avec Git :
- STATIC_ROOT="/var/...." : localisation des fichiers statiques
- ADMINS : liste des admins
- STATICFILES_DIRS = () : doit être vide en production
- MASTODON = {
'url': '', ⇒ URL (avec http://) de l'instance
'login': '', ⇒ Le nom d'utilisateur
'pwd': "", ⇒ Le mot de passe
}
# Créer la base de données
$ python manage.py syncdb
......
......@@ -22,7 +22,7 @@ from fj.models import Ville, Inscrits
from django import forms
class VilleAdmin(admin.ModelAdmin):
fields = ('code', 'nom', 'message', 'description', 'email',
fields = ('code', 'nom', 'message', 'description', 'pouet', 'email',
'lieu', 'tag',
('numday', 'numweek', 'debut', 'fin', 'limite'),
'autorise_inscription'
......
......@@ -65,4 +65,4 @@ class InscritsForm(forms.ModelForm):
class AgendaForm(forms.Form):
""" Formulaire de soumission à l'Agenda du Libre """
email = forms.EmailField(label="Adresse du soumetteur", max_length=100)
toot = forms.BooleanField(label=_("En profiter pour envoyer un pouet sur Mastodon"),required=False)
# Generated by Django 2.0.7 on 2018-09-07 21:33
from django.db import migrations, models
import tinymce.models
class Migration(migrations.Migration):
dependencies = [
('fj', '0005_auto_20180415_2317'),
]
operations = [
migrations.AddField(
model_name='ville',
name='pouet',
field=models.TextField(help_text="Les mots-clés peuvent-être utilisés :<br>#LIEU_NOM : le nom du lieu<br>#LIEU_ADRESSE : l'adresse du lieu<br>#HEURE_DEBUT : l'heure de début<br>#HEURE_FIN : l'heure de fin", max_length=500, null=True, verbose_name='Message à envoyer sur Mastodon'),
),
migrations.AlterField(
model_name='ville',
name='message',
field=tinymce.models.HTMLField(help_text="Apparaît sur la page de la rencontre. Les mots-clés suivants peuvent êtres utilisés :<br>#LIEU_NOM : le nom du lieu<br>#LIEU_URL : l'URL vers la page du lieu<br>#LIEU_ADRESSE : adresse du lieu<br>#HEURE_DEBUT : début de l'évènement<br>#HEURE_FIN : Fin de l'évènement", verbose_name='Message long'),
),
]
# Generated by Django 2.0.7 on 2018-09-07 21:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('fj', '0006_Mastodon'),
]
operations = [
migrations.AlterField(
model_name='ville',
name='pouet',
field=models.TextField(help_text="Les mots-clés peuvent-être utilisés :<br>#LIEU_NOM : le nom du lieu<br>#LIEU_ADRESSE : l'adresse du lieu<br><br>#DATE : la date<br>#HEURE_DEBUT : l'heure de début<br>#HEURE_FIN : l'heure de fin", max_length=500, null=True, verbose_name='Message à envoyer sur Mastodon'),
),
]
......@@ -60,6 +60,11 @@ class Ville(models.Model):
description = tinymce_models.HTMLField(
verbose_name=_("Message plus court"), help_text=_("Apparaît sur le résumé.")
)
pouet = models.TextField(
verbose_name=_("Message à envoyer sur Mastodon"),
help_text=_("Les mots-clés peuvent-être utilisés :<br>#LIEU_NOM : le nom du lieu<br>#LIEU_ADRESSE : l'adresse (courte) du lieu<br>#LIEU_VILLE : la ville de l'évènement<br>#LIEU_REGION : la région de l'évènement<br>#URL : l'URL vers l'évènement<br>#DATE : la date<br>#HEURE_DEBUT : l'heure de début<br>#HEURE_FIN : l'heure de fin"),
max_length=500,
null=True)
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)
email = models.TextField(
......@@ -101,4 +106,3 @@ class Inscrits(models.Model):
class Meta:
verbose_name=_("Inscription")
verbose_name_plural=_("Inscriptions")
......@@ -18,8 +18,13 @@
<hr class="separation">
{% if resultatMastodon %}
<p class="infos">{{ resultatMastodon }}
</p>
{% endif %}
{% if resultat %}
<p class="infos">{{ resultat }}</p>
<p class="infos">{{ resultat }}
</p>
{% else %}
<form action="" method="post">
......
......@@ -48,6 +48,9 @@ import datetime
# Envoi de courriels
from django.core.mail import send_mail
# Mastodon
from mastodon import Mastodon
from fj.models import Ville, Inscrits
from fj.forms import InscritsForm, AgendaForm
from django.utils.translation import gettext_lazy as _
......@@ -218,6 +221,7 @@ def adlxml(request, code):
@staff_member_required
def adl(request, code):
""" Page de soumission directe pour l'Agenda Du Libre
et à Mastodon
"""
# Pour la description de la ville :
......@@ -248,6 +252,17 @@ def adl(request, code):
ville.message = ville.message.replace(u"#HEURE_DEBUT",ville.debut.strftime("%Hh%M"))
if ville.fin != None:
ville.message = ville.message.replace(u"#HEURE_FIN",ville.fin.strftime("%Hh%M"))
if ville.pouet !=None:
ville.pouet = ville.pouet.replace(u"#URL",url)
ville.pouet = ville.pouet.replace(u"#DATE",jour)
ville.pouet = ville.pouet.replace(u"#LIEU_NOM",str(ville.lieu.nom))
ville.pouet = ville.pouet.replace(u"#LIEU_ADRESSE",str(ville.lieu.adresse_adl))
ville.pouet = ville.pouet.replace(u"#LIEU_VILLE",str(ville.lieu.ville_adl))
ville.pouet = ville.pouet.replace(u"#LIEU_REGION",str(ville.lieu.region_adl))
if ville.debut != None:
ville.pouet = ville.pouet.replace(u"#HEURE_DEBUT",ville.debut.strftime("%Hh%M"))
if ville.fin != None:
ville.pouet = ville.pouet.replace(u"#HEURE_FIN",ville.fin.strftime("%Hh%M"))
if request.method== 'POST':
......@@ -263,6 +278,32 @@ def adl(request, code):
f.close()
cmd = subprocess.Popen([script, '--submitter', request.POST['email'], '--file', fichier], stdout=subprocess.PIPE)
resultat = cmd.communicate()[0]
if 'toot' in request.POST and ville.pouet!=None:
with tempfile.TemporaryDirectory() as tempdir:
temporaire = tempdir + str(time.time())
Mastodon.create_app(
'pytooterapp',
api_base_url = settings.MASTODON['url'],
to_file = temporaire + 'pytooter_clientcred.secret'
)
mastodon = Mastodon(
client_id = temporaire + 'pytooter_clientcred.secret',
api_base_url = settings.MASTODON['url'],
)
mastodon.log_in(
settings.MASTODON['login'],
settings.MASTODON['pwd'],
to_file = temporaire + 'pytooter_usercred.secret'
)
mastodon = Mastodon(
access_token = temporaire + 'pytooter_usercred.secret',
api_base_url = settings.MASTODON['url'],
)
pouet = ville.pouet
mastodon.toot(pouet[:500])
resultatMastodon = "Pouet envoyé !"
else:
form=AgendaForm()
......
......@@ -23,7 +23,7 @@ from ponctu.models import Rencontre, Inscrits
from django import forms
class RencontreAdmin(admin.ModelAdmin):
fields = ('code', 'nom', 'message', 'description', 'email',
fields = ('code', 'nom', 'message', 'description', 'pouet', 'email',
'lieu', 'tag',
('date', 'debut', 'fin', 'limite'),
'autorise_inscription'
......
# Generated by Django 2.0.7 on 2018-09-08 06:15
from django.db import migrations, models
import tinymce.models
class Migration(migrations.Migration):
dependencies = [
('ponctu', '0005_auto_20180415_2317'),
]
operations = [
migrations.AddField(
model_name='rencontre',
name='pouet',
field=models.TextField(help_text="Les mots-clés peuvent-être utilisés :<br>#LIEU_NOM : le nom du lieu<br>#LIEU_ADRESSE : l'adresse (courte) du lieu<br>#LIEU_VILLE : la ville de l'évènement<br>#LIEU_REGION : la région de l'évènement<br>#URL : l'URL vers l'évènement<br>#DATE : la date<br>#HEURE_DEBUT : l'heure de début<br>#HEURE_FIN : l'heure de fin", max_length=500, null=True, verbose_name='Message à envoyer sur Mastodon'),
),
migrations.AlterField(
model_name='rencontre',
name='message',
field=tinymce.models.HTMLField(help_text="Apparaît sur la page de la Rencontre. Les mots-clés suivants peuvent êtres utilisés :<br>#LIEU_NOM : le nom du lieu<br>#LIEU_URL : l'URL vers la page du lieu<br>#LIEU_ADRESSE : adresse du lieu<br>#HEURE_DEBUT : début de l'évènement<br>#HEURE_FIN : Fin de l'évènement", verbose_name='Message long'),
),
]
......@@ -46,6 +46,11 @@ class Rencontre(models.Model):
description = tinymce_models.HTMLField(
verbose_name=_("Message plus court"), help_text=("Apparaît sur le résumé."),
)
pouet = models.TextField(
verbose_name=_("Message à envoyer sur Mastodon"),
help_text=_("Les mots-clés peuvent-être utilisés :<br>#LIEU_NOM : le nom du lieu<br>#LIEU_ADRESSE : l'adresse (courte) du lieu<br>#LIEU_VILLE : la ville de l'évènement<br>#LIEU_REGION : la région de l'évènement<br>#URL : l'URL vers l'évènement<br>#DATE : la date<br>#HEURE_DEBUT : l'heure de début<br>#HEURE_FIN : l'heure de fin"),
max_length=500,
null=True)
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)
......
......@@ -18,9 +18,13 @@
<hr class="separation">
{% if resultatMastodon %}
<p class="infos">{{ resultatMastodon }}
</p>
{% endif %}
{% if resultat %}
<p class="infos">{{ resultat }}</p>
<p class="infos">{{ resultat }}
</p>
{% else %}
<form action="" method="post">
{% csrf_token %}
......
......@@ -43,6 +43,9 @@ from datetime import timedelta
# Envoi de courriels
from django.core.mail import send_mail
# Mastodon
from mastodon import Mastodon
# Create your views here.
......@@ -184,6 +187,7 @@ def adlxml(request, code):
@staff_member_required
def adl(request, code):
""" Page de soumission directe pour l'Agenda Du Libre
et Mastodon
"""
# Pour la description de la rencontre
......@@ -199,7 +203,21 @@ def adl(request, code):
rencontre.message = rencontre.message.replace(u"#HEURE_FIN",rencontre.fin.strftime("%Hh%M"))
contact_adl = settings.ADMINS[0][1]
url = "http://" + request.META["SERVER_NAME"] + "/" + rencontre.code
url = "http://" + request.META["SERVER_NAME"] + "/r/" + rencontre.code
date = str(rencontre.date.strftime('%A %d %B %Y'))
if rencontre.pouet !=None:
url = "http://" + request.META["SERVER_NAME"] + "/" + rencontre.code
rencontre.pouet = rencontre.pouet.replace(u"#URL",url)
rencontre.pouet = rencontre.pouet.replace(u"#DATE",date)
rencontre.pouet = rencontre.pouet.replace(u"#LIEU_NOM",str(rencontre.lieu.nom))
rencontre.pouet = rencontre.pouet.replace(u"#LIEU_ADRESSE",str(rencontre.lieu.adresse_adl))
rencontre.pouet = rencontre.pouet.replace(u"#LIEU_VILLE",str(rencontre.lieu.ville_adl))
rencontre.pouet = rencontre.pouet.replace(u"#LIEU_REGION",str(rencontre.lieu.region_adl))
if rencontre.debut != None:
rencontre.pouet = rencontre.pouet.replace(u"#HEURE_DEBUT",rencontre.debut.strftime("%Hh%M"))
if rencontre.fin != None:
rencontre.pouet = rencontre.pouet.replace(u"#HEURE_FIN",rencontre.fin.strftime("%Hh%M"))
if request.method== 'POST':
form = AgendaForm(request.POST)
......@@ -214,6 +232,32 @@ def adl(request, code):
f.close()
cmd = subprocess.Popen([script, '--submitter', request.POST['email'], '--file', fichier], stdout=subprocess.PIPE)
resultat = cmd.communicate()[0]
if 'toot' in request.POST and rencontre.pouet!=None:
with tempfile.TemporaryDirectory() as tempdir:
temporaire = tempdir + str(time.time())
Mastodon.create_app(
'pytooterapp',
api_base_url = settings.MASTODON['url'],
to_file = temporaire + 'pytooter_clientcred.secret'
)
mastodon = Mastodon(
client_id = temporaire + 'pytooter_clientcred.secret',
api_base_url = settings.MASTODON['url'],
)
mastodon.log_in(
settings.MASTODON['login'],
settings.MASTODON['pwd'],
to_file = temporaire + 'pytooter_usercred.secret'
)
mastodon = Mastodon(
access_token = temporaire + 'pytooter_usercred.secret',
api_base_url = settings.MASTODON['url'],
)
pouet = rencontre.pouet
mastodon.toot(pouet[:500])
print(pouet)
resultatMastodon = "Pouet envoyé !"
else:
form=AgendaForm()
......
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