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])
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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 []
示例#9
0
    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)
示例#12
0
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})