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