From 63b0fc6269b38edf7234b9f151b80d81f614c0a3 Mon Sep 17 00:00:00 2001 From: Filipp Lepalaan Date: Tue, 4 Aug 2015 10:11:24 +0300 Subject: Initial commit First public commit --- servo/tasks.py | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 servo/tasks.py (limited to 'servo/tasks.py') diff --git a/servo/tasks.py b/servo/tasks.py new file mode 100644 index 0000000..c302cca --- /dev/null +++ b/servo/tasks.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2013, First Party Software +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. + +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +from __future__ import absolute_import + +from celery import shared_task + +from django.core.cache import cache + +from servo.models import Order, Note + + +def get_rules(): + import json + fh = open("local_rules.json", "r") + rules = json.load(fh) + cache.set('rules', rules) + return rules + + +@shared_task +def apply_rules(event): + + rules = cache.get('rules', get_rules()) + + for r in rules: + if (r['event'] == event.action) and (r['match'] == event.description): + + if r['action'] == "set_queue": + order = event.content_object + order.set_queue(r['data'], event.triggered_by) + + if r['action'] == "send_sms": + number = 0 + order = event.content_object + + try: + number = order.customer.get_standard_phone() + except Exception as e: + continue + + note = Note(order=order, created_by=event.triggered_by) + + note.body = r['data'] + note.render_body({'order': order}) + 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)) + -- cgit v1.2.3