def get_broadcast_migration_function(self, handler): if handler.method not in (METHOD_SMS, METHOD_EMAIL, METHOD_SMS_SURVEY): return None if len(handler.events) != 1: return None if handler.method in (METHOD_SMS, METHOD_EMAIL) and len( handler.events[0].message) != 1: return None if handler.method == METHOD_EMAIL and len( handler.events[0].subject) != 1: return None if handler.recipient not in ( RECIPIENT_SURVEY_SAMPLE, RECIPIENT_USER_GROUP, RECIPIENT_LOCATION, ): return None if handler.recipient == RECIPIENT_SURVEY_SAMPLE and not handler.sample_id: return None if handler.recipient == RECIPIENT_USER_GROUP and not handler.user_group_id: return None if handler.recipient == RECIPIENT_LOCATION and len( handler.location_ids) != 1: return None if handler.locked: return None if handler.start_condition_type != ON_DATETIME: return None if handler.user_data_filter: return None reminder_result = list( CaseReminder.view('reminders/by_domain_handler_case', startkey=[handler.domain, handler._id], endkey=[handler.domain, handler._id, {}], include_docs=True).all()) if len(reminder_result) > 1: return None if ((len(reminder_result) == 0 or not reminder_result[0].active) and handler.start_datetime and handler.start_datetime < datetime.utcnow() and handler.event_interpretation == EVENT_AS_OFFSET and handler.max_iteration_count == 1 and handler.events[0].day_num == 0 and handler.events[0].fire_time == time(0, 0)): return migrate_past_immediate_broadcast return None
def get_source_instances(self): return list( CaseReminder.view( 'reminders/by_domain_handler_case', startkey=[self.handler.domain, self.handler._id], endkey=[self.handler.domain, self.handler._id, {}], include_docs=True).all())
def get_items_to_be_processed(self, utcnow): utcnow_json = json_format_datetime(utcnow) result = CaseReminder.view('reminders/by_next_fire', startkey=[None], endkey=[None, utcnow_json], include_docs=False, ).all() return [{"id": e["id"], "key": e["key"][1]} for e in result]
def get_items_to_be_processed(self, utcnow): utcnow_json = json_format_datetime(utcnow) result = CaseReminder.view('reminders/by_next_fire', startkey=[None], endkey=[None, utcnow_json], include_docs=False, ).all() return [QueueItem(e['id'], e['key'], e) for e in result]
def get_items_to_be_processed(self, utcnow): utcnow_json = json_format_datetime(utcnow) result = CaseReminder.view('reminders/by_next_fire', startkey=[None], endkey=[None, utcnow_json], include_docs=False, ).all() return [{"id": e["id"], "key": e["key"][1]} for e in result]
def reminders_in_error(request, domain): handler_map = {} if request.method == "POST": form = RemindersInErrorForm(request.POST) if form.is_valid(): kwargs = {} if is_bigcouch(): # Force a write to all nodes before returning kwargs["w"] = bigcouch_quorum_count() current_timestamp = datetime.utcnow() for reminder_id in form.cleaned_data.get("selected_reminders"): reminder = CaseReminder.get(reminder_id) if reminder.domain != domain: continue if reminder.handler_id in handler_map: handler = handler_map[reminder.handler_id] else: handler = reminder.handler handler_map[reminder.handler_id] = handler reminder.error = False reminder.error_msg = None handler.set_next_fire(reminder, current_timestamp) reminder.save(**kwargs) timezone = report_utils.get_timezone(request.couch_user.user_id, domain) reminders = [] for reminder in CaseReminder.view("reminders/reminders_in_error", startkey=[domain], endkey=[domain, {}], include_docs=True).all(): if reminder.handler_id in handler_map: handler = handler_map[reminder.handler_id] else: handler = reminder.handler handler_map[reminder.handler_id] = handler recipient = reminder.recipient case = reminder.case reminders.append({ "reminder_id": reminder._id, "handler_id": reminder.handler_id, "handler_name": handler.nickname, "case_id": case.get_id if case is not None else None, "case_name": case.name if case is not None else None, "next_fire": tz_utils.adjust_datetime_to_timezone( reminder.next_fire, pytz.utc.zone, timezone.zone).strftime("%Y-%m-%d %H:%M:%S"), "error_msg": reminder.error_msg, "recipient_name": get_recipient_name(recipient), })
def reminders_in_error(request, domain): handler_map = {} if request.method == "POST": form = RemindersInErrorForm(request.POST) if form.is_valid(): kwargs = {} if is_bigcouch(): # Force a write to all nodes before returning kwargs["w"] = bigcouch_quorum_count() current_timestamp = datetime.utcnow() for reminder_id in form.cleaned_data.get("selected_reminders"): reminder = CaseReminder.get(reminder_id) if reminder.domain != domain: continue if reminder.handler_id in handler_map: handler = handler_map[reminder.handler_id] else: handler = reminder.handler handler_map[reminder.handler_id] = handler reminder.error = False reminder.error_msg = None handler.set_next_fire(reminder, current_timestamp) reminder.save(**kwargs) timezone = report_utils.get_timezone(request.couch_user.user_id, domain) reminders = [] for reminder in CaseReminder.view("reminders/reminders_in_error", startkey=[domain], endkey=[domain, {}], include_docs=True).all(): if reminder.handler_id in handler_map: handler = handler_map[reminder.handler_id] else: handler = reminder.handler handler_map[reminder.handler_id] = handler recipient = reminder.recipient case = reminder.case reminders.append({ "reminder_id" : reminder._id, "handler_id" : reminder.handler_id, "handler_name" : handler.nickname, "case_id" : case.get_id if case is not None else None, "case_name" : case.name if case is not None else None, "next_fire" : tz_utils.adjust_datetime_to_timezone(reminder.next_fire, pytz.utc.zone, timezone.zone).strftime("%Y-%m-%d %H:%M:%S"), "error_msg" : reminder.error_msg, "recipient_name" : get_recipient_name(recipient), }) context = { "domain" : domain, "reminders" : reminders, "timezone" : timezone, "timezone_now" : datetime.now(tz=timezone), } return render(request, "reminders/partial/reminders_in_error.html", context)
def handle(self, **options): num_dups = 0 make_fixes = options["fix"] ids = {} rows = CaseReminder.view("reminders/by_domain_handler_case", include_docs=False).all() for row in rows: row_key = row["key"] if row_key[2]: ids_key = "|".join(row_key) if ids_key in ids: ids[ids_key].append(row["id"]) else: ids[ids_key] = [row["id"]] for k, v in ids.items(): if len(v) > 1: num_dups += 1 split_key = k.split("|") print("Duplicate found: ", split_key) handler = CaseReminderHandler.get(split_key[1]) if handler.start_condition_type != CASE_CRITERIA: print("ERROR: Duplicate with the above key is not a case " "criteria reminder") continue all_match = True reminders = [CaseReminder.get(i) for i in v] for r in reminders[1:]: all_match = all_match and self.reminders_match( reminders[0], r) if all_match: if make_fixes: print("Removing duplicate(s)...") for r in reminders[1:]: r.retire() c = CommCareCase.get(split_key[2]) messaging_case_changed_receiver(None, c) else: print( "ERROR: Not all of the reminders with the above key match" ) print("%s Duplicate(s) were found" % num_dups)
def handle(self, *args, **options): num_dups = 0 make_fixes = options["fix"] ids = {} rows = CaseReminder.view("reminders/by_domain_handler_case", include_docs=False).all() for row in rows: row_key = row["key"] if row_key[2]: ids_key = "|".join(row_key) if ids_key in ids: ids[ids_key].append(row["id"]) else: ids[ids_key] = [row["id"]] for k, v in ids.items(): if len(v) > 1: num_dups += 1 split_key = k.split("|") print "Duplicate found: ", split_key handler = CaseReminderHandler.get(split_key[1]) if handler.start_condition_type != CASE_CRITERIA: print ("ERROR: Duplicate with the above key is not a case " "criteria reminder") continue all_match = True reminders = [CaseReminder.get(i) for i in v] for r in reminders[1:]: all_match = all_match and self.reminders_match(reminders[0], r) if all_match: if make_fixes: print "Removing duplicate(s)..." for r in reminders[1:]: r.retire() c = CommCareCase.get(split_key[2]) case_changed_receiver(None, c) else: print "ERROR: Not all of the reminders with the above key match" print "%s Duplicate(s) were found" % num_dups
def get_all_reminders(self): return CaseReminder.view('reminders/by_domain_handler_case', include_docs=True).all()
def get_reminders(self): return CaseReminder.view('reminders/by_domain_handler_case', startkey=[self.domain], endkey=[self.domain, {}], include_docs=True).all()
def get_all_reminders(self): return CaseReminder.view('reminders/by_domain_handler_case', include_docs=True).all()
def get_reminders(self): return CaseReminder.view('reminders/by_domain_handler_case', start_key=[self.domain], end_key=[self.domain, {}], include_docs=True).all()