def test_type_check(type_or_hint, instance, raises):
    for _ in range(1):
        if raises:
            with pytest.raises(TypeError):
                check_type(instance, type_or_hint)
        else:
            check_type(instance, type_or_hint, is_argument=False)
Exemplo n.º 2
0
def __create_task():
    formData = request.form
    data: TodoCreatePayload = commons.validateCreateEditPayload(formData)
    if "globalErrors" in data:
        return __load_create_new_page(data)
    check_type(data, TodoCreatePayload)
    __database.create_todo(data)
    return redirect("/todos/home", 302)
Exemplo n.º 3
0
def __edit_task(todo_id):
    formData = request.form
    data = commons.validateCreateEditPayload(formData, todo_id)
    if "globalErrors" in data:
        return __edit_task_page(todo_id, data)
    check_type(data, TodoUpdatePayload)
    __database.upsert_todo(todo_id, data)
    return redirect("/todos/home", 302)
Exemplo n.º 4
0
def get_task_view_model(todo: Todo, todo_logs_map, accept_languages) -> TodoListViewModel:
    todoModel = {"todo_id": todo['todo_id'],
                                    "due_date_str": "",
                                    "due_date": datetime.now(),  # To satisfy type system
                                    "frequency": todo['frequency'],
                                    "task": todo['task'],
                                    "trackHabit": todo['trackHabit'],
                                    "timeSlot": todo['timeSlot'],
                                    "remindBeforeDays": '',
                                    "next_due_date": None,  # TODO
                                    "due_in_days": None,
                                    "done_count": None,
                                    "skip_count": None,
                                    "category": todo['category']}  # type: TodoListViewModel
    if todo['task'] is None or todo['task'] == "":
        todoModel['task'] = "<No Title>"

    if(todo['due_date'] is None):
        todoModel['due_date'] = datetime.utcnow()
    else:
        todoModel['due_date'] = todo['due_date']

    currentTime = pytz.utc.localize(datetime.utcnow()).astimezone(__get_ui_time_zone())
    todo_due_date_local = pytz.utc.localize(todoModel['due_date']).astimezone(__get_ui_time_zone())

    todoModel["due_date_str"] = todo_due_date_local.strftime(date_format)

    if (todo_due_date_local.date() - currentTime.date()).days > 0:
        todoModel['due_in_days'] = (todo_due_date_local.date() - currentTime.date()).days

    frequency_model = recur.parse_frequency(todo["frequency"])
    if frequency_model:
        next_due_date = recur.get_next_occurrence(frequency_model, todo_due_date_local)
        if next_due_date:
            todoModel['next_due_date'] = next_due_date.strftime(date_format)
    if todo['remindBeforeDays']:
        todoModel['remindBeforeDays'] = str(todo['remindBeforeDays'])

    if todo["todo_id"] in todo_logs_map:
        todoModel["done_count"] = todo_logs_map[todo["todo_id"]].get("Done", 0)
        todoModel["skip_count"] = todo_logs_map[todo["todo_id"]].get("Skip", 0)
    elif todo["trackHabit"]:
        todoModel["done_count"] = 0
        todoModel["skip_count"] = 0
    check_type(todoModel, TodoListViewModel)
    return todoModel
Exemplo n.º 5
0
def __process_updates():
    errors = {"globalErrors": []}  # type: PayloadError
    formData = request.form
    submittedData = {}
    for dataKey in formData:
        data = formData[dataKey]
        delimiter = dataKey.find("_")
        if delimiter == -1:
            errors["globalErrors"].append("Invalid Parameter detected")
            continue
        todo_id = dataKey[0:delimiter]
        attribute = dataKey[delimiter + 1:]
        if todo_id not in submittedData:
            submittedData[todo_id] = {}
        submittedData[todo_id][attribute] = data

    if len(errors['globalErrors']) > 0:
        return __home_page(errors)

    # Start to process data with actions
    dataToProcess = {}
    for x in submittedData:
        if 'done_or_skip' in submittedData[
                x] and submittedData[x]['done_or_skip'] != "None":
            if commons.validateDueDate(submittedData[x]['next_due']) is False:
                errors['globalErrors'].append("Invalid Due Date Detected")
            dataToProcess[x] = submittedData[x]

    if len(errors['globalErrors']) > 0:
        return __home_page(errors)

    for dataKey in dataToProcess:
        data = dataToProcess[dataKey]
        due_date = data.get("next_due") and datetime.utcfromtimestamp(
            task_utils.get_local_datetime_object(data['next_due']).timestamp())
        todo_data = {
            'due_date': due_date,
            'todo_action': data['done_or_skip'],
            'todo_id': int(dataKey)
        }  # type: TodoTaskDoneOrSkipModel
        check_type(todo_data, TodoTaskDoneOrSkipModel)
        __database.process_todo_action(todo_data)
    return __home_page()
Exemplo n.º 6
0
def __home_page(errors=None):
    filterString = ""
    if request.args.get("query"):
        filters = __database.parseFilters(request.args.get("query"))
        if filters:
            filterString = request.args.get("query")
    else:
        filters = []
    allTodos = __database.get_all_todos_by_due_date(
        filters)  # type: List[Todo]
    todo_logs = __database.get_todo_logs_count()  # type: TodoLog
    todo_logs_map = {}
    for log in todo_logs:
        if log["todo_id"] not in todo_logs_map:
            todo_logs_map[log["todo_id"]] = {}
        todo_logs_map[log["todo_id"]][log["action"]] = log["count"]

    todos_by_type = {
        TaskBuckets.ALERTS.name: [],
        TaskBuckets.PENDING.name: [],
        TaskBuckets.TODAY.name: [],
        TaskBuckets.UPCOMING.name: []
    }

    for todo in allTodos:
        check_type(todo, Todo)
        bucket = task_utils.get_task_bucket(todo).name
        todos_by_type[bucket].append(
            task_utils.get_task_view_model(todo, todo_logs_map,
                                           request.accept_languages))

    task_utils.sort_task_by_slots(todos_by_type[TaskBuckets.TODAY.name])
    return render_template("homepage.html",
                           todos=todos_by_type,
                           errors=errors,
                           filterString=filterString,
                           commons=commons)