src/hdalab/management/commands/send_moderation_mail.py
author ymh <ymh.work@gmail.com>
Fri, 24 Jan 2020 16:49:22 +0100
branchdocumentation
changeset 701 bf0820deea40
parent 693 09e00f38d177
permissions -rw-r--r--
Added tag V03.02.02 for changeset fe94d8572c18
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
'''
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
     3
Envoie un mail récapitulatif des renkan à modérer.
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
     4
Aucun mail n'est envoyé si aucune modération n'est demandée.
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
     5
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
     6
L'envoi est fait aux utilisateurs marqués comme `staff <https://docs.djangoproject.com/en/1.8/ref/contrib/auth/#django.contrib.auth.models.User.is_staff>`_.
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
     8
cette commande est typiquement prévue pour être lancée à partir d'une tâche ``cron`` périodique (1 fois par jour par exemple).
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
     9
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    10
**Usage**: ``django-admin send_moderation_mail [options]``
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    11
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
'''
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
import logging
530
5d3b4e1e5b34 correct email formatting
ymh <ymh.work@gmail.com>
parents: 481
diff changeset
    15
import os
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
from django.conf import settings
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
from django.contrib.auth import get_user_model
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
from django.core import mail
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
from django.core.mail.message import EmailMultiAlternatives
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
from django.core.management.base import NoArgsCommand
632
eff2287e93fb correct some small problems with urls in mails. set final version
ymh <ymh.work@gmail.com>
parents: 530
diff changeset
    22
from django.core.urlresolvers import set_script_prefix
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
from django.template.base import TemplateDoesNotExist
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
from django.template.loader import render_to_string
530
5d3b4e1e5b34 correct email formatting
ymh <ymh.work@gmail.com>
parents: 481
diff changeset
    25
import premailer
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
from hdalab.models.renkan import HdalabRenkan
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
User = get_user_model()
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
logger = logging.getLogger(__name__)
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
TEMPLATE_NAME = "mails/moderation_notice"
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
class Command(NoArgsCommand):
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    35
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    def handle_noargs(self, **options):
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        # query renkan to moderate
632
eff2287e93fb correct some small problems with urls in mails. set final version
ymh <ymh.work@gmail.com>
parents: 530
diff changeset
    38
        set_script_prefix(settings.SCRIPT_PREFIX)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    39
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
        renkan_query = HdalabRenkan.objects.filter(state=HdalabRenkan.MODERATED)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    41
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        renkan_count = renkan_query.count()
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    43
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        if renkan_count == 0:
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
            logger.info("Send moderation email : no renkan to moderate. exiting")
634
6bdb0e1c0b84 make sure to exit send_moderation_email when there is no renkan to moderate
ymh <ymh.work@gmail.com>
parents: 632
diff changeset
    46
            return
6bdb0e1c0b84 make sure to exit send_moderation_email when there is no renkan to moderate
ymh <ymh.work@gmail.com>
parents: 632
diff changeset
    47
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        logger.debug("Send moderation email : %d renkan(s) to moderate", renkan_count)
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    49
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        renkan_list = list(renkan_query.select_related()[:20])
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    51
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        connection = mail.get_connection()
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        try:
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
            connection.open()
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
            for email_recipient in User.objects.filter(is_staff=True):
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
                if not email_recipient.email:
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
                    continue
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    58
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
                msg_html = ""
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
                msg_txt = ""
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
                try:
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
                    context = {
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
                        'renkan_count': renkan_count,
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
                        'renkan_list': renkan_list,
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
                        'WEB_URL': settings.WEB_URL,
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
                        'email_recipient': email_recipient
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
                    }
530
5d3b4e1e5b34 correct email formatting
ymh <ymh.work@gmail.com>
parents: 481
diff changeset
    68
                    msg_html = premailer.transform(render_to_string(TEMPLATE_NAME+".html", context), base_url=os.path.join(settings.STATIC_ROOT,'site'))
5d3b4e1e5b34 correct email formatting
ymh <ymh.work@gmail.com>
parents: 481
diff changeset
    69
                    msg_txt = render_to_string(TEMPLATE_NAME+".txt", context)
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
                except TemplateDoesNotExist:
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
                    logger.error("Mail template %s not found", TEMPLATE_NAME)
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
                    return
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
                except Exception as e:
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
                    logger.error("Error rendering template %s : %r", TEMPLATE_NAME, e)
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
                    raise e
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 634
diff changeset
    76
481
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
                if not msg_html and not msg_txt:
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
                    logger.info("Send moderation email: nothing to email exiting")
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
                    continue
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
                emsg = EmailMultiAlternatives("Moderation Renkan", msg_txt, settings.DEFAULT_FROM_EMAIL, [email_recipient.email], connection=connection)
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
                emsg.attach_alternative(msg_html, "text/html")
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
                emsg.send(fail_silently=True)
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        finally:
efd1aaee4b0c add moderation command
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
            connection.close()