Exemple #1
0
def create(request: HttpRequest) -> HttpResponse:
    """Render the create page"""
    if request.META.get('HTTP_REFERER') is None:
        return redirect('/calendar/')
    if request.method == 'POST':
        form = EditForm(request.POST)
        if form.is_valid():
            if is_ajax(request):
                return render(request, 'popup.html', context={"form": form})

            past_conflicts = list(Conflict.objects.all())
            professor = form.cleaned_data['professor'].strip().split()
            professor = get_professor(professor[0], professor[1])
            room = get_room(form.cleaned_data['room'])
            group = get_group(form.cleaned_data['group'])
            Lesson.objects.get_or_create(
                name=form.cleaned_data['name'],
                professor=professor,
                room=room,
                group=group,
                start_time=form.cleaned_data['start_time'],
                end_time=form.cleaned_data['end_time']
            )
            db_conflicts()
            context = generate_full_index_context_with_date(form.cleaned_data['start_time'])
            current_conflicts = list(context['conflicts'])
            context.update(generate_context_for_conflicts_report(past_conflicts, current_conflicts))
            return render(request, 'index.html', context=context)
        return render(request, 'popup.html', context={"form": form})
    return render(request, 'popup.html', context={"form": EditForm()})
Exemple #2
0
def edit(request: HttpRequest, lesson_id) -> HttpResponse:
    """Render the edit page"""
    if request.META.get('HTTP_REFERER') is None:
        return redirect('/calendar/')
    if request.method == 'POST':
        form = EditForm(request.POST)
        if form.is_valid():
            if is_ajax(request):
                return render(request, 'popup.html', context={"form": form})

            past_conflicts = list(Conflict.objects.all())
            lesson = Lesson.objects.get(id=form.cleaned_data['id'])
            lesson.name = form.cleaned_data['name']
            professor = form.cleaned_data['professor'].strip().split()
            lesson.professor = get_professor(professor[0], professor[1])
            lesson.room = get_room(form.cleaned_data['room'])
            lesson.group = get_group(form.cleaned_data['group'])
            lesson.start_time = form.cleaned_data['start_time']
            lesson.end_time = form.cleaned_data['end_time']
            lesson.save()
            db_conflicts()
            context = generate_full_index_context_with_date(form.cleaned_data['start_time'])
            current_conflicts = list(context['conflicts'])
            context.update(generate_context_for_conflicts_report(past_conflicts, current_conflicts))
            return render(request, 'index.html', context=context)
        return render(request, 'popup.html', context={"form": form})
    lesson = Lesson.objects.get(id=lesson_id)
    form = EditForm(
        initial={'id': lesson.id, 'name': lesson.name, 'professor': lesson.professor,
                 'room': lesson.room, 'group': lesson.group,
                 'start_time': lesson.start_time, 'end_time': lesson.end_time})
    return render(request, 'popup.html', context={"form": form})
Exemple #3
0
def import_students(data: pd.DataFrame) -> Tuple[int, List[int], List[int]]:
    """
        Parse students data and add to database
        :param data: DataFrame with students data
            Accepted format: index_number | name_and_surname | group
        :return: number of students added
        """
    if len(data.columns) == 3:
        added_columns = 0
        incorrect = []
        duplicate = []
        for row in data.itertuples():
            if row.count(nan) != 0 or not students_check_types(row):
                incorrect.append(row[0])
                continue
            full_name = row[2].strip().split()
            if len(full_name) == 2:
                group = get_group(row[3])
                _student, created = Student.objects.get_or_create(
                    name=full_name[0],
                    surname=full_name[1],
                    group=group,
                    index=int(row[1]))
                if created:
                    added_columns += 1
                else:
                    duplicate.append(row[0])
            else:
                incorrect.append(row[0])
                continue
        return added_columns, incorrect, duplicate
    raise ImportSizeException
Exemple #4
0
def edit_lessons(request: HttpRequest) -> HttpResponse:
    """Logic for mass edit of conflicts"""
    if request.method == 'POST':
        form = MassEditForm(request.POST)
        if form.is_valid():
            changes = {}
            past_conflicts = list(Conflict.objects.all())
            if form.cleaned_data['lesson_name']:
                changes['name'] = form.cleaned_data['lesson_name']
            if form.cleaned_data['professor']:
                professor = form.cleaned_data['professor'].strip().split()
                changes['professor'] = get_professor(professor[0], professor[1])
            if form.cleaned_data['room']:
                changes['room'] = get_room(form.cleaned_data['room'])
            if form.cleaned_data['group']:
                changes['group'] = get_group(form.cleaned_data['group'])
            if form.cleaned_data['start_time']:
                changes['start_time'] = form.cleaned_data['start_time']
            if form.cleaned_data['end_time']:
                changes['end_time'] = form.cleaned_data['end_time']

            checks = request.POST.getlist('checks[]')
            if changes != {}:
                lessons = Lesson.objects.filter(id__in=checks)
                lessons.update(**changes)

            db_conflicts()
            context_after_edit = generate_full_index_context()
            current_conflicts = list(context_after_edit['conflicts'])
            context_after_edit.update(
                generate_context_for_conflicts_report(past_conflicts, current_conflicts))
            return render(request, 'index.html', context=context_after_edit)
        context: dict = {}
        context.update(generate_conflicts_context())
        context.update(generate_full_schedule_context())
        context.update({'form': form})
        return render(request, 'index.html', context=context)
    return index(request)
Exemple #5
0
def import_excel(data: pd.DataFrame) -> Tuple[int, List[int], List[int]]:
    """
    Parse excel data from DataFrame and add to database
    :param data: consists of complex types for date etc.
        Date: YYYY-MM-DD  Time: HH:MM(:SS)
    :return: number of lessons added
    """
    added_columns = 0
    incorrect = []
    duplicate = []
    for row in data.itertuples():
        if row.count(nan) != 0 or not check_types_excel(row):
            incorrect.append(row[0])
            continue
        professor_data = row[5].strip().split()
        if len(professor_data) == 2:
            try:
                if isinstance(row[2], str):
                    tmp_time = dt.datetime.strptime(row[2], ("%H:%M:%S" if len(
                        row[2].split(":")) == 3 else "%H:%M"))
                    start_time = dt.timedelta(hours=tmp_time.hour,
                                              minutes=tmp_time.minute)
                    tmp_time = dt.datetime.strptime(row[3], ("%H:%M:%S" if len(
                        row[3].split(":")) == 3 else "%H:%M"))
                    end_time = dt.timedelta(hours=tmp_time.hour,
                                            minutes=tmp_time.minute)
                else:
                    start_time = dt.timedelta(hours=row[2].hour,
                                              minutes=row[2].minute)
                    end_time = dt.timedelta(hours=row[3].hour,
                                            minutes=row[3].minute)
                if isinstance(row[1], str):
                    date = dt.datetime.strptime(row[1], "%Y-%m-%d")
                    start_date = date + start_time
                    end_date = date + end_time
                else:
                    start_date = row[1].to_pydatetime() + start_time
                    end_date = row[1].to_pydatetime() + end_time
            except ValueError:
                incorrect.append(row[0])
                continue
            if start_date > end_date:
                incorrect.append(row[0])
                continue
            professor = get_professor(professor_data[0], professor_data[1])
            room = get_room(str(row[7]))
            group = get_group(str(row[6]))
            _lesson, created = Lesson.objects.get_or_create(
                name=str(row[4]).strip(),
                professor=professor,
                room=room,
                group=group,
                start_time=start_date,
                end_time=end_date)
            if created:
                added_columns += 1
            else:
                duplicate.append(row[0])
        else:
            incorrect.append(row[0])
    return added_columns, incorrect, duplicate
Exemple #6
0
def import_csv(data: pd.DataFrame) -> Tuple[int, List[int], List[int]]:
    """
    Parse csv data from DataFrame and add to database
    :param data: consists of simple types (str or int)
        Date: DD-MM-YY or YYYY-MM-DD  Time: HH:MM(:SS)
    :return: number of lessons added
    """
    added_columns = 0
    incorrect = []
    duplicate = []
    for row in data.itertuples():
        if row.count(nan) != 0 or not check_types_csv(row):
            incorrect.append(row[0])
            continue
        try:
            date = [val for val in row[1].split("-")]
            start_t = [val for val in row[2].split(":")]
            end_t = [val for val in row[3].split(":")]
            professor_data = row[5].strip().split()
            if len(date) == 3 and len(start_t) >= 2 and len(end_t) >= 2\
                    and len(professor_data) == 2:
                if len(date[0]) == 2:
                    start_date = dt.datetime(
                        int(date[2]) + 2000, int(date[1]), int(date[0]),
                        int(start_t[0]), int(start_t[1]))
                    end_date = dt.datetime(
                        int(date[2]) + 2000, int(date[1]), int(date[0]),
                        int(end_t[0]), int(end_t[1]))
                elif len(date[0]) == 4:
                    start_date = dt.datetime(int(date[0]), int(date[1]),
                                             int(date[2]), int(start_t[0]),
                                             int(start_t[1]))
                    end_date = dt.datetime(int(date[0]), int(date[1]),
                                           int(date[2]), int(end_t[0]),
                                           int(end_t[1]))
                else:
                    incorrect.append(row[0])
                    continue
                if start_date > end_date:
                    incorrect.append(row[0])
                    continue
                professor = get_professor(professor_data[0], professor_data[1])
                room = get_room(str(row[7]))
                group = get_group(str(row[6]))
                _lesson, created = Lesson.objects.get_or_create(
                    name=str(row[4]).strip(),
                    professor=professor,
                    room=room,
                    group=group,
                    start_time=start_date,
                    end_time=end_date)
                if created:
                    added_columns += 1
                else:
                    duplicate.append(row[0])
            else:
                incorrect.append(row[0])
        except ValueError:
            incorrect.append(row[0])
            continue
    return added_columns, incorrect, duplicate