def test_ScheduleModel_IsScheduledAvailable_ShouldReturnTrueIfScheduled(
            self):
        u1 = User(zone=Zone.A, role=Role.SALES_REP)
        o1 = Outlet(zone=Zone.A, rep=u1)
        t1 = Task(outlet=o1,
                  rep=u1,
                  creator=u1,
                  type=TaskType.CUSTOM,
                  assigner=u1)
        s1 = Schedule(start=datetime(2021, 1, 27, 4),
                      end=datetime(2021, 1, 27, 7),
                      rep=u1,
                      task=t1)

        db.session.add_all([u1, o1, t1, s1])
        db.session.commit()

        result1 = Schedule.is_schedule_available(u1, datetime(2021, 1, 27, 2),
                                                 datetime(2021, 1, 27, 8))
        result2 = Schedule.is_schedule_available(u1, datetime(2021, 1, 27, 2),
                                                 datetime(2021, 1, 27, 3))
        result3 = Schedule.is_schedule_available(u1, datetime(2021, 1, 27, 4),
                                                 datetime(2021, 1, 27, 8))
        result4 = Schedule.is_schedule_available(u1, datetime(2021, 1, 27, 5),
                                                 datetime(2021, 1, 27, 8))
        result5 = Schedule.is_schedule_available(u1, datetime(2021, 1, 27, 5),
                                                 datetime(2021, 1, 27, 7))
        result6 = Schedule.is_schedule_available(u1, datetime(2021, 1, 27, 5),
                                                 datetime(2021, 1, 27, 6))
        result7 = Schedule.is_schedule_available(u1, datetime(2021, 1, 27, 7),
                                                 datetime(2021, 1, 27, 8))
        result8 = Schedule.is_schedule_available(u1, datetime(2021, 1, 27, 8),
                                                 datetime(2021, 1, 27, 9))

        self.assertEqual(result1, False)
        self.assertEqual(result2, True)
        self.assertEqual(result3, False)
        self.assertEqual(result4, False)
        self.assertEqual(result5, False)
        self.assertEqual(result6, False)
        self.assertEqual(result7, True)
        self.assertEqual(result8, True)
Пример #2
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
Пример #3
0
def planner(username):
    if username != current_user.username and current_user.role != Role.SALES_REP_LEAD:
        return redirect(
            url_for('calendar.planner', username=current_user.username))

    start_date = isoparse(request.args.get('start')) or get_current_week(
        datetime.utcnow(), session['timezone'])[0]
    schedule_task_form = ScheduleTaskForm()
    task_choices = [(task.id, f"(ID: {task.id}) {task.title}")
                    for task in current_user.tasks]
    schedule_task_form.task_id.choices = task_choices

    if schedule_task_form.validate_on_submit():
        valid = True

        task = Task.query.filter(
            Task.id == schedule_task_form.task_id.data).first()
        if task.rep.id != current_user.id:
            flash('Invalid task')
            valid = False

        start = schedule_task_form.start.data  #In UTC time, it is the forms job of converting from local to UTC
        end = schedule_task_form.end.data
        if start > end:
            flash('Invalid date')
            valid = False

        if end - start >= timedelta(
                days=current_app.config['TASK_SCHEDULE_LIMIT']):
            flash(
                f'Tasks can only be scheduled for {current_app.config["TASK_SCHEDULE_LIMIT"]} days'
            )
            valid = False

        week = get_current_week(start, session['timezone'])
        if not Schedule.is_task_scheduled(task, week[0], week[-1]):
            flash(
                f'Task {schedule_task_form.task_id.data} has already been scheduled for this week'
            )
            valid = False

        elif not Schedule.is_schedule_available(current_user, start, end):
            flash('A task has already been scheduled at that time')
            valid = False

        if valid:
            if to_timezone(start, to_timezone=session['timezone']).time(
            ) < time(8, 0, 0) or to_timezone(
                    end, to_timezone=session['timezone']).time() > time(
                        20, 0, 0):  #TODO: working hours
                flash(
                    'You have scheduled a task outside of your working hours')

            schedule = Schedule(start=start,
                                end=end,
                                rep=current_user,
                                task=task)
            db.session.add(schedule)
            db.session.commit()

            start_date = get_current_week(start, session['timezone'])[0]

    unscheduled_tasks = Task.get_unscheduled_tasks(current_user,
                                                   start_date=start_date,
                                                   end_date=start_date +
                                                   timedelta(days=6))
    info_task_form = TaskForm()
    return render_template('calendar/calendar.html',
                           title='Calendar',
                           all_tasks=unscheduled_tasks,
                           schedule_task_form=schedule_task_form,
                           info_task_form=info_task_form,
                           start_date=start_date)