Done with feature
[auf_rh_dae.git] / project / rh / admin.py
index 3cf8760..3a60011 100644 (file)
@@ -1,10 +1,11 @@
 # -*- encoding: utf-8 -*-
 
 import datetime
-
 import reversion
+import itertools
 from ajax_select import make_ajax_form
 from auf.django.references import models as ref
+from django.core.mail import send_mail
 from django.contrib.auth.admin import UserAdmin
 from django.contrib.auth.models import User
 from django import forms
@@ -1348,6 +1349,89 @@ class RHUserAdmin(UserAdmin):
     inlines = list(UserAdmin.inlines) + [ProfileInline]
     
 
+def _invalidate(modaladmin, req, qs):
+    qs.update(valide=False)
+_invalidate.short_description = 'Invalider'
+    
+
+def _communique(modaladmin, req, qs):
+    url_prefix = ('https://' if req.is_secure() else 'http://') + (
+        req.META['SERVER_NAME'] if 'SERVER_NAME' in req.META else
+        'localhost') + (':%s' % (req.META['SERVER_PORT']) if 'SERVER_PORT'
+        in req.META else '')
+
+    types = [x[0] for x in rh.TYPES_CHANGEMENT]
+
+    # make a list of all possible email types. It is reversed so that
+    # we start with the largest combinations.
+    combs = list(itertools.chain(*map(
+            lambda x: itertools.combinations(types, x),
+            range(1, len(types)+1))))
+    
+    combs = reversed(combs)
+
+    recipient_list = ref.Employe.objects.filter(
+        changement_notifications__in=
+        rh.ChangementPersonnelNotifications.objects.all()).distinct()
+
+
+    for comb in combs:
+        # qf c'est pour trouver les recipients.
+        qf = reduce(
+            lambda x, y: x & y,
+            [Q(**{'changement_notifications__type': t}) for t in comb]
+            )
+        recipients = recipient_list.filter(qf)
+
+        recipient_list = recipient_list.exclude(
+            id__in=recipients.values_list('id', flat=True))
+
+        types_dict = dict(rh.TYPES_CHANGEMENT)
+
+        if len(recipients):
+            sujet = '[SGRH] Rapport des employés de type: %s' % (
+                ', '.join(
+                    [types_dict[c].lower() for c in
+                     comb]))
+            message = u''
+            for t in comb:
+                message += u'%s: \n' % (types_dict[t].decode('utf8'))
+                message += '\n'.join([u'\t%s %s, %s' % (
+                            x.dossier.employe.prenom,
+                            x.dossier.employe.nom,
+                            url_prefix + reverse(
+                                'admin:rh_dossier_change', args=[x.dossier.id]))
+                            for x in qs.filter(type__in=[t])])
+            send_mail(
+                sujet,
+                message,
+                settings.SERVER_EMAIL,
+                [x.courriel for x in recipients],
+                fail_silently=False)
+        
+    qs.update(communique=True)
+
+_communique.short_description = u'Envoyer aux desinataires prévus.'
+
+
+class ChangementPersonnelAdmin(admin.ModelAdmin):
+
+    actions = (
+        _invalidate,
+        _communique,
+        )
+
+    list_display = (
+        'type', 'dossier', 'valide', 'communique', 'date_communication'
+        )
+
+    list_filter = (
+        'type',
+        'valide',
+        'communique',
+        )
+    
+
 admin.site.unregister(User)
 admin.site.register(User, RHUserAdmin)
 
@@ -1374,3 +1458,5 @@ admin.site.register(rh.TypeRevalorisation, TypeRevalorisationAdmin)
 admin.site.register(rh.ValeurPoint, ValeurPointAdmin)
 admin.site.register(ImplantationProxy, ImplantationProxyAdmin)
 admin.site.register(RegionProxy, RegionProxyAdmin)
+admin.site.register(rh.ChangementPersonnelNotifications)
+admin.site.register(rh.ChangementPersonnel, ChangementPersonnelAdmin)