aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--servo/models/common.py9
-rw-r--r--servo/models/customer.py8
-rw-r--r--servo/tasks.py200
3 files changed, 125 insertions, 92 deletions
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))