From d5de82322ec94e0a708ba082f32f158d8cd80032 Mon Sep 17 00:00:00 2001 From: Filipp Lepalaan Date: Sun, 18 Oct 2015 23:21:49 +0300 Subject: Add send_email task --- servo/models/common.py | 9 ++- servo/models/customer.py | 8 ++ servo/tasks.py | 200 ++++++++++++++++++++++++++--------------------- 3 files changed, 125 insertions(+), 92 deletions(-) (limited to 'servo') diff --git a/servo/models/common.py b/servo/models/common.py index 622c017..9b6e082 100644 --- a/servo/models/common.py +++ b/servo/models/common.py @@ -679,17 +679,22 @@ class Template(models.Model): blank=False, unique=True, max_length=128, - verbose_name=_('title'), + verbose_name=_('Title'), default=_('New Template') ) - content = models.TextField(blank=False, verbose_name=_('content')) + content = models.TextField(blank=False, verbose_name=_('Content')) @classmethod def templates(self): choices = Template.objects.all().values_list('title', flat=True) return list(choices) + def render(self, context): + from django import template + tpl = template.Template(self.content) + return tpl.render(template.Context({'order': context})) + def get_absolute_url(self): return reverse('notes-template', args=[self.pk]) diff --git a/servo/models/customer.py b/servo/models/customer.py index f147883..ca5ce88 100644 --- a/servo/models/customer.py +++ b/servo/models/customer.py @@ -5,6 +5,7 @@ from django.db import models from django.conf import settings from mptt.managers import TreeManager +from django.core.validators import validate_email from django.template.defaultfilters import slugify from mptt.models import MPTTModel, TreeForeignKey from django.utils.translation import ugettext_lazy as _ @@ -158,6 +159,13 @@ class Customer(MPTTModel): fmt = phonenumbers.PhoneNumberFormat.NATIONAL return phonenumbers.format_number(n, fmt) + def valid_email(self): + try: + validate_email(self.email) + return self.email + except Exception: + pass + def get_email_address(self): return '%s <%s>' % (self.name, self.email) diff --git a/servo/tasks.py b/servo/tasks.py index 276f5ae..0bc8d00 100644 --- a/servo/tasks.py +++ b/servo/tasks.py @@ -7,113 +7,133 @@ from celery import shared_task from django.conf import settings from django.core.cache import cache -from servo.models import Order, Note +from servo.models import Order, Note, Template def get_rules(): - """ - Get the rules from the JSON file and cache them. - Fail silently if not configured. - """ - import json - - try: - fh = open("local_rules.json", "r") - except IOError: - return [] - - rules = json.load(fh) - cache.set('rules', rules) - return rules + """ + Get the rules from the JSON file and cache them. + Fail silently if not configured. + """ + import json + + try: + fh = open("local_rules.json", "r") + except IOError: + return [] + + rules = json.load(fh) + cache.set('rules', rules) + return rules @shared_task def apply_rules(event): - rules = cache.get('rules', get_rules()) + rules = cache.get('rules', get_rules()) + order = event.content_object - for r in rules: - if (r['event'] == event.action) and (r['match'] == event.description): + for r in rules: + if r['event'] == 'create': + event.description = r['event'] - if r['action'] == "set_queue": - order = event.content_object - order.set_queue(r['data'], event.triggered_by) + if (r['event'] == event.action) and (r['match'] == event.description): - if r['action'] == "send_sms": - number = 0 - order = event.content_object + if isinstance(r['data'], dict): + tpl_id = r['data']['template'] + r['data'] = Template.objects.get(pk=tpl_id).render(order) - try: - number = order.customer.get_standard_phone() - except Exception as e: - continue + if r['action'] == "set_queue": + order.set_queue(r['data'], event.triggered_by) - note = Note(order=order, created_by=event.triggered_by) + if r['action'] == "send_email": - note.body = r['data'] - note.render_body({'order': order}) - note.save() + try: + email = order.customer.valid_email() + except Exception: + continue + + note = Note(order=order, created_by=event.triggered_by) + note.body = r['data'] + note.recipient = email + note.render_subject({'note': note}) + note.save() - return note.send_sms(number, event.triggered_by) + note.send_mail(event.triggered_by) + + if r['action'] == "send_sms": + number = 0 + + try: + number = order.customer.get_standard_phone() + except Exception: + continue # skip invalid numbers + + note = Note(order=order, created_by=event.triggered_by) + + note.body = r['data'] + note.save() + + return note.send_sms(number, event.triggered_by) @shared_task def batch_process(user, data): - """ - /orders/batch - """ - processed = 0 - orders = data['orders'].strip().split("\r\n") - - for o in orders: - try: - order = Order.objects.get(code=o) - except Exception as e: - continue - - if data['status'] and order.queue: - status = order.queue.queuestatus_set.get(status_id=data['status']) - order.set_status(status, user) - - if data['queue']: - order.set_queue(data['queue'], user) - - if len(data['sms']) > 0: - try: - number = order.customer.get_standard_phone() - note = Note(order=order, created_by=user, body=data['sms']) - note.render_body({'order': order}) - note.save() - - try: - note.send_sms(number, user) - except Exception as e: - note.delete() - print("Failed to send SMS to: %s" % number) - - except AttributeError as e: # customer has no phone number - continue - - if len(data['email']) > 0: - note = Note(order=order, created_by=user, body=data['email']) - note.sender = user.email - - try: - note.recipient = order.customer.email - note.render_subject({'note': note}) - note.render_body({'order': order}) - note.save() - note.send_mail(user) - except Exception as e: - # customer has no email address or some other error... - pass - - if len(data['note']) > 0: - note = Note(order=order, created_by=user, body=data['note']) - note.render_body({'order': order}) - note.save() - - processed += 1 - - return '%d/%d orders processed' % (processed, len(orders)) + """ + /orders/batch + """ + processed = 0 + orders = data['orders'].strip().split("\r\n") + + for o in orders: + try: + order = Order.objects.get(code=o) + except Exception as e: + continue + + if data['status'] and order.queue: + status = order.queue.queuestatus_set.get(status_id=data['status']) + order.set_status(status, user) + + if data['queue']: + order.set_queue(data['queue'], user) + + if len(data['sms']) > 0: + try: + number = order.customer.get_standard_phone() + note = Note(order=order, created_by=user, body=data['sms']) + note.render_body({'order': order}) + note.save() + + try: + note.send_sms(number, user) + except Exception as e: + note.delete() + print("Failed to send SMS to: %s" % number) + + except AttributeError as e: # customer has no phone number + continue + + if len(data['email']) > 0: + note = Note(order=order, created_by=user, body=data['email']) + note.sender = user.email + + try: + note.recipient = order.customer.email + note.render_subject({'note': note}) + note.render_body({'order': order}) + note.save() + note.send_mail(user) + except Exception as e: + # customer has no email address or some other error... + pass + + if len(data['note']) > 0: + note = Note(order=order, created_by=user, body=data['note']) + note.render_body({'order': order}) + note.save() + + processed += 1 + + return '%d/%d orders processed' % (processed, len(orders)) -- cgit v1.2.3