def test_ScheduleModel_GetSchedule_ShouldReturnTasksWithinDateRange(self):
        u1 = User(zone=Zone.A, role=Role.SALES_REP)
        u2 = User(zone=Zone.B, role=Role.SALES_REP)
        o1 = Outlet(zone=Zone.A, rep=u1)
        o2 = Outlet(zone=Zone.B, rep=u2)
        t1 = Task(outlet=o1,
                  rep=u1,
                  creator=u1,
                  type=TaskType.CUSTOM,
                  assigner=u1)
        t2 = Task(outlet=o2,
                  rep=u2,
                  creator=u2,
                  type=TaskType.CUSTOM,
                  assigner=u2)
        s1 = Schedule(start=date(2020, 1, 27),
                      end=date(2020, 1, 27),
                      rep=u1,
                      task=t1)
        s2 = Schedule(start=date(2020, 1, 28),
                      end=date(2020, 1, 28),
                      rep=u1,
                      task=t1)
        s3 = Schedule(start=date(2020, 1, 29),
                      end=date(2020, 1, 29),
                      rep=u1,
                      task=t1)
        s4 = Schedule(start=date(2020, 1, 30),
                      end=date(2020, 1, 30),
                      rep=u1,
                      task=t1)
        s5 = Schedule(start=date(2020, 1, 31),
                      end=date(2020, 1, 31),
                      rep=u1,
                      task=t1)

        s6 = Schedule(start=date(2020, 1, 27),
                      end=date(2020, 1, 27),
                      rep=u2,
                      task=t2)
        s7 = Schedule(start=date(2020, 1, 28),
                      end=date(2020, 1, 28),
                      rep=u2,
                      task=t2)
        s8 = Schedule(start=date(2020, 1, 29),
                      end=date(2020, 1, 29),
                      rep=u2,
                      task=t2)
        s9 = Schedule(start=date(2020, 1, 30),
                      end=date(2020, 1, 30),
                      rep=u2,
                      task=t2)
        s10 = Schedule(start=date(2020, 1, 31),
                       end=date(2020, 1, 31),
                       rep=u2,
                       task=t2)

        db.session.add_all(
            [u1, u2, o1, o2, t1, t2, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10])
        db.session.commit()

        result1 = Schedule.get_schedule(u1,
                                        start_date=datetime(2020, 1, 29),
                                        end_date=datetime(2020, 1, 29))
        result2 = Schedule.get_schedule(u1,
                                        start_date=datetime(2020, 1, 28),
                                        end_date=datetime(2020, 1, 29))
        result3 = Schedule.get_schedule(u1,
                                        start_date=datetime(2020, 1, 27),
                                        end_date=datetime(2020, 1, 29))
        result4 = Schedule.get_schedule(u1,
                                        start_date=datetime(2020, 1, 29),
                                        end_date=datetime(2020, 1, 30))
        result5 = Schedule.get_schedule(u1,
                                        start_date=datetime(2020, 1, 29),
                                        end_date=datetime(2020, 1, 31))
        result6 = Schedule.get_schedule(u1,
                                        start_date=datetime(2020, 1, 27),
                                        end_date=datetime(2020, 1, 31))
        result7 = Schedule.get_schedule(u1,
                                        start_date=datetime(2020, 1, 26),
                                        end_date=datetime(2020, 1, 26))
        result8 = Schedule.get_schedule(u1,
                                        start_date=datetime(2020, 2, 1),
                                        end_date=datetime(2020, 2, 1))
        result9 = Schedule.get_schedule(u1, start_date=datetime(2020, 1, 29))
        result10 = Schedule.get_schedule(u1, end_date=datetime(
            2020, 1,
            29))  #Doing this will get all schedules that have ever been
        #created, DO NOT DO THIS

        self.assertEqual(result1, [s3])
        self.assertEqual(result2, [s2, s3])
        self.assertEqual(result3, [s1, s2, s3])
        self.assertEqual(result4, [s3, s4])
        self.assertEqual(result5, [s3, s4, s5])
        self.assertEqual(result6, [s1, s2, s3, s4, s5])
        self.assertEqual(result7, [])
        self.assertEqual(result8, [])
        self.assertEqual(result9, [s3, s4, s5])
        self.assertEqual(result10, [s1, s2, s3])
Пример #2
0
def index():
    schedules = Schedule.get_schedule(current_user,
                                      start_date=datetime.utcnow())
    return render_template('index.html',
                           title='Home',
                           upcoming_schedules=schedules)
Пример #3
0
def schedule_data(username):
    if username != current_user.username and current_user.role != Role.SALES_REP_LEAD:
        return redirect(
            url_for('tasks.user_tasks', username=current_user.username))

    start_date = isoparse(request.args.get('start'))
    end_date = isoparse(request.args.get('end'))
    data = request.get_json()
    if data:
        if request.method == 'DELETE':
            print('delete')
            valid = True

            schedule_id = data['task']['id']
            schedule = Schedule.query.filter(
                Schedule.id == schedule_id).first()
            print(schedule)
            if not schedule:
                valid = False

            current_week = get_current_week(isoparse(data['task']['start']))
            if not start_date and not end_date:
                start_date = current_week[0]
                end_date = current_week[-1]

            if valid:
                db.session.delete(schedule)
                db.session.commit()

        elif request.method == 'POST':
            valid = True

            schedules = []
            for schedule in data['tasks']:
                rep = User.query.filter(User.id == schedule['rep_id']).first()
                if not rep:
                    valid = False
                    break
                print(
                    Schedule.is_schedule_available(rep,
                                                   isoparse(schedule['start']),
                                                   isoparse(schedule['end'])))
                if Schedule.is_schedule_available(rep,
                                                  isoparse(schedule['start']),
                                                  isoparse(schedule['end'])):
                    task = rep.tasks.filter(
                        Task.id == schedule['task_id']).first()

                    schedules.append(
                        Schedule(start=isoparse(
                            schedule['start']).replace(microsecond=0),
                                 end=isoparse(
                                     schedule['end']).replace(microsecond=0),
                                 rep=rep,
                                 task=task))

            current_week = get_current_week(isoparse(schedule['start']))
            if not start_date and not end_date:
                start_date = current_week[0]
                end_date = current_week[-1]

            if valid:
                db.session.add_all(schedules)
                db.session.commit()

    unscheduled = is_true(request.args.get('unscheduled'))
    result = {}
    if unscheduled:
        unscheduled_tasks = Task.get_unscheduled_tasks(current_user,
                                                       start_date=start_date,
                                                       end_date=end_date)
        result['tasks'] = TaskSchema().dump(unscheduled_tasks, many=True)

    else:
        schedules = Schedule.get_schedule(current_user,
                                          start_date=start_date,
                                          end_date=end_date)
        result['tasks'] = [
            schedule_to_fullcalendar(schedule, session['timezone'])
            for schedule in schedules
        ]
        result['stats'] = calculate_stats(schedules, start_date, depot)

    return result
Пример #4
0
def user_tasks(username):
    if username != current_user.username and current_user.role != Role.SALES_REP_LEAD:
        return redirect(
            url_for('tasks.user_tasks', username=current_user.username))

    create_task_form = TaskForm()
    outlet_choices = [(outlet.id, outlet.name)
                      for outlet in current_user.outlets]
    create_task_form.outlet.choices = outlet_choices
    if create_task_form.validate_on_submit():
        valid = True

        title = create_task_form.title.data
        description = create_task_form.description.data
        start = create_task_form.start.data
        end = create_task_form.end.data
        if start > end:
            flash("Invalid date")
            valid = False

        estimated_time = create_task_form.estimated_time.data.hour * 60 + create_task_form.estimated_time.data.minute
        repeat_count = create_task_form.repeat_count.data
        outlet_id = create_task_form.outlet.data
        outlet = current_user.outlets.filter(Outlet.id == outlet_id).first()
        if not outlet:
            flash("Invalid outlet ID")
            valid = False

        if valid:
            task = Task(creator=current_user,
                        type=TaskType.CUSTOM,
                        title=title,
                        description=description,
                        start_date=start,
                        end_date=end,
                        service_time=estimated_time,
                        repeat_count=repeat_count,
                        outlet=outlet,
                        rep=current_user,
                        assigner=current_user)
            weeks = TaskWeek.create_task_weeks(task, session['timezone'])
            db.session.add(task, weeks)
            db.session.commit()

    delete_task_form = DeleteTaskForm()
    task_choices = [(task.id, f"(ID: {task.id}) {task.title}")
                    for task in current_user.tasks
                    if task.is_task_deletable(current_user)]
    delete_task_form.task_id.choices = task_choices
    if delete_task_form.validate_on_submit():
        valid = True
        task = current_user.tasks.filter(
            Task.id == delete_task_form.task_id.data).first()
        if not task:
            valid = False
            flash('Invalid Task')

        if not task.is_task_deletable(current_user):
            valid = False
            flash('Invalid Task')

        if valid:
            flash(f'Task {task.id} successfully deleted')
            db.session.delete(task)
            db.session.commit()
            task_choices = [(task.id, f"(ID: {task.id}) {task.title}")
                            for task in current_user.tasks
                            if task.is_task_deletable(current_user)]
            delete_task_form.task_id.choices = task_choices

    start = request.args.get('start')
    end = request.args.get('end')
    if start:
        start = isoparse(start)
    else:
        start = get_current_week(datetime.utcnow(), session['timezone'])[0]
    if end:
        end = isoparse(end)
    else:
        end = start + timedelta(days=current_app.config['DAYS_PER_WEEK'])

    current_task_week = TaskWeek.query.filter(
        TaskWeek.end_date >= start).filter(TaskWeek.start_date < end)
    mandatory_tasks = current_task_week.join(
        Task, Task.id == TaskWeek.task_id).filter(
            Task.type == TaskType.MANDATORY).join(
                User, User.id == Task.rep_id).filter(
                    User.username == username).order_by(Task.id.desc()).all()
    custom_tasks = current_task_week.join(
        Task,
        Task.id == TaskWeek.task_id).filter(Task.type == TaskType.CUSTOM).join(
            User,
            User.id == Task.rep_id).filter(User.username == username).order_by(
                Task.id.desc()).all()
    schedules = Schedule.get_schedule(current_user,
                                      start_date=datetime.utcnow())
    return render_template('tasks/tasks.html',
                           title='My Tasks',
                           mandatory_tasks=mandatory_tasks,
                           custom_tasks=custom_tasks,
                           upcoming_schedules=schedules,
                           start=start,
                           end=end,
                           create_task_form=create_task_form,
                           delete_task_form=delete_task_form)