Guest User

Untitled

a guest
Mar 5th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.38 KB | None | 0 0
  1. # coding: utf-8
  2. import locale
  3. from datetime import datetime
  4.  
  5. from django.conf import settings
  6. from django.contrib.sites.models import Site
  7. from django.contrib.auth.models import User
  8. from celery.decorators import periodic_task
  9. from celery.schedules import crontab
  10. from django.template.loader import render_to_string
  11. from textmagic.client import TextMagicClient, TextMagicError
  12.  
  13. from ella.user_accounts.models import UserProfile
  14. from ella.events.models import BiddingRoundUsers
  15. from ella.sms.models import Message
  16. from ella.notices.models import EmailMessage
  17. from ella.utils import SendSMS, proper_absolute_url, randstr
  18. from ella.utils.amazon_ses import AmazonSES, EmailMessage as Email,\
  19.                                   AmazonError, AmazonAPIError
  20. from ella.utils.nexmomessage import NexmoMessage
  21.  
  22. @periodic_task(run_every=crontab())
  23. def queue_message_handler():
  24.     print "RUN RUN RUN"
  25.     '''
  26.    Message.objects.filter(direction=0, status=0).update(status=1)
  27.    incomming_messages = Message.objects.filter(direction=0,
  28.        status=1).values_list('id', flat=True)
  29.    incomming_message_handler(incomming_messages)
  30.  
  31.    Message.objects.filter(direction=1, status=0).update(status=1)
  32.    outgoing_messages =  Message.objects.filter(direction=1,
  33.        status=1).values_list('id', flat=True)
  34.    outgoing_message_handler(outgoing_messages)
  35.    # FIXME: Change EmailMessage model also.
  36.    email_message_handler(EmailMessage.objects.filter(proceed=False))
  37.    '''
  38.     Message.objects.filter(direction=1, status=0).update(status=1)
  39.     outgoing_messages =  Message.objects.filter(direction=1,
  40.         status=1).values_list('id', flat=True)
  41.     print "Oungoing messages" + str(len(outgoing_messages))
  42.     print outgoing_messages
  43.     outgoing_message_handler(outgoing_messages)
  44. def incomming_message_handler(incomming_messages):
  45.  
  46.     def parse_message(text):
  47.         result = {'argument': ''}
  48.         text = text.replace('"', '').lower()
  49.         data = text.split(' ', 1)
  50.         if len(data) == 2:
  51.             result['command'], result['argument'] = data[0], data[1].replace(' ', '')
  52.         else:
  53.             result['command'] = data[0]
  54.         return result
  55.  
  56.     def get_user(phone):
  57.         try:
  58.             user = UserProfile.objects.filter(mobile_phone=phone[2:],
  59.             country__mobile_prefix=phone[:2])[0].user
  60.         except IndexError:
  61.             user = None
  62.         return user
  63.  
  64.     def make_bid(user, code):
  65.         try:
  66.             bidding_round_user = BiddingRoundUsers.objects.get(code=code,
  67.                 user=user)
  68.         except BiddingRoundUsers.DoesNotExist:
  69.             SendSMS(user, render_to_string('notices/sms/bru_does_not_exist',
  70.                                            {'code': code}))
  71.             return
  72.         event = bidding_round_user.event
  73.         profile = user.get_profile()
  74.         message = ''
  75.         if not event.is_open:
  76.             message = render_to_string('notices/sms/event_closed',
  77.                                        {'code': code})
  78.         elif event.deleted:
  79.             message = render_to_string('notices/sms/event_deleted',
  80.                                        {'code': code})
  81.         elif profile.conflicting_appointments(event.start_date,
  82.                 event.end_date, event.start_time,
  83.                 event.end_time).filter(is_assigned=True):
  84.             message = render_to_string('notices/sms/conflicting_appointments',
  85.                                        {'code': code})
  86.         else:
  87.             if profile.receive_event_confirmation:
  88.                 message = render_to_string('notices/sms/bid_accepted',
  89.                                            {'bru': bidding_round_user})
  90.             bidding_round_user.responded_yes = True
  91.             bidding_round_user.responded_no = False
  92.             bidding_round_user.agreed_at = datetime.now()
  93.             bidding_round_user.save()
  94.         if message:
  95.             SendSMS(user, message)
  96.  
  97.     def activate_user(user, code):
  98.         profile = user.get_profile()
  99.         if profile.activation_code.lower() == code:
  100.             password = randstr(length=4, allowed_chars='23456789')
  101.             user.set_password(password)
  102.             user.is_active = True
  103.             user.save()
  104.             SendSMS(user, render_to_string('notices/sms/user_activated',
  105.                 {'link': proper_absolute_url('/', False,
  106.                             profile.municipalities.all()[0])[:-1],
  107.                      'login': user.username, 'password': password }))
  108.         else:
  109.             SendSMS(user, render_to_string('notices/sms/wrong_activation_code',
  110.                                            {'code': profile.activation_code}))
  111.    
  112.     def send_events_date(user, date):
  113.         try:
  114.             event_date = datetime.strptime(date, '%d%m%y')
  115.         except ValueError:
  116.             SendSMS(user, render_to_string('notices/sms/gibberish_date',
  117.                 {'wrong_date': date,
  118.                     'curr_short_date': datetime.now().strftime('%d%m%y')}))
  119.             return
  120.        
  121.         brus = BiddingRoundUsers.objects.filter(event__start_date=event_date,
  122.             user=user)
  123.        
  124.         for bru in brus:
  125.             sms_msg = render_to_string('notices/sms/events_to_date',
  126.                                        {'bru': bru })
  127.            
  128.             SendSMS(bru.user, sms_msg)
  129.    
  130.     def unknown_command(user):
  131.         SendSMS(user, render_to_string('notices/sms/unknown_command'))
  132.  
  133.     for message in Message.objects.filter(id__in=incomming_messages):
  134.         user = get_user(message.phone)
  135.         if not user:
  136.             message.status = 2
  137.             message.save()
  138.             continue
  139.         data = parse_message(message.text)
  140.         if data['command'] == u'vagt':
  141.             make_bid(user, data['argument'])
  142.         elif data['command'] == u'aktiver':
  143.             activate_user(user, data['argument'])
  144.         elif data['command'] == u'vagter':
  145.             send_events_date(user, data['argument'])
  146.         else:
  147.             unknown_command(user)
  148.         message.status = 2
  149.         message.save()
  150.  
  151. def outgoing_message_handler(outgoing_messages):
  152.     client = TextMagicClient(settings.TEXTMAGIC_LOGIN,
  153.                              settings.TEXTMAGIC_PASSWORD)
  154.     for message in Message.objects.filter(id__in=outgoing_messages):
  155.         print "send sms %s" % settings.SEND_SMS
  156.         if settings.SEND_SMS:
  157.             try:
  158.                 '''
  159.                result = client.send(message.text,
  160.                    message.phone, send_time=message.timestamp.timetuple())
  161.                '''
  162.                 msg = {'reqtype': "json",
  163.                        'username': settings.NEXMO_LOGIN,
  164.                        'password': settings.NEXMO_PASSWORD,
  165.                        'text':  message.text,
  166.                        'from': "???",
  167.                        'to': message.phone}
  168.                
  169.                 sms = NexmoMessage(msg)
  170.                 print("SMS details: %s") % sms.get_details()
  171.                 #result = sms.send_request()
  172.                 print result
  173.             except TextMagicError, e:
  174.                 print e
  175.                 print message
  176.             else:
  177.                 message.msg_id = result['message_id'].keys()[0]
  178.         else:
  179.             dbg_msg  = u'Handle %s SMS: %s | %s' % (u'outgoing' if message.direction\
  180.                 else u'incomming', message.phone, message.text)
  181.             print dbg_msg.encode(locale.getpreferredencoding())
  182.         message.status = 2
  183.         message.save()
  184.        
  185.  
  186. def email_message_handler(queue):
  187.     amazon_ses = AmazonSES(settings.ASES_ACCESS_KEY_ID,
  188.                            settings.ASES_SECRET_ACCESS_KEY)
  189.     for message in queue:
  190.         email_message = Email()
  191.         email_message.subject = message.text.split('\n', 1)[0].encode('utf-8')
  192.         email_message.bodyText = message.text.split('\n', 1)[1].encode('utf-8')
  193.         if settings.SEND_EMAIL:
  194.             try:
  195.                 amazon_ses.sendEmail(message.sender, message.receiver,
  196.                                      email_message)
  197.             except (AmazonError, AmazonAPIError), e:
  198.                 print e
  199.                 print message
  200.         else:
  201.             dbg_msg =  u'Handle email:\n>To: %s\n%s' % (message.receiver,
  202.                 message.text)
  203.             print dbg_msg.encode(locale.getpreferredencoding())
  204.        
  205.         message.proceed = True
  206.         message.save()
Add Comment
Please, Sign In to add comment