diff --git a/ietf/nomcom/management/commands/send_reminders.py b/ietf/nomcom/management/commands/send_reminders.py index 40e8dff1e..8a0d55529 100644 --- a/ietf/nomcom/management/commands/send_reminders.py +++ b/ietf/nomcom/management/commands/send_reminders.py @@ -3,21 +3,15 @@ import syslog from optparse import make_option from django.core.management.base import BaseCommand, CommandError -from django.conf import settings - -from ietf.utils.mail import send_mail - -from ietf.dbtemplate.models import DBTemplate from ietf.nomcom.models import Nominee, NomCom -from ietf.nomcom.utils import NOMINEE_REMINDER_TEMPLATE +from nomcom.utils import send_reminder_to_nominee class Command(BaseCommand): help = (u"Send reminders to nominees") option_list = BaseCommand.option_list + ( - make_option('--nomcom-year', dest='year', help='NomCom year'), - ) + make_option('--nomcom-year', dest='year', help='NomCom year'),) def handle(self, *args, **options): year = options.get('year', None) @@ -33,33 +27,22 @@ class Command(BaseCommand): raise CommandError("NomCom %s does not exist or it isn't active" % year) today = datetime.date.today() - nomcom_template_path = '/nomcom/%s/' % nomcom.group.acronym - mail_path = nomcom_template_path + NOMINEE_REMINDER_TEMPLATE - mail_template = DBTemplate.objects.filter(group=nomcom.group, path=mail_path) - mail_template = mail_template and mail_template[0] or None - subject = 'IETF Nomination Information' - from_email = settings.NOMCOM_FROM_EMAIL if nomcom.reminder_interval: nominees = Nominee.objects.get_by_nomcom(nomcom).not_duplicated().filter(nomineeposition__state='pending').distinct() for nominee in nominees: - positions = [] - for np in nominee.nomineeposition_set.all(): - nomination_date = np.time.date() + for nominee_position in nominee.nomineeposition_set.all(): + nomination_date = nominee_position.time.date() if not (today - nomination_date).days <= 0: if (today - nomination_date).days % nomcom.reminder_interval == 0: - positions.append(np.position) - if positions: - to_email = nominee.email.address - context = {'positions': ', '.join([p.name for p in positions])} - send_mail(None, to_email, from_email, subject, mail_path, context) - syslog.syslog(u"Sent reminder to %s" % to_email) + send_reminder_to_nominee(nominee_position) + syslog.syslog(u"Sent reminder to %s" % nominee_position.nominee.email.address) + print u"Sent reminder to %s" % nominee_position.nominee.email.address else: if nomcom.reminderdates_set.filter(date=today): nominees = Nominee.objects.get_by_nomcom(nomcom).not_duplicated().filter(nomineeposition__state='pending').distinct() for nominee in nominees: - to_email = nominee.email.address - positions = ', '.join([nominee_position.position.name for nominee_position in nominee.nomineeposition_set.pending()]) - context = {'positions': positions} - send_mail(None, to_email, from_email, subject, mail_path, context) - syslog.syslog(u"Sent reminder to %s" % to_email) + for nominee_position in nominee.nomineeposition_set.pending(): + send_reminder_to_nominee(nominee_position) + syslog.syslog(u"Sent reminder to %s" % nominee_position.nominee.email.address) + print u"Sent reminder (by dates) to %s" % nominee_position.nominee.email.address diff --git a/ietf/nomcom/utils.py b/ietf/nomcom/utils.py index e3c57842d..896f7635c 100644 --- a/ietf/nomcom/utils.py +++ b/ietf/nomcom/utils.py @@ -1,3 +1,4 @@ +import datetime import email import hashlib import os @@ -5,12 +6,16 @@ import re import tempfile from django.conf import settings +from django.contrib.sites.models import Site from django.core.exceptions import PermissionDenied +from django.core.urlresolvers import reverse +from django.template.loader import render_to_string from django.shortcuts import get_object_or_404 from ietf.dbtemplate.models import DBTemplate from ietf.person.models import Email from ietf.utils.pipe import pipe +from ietf.utils.mail import send_mail_text MAIN_NOMCOM_TEMPLATE_PATH = '/nomcom/defaults/' QUESTIONNAIRE_TEMPLATE = 'position/questionnaire.txt' @@ -185,3 +190,48 @@ def validate_public_key(public_key): os.unlink(key_file.name) return (not error, error) + + +def send_reminder_to_nominee(nominee_position): + today = datetime.date.today().strftime('%Y%m%d') + subject = 'IETF Nomination Information' + from_email = settings.NOMCOM_FROM_EMAIL + domain = Site.objects.get_current().domain + position = nominee_position.position + nomcom = position.nomcom + nomcom_template_path = '/nomcom/%s/' % nomcom.group.acronym + mail_path = nomcom_template_path + NOMINEE_REMINDER_TEMPLATE + nominee = nominee_position.nominee + to_email = nominee.email.address + + hash = get_hash_nominee_position(today, nominee_position.id) + accept_url = reverse('nomcom_process_nomination_status', + None, + args=(get_year_by_nomcom(nomcom), + nominee_position.id, + 'accepted', + today, + hash)) + decline_url = reverse('nomcom_process_nomination_status', + None, + args=(get_year_by_nomcom(nomcom), + nominee_position.id, + 'declined', + today, + hash)) + + context = {'nominee': nominee, + 'position': position, + 'domain': domain, + 'accept_url': accept_url, + 'decline_url': decline_url} + body = render_to_string(mail_path, context) + path = '%s%d/%s' % (nomcom_template_path, position.id, QUESTIONNAIRE_TEMPLATE) + body += '\n\n%s' % render_to_string(path, context) + send_mail_text(None, to_email, from_email, subject, body) + + +def send_reminder_to_nominees(nominees): + for nominee in nominees: + for nominee_position in nominee.nomineeposition_set.pending(): + send_reminder_to_nominee(nominee_position) diff --git a/ietf/nomcom/views.py b/ietf/nomcom/views.py index 70900df00..56f743a68 100644 --- a/ietf/nomcom/views.py +++ b/ietf/nomcom/views.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- + import datetime from django.views.generic.create_update import delete_object @@ -12,9 +13,7 @@ from django.template.loader import render_to_string from django.utils import simplejson from django.db.models import Count, Q from django.forms.models import modelformset_factory, inlineformset_factory -from django.contrib.sites.models import Site -from ietf.utils.mail import send_mail_text from ietf.dbtemplate.models import DBTemplate from ietf.dbtemplate.views import template_edit @@ -26,9 +25,9 @@ from ietf.nomcom.forms import (NominateForm, FeedbackForm, QuestionnaireForm, PrivateKeyForm, EditNomcomForm, PendingFeedbackForm, ReminderDatesForm) from ietf.nomcom.models import Position, NomineePosition, Nominee, Feedback, NomCom, ReminderDates -from ietf.nomcom.utils import (get_nomcom_by_year, get_year_by_nomcom, HOME_TEMPLATE, - store_nomcom_private_key, get_hash_nominee_position, - NOMINEE_REMINDER_TEMPLATE, QUESTIONNAIRE_TEMPLATE) +from ietf.nomcom.utils import (get_nomcom_by_year, store_nomcom_private_key, + get_hash_nominee_position, send_reminder_to_nominees, + HOME_TEMPLATE, NOMINEE_REMINDER_TEMPLATE) def index(request, year): @@ -148,39 +147,7 @@ def send_reminder_mail(request, year): selected_nominees = request.POST.getlist('selected') selected_nominees = nominees.filter(id__in=selected_nominees) if selected_nominees: - subject = 'IETF Nomination Information' - from_email = settings.NOMCOM_FROM_EMAIL - domain = Site.objects.get_current().domain - today = datetime.date.today().strftime('%Y%m%d') - for nominee in nominees: - to_email = nominee.email.address - for nominee_position in nominee.nomineeposition_set.pending(): - hash = get_hash_nominee_position(today, nominee_position.id) - accept_url = reverse('nomcom_process_nomination_status', - None, - args=(get_year_by_nomcom(nomcom), - nominee_position.id, - 'accepted', - today, - hash)) - decline_url = reverse('nomcom_process_nomination_status', - None, - args=(get_year_by_nomcom(nomcom), - nominee_position.id, - 'declined', - today, - hash)) - - context = {'nominee': nominee, - 'position': nominee_position.position, - 'domain': domain, - 'accept_url': accept_url, - 'decline_url': decline_url} - body = render_to_string(mail_path, context) - path = '%s%d/%s' % (nomcom_template_path, nominee_position.position.id, QUESTIONNAIRE_TEMPLATE) - body += '\n\n%s' % render_to_string(path, context) - send_mail_text(None, to_email, from_email, subject, body) - + send_reminder_to_nominees(selected_nominees) message = ('success', 'An query has been sent to each person, asking them to accept (or decline) the nominations') else: message = ('warning', "Please, select some nominee")