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])
def index(): schedules = Schedule.get_schedule(current_user, start_date=datetime.utcnow()) return render_template('index.html', title='Home', upcoming_schedules=schedules)
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 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)