def handle(self, **options): path = options.get('file') if not path: raise ValueError, 'Provide a path with -f --file .' weeks = [] days = [] with open(path) as f: while True: try: x, y, week, day, z, a, b, text, c, d = f.readline().split('\t') if len(text) > 2 and text[0] == '"'[0]: text = text[1:-1] rm = None wk = int(week) dy = int(day) try: rm = ReminderMessage.objects.get(week_number = wk, day_number = dy) rm.reminder_text = text except ReminderMessage.DoesNotExist: rm = ReminderMessage(week_number = wk, day_number = dy, reminder_text = text) rm.save() weeks.append(wk) days.append(dy) except ValueError: break except StopIteration: break for unused in ReminderMessage.objects.exclude(week_number__in = weeks, day_number__in = days): sys.stderr.write('Deleting unused reminder for week %d, day %d.\n' % (unused.week_number, unused.day_number)) unused.delete()
def handle(self, **options): outmsgs = ReminderMessage.as_hash() for week in outmsgs.keys(): this_week = outmsgs[week] for day in this_week.keys(): mother_queue = Queue.Queue() this_day = this_week[day] # for mother in Contact.objects.raw('''SELECT * FROM rapidsms_contact WHERE ((NOW() :: DATE) - ('%d WEEK %d DAY' :: INTERVAL)) :: DATE = last_menses :: DATE''' % (week, day)): # for mother in Contact.objects.raw('''SELECT * FROM rapidsms_contact WHERE (last_menses + ('%d WEEK %d DAY' :: INTERVAL)) :: DATE = NOW() :: DATE''' % (week, day)): # Because Django ORM speaks pidgin: “today” will be encoded as “between end of yesterday and start of tomorrow”. Hahaha. As long as it is not SQL. # back_then = datetime.now() - timedelta(weeks = week, days = day) # prior_day = back_then - timedelta(days = 1) # mothers = Contact.objects.filter(interested = True, last_menses__range = (prior_day, back_then)).exclude(connection = None) mothers = Contact.objects.raw('''SELECT * FROM rapidsms_contact WHERE interested AND ((NOW() :: DATE) - ('%d WEEK %d DAY' :: INTERVAL)) :: DATE = last_menses :: DATE''' % (week, day - 1)) sending = [] for mother in mothers: if not mother.default_connection: continue sending.append(mother.default_connection.identity) msg = Message.objects.create(connection = mother.default_connection, status = 'Q', direction = 'O', text = this_day) # msg.save() or sys.stderr.write('FAILED.\n') if msg: sys.stderr.write('%s (%s)\n' % (mother.default_connection.identity, mother.last_menses.strftime('%d-%m-%Y'))) else: if sys.stderr.isatty(): sys.stderr.write('FAILED.\n') # Colorise? else: sys.stderr.write('FAILED.\n') if sending: sys.stderr.write('Sending to %d mothers (week %d, day %d):\n%s\n\n%s\n' % (len(sending), week, day, this_day, ', '.join(sending))) sys.stderr.write('\n' + ('==' * 12) + '\n')
def handle(self, **options): outmsgs = ReminderMessage.as_hash().keys() outmsgs.sort() try: lastweek = outmsgs[-1] for mother in Contact.objects.filter(interested=True, last_menses__lt=(datetime.now() - timedelta(weeks=lastweek))).exclude(connection=None): text = 'If you want to stop receiving FREE messages from Mother Reminder please reply with STOP.' last_optout = Message.objects.filter(connection=mother.default_connection).filter(text=text).order_by('-date') if not last_optout: msg = Message.objects.create(connection=mother.default_connection, direction='O', status='Q', text=text) else: if last_optout[0].date + timedelta(weeks=8) <= datetime.now(): msg = Message.objects.create(connection=mother.default_connection, direction='O', status='Q', text=text) # msg.save() # application, batch, connection, date, direction, flags, id, in_response_to, poll, poll_responses, priority, responses, status, submissions, text except IndexError: pass
def perform(self, request, results): rmdr = ReminderMessage(week_number = self.cleaned_data['week'], day_number = self.cleaned_data['day'], reminder_text = self.cleaned_data['message']) rmdr.save() return ('Saved reminder message for week %d, day %d' % (rmdr.week_number, rmdr.day_number), 'successfully.')