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)
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)
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)
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
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()
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)