6 ''' |
6 ''' |
7 import logging |
7 import logging |
8 from renkanmanager.models import Renkan |
8 from renkanmanager.models import Renkan |
9 |
9 |
10 from django.conf import settings |
10 from django.conf import settings |
11 from django.core.mail.message import EmailMultiAlternatives |
|
12 from django.db import models |
11 from django.db import models |
13 from django.db.models.signals import post_save |
|
14 from django.template.base import TemplateDoesNotExist |
|
15 from django.template.loader import render_to_string |
|
16 from django.utils.html import strip_tags |
|
17 from django.utils.translation import ugettext as _ |
12 from django.utils.translation import ugettext as _ |
18 |
13 |
19 |
14 |
20 logger = logging.getLogger(__name__) |
15 logger = logging.getLogger(__name__) |
21 |
16 |
48 app_label = 'hdalab' |
43 app_label = 'hdalab' |
49 |
44 |
50 |
45 |
51 class HdalabRenkanStateTransition(models.Model): |
46 class HdalabRenkanStateTransition(models.Model): |
52 |
47 |
53 renkan = models.ForeignKey(HdalabRenkan, blank=False, null=False) |
48 renkan = models.ForeignKey(HdalabRenkan, blank=False, null=False, related_name='states') |
54 from_state = models.IntegerField(choices=HdalabRenkan.STATE_CHOICES, default=1, blank=False, null=False) |
49 from_state = models.IntegerField(choices=HdalabRenkan.STATE_CHOICES, default=1, blank=False, null=False) |
55 to_state = models.IntegerField(choices=HdalabRenkan.STATE_CHOICES, default=1, blank=False, null=False) |
50 to_state = models.IntegerField(choices=HdalabRenkan.STATE_CHOICES, default=1, blank=False, null=False) |
56 ts = models.DateTimeField(auto_now_add=True, blank=False, null=False) |
51 ts = models.DateTimeField(auto_now_add=True, blank=False, null=False) |
57 message = models.TextField(blank=True, null=True) |
52 message = models.TextField(blank=True, null=True) |
58 author = models.ForeignKey(settings.AUTH_USER_MODEL, blank=False, null=False) |
53 author = models.ForeignKey(settings.AUTH_USER_MODEL, blank=False, null=False) |
59 |
54 |
60 class Meta: |
55 class Meta: |
61 app_label = 'hdalab' |
56 app_label = 'hdalab' |
62 |
57 ordering = ["-ts"] |
63 MAIL_TEMPLATES = { |
|
64 (HdalabRenkan.MODERATED,HdalabRenkan.PUBLISHED): ("mails/published_renkan", "Renkan publié"), |
|
65 (HdalabRenkan.MODERATED,HdalabRenkan.REJECTED): ("mails/rejected_renkan", "Renkan rejeté"), |
|
66 (HdalabRenkan.PUBLISHED, HdalabRenkan.EDITION): ("mails/unpublished_renkan", "Renkan dépublié"), |
|
67 } |
|
68 |
|
69 |
|
70 #TODO put into queue |
|
71 def send_renkan_moderation_messages(sender, **kwargs): |
|
72 renkan_state = kwargs.get('instance', None) |
|
73 if not renkan_state or (renkan_state.from_state,renkan_state.to_state) not in MAIL_TEMPLATES: |
|
74 return |
|
75 |
|
76 template_key = (renkan_state.from_state,renkan_state.to_state) |
|
77 msg_txt = "" |
|
78 msg_html = "" |
|
79 subject = "" |
|
80 try: |
|
81 template_name, subject = MAIL_TEMPLATES[template_key] |
|
82 # template = loader.get_template(template_name) |
|
83 context = {'renkan_state': renkan_state, 'WEB_URL': settings.WEB_URL} |
|
84 msg_html = render_to_string(template_name+".txt", context) |
|
85 msg_txt = render_to_string(template_name+".html", context) |
|
86 except TemplateDoesNotExist: |
|
87 logger.error("Mail template %s for state %s not found", MAIL_TEMPLATES[template_key], HdalabRenkan.STATE_CHOICES_DICT[renkan_state.to_state]) |
|
88 return |
|
89 except Exception as e: |
|
90 logger.error("Error rendering template %s for state %s : %r", MAIL_TEMPLATES[template_key], HdalabRenkan.STATE_CHOICES_DICT[renkan_state.to_state], e) |
|
91 |
|
92 if msg_txt and msg_html and renkan_state.renkan and renkan_state.renkan.renkan and renkan_state.renkan.renkan.owner and renkan_state.renkan.renkan.owner.email: |
|
93 logger.debug("Sending following mail to %s : %s", renkan_state.renkan.renkan.owner.email, msg_txt) |
|
94 emsg = EmailMultiAlternatives(subject, strip_tags(msg_txt), settings.DEFAULT_FROM_EMAIL, [renkan_state.renkan.renkan.owner.email]) |
|
95 emsg.attach_alternative(msg_html, "text/html") |
|
96 emsg.send(fail_silently=True) |
|
97 |
|
98 |
|
99 def queue_renkan_rendering(sender, **kwargs): |
|
100 pass |
|
101 #check state |
|
102 #queue renkan for endering |
|
103 |
|
104 |
|
105 RENKAN_MODERATION_UUID = "e2f84503-609b-4efa-819d-908e2efe7b1b" |
|
106 RENKAN_RENDERING_UUID = "b8830748-be2b-479a-8aef-c8d952437b2f" |
|
107 |
|
108 post_save.connect(send_renkan_moderation_messages, sender=HdalabRenkanStateTransition, dispatch_uid=RENKAN_MODERATION_UUID) |
|