diff --git a/smash/web/views/kit.py b/smash/web/views/kit.py index aaa91741d4818a97c93d3503d7e8befb5e765997..8e72e9975c85e98ec245b530bf7c4c9908c61dbf 100644 --- a/smash/web/views/kit.py +++ b/smash/web/views/kit.py @@ -1,16 +1,27 @@ # coding=utf-8 + import datetime +import locale +import platform +import sys +import time +import traceback +import pytz from django.contrib import messages from django.utils.dateparse import parse_datetime +from django_cron import CronJobBase, Schedule +from django_cron.models import CronJobLog from notifications import get_filter_locations, get_today_midnight_date -from web.models import ConfigurationItem +from web.models import ConfigurationItem, Language, Worker +from web.models.constants import KIT_EMAIL_HOUR_CONFIGURATION_TYPE, \ + KIT_EMAIL_DAY_OF_WEEK_CONFIGURATION_TYPE from web.models.constants import KIT_RECIPIENT_EMAIL_CONFIGURATION_TYPE from . import wrap_response -from ..smash_email import EmailSender from ..forms import KitRequestForm from ..models import AppointmentType, Appointment +from ..smash_email import EmailSender def get_kit_requests(user, start_date=None, end_date=None): @@ -67,10 +78,9 @@ def kit_requests(request): return wrap_response(request, 'equipment_and_rooms/kit_requests.html', get_kit_requests_data(request)) -def kit_requests_send_mail(request, start_date, end_date=None): - data = get_kit_requests_data(request, start_date, end_date) +def send_mail(data): end_date_str = " end of time" - if end_date is not None: + if data["end_date"] is not None: end_date_str = data["end_date"].strftime('%Y-%m-%d') title = "Kits required between " + data["start_date"].strftime('%Y-%m-%d') + " and " + end_date_str @@ -101,14 +111,58 @@ def kit_requests_send_mail(request, start_date, end_date=None): email_body += "</tr>" email_body += "</tbody></table>" recipients = ConfigurationItem.objects.get(type=KIT_RECIPIENT_EMAIL_CONFIGURATION_TYPE).value - sender = request.user.email cc_recipients = [] - if sender is not None: - cc_recipients.append(sender) + EmailSender().send_email(title, email_body, recipients, cc_recipients) + + +def kit_requests_send_mail(request, start_date, end_date=None): + data = get_kit_requests_data(request, start_date, end_date) try: - print email_body - EmailSender().send_email(title, email_body, recipients, cc_recipients) + send_mail(data) messages.add_message(request, messages.SUCCESS, 'Mail sent') except: messages.add_message(request, messages.ERROR, 'There was problem with sending email') return wrap_response(request, 'equipment_and_rooms/kit_requests.html', get_kit_requests_data(request)) + + +class KitRequestEmailSendJob(CronJobBase): + RUN_EVERY_MINS = 1 + schedule = Schedule(run_every_mins=RUN_EVERY_MINS) + code = 'web.kit_request_weekly_email' # a unique code + + def do(self): + now = datetime.datetime.utcnow() + hour = int(ConfigurationItem.objects.get( + type=KIT_EMAIL_HOUR_CONFIGURATION_TYPE).value.split(":")[0]) + minute = int(ConfigurationItem.objects.get( + type=KIT_EMAIL_HOUR_CONFIGURATION_TYPE).value.split(":")[1]) + # check if we sent email this day already + date = pytz.utc.localize(now.replace(hour=hour, minute=minute)) + date = date + (datetime.datetime.utcnow() - datetime.datetime.now()) + jobs = CronJobLog.objects.filter(code=KitRequestEmailSendJob.code, message="mail sent", start_time__gte=date) + + if jobs.count() == 0: + if self.match_day_of_week(): + data = get_kit_requests(Worker.objects.create()); + send_mail(data); + return "mail sent" + else: + return False + else: + return False + + def match_day_of_week(self): + user_day_of_week = ConfigurationItem.objects.get(type=KIT_EMAIL_DAY_OF_WEEK_CONFIGURATION_TYPE).value + language = Language.objects.get(name="English"); + locale_name = language.locale + if platform.system() == 'Windows': + locale_name = language.windows_locale_name + try: + locale.setlocale(locale.LC_TIME, locale_name) + except: + traceback.print_exc(file=sys.stdout) + + user_day_of_week_int = int(time.strptime(user_day_of_week, '%A').tm_wday) + 1 + current_day_of_week_int = int(datetime.datetime.now().strftime("%w")); + + return user_day_of_week_int == current_day_of_week_int