1677: Changer les informations concernant le SMTP + composer message. 1655: Envois...
authorNilovna Bascunan-Vasquez <contact@nilovna.com>
Fri, 15 Jul 2011 14:28:28 +0000 (10:28 -0400)
committerNilovna Bascunan-Vasquez <contact@nilovna.com>
Fri, 15 Jul 2011 14:28:28 +0000 (10:28 -0400)
project/recrutement/admin.py
project/recrutement/forms.py
project/recrutement/models.py
project/recrutement/templates/recrutement/envoyer_courriel_candidats.html
project/recrutement/templates/recrutement/selectionner_template.html [new file with mode: 0644]
project/recrutement/views.py
project/urls.py

index 149ba74..da47af4 100644 (file)
@@ -183,7 +183,7 @@ class CandidatAdmin(VersionAdmin):
     def envoyer_courriel_candidats(modeladmin, obj, candidats):   
         selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
 
-        return HttpResponseRedirect(reverse('envoyer_courriel_candidats')+
+        return HttpResponseRedirect(reverse('selectionner_template')+
                 "?ids=%s" % (",".join(selected)))
     envoyer_courriel_candidats.short_description = u'Envoyer courriel'
 
@@ -447,4 +447,4 @@ admin.site.register(ProxyCandidat, ProxyCandidatAdmin)
 admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin)
 admin.site.register(Evaluateur, EvaluateurAdmin)
 #admin.site.register(AdministrateurRegional, AdministrateurRegionalAdmin)
-#admin.site.register(CourrielTemplate, CourrielTemplateAdmin)
+admin.site.register(CourrielTemplate, CourrielTemplateAdmin)
index 454fa9c..ee0c90c 100644 (file)
@@ -15,6 +15,7 @@ from tinymce.widgets import TinyMCE
 from captcha.fields import CaptchaField
 
 from recrutement import models as recr
+from django.core.mail import send_mail
 #from recrutement.lib import send_templated_mail
 
 ################################################################################
@@ -85,19 +86,24 @@ class PostulerOffreEmploiForm(ModelForm):
 ################################################################################
 # TEMPLATE COURRIEL
 ################################################################################
-class CandidatCourrielForm(ModelForm):
-    #texte = forms.CharField(widget=TinyMCE())
+class CandidatCourrielTemplateForm(ModelForm):
+    def get_template(self):
+        return self.data['template']
 
+    class Meta:
+        model = recr.CandidatCourriel
+        fields = ('template', )
+
+class CandidatCourrielForm(ModelForm):
     def __init__(self, *args, **kwargs):
         self.candidats = kwargs.pop('candidats')
+        self.template = kwargs.pop('template')
         super(CandidatCourrielForm, self).__init__(*args, **kwargs)
 
     def save(self):
         super(CandidatCourrielForm, self).save()
-        #for cand in self.candidats:   
-        #send_templated_mail()
 
     class Meta:
         model = recr.CandidatCourriel
-        fields = ('template','titre', 'texte')
+        fields = ('sujet', 'plain_text', 'html')
 
index 5b1b36b..5263c95 100755 (executable)
@@ -21,6 +21,11 @@ NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)]
 #HELP_TEXT
 HELP_TEXT_NB_DEPENDANT = "Le nombre de personnes à charge"
 HELP_TEXT_FORMAT_DATE = "Le format de la date est AAAA-MM-JJ"
+HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \
+                            {{ nom_candidat }} {{ prenom_candidat }} \
+                            {{ offre_emploi }}. Ces champs seront \
+                            automatiquement remplacés par les informations de \
+                            chaque candidat."
 
 # Abstracts
 class Metadata(models.Model):
@@ -242,10 +247,12 @@ TEMPLATE_CHOICES = (
 )
 
 class CourrielTemplate(models.Model):
-    nom_modele = models.CharField(max_length=100, verbose_name='Nom modèle', )
-    sujet = models.CharField(max_length=100, )
-    plain_text = models.TextField(verbose_name='Texte', )
-    html = tinymce_models.HTMLField(verbose_name='Texte HTML', )
+    nom_modele = models.CharField(max_length=100, verbose_name='Nom du modèle',)
+    sujet = models.CharField(max_length=100, verbose_name='Sujet du courriel')
+    plain_text = models.TextField(verbose_name='Texte', 
+                                    help_text=HELP_TEXT_TAGS_ACCEPTES,  )
+    html = tinymce_models.HTMLField(verbose_name='Texte en HTML', 
+                                    help_text=HELP_TEXT_TAGS_ACCEPTES,  )
 
     def __unicode__(self):
         return u'%s' % self.nom_modele
@@ -254,12 +261,15 @@ class CourrielTemplate(models.Model):
         ordering = ['nom_modele',]
 
 class CandidatCourriel(models.Model):
-    candidat = models.ForeignKey(Candidat, db_column='candidat', 
-                related_name='+', ) 
-    template = models.ForeignKey(CourrielTemplate, db_column='nom', 
+    candidats = models.ManyToManyField(Candidat, verbose_name="Candidats", )
+    template = models.ForeignKey(CourrielTemplate, db_column='template', 
                 related_name='+', verbose_name="Modèle de courriel", )
-    titre = models.CharField(max_length=255, )
-    texte = models.TextField(null=True, blank=True, )
+    sujet = models.CharField(max_length=255, blank=True, 
+                                help_text=HELP_TEXT_TAGS_ACCEPTES, )
+    plain_text = models.TextField(verbose_name='Texte', blank=True,
+                                    help_text=HELP_TEXT_TAGS_ACCEPTES,  )
+    html = tinymce_models.HTMLField(verbose_name='Texte en HTML', null=True, blank=True, 
+                                help_text=HELP_TEXT_TAGS_ACCEPTES, )
 
     def __unicode__(self):
         return '%s' % (self.titre)
index 357378a..7fa5696 100644 (file)
@@ -3,7 +3,7 @@
 
 {% block title %}RH - Recrutement{% endblock %}
 {% block titre %}Ressources humaines{% endblock %}
-{% block sous_titre %}Envoyer courriel{% endblock %}
+{% block sous_titre %}Envoyer courriel aux candidats{% endblock %}
 {% block extrahead %}
 
 {{ form.media }}
@@ -12,8 +12,6 @@
 <div id="content-main">
     {% block object-tools %}{% endblock %}
 
-
-
     <div class="module">
         <h2>Envoyer un courriel aux candidats</h2>
 
@@ -21,7 +19,8 @@
             <table>
                 <tr>
                     <td>Candidats sélectionnés</td>
-                    <td><select name="candidats" multiple="True">
+                    <td>
+                        <select name="candidats" multiple="True">
                         {% for c in form.candidats %}
                             <option selected="selected" value="{{ c.nom }}_{{c.prenom}}_{{c.id}}">{{c}}</option>
                         {% endfor %}
                     </td>
                 </tr>
                 <tr>
-                    <td>{{ form.template.label }}</td>
-                    <td>{{ form.template }}</td>
+                    <td>Modèle de courriel</td>
+                    <td>
+                        {{ form.template }}
+                    </td>
                 </tr>
                 <tr>
-                    <td>{{ form.titre.label }}</td>
-                    <td>{{ form.titre }}</td>
+                    <td>{{ form.sujet.label }}</td>
+                    <td>{{ form.sujet }}</td>
                 </tr>
                 <tr>
-
-                    <td>{{ form.texte.label }}</td>
-                    <td>{{ form.texte }}</td>
-<script type="text/javascript">tinyMCE.setContent('<strong>Some contents</strong>');</script>
+                    <td>{{ form.plain_text.label }}</td>
+                    <td>{{ form.plain_text }}
+                        <p class="help">{{ form.plain_text.help_text }}</p>
+                    </td>
+                    
+                </tr>
+                <tr>
+                    <td>{{ form.html.label }}</td>
+                    <td>{{ form.html }}
+                        <p class="help">{{ form.html.help_text }}</p>
+                    </td>                       
                 </tr>
-                
             </table>
             <div class="submit-row">
                 <input type="submit" name="_save" class="default" value="Envoyer">
diff --git a/project/recrutement/templates/recrutement/selectionner_template.html b/project/recrutement/templates/recrutement/selectionner_template.html
new file mode 100644 (file)
index 0000000..0af5e85
--- /dev/null
@@ -0,0 +1,34 @@
+{% extends 'admin/base_site.html' %}
+{% load i18n adminmedia form_utils_tags %}
+
+{% block title %}RH - Recrutement{% endblock %}
+{% block titre %}Ressources humaines{% endblock %}
+{% block sous_titre %}Envoyer courriel aux candidats{% endblock %}
+{% block extrahead %}
+{{ form.media }}
+{% endblock %}
+{% block content %}
+<div id="content-main">
+    {% block object-tools %}{% endblock %}
+
+    <div class="module">
+        <h2>Sélectionner modèle de courriel</h2>
+
+        <form action="" method="post">
+            <table>
+                <tr>
+                    <td>{{ form.template.label }}</td>
+                    <td>{{ form.template }}</td>
+                </tr>
+                
+            </table>
+            <div class="submit-row">
+                <input type="submit" name="_save" class="default" value="Envoyer">
+            </div>
+        </form>
+    </div>
+
+
+</div>
+
+{% endblock %}
index aced519..e8e41e6 100755 (executable)
@@ -3,9 +3,11 @@
 from django.contrib import messages
 from django.contrib.auth.models import User
 from django.core.mail import send_mail
-from django.http import HttpResponse
+from django.core.urlresolvers import reverse
+from django.http import HttpResponse, HttpResponseRedirect
 from django.shortcuts import render_to_response, redirect, get_object_or_404
-from django.template import Context, RequestContext
+from django.template import Context, RequestContext, Template
+from django.core.mail import EmailMultiAlternatives
 
 from forms import *
 from models import *
@@ -33,26 +35,57 @@ def affecter_evaluateurs_candidats(request):
     return render_to_response("recrutement/affecter_evaluateurs.html", 
             Context(c), context_instance = RequestContext(request))
 
+def selectionner_template(request):
+    candidat_ids = request.GET.get('ids')
+    if request.method == "POST":
+        form = CandidatCourrielTemplateForm(request.POST)
+        if form.is_valid():
+            form.save()
+            courriel_template_id = form.get_template()
+            
+            return HttpResponseRedirect(reverse('envoyer_courriel_candidats')+
+                "?ids_cand=%s&id_temp=%s" % (candidat_ids, courriel_template_id))
+    else:
+        form = CandidatCourrielTemplateForm()
+
+    c = {'form' : form}   
+    return render_to_response("recrutement/selectionner_template.html", 
+            Context(c), context_instance = RequestContext(request))
+
 def envoyer_courriel_candidats(request):
-    candidat_ids = request.GET.get('ids').split(',')
+    candidat_ids = request.GET.get('ids_cand').split(',')
     candidats = Candidat.objects.filter(id__in=candidat_ids)
+    template_id = request.GET.get('id_temp')
+    template = CourrielTemplate.objects.get(id=template_id) 
 
     if request.method == "POST":
-        form = CandidatCourrielForm(request.POST, candidats=candidats)
+        form = CandidatCourrielForm(request.POST, instance=template,
+                                    candidats=candidats, template=template)
+
         if form.is_valid():
             form.save()
+            courriel_template = CourrielTemplate()
+            courriel_template.nom_modele = template.nom_modele
+            courriel_template.sujet = form.data['sujet']
+            courriel_template.plain_text = form.data['plain_text']
+            courriel_template.html = form.data['html']
+            for cand in candidats:     
+                import pdb;pdb.set_trace()
+                send_templated_email(cand, courriel_template)
             messages.add_message(request, messages.SUCCESS, 
-                            "Les évaluateurs ont été affectés aux candidats.")
+                            "Le email a été envoyé aux candidats.")
             return redirect("admin:recrutement_candidat_changelist")
     else:
-        form = CandidatCourrielForm(candidats=candidats)
+        form = CandidatCourrielForm(candidats=candidats, template=template,
+                                    initial={'sujet': template.sujet,
+                                    'plain_text': template.plain_text,
+                                    'html': template.html})
 
     c = {'form' : form}   
     return render_to_response("recrutement/envoyer_courriel_candidats.html", 
             Context(c), context_instance = RequestContext(request))
 
 def postuler_appel_offre(request):
-
     vars = dict()
     offre_emploi = get_object_or_404(OffreEmploi, id=request.GET.get('id'))
     candidat = Candidat()
@@ -63,27 +96,18 @@ def postuler_appel_offre(request):
                  instance=candidat, offre_emploi=offre_emploi)
         piecesForm = CandidatPieceForm(request.POST, request.FILES,
                     instance=candidat)
-        print form.errors
         if form.is_valid() and piecesForm.is_valid():
             offre = form.save()
             piecesForm.instance = offre
             piecesForm.save() 
+     
+            courriel_template = CourrielTemplate.objects.\
+                        get(nom_modele='Confirmation postulation (automatique)')
+            send_templated_email(candidat, courriel_template)
+     
             messages.add_message(request, messages.SUCCESS, 
                             "Votre application à l'appel d'offre d'emploi a \
-                            été effectuée.")
-            
-            # Envoi d'un email de confirmation
-            send_mail(u"Confirmation de postulation pour le poste \
-                        de " + offre_emploi.nom, 
-                        u"Bonjour " + candidat.prenom + " " + candidat.nom +
-                        u", \nceci est un email pour vous confirmer que votre \
-                        postulation pour l'offre d'emploi: " +
-                        offre_emploi.nom + u" a été effectuée avec succès. Vous\
-                        devriez être contacté sous peu par l'AUF. \n\n Merci \
-                        pour votre intérêt envers l'AUF.",
-                        'test@auf.org',
-                        [candidat.email], fail_silently=False)            
-
+                            été effectuée.")       
             return redirect("admin:recrutement_offreemploi_changelist")
         else:
             messages.add_message(request, messages.ERROR,
@@ -115,3 +139,24 @@ def affecter_evaluateurs_offre_emploi(request):
     c = {'form' : form}   
     return render_to_response("recrutement/affecter_evaluateurs.html", 
             Context(c), context_instance = RequestContext(request))
+
+def send_templated_email(candidat, template):
+    # Sujet
+    sujet_template = Template(template.sujet)
+    dict_sujet = {"offre_emploi": candidat.offre_emploi.nom,}            
+    sujet = Context(dict_sujet)
+    # Plain text
+    texte_template = Template(template.plain_text)
+    dict_texte = {"nom_candidat": candidat.nom, 
+                    "prenom_candidat": candidat.prenom, 
+                    "offre_emploi": candidat.offre_emploi.nom,}
+    texte = Context(dict_texte)
+    # HTML text
+    html_template = Template(template.html)
+    texte_html = Context(dict_texte)
+    msg = EmailMultiAlternatives(sujet_template.render(sujet), 
+                                texte_template.render(texte),
+                                'recrutement@auf.org', 
+                                [candidat.email])
+    msg.attach_alternative(texte_template.render(texte_html), "text/html")
+    msg.send()
index 30afb13..1e7c852 100644 (file)
@@ -3,7 +3,6 @@ from django.conf.urls.defaults import patterns, include, handler500, url
 from django.conf import settings
 from django.contrib import admin
 
-
 admin.autodiscover()
 
 handler500 # Pyflakes
@@ -28,6 +27,9 @@ urlpatterns = patterns(
     url(r'^recrutement/envoyer_courriel_candidats/$', 
         'recrutement.views.envoyer_courriel_candidats', 
         name='envoyer_courriel_candidats'),
+    url(r'^recrutement/selectionner_template/$', 
+        'recrutement.views.selectionner_template', 
+        name='selectionner_template'),
     url(r'^recrutement/pieces/$', 'recrutement.views.postuler_appel_offre', 
         name='pieces'),
     url(r'^recrutement/postuler_appel_offre/$',