Beispiel #1
0
def projects_list(controller, request):
    if request.method == "POST":
        username = request.POST.get('username')
        pid = request.POST.get('pid')
        action = request.POST.get('action')
        status = request.POST.get('status')
        show_project = request.POST.get('show')

        if show_project is not None:
            return HttpResponseRedirect(
                reverse('core:project_tasks', args=[show_project]))

        if (username is not None and len(username) != 0 and pid is not None):
            users = UserController(controller).fetch_user(login=username)
            if users is not None and len(users) != 0:
                user = users[0]
                if action == 'invite':
                    if status == 'admin':
                        ProjectController(controller).invite_user_to_project(
                            int(pid), user.uid, admin=True)
                    if status == 'guest':
                        ProjectController(controller).invite_user_to_project(
                            int(pid), user.uid, guest=True)
                if action == 'exclude':
                    ProjectController(controller).exclude_user_from_project(
                        int(pid), user.uid)

    projects = ProjectController(controller).fetch_projects()
    visual_projects = [
        VisualProjectData.from_lib_project(controller, project)
        for project in projects
    ]
    VisualProjectData.normalize_visual_names(visual_projects, controller)
    return render(request, 'core/projects_list.html',
                  {'projects': visual_projects})
Beispiel #2
0
def delete_project(controller, request, project_id):
    projects = ProjectController(controller).fetch_projects(pid=project_id)
    if projects is None or len(projects) == 0:
        raise Http404

    project = projects[0]
    if project.name == 'Default':
        return HttpResponseRedirect(reverse('core:projects_list'))

    ProjectController(controller).remove_project(project_id)
    return HttpResponseRedirect(reverse('core:projects_list'))
Beispiel #3
0
def edit_project(controller, request, project_id):
    def on_project_edited(name):
        ProjectController(controller).edit_project(project_id, name)

    projects = ProjectController(controller).fetch_projects(pid=project_id)
    if projects is None or len(projects) == 0:
        raise Http404

    return _project_change_common(request, on_project_edited, projects[0])
def show_tasks_in_console(tasks, shift=0):
    data = [[str(task.tid), str(task.pid), str(task.parent_tid), task.title, task.description, 
            timestamp_to_display(task.supposed_start_time), 
            timestamp_to_display(task.supposed_end_time),
            timestamp_to_display(task.deadline_time),
            Priority.to_str(task.priority),
            Status.to_str(task.status),
            task.notificate_supposed_start,
            task.notificate_supposed_end,
            task.notificate_deadline] for task in tasks]
    data.insert(0, ['TID', 'PID', 'PARENT', 'TITLE', 'DESCRIPTION', 'SUPPOSED_START', 'SUPPOSED_END', 'DEADLINE',
                    'PRIORITY', 'STATUS', 'NOTIFICATE START', 'NOTIFICATE END', 'NOTIFICATE DEADLINE', 
                    'PLANNED (plan id)', 'EDIT PLANS (plan id)', 'NUMBER IN PLANS'])
    
    for i in range(len(tasks)):
        task = tasks[i]
        projects = ProjectController.fetch_projects(pid=task.pid)
        if projects is not None and len(projects) != 0:
            projects_str = ','.join([project.name for project in projects])
            data[i+1][1] += ' ({})'.format(projects_str)

    plan_controller = PlanController()
    for i in range(len(tasks)):
        task = tasks[i]
        plans = plan_controller.get_plan_for_common_task(task.tid)
        if len(plans) > 0:
            plans_ids = ','.join([str(plan.plan_id) for plan in plans])
            data[i+1].append(plans_ids)
        else:
            data[i+1].append(str(None))
        edited_plans = plan_controller.get_plan_for_edit_repeat_task(task.tid)
        if len(edited_plans) > 0:
            plans_ids = ','.join([str(plan.plan_id) for plan in edited_plans])
            data[i+1].append(plans_ids)
        else:
            data[i+1].append(str(None))

        all_plans = plans + edited_plans
        if len(all_plans) > 0:
            repeats = []
            for plan in all_plans:
                repeat = plan_controller.get_repeat_number_for_task(plan.plan_id, task)
                if repeat is not None:
                    repeats.append(str(repeat))
            numbers = ','.join(repeats)
            data[i+1].append(numbers)
        else:
            data[i+1].append(str(None))
        
    print_in_groups(data, shift)
Beispiel #5
0
def project_tasks(controller, request, project_id):
    request.session['pid'] = project_id

    if request.session.get('parent_task') is not None:
        request.session.pop('parent_task')

    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)))
            TaskController(controller).edit_task(tid, 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)))
            TaskController(controller).edit_task(tid, status=status)
        back = request.POST.get('back')
        if back is not None:
            return HttpResponseRedirect(reverse('core:projects_list'))
        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'))

    projects = ProjectController(controller).fetch_projects(pid=project_id)
    back_text = None
    if projects is not None and len(projects) != 0:
        back_text = projects[0].name

    tasks = TaskController(controller).fetch_tasks(pid=project_id)
    tasks = list(reversed(tasks))
    visual_tasks = [
        VisualTaskData.from_lib_task(controller, task) for task in tasks
    ]
    return render(request, 'core/projects_task_list.html', {
        'tasks': visual_tasks,
        'back_text': back_text
    })
 def setUp(self):
     self.controllers = ProjectController()
     self.user_controller = UserController()
Beispiel #7
0
def _task_change_common(controller,
                        request,
                        on_task_changed,
                        plan_id=None,
                        repeat=None,
                        initial_task=None):
    def to_utc(datetime_object):
        if datetime_object is not None:
            return datetime_object.replace(tzinfo=None)

    def timestamp_to_display(timestamp):
        if timestamp is not None:
            return datetime.datetime.utcfromtimestamp(
                timestamp / 1000.0).strftime('%d-%m-%Y %H:%M')

    projects = ProjectController(controller).fetch_projects()
    visual_projects = [
        VisualProjectData.from_lib_project(controller, project)
        for project in projects
    ]
    VisualProjectData.normalize_visual_names(visual_projects, controller)

    if request.method == "POST":
        form = TaskForm(data=request.POST)

        cancel_parent = request.POST.get('cancel_parent')
        if cancel_parent is not None:
            request.session.pop('parent_task')
        elif form.is_valid():
            title = form.cleaned_data.get('title')
            description = form.cleaned_data.get('description')
            priority = form.cleaned_data.get('priority')
            supposed_start = form.cleaned_data.get('supposed_start')
            supposed_end = form.cleaned_data.get('supposed_end')
            deadline = form.cleaned_data.get('deadline')
            project_pid = int(form.cleaned_data.get('project'))

            shift_milliseconds = 0
            plan_minute = form.cleaned_data.get('plan_minute')
            if plan_minute is not None:
                plan_minute = int(plan_minute)
                shift_milliseconds += plan_minute * 60000
            plan_hour = form.cleaned_data.get('plan_hour')
            if plan_hour is not None:
                plan_hour = int(plan_hour)
                shift_milliseconds += plan_hour * 60 * 60000
            plan_day = form.cleaned_data.get('plan_day')
            if plan_day is not None:
                plan_day = int(plan_day)
                shift_milliseconds += plan_day * 24 * 60 * 60000
            plan_month = form.cleaned_data.get('plan_month')
            if plan_month is not None:
                plan_month = int(plan_month)
                shift_milliseconds += plan_month * 30 * 24 * 60 * 60000
            plan_year = form.cleaned_data.get('plan_year')
            if plan_year is not None:
                plan_year = int(plan_year)
                shift_milliseconds += plan_year * 365 * 30 * 24 * 60 * 60000

            print('t', supposed_end)

            supposed_start = to_utc(supposed_start)
            supposed_end = to_utc(supposed_end)
            deadline = to_utc(deadline)

            print('t', supposed_end)

            supposed_start = lib_utils.datetime_to_milliseconds(supposed_start)
            supposed_end = lib_utils.datetime_to_milliseconds(supposed_end)
            deadline = lib_utils.datetime_to_milliseconds(deadline)

            print('t', timestamp_to_display(supposed_end))

            on_task_changed(title, description, priority, supposed_start,
                            supposed_end, deadline, project_pid,
                            shift_milliseconds)

            return HttpResponseRedirect(
                reverse('core:project_tasks', args=[project_pid]))
    else:
        form = TaskForm()
        if initial_task is not None:
            form.fields['title'].initial = initial_task.title
            form.fields['description'].initial = initial_task.description
            form.fields['priority'].initial = Priority.to_str(
                initial_task.priority)

            supposed_start = VisualTaskData.timestamp_to_display(
                initial_task.supposed_start_time)
            supposed_end = VisualTaskData.timestamp_to_display(
                initial_task.supposed_end_time)
            deadline = VisualTaskData.timestamp_to_display(
                initial_task.deadline_time)

            form.fields['supposed_start'].initial = supposed_start
            form.fields['supposed_end'].initial = supposed_end
            form.fields['deadline'].initial = deadline

            form.fields['project'].initial = str(initial_task.pid)

            plans = PlanController(controller).get_plan_for_common_task(
                initial_task.tid)
            if plans is not None and len(plans) != 0:
                years, months, days, hours, minutes = VisualPlanData.parse_shift(
                    plans[0].shift)
                if minutes != 0:
                    form.fields['plan_minute'].initial = minutes
                if hours != 0:
                    form.fields['plan_hour'].initial = hours
                if days != 0:
                    form.fields['plan_day'].initial = days
                if months != 0:
                    form.fields['plan_month'].initial = months
                if years != 0:
                    form.fields['plan_year'].initial = years
        else:
            pid = request.session.get('pid')
            if pid is not None:
                form.fields['project'].initial = str(pid)
            else:
                for project in projects:
                    if project.name == Project.default_project_name:
                        form.fields['project'].initial = str(project.pid)
                        break

    parent_task = None
    if initial_task is None:
        parent_tid = request.session.get('parent_task')
        if parent_tid is not None:
            lib_task = TaskController(controller).fetch_tasks(tid=parent_tid)
            if lib_task is not None and len(lib_task) != 0:
                parent_task = VisualTaskData.from_lib_task(
                    controller, lib_task[0])
    else:
        if request.session.get('parent_task') is not None:
            request.session.pop('parent_task')

    return render(
        request, 'core/add_task.html', {
            'form': form,
            'projects': visual_projects,
            'parent_task': parent_task,
            'repeat': repeat
        })
Beispiel #8
0
def search(controller, request):
    def to_utc(datetime_object):
        if datetime_object is not None:
            return datetime_object.replace(tzinfo=None)

    if request.session.get('parent_task') is not None:
        request.session.pop('parent_task')

    projects = ProjectController(controller).fetch_projects()
    visual_projects = [
        VisualProjectData.from_lib_project(controller, project)
        for project in projects
    ]
    VisualProjectData.normalize_visual_names(visual_projects, controller)

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

        form = TaskSearchForm(data=request.POST)
        if form.is_valid():
            title = form.cleaned_data.get('title')
            if len(title) == 0:
                title = None

            description = form.cleaned_data.get('description')
            if len(description) == 0:
                description = None

            priority_list = form.cleaned_data.get('priority')
            if len(priority_list) == 0:
                priority_list = None
            else:
                priority_list = [
                    Priority.from_str(priority) for priority in priority_list
                ]

            status_list = form.cleaned_data.get('status')
            if len(status_list) == 0:
                status_list = None
            else:
                status_list = [
                    Status.from_str(status) for status in status_list
                ]

            supposed_start = form.cleaned_data.get('supposed_start')
            supposed_end = form.cleaned_data.get('supposed_end')
            deadline = form.cleaned_data.get('deadline')

            project_pid = request.POST.getlist('project')
            form.projects = project_pid

            supposed_start = to_utc(supposed_start)
            supposed_end = to_utc(supposed_end)
            deadline = to_utc(deadline)

            supposed_start = lib_utils.datetime_to_milliseconds(supposed_start)
            supposed_end = lib_utils.datetime_to_milliseconds(supposed_end)
            deadline = lib_utils.datetime_to_milliseconds(deadline)

            time_range = utils.get_time_range(supposed_start, supposed_end,
                                              deadline)

            print('TEST', time_range)

            timeless = form.cleaned_data.get('timeless')
            if timeless == 'true':
                timeless = True
            else:
                timeless = None

            if project_pid is None or len(project_pid) == 0:

                tasks = TaskController(controller).fetch_tasks(
                    title=title,
                    description=description,
                    priority=priority_list,
                    status=status_list,
                    time_range=time_range,
                    timeless=timeless)
            else:
                project_pid = [int(p) for p in project_pid]
                tasks = []
                for p in project_pid:
                    tasks += TaskController(controller).fetch_tasks(
                        pid=p,
                        title=title,
                        description=description,
                        priority=priority_list,
                        status=status_list,
                        time_range=time_range,
                        timeless=timeless)
        else:
            tasks = TaskController(controller).fetch_tasks()
    else:
        form = TaskSearchForm()
        tasks = TaskController(controller).fetch_tasks()

    tasks = list(reversed(tasks))
    visual_tasks = [
        VisualTaskData.from_lib_task(controller, task) for task in tasks
    ]

    return render(request, 'core/search.html', {
        'form': form,
        'tasks': visual_tasks,
        'projects': visual_projects
    })
Beispiel #9
0
 def on_project_edited(name):
     ProjectController(controller).edit_project(project_id, name)
Beispiel #10
0
 def on_project_created(name):
     ProjectController(controller).save_project(name)
Beispiel #11
0
 def get_project_name(self):
     projects = ProjectController(
         self.controller).fetch_projects(pid=self.pid)
     if projects is not None and len(projects) != 0:
         return projects[0].name