def test_delete_repeats_from_plan_by_time_range(self): class PlanStorageAdapterMock(): _deleted_numbers = [] def get_plans(self, plan_id): plan = Plan() plan.tid = 1 plan.plan_id = 1 plan.shift = utils.create_shift_in_millis(datetime.timedelta(days=3)) return [plan] def delete_plan_repeat(self, plan_id, number): if plan_id == 1: self._deleted_numbers.append(number) return True return False def get_tid_for_edit_repeat(self, plan_id, number): return None def get_exclude_type(self, plan_id, number): return None class TaskStorageAdapterMock(): def get_tasks(self, filter): task = Task() task.tid = 1 task.supposed_start_time = utils.datetime_to_milliseconds(datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=3)) return [task] class ProjectStorageAdapterMock(): def get_projects(self, uid, name=None, pid=None): project = Project() project.creator = 1 project.name = Project.default_project_name return [project] class UserStorageAdapterMock(): def get_users(self, uid): user = User() return [user] Controller.init_storage_adapters(PlanStorageAdapterMock, TaskStorageAdapterMock, UserStorageAdapterMock, ProjectStorageAdapterMock) Controller.authentication(1) time_range = (utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=10)), utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=20))) success = self.controller.delete_repeats_from_plan_by_time_range(1, time_range) self.assertEqual(success, True) deleted_numbers = PlanStorageAdapterMock._deleted_numbers self.assertEqual(deleted_numbers, [3, 4, 5, 6])
def test_is_before_time(self): task = Task() task.supposed_start_time = utils.datetime_to_milliseconds( datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=3)) time_range = (utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=5)), utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=8))) is_before = task.is_before_time(time_range) self.assertEqual(is_before, True)
def test_is_after_time(self): task = Task() task.supposed_start_time = utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=9)) task.supposed_end_time = utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=10)) time_range = (utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=5)), utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=8))) is_after = task.is_after_time(time_range) self.assertEqual(is_after, True)
def test_is_time_overlap_fully(self): task = Task() task.supposed_start_time = utils.datetime_to_milliseconds( datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=6)) time_range = (utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=0)), utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=6))) is_overlap = task.is_time_overlap_fully(time_range) self.assertEqual(is_overlap, True)
def test_get_repeats_by_time_range(self): class PlanStorageAdapterMock(): def get_plans(self, plan_id): plan = Plan() plan.tid = 1 plan.plan_id = 1 plan.shift = utils.create_shift_in_millis(datetime.timedelta(days=3)) plan.exclude = [5] plan.end = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=10)) return [plan] class TaskStorageAdapterMock(): _saved_task = None def get_tasks(self, filter): task = Task() task.tid = 1 task.status = Status.PENDING task.supposed_start_time = utils.datetime_to_milliseconds(datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=2)) task.notificate_supposed_start=False return [task] class ProjectStorageAdapterMock(): def get_projects(self, uid, name=None, pid=None): project = Project() project.creator = 1 project.name = Project.default_project_name return [project] class UserStorageAdapterMock(): def get_users(self, uid): user = User() return [user] Controller.init_storage_adapters(PlanStorageAdapterMock, TaskStorageAdapterMock, UserStorageAdapterMock, ProjectStorageAdapterMock) Controller.authentication(1) time_range = (utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=8)), utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=30))) repeats = self.controller.get_repeats_by_time_range(1, time_range) self.assertEqual(repeats, [2, 3])
def get_tasks(self, filter): task = Task() task.tid = 1 task.status = Status.PENDING task.supposed_start_time = utils.datetime_to_milliseconds(datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=2)) task.notificate_supposed_start=False return [task]
def get_plans(self, plan_id): plan = Plan() plan.tid = 1 plan.plan_id = 1 plan.shift = utils.create_shift_in_millis(datetime.timedelta(days=3)) plan.exclude = [5] plan.end = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=10)) return [plan]
def get_tasks(self, filter): tid = getattr(filter, '_tid', None) if tid is not None and tid == 1: task = Task() task.tid = 1 task.status = Status.PENDING task.supposed_start_time = utils.datetime_to_milliseconds(datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=2)) task.notificate_supposed_start=False return [task] if tid is not None and tid == 2: task = Task() task.tid = 2 task.status = Status.PENDING task.supposed_start_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=9)) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=11)) task.notificate_deadline=True return [task] return []
def test_shift_task_forward(self): task = Task() task.supposed_start_time = utils.datetime_to_milliseconds( datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=4)) shift_time = utils.create_shift_in_millis(datetime.timedelta(days=4)) task.shift_time(shift_time) test_start_time = utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=4)) test_end_time = utils.shift_datetime_in_millis( datetime.datetime.today(), datetime.timedelta(days=8)) if test_start_time - task.supposed_start_time == 1: test_start_time -= 1 if test_end_time - task.supposed_end_time == 1: test_end_time -= 1 self.assertEqual(task.supposed_start_time, test_start_time) self.assertEqual(task.supposed_end_time, test_end_time) self.assertEqual(task.deadline_time, None)
def get_tasks(self, filter): task = Task() task.tid = 1 task.supposed_start_time = utils.datetime_to_milliseconds(datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=3)) return [task]
def test_edit_repeat_by_number(self): class PlanStorageAdapterMock(): _plan_id = None _number = None _tid = None def get_plans(self, plan_id=None, common_tid=None): plan = Plan() plan.tid = 1 plan.plan_id = 1 plan.shift = utils.create_shift_in_millis(datetime.timedelta(days=3)) plan.exclude = [5] return [plan] def edit_plan_repeat(self, plan_id, number, tid): self.__class__._plan_id = plan_id self.__class__._number = number self.__class__._tid = tid return True def get_tid_for_edit_repeat(self, plan_id, number): return 2 class TaskStorageAdapterMock(): _saved_task = None _removed_tid = None class Filter(): def tid(self, tid): self._tid = tid def uid(self, uid): self._uid = uid def get_tasks(self, filter): tid = getattr(filter, '_tid', None) if tid is not None and tid == 1: task = Task() task.tid = 1 task.status = Status.PENDING task.supposed_start_time = utils.datetime_to_milliseconds(datetime.datetime.today()) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=2)) task.notificate_supposed_start=False return [task] if tid is not None and tid == 2: task = Task() task.tid = 2 task.status = Status.PENDING task.supposed_start_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=9)) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=11)) task.notificate_deadline=True return [task] return [] def remove_task(self, tid): self.__class__._removed_tid = tid return True def save_task(self, task): self.__class__._saved_task = task return True def get_last_saved_task(self): self._saved_task.tid = 3 return self._saved_task class ProjectStorageAdapterMock(): def get_projects(self, uid, name=None, pid=None): project = Project() project.creator = 1 project.name = Project.default_project_name return [project] class UserStorageAdapterMock(): def get_users(self, uid): user = User() return [user] Controller.init_storage_adapters(PlanStorageAdapterMock, TaskStorageAdapterMock, UserStorageAdapterMock, ProjectStorageAdapterMock) Controller.authentication(1) success = self.controller.edit_repeat_by_number(1, 3, status=Status.COMPLETED, notificate_supposed_start=True) self.assertEqual(success, True) task = Task() task.tid = 3 task.status = Status.COMPLETED task.supposed_start_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=9)) task.supposed_end_time = utils.shift_datetime_in_millis(datetime.datetime.today(), datetime.timedelta(days=11)) task.notificate_supposed_start=True if task.supposed_start_time - TaskStorageAdapterMock._saved_task.supposed_start_time == 1: task.supposed_start_time -= 1 if task.supposed_end_time - TaskStorageAdapterMock._saved_task.supposed_end_time == 1: task.supposed_end_time -= 1 self.assertEqual(TaskStorageAdapterMock._saved_task.__dict__, task.__dict__) self.assertEqual(TaskStorageAdapterMock._removed_tid, 2) self.assertEqual(PlanStorageAdapterMock._plan_id, 1) self.assertEqual(PlanStorageAdapterMock._number, 3) self.assertEqual(PlanStorageAdapterMock._tid, 3)
def home(controller, request): if request.session.get('parent_task') is not None: request.session.pop('parent_task') now = lib_utils.datetime_to_milliseconds(lib_utils.now()) TaskController(controller).find_overdue_tasks(now) if request.method == "POST": up_status = request.POST.get('status_up') if up_status is not None: status, tid = tuple(up_status.split(',')) status = Status.to_str(Status.raise_status( Status.from_str(status))) parts = tid.split('_') repeat = None plan_id = None if len(parts) == 1: tid = int(tid) if len(parts) == 3: tid = int(parts[0]) plan_id = int(parts[1]) repeat = int(parts[2]) if repeat is None: TaskController(controller).edit_task(tid, status=status) else: PlanController(controller).edit_repeat_by_number(plan_id, repeat, status=status) down_status = request.POST.get('status_down') if down_status is not None: status, tid = tuple(down_status.split(',')) status = Status.to_str( Status.downgrade_status(Status.from_str(status))) parts = tid.split('_') repeat = None plan_id = None if len(parts) == 1: tid = int(tid) if len(parts) == 3: tid = int(parts[0]) plan_id = int(parts[1]) repeat = int(parts[2]) if repeat is None: TaskController(controller).edit_task(tid, status=status) else: PlanController(controller).edit_repeat_by_number(plan_id, repeat, status=status) add_subtask = request.POST.get('add_subtask') if add_subtask is not None: request.session['parent_task'] = add_subtask return HttpResponseRedirect(reverse('core:add_task')) time_range = (lib_utils.datetime_to_milliseconds(lib_utils.today()), lib_utils.shift_datetime_in_millis( lib_utils.today(), datetime.timedelta(days=1))) tasks = [] tasks += TaskController(controller).get_overdue_tasks(now) tasks += TaskController(controller).fetch_tasks(time_range=time_range) tasks += TaskController(controller).fetch_tasks(timeless=True) for i, task in enumerate(tasks): for j in range(len(tasks) - 1, i, -1): if task.tid == tasks[j].tid and task.status == Status.OVERDUE: del tasks[j] tasks = filter_status(tasks) visual_tasks = [ VisualTaskData.from_lib_task(controller, task) for task in tasks ] return render(request, 'core/home.html', {'tasks': visual_tasks})