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())
Esempio n. 3
0
 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]
Esempio n. 6
0
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),
        })
Esempio n. 7
0
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)
Esempio n. 8
0
    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
Esempio n. 10
0
 def get_all_reminders(self):
     return CaseReminder.view('reminders/by_domain_handler_case',
         include_docs=True).all()
Esempio n. 11
0
 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()