diff --git a/cotisations/views.py b/cotisations/views.py index a4a35825..ae95ec23 100644 --- a/cotisations/views.py +++ b/cotisations/views.py @@ -148,7 +148,7 @@ def new_facture(request, user, userid): p.facture = new_invoice_instance p.save() - send_mail_invoice(new_invoice_instance) + #send_mail_invoice(new_invoice_instance) return new_invoice_instance.paiement.end_payment( new_invoice_instance, diff --git a/preferences/admin.py b/preferences/admin.py index 5ca90095..809a4b6d 100644 --- a/preferences/admin.py +++ b/preferences/admin.py @@ -35,6 +35,7 @@ from .models import ( GeneralOption, Service, MailContact, + Reminder, AssoOption, MailMessageOption, HomeOption @@ -85,6 +86,9 @@ class HomeOptionAdmin(VersionAdmin): """Class admin options home""" pass +class ReminderAdmin(VersionAdmin): + """Class reminder""" + pass admin.site.register(OptionalUser, OptionalUserAdmin) admin.site.register(OptionalMachine, OptionalMachineAdmin) @@ -93,5 +97,6 @@ admin.site.register(GeneralOption, GeneralOptionAdmin) admin.site.register(HomeOption, HomeOptionAdmin) admin.site.register(Service, ServiceAdmin) admin.site.register(MailContact, MailContactAdmin) +admin.site.register(Reminder, ReminderAdmin) admin.site.register(AssoOption, AssoOptionAdmin) admin.site.register(MailMessageOption, MailMessageOptionAdmin) diff --git a/preferences/forms.py b/preferences/forms.py index 73731750..5b2660d3 100644 --- a/preferences/forms.py +++ b/preferences/forms.py @@ -24,6 +24,7 @@ Formulaire d'edition des réglages : user, machine, topologie, asso... """ from __future__ import unicode_literals +from re2o.mixins import FormRevMixin from django.forms import ModelForm, Form from django import forms @@ -39,6 +40,7 @@ from .models import ( HomeOption, Service, MailContact + Reminder ) @@ -211,7 +213,7 @@ class EditHomeOptionForm(ModelForm): self.fields['twitter_account_name'].label = _("Twitter account name") -class ServiceForm(ModelForm): +class ServiceForm(FormRevMixin, ModelForm): """Edition, ajout de services sur la page d'accueil""" class Meta: model = Service @@ -269,3 +271,12 @@ class DelMailContactForm(Form): else: self.fields['mailcontacts'].queryset = MailContact.objects.all() +class ReminderForm(FormRevMixin, ModelForm): + """Edition, ajout de rappel""" + class Meta: + model = Reminder + fields = '__all__' + + def __init__(self, *args, **kwargs): + prefix = kwargs.pop('prefix', self.Meta.model.__name__) + super(ReminderForm, self).__init__(*args, prefix=prefix, **kwargs) diff --git a/preferences/models.py b/preferences/models.py index 3199dd6c..adcd2e37 100644 --- a/preferences/models.py +++ b/preferences/models.py @@ -215,6 +215,32 @@ def optionaltopologie_post_save(**kwargs): topologie_pref.set_in_cache() +class Reminder(AclMixin, models.Model): + """Options pour les mails de notification de fin d'adhésion. + Days: liste des nombres de jours pour lesquells un mail est envoyé + optionalMessage: message additionel pour le mail + """ + PRETTY_NAME="Options pour le mail de fin d'adhésion" + + days = models.IntegerField( + default=7, + unique=True, + help_text="Délais entre le mail et la fin d'adhésion" + ) + message = models.CharField( + max_length=255, + default="", + null=True, + blank=True, + help_text="Message affiché spécifiquement pour ce rappel" + ) + + class Meta: + permissions = ( + ("view_reminder", "Peut voir un objet reminder"), + ) + + class GeneralOption(AclMixin, PreferencesModel): """Options générales : nombre de resultats par page, nom du site, temps où les liens sont valides""" diff --git a/preferences/templates/preferences/display_preferences.html b/preferences/templates/preferences/display_preferences.html index 6a499969..05154246 100644 --- a/preferences/templates/preferences/display_preferences.html +++ b/preferences/templates/preferences/display_preferences.html @@ -224,8 +224,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% acl_end %} {% trans "Delete one or several addresses" %} {% include "preferences/aff_mailcontact.html" with mailcontact_list=mailcontact_list %} -

-

+ @@ -238,5 +237,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% trans "Twitter account URL" %}{{ homeoptions.facebook_url }}
+ + {% for line in assooptions %} + + {% for text, field in line %} + + + {% endfor %} + + {% endfor %} +
{{ field }}{{ text }}
+ + +

Options pour le mail de fin d'adhésion

+ {% can_create preferences.Reminder%} + Ajouter un rappel + {% acl_end %} + {% include "preferences/aff_reminder.html" with reminder_list=reminder_list %} + +
+
+
{% endblock %} diff --git a/preferences/urls.py b/preferences/urls.py index a89fcdf3..1f6dffdd 100644 --- a/preferences/urls.py +++ b/preferences/urls.py @@ -74,6 +74,13 @@ urlpatterns = [ ), url(r'^del_service/$', views.del_service, name='del-service'), url(r'^add_mailcontact/$', views.add_mailcontact, name='add-mailcontact'), + url(r'^add_reminder/$', views.add_reminder, name='add-reminder'), + url( + r'^edit_reminder/(?P[0-9]+)$', + views.edit_reminder, + name='edit-reminder' + ), + url(r'^del_reminder/$', views.del_reminder, name='del-reminder'), url( r'^edit_mailcontact/(?P[0-9]+)$', views.edit_mailcontact, diff --git a/preferences/views.py b/preferences/views.py index 559cdfef..a4724be1 100644 --- a/preferences/views.py +++ b/preferences/views.py @@ -41,11 +41,12 @@ from django.utils.translation import ugettext as _ from reversion import revisions as reversion from re2o.views import form -from re2o.acl import can_create, can_edit, can_delete_set, can_view_all +from re2o.acl import can_create, can_edit, can_delete, can_view_all from .forms import ( - ServiceForm, DelServiceForm, MailContactForm, DelMailContactForm + ServiceForm, DelServiceForm, MailContactForm, DelMailContactForm, ReminderForm ) + from .models import ( Service, MailContact, @@ -133,11 +134,8 @@ def add_service(request): """Ajout d'un service de la page d'accueil""" service = ServiceForm(request.POST or None, request.FILES or None) if service.is_valid(): - with transaction.atomic(), reversion.create_revision(): - service.save() - reversion.set_user(request.user) - reversion.set_comment("Creation") - messages.success(request, _("The service was added.")) + service.save() + messages.success(request, "Ce service a été ajouté") return redirect(reverse('preferences:display-options')) return form( {'preferenceform': service, 'action_name': _("Add a service")}, @@ -156,15 +154,8 @@ def edit_service(request, service_instance, **_kwargs): instance=service_instance ) if service.is_valid(): - with transaction.atomic(), reversion.create_revision(): - service.save() - reversion.set_user(request.user) - reversion.set_comment( - "Field(s) edited: %s" % ', '.join( - field for field in service.changed_data - ) - ) - messages.success(request, _("The service was edited.")) + service.save() + messages.success(request, "Service modifié") return redirect(reverse('preferences:display-options')) return form( {'preferenceform': service, 'action_name': _("Edit")}, @@ -172,6 +163,34 @@ def edit_service(request, service_instance, **_kwargs): request ) +@login_required +@can_delete(Service) +def del_service(request, service_instance, **_kwargs): + """Destruction d'un service""" + if request.method == "POST": + service_instance.delete() + messages.success(request, "Le service a été détruit") + return redirect(reverse('preferences:display-options')) + return form( + {'objet': service_instance, 'objet_name': 'service'}, + 'preferences/delete.html', + request + ) + +@login_required +@can_create(Reminder) +def add_reminder(request): + """Ajout d'un rappel""" + reminder = ReminderForm(request.POST or None) + if reminder.is_valid(): + reminder.save() + messages.success(request, "Ce rappel a été ajouté") + return redirect(reverse('preferences:display-options')) + return form( + {'preferenceform': reminder, 'action_name': 'Ajouter'}, + 'preferences/preferences.html', + request + ) @login_required @can_delete_set(Service) @@ -232,6 +251,17 @@ def edit_mailcontact(request, mailcontact_instance, **_kwargs): return redirect(reverse('preferences:display-options')) return form( {'preferenceform': mailcontact, 'action_name': _("Edit")}, + +@can_edit(Reminder) +def edit_reminder(request, reminder_instance, **_kwargs): + """Edition des rappels""" + reminder = ReminderForm(request.POST or None, instance=reminder_instance) + if reminder.is_valid(): + reminder.save() + messages.success(request, "Service modifié") + return redirect(reverse('preferences:display-options')) + return form( + {'preferenceform': reminder, 'action_name': 'Editer'}, 'preferences/preferences.html', request ) @@ -258,3 +288,18 @@ def del_mailcontact(request, instances): request ) +@login_required +@can_delete(Reminder) +def del_reminder(request, reminder_instance, **_kwargs): + """Destruction d'un reminder""" + if request.method == "POST": + reminder_instance.delete() + messages.success(request, "Le reminder a été détruit") + return redirect(reverse('preferences:display-options')) + return form( + {'objet': reminder_instance, 'objet_name': 'reminder'}, + 'preferences/delete.html', + request + ) + + diff --git a/re2o/templatetags/acl.py b/re2o/templatetags/acl.py index 6fd00e19..54352e59 100644 --- a/re2o/templatetags/acl.py +++ b/re2o/templatetags/acl.py @@ -79,6 +79,65 @@ from django.contrib.contenttypes.models import ContentType register = template.Library() +MODEL_NAME = { + # cotisations + 'Facture': cotisations.models.Facture, + 'Vente': cotisations.models.Vente, + 'Article': cotisations.models.Article, + 'Banque': cotisations.models.Banque, + 'Paiement': cotisations.models.Paiement, + 'Cotisation': cotisations.models.Cotisation, + # machines + 'Machine': machines.models.Machine, + 'MachineType': machines.models.MachineType, + 'IpType': machines.models.IpType, + 'Vlan': machines.models.Vlan, + 'Nas': machines.models.Nas, + 'SOA': machines.models.SOA, + 'Extension': machines.models.Extension, + 'Mx': machines.models.Mx, + 'Ns': machines.models.Ns, + 'Txt': machines.models.Txt, + 'Srv': machines.models.Srv, + 'Interface': machines.models.Interface, + 'Domain': machines.models.Domain, + 'IpList': machines.models.IpList, + 'Ipv6List': machines.models.Ipv6List, + 'machines.Service': machines.models.Service, + 'Service_link': machines.models.Service_link, + 'OuverturePortList': machines.models.OuverturePortList, + 'OuverturePort': machines.models.OuverturePort, + # preferences + 'OptionalUser': preferences.models.OptionalUser, + 'OptionalMachine': preferences.models.OptionalMachine, + 'OptionalTopologie': preferences.models.OptionalTopologie, + 'GeneralOption': preferences.models.GeneralOption, + 'preferences.Service': preferences.models.Service, + 'preferences.Reminder': preferences.models.Reminder, + 'AssoOption': preferences.models.AssoOption, + 'MailMessageOption': preferences.models.MailMessageOption, + # topologie + 'Stack': topologie.models.Stack, + 'Switch': topologie.models.Switch, + 'AccessPoint': topologie.models.AccessPoint, + 'ModelSwitch': topologie.models.ModelSwitch, + 'ConstructorSwitch': topologie.models.ConstructorSwitch, + 'Port': topologie.models.Port, + 'Room': topologie.models.Room, + 'Building': topologie.models.Building, + 'SwitchBay': topologie.models.SwitchBay, + # users + 'User': users.models.User, + 'Adherent': users.models.Adherent, + 'Club': users.models.Club, + 'ServiceUser': users.models.ServiceUser, + 'School': users.models.School, + 'ListRight': users.models.ListRight, + 'ListShell': users.models.ListShell, + 'Ban': users.models.Ban, + 'Whitelist': users.models.Whitelist, +} + def get_model(model_name): """Retrieve the model object from its name"""