예제 #1
0
def SendCheckpointsForAcceptedWP(request):
    """
    Отправка всех прошедших экспертизу РПД, в БАРС
    Параметры:
    year : Поле вида 'YYYY/YYYY', указывает учебный год в который надо отправить РПД
    send_semester : 0, если семетр осенний, 1 - если весенний
    """
    year = request.data.get('year')
    send_semester = request.data.get('send_semester')

    setup_bars = (year, send_semester)

    send_semester += 1
    needed_wp = WorkProgram.objects.filter(
        expertise_with_rpd__expertise_status__contains='AC').distinct()
    all_sends = []
    for work_program in needed_wp:
        imp_list = []
        wp_bars_data = WorkProgramIdStrUpForIsu.objects.filter(
            work_program_in_field_of_study__work_program=work_program
        ).distinct()
        for data_isu in wp_bars_data:
            implementation_of_academic_plan = ImplementationAcademicPlan.objects.filter(
                academic_plan__discipline_blocks_in_academic_plan__modules_in_discipline_block__change_blocks_of_work_programs_in_modules__zuns_for_cb__zuns_for_wp
                =data_isu).distinct()

            for imp in implementation_of_academic_plan:
                field_of_studies = FieldOfStudy.objects.get(
                    implementation_academic_plan_in_field_of_study=imp)
                imp_list.append(
                    generate_fos(data_isu.ns_id, field_of_studies.number,
                                 imp.title))
        semesters = str(data_isu.ze_v_sem).split(",")
        count = 1
        for i, el in enumerate(semesters):
            # Входная точка: у нас есть все данные - семетр, учебный план, направление, рпд, информация из ИСУ
            if float(el) > 0:
                if ((i + 1) % 2 == 0 and send_semester % 2 == 0) or (
                    (i + 1) % 2 != 0 and send_semester % 2 != 0):
                    imp_list = list({v['id']: v for v in imp_list}.values())
                    request_text = generate_single_checkpoint(
                        absolute_semester=i + 1,
                        relative_semester=count,
                        programs=imp_list,
                        work_program=work_program,
                        setup=setup_bars)
                    request_response, request_status_code = post_checkpoint_plan(
                        request_text, setup_bars)
                    if request_status_code != 200:
                        print(request_text, request_response)
                    HistoryOfSendingToBars.objects.create(
                        work_program=work_program,
                        request_text=request_text,
                        request_response=request_response,
                        request_status=request_status_code)
                    all_sends.append({
                        "status": request_status_code,
                        "request": request_text,
                        "response": request_response
                    })
                count += 1
    return Response(all_sends)
예제 #2
0
def CreateCheckPoint(request):
    # TODO: УБРАТЬ ХАРДКОДИНГ
    work_program_id = request.data.get('work_program_id')
    field_of_study_id = request.data.get('field_of_study_id')
    term = request.data.get('term')

    # Переменные для формирования запроса к БАРС
    point_distribution = 0
    bars_id = WorkProgram.objects.get(
        id=work_program_id).wp_isu_id
    types_checkpoints = get_list_of_regular_checkpoints()  # Список оценочных средств в БАРСе
    list_regular = []
    has_course_project = False
    course_project = None
    final_checkpoint = None
    discipline = None
    extra_points = True if WorkProgram.objects.get(id=work_program_id).extra_points else False
    field_of_study = FieldOfStudy.objects.get(id=field_of_study_id)

    # Получение дисцплины из направления
    wp_in_change = WorkProgramChangeInDisciplineBlockModule.objects.filter(work_program=work_program_id,
                    discipline_block_module__descipline_block__academic_plan__field_of_study=field_of_study).distinct()
    wp_in_change = wp_in_change[0]

    """
    Пока названия имен в Конструкторе РПД не совпадают с именами в БАРСе этот код не имеет смысла, 
    заменяется тем что ниже
    
    educational_bars_id = WorkProgramInFieldOfStudy.objects.filter(
        work_program_change_in_discipline_block_module=wp_in_change)[0].id_str_up
    """

    # Поиск информции об образовательной программе в барсе, получение ее таблицы
    programs = []
    bars_education = get_one_educational_program(bars_id, term)
    for educ in bars_education:
        if educ["code"] == field_of_study.number + ".":
            programs = educ

    # Поиск относительного семестра из переданного абсолютного
    semesters = str(wp_in_change.credit_units).split(",")
    needed_semester = -1
    count = 1
    for i, el in enumerate(semesters):
        if int(el) > 0:
            if i + 1 == term:
                needed_semester = count
                break
            count += 1

    # Поиск оценочных средства для семетра, а также нахождение БАРСовских типов оценочных срелств
    evaluation_tools = EvaluationTool.objects.filter(evaluation_tools__in=DisciplineSection.objects.filter(
        work_program__id=work_program_id)).distinct().filter(semester=needed_semester)
    for eva in evaluation_tools:
        for el in types_checkpoints:
            if el["name"] == eva.type:
                id = el["id"]
        list_regular.append(
            generate_checkpoint(name=eva.name, min=eva.min, max=eva.max, week=int(eva.deadline), type_id=id,
                                key=eva.check_point))
    certificate = СertificationEvaluationTool.objects.filter(work_program=work_program_id, semester=needed_semester)
    for cerf in certificate:
        if int(cerf.type) == 4:
            has_course_project = True
            course_project = generate_checkpoint(name=cerf.name, min=cerf.min, max=cerf.max, week=None, type_id=id,
                                                 key=True)
        else:
            point_distribution = 100 - cerf.max
            final_checkpoint = generate_checkpoint(name=cerf.name, min=cerf.min, max=cerf.max, week=None,
                                                   type_id=get_checkpoints_type(int(cerf.type)), key=True)

    discipline = generate_discipline(bars_id=bars_id, name=WorkProgram.objects.get(id=work_program_id).title, term=term,
                                     course_project=has_course_project)
    print(programs)
    checkpoint_plan = generate_checkpoint_plan(regular_checkpoint=list_regular, programs=programs,
                                               discipline=discipline,
                                               final_checkpoint=final_checkpoint,
                                               course_project_checkpoint=course_project,
                                               term=term, point_distribution=point_distribution,
                                               additional_points=extra_points,
                                               alternate_methods=False, has_course_project=has_course_project)
    print(post_checkpoint_plan(checkpoint_plan))
    return Response(checkpoint_plan)
예제 #3
0
def SendCheckpointsForAcceptedWP(request):
    """
    Отправка всех прошедших экспертизу РПД, в БАРС
    Параметры:
    year : Поле вида 'YYYY/YYYY', указывает учебный год в который надо отправить РПД [str]
    send_semester : 1 - семетр осенний, 0 - семестр весенний [int]
    one_wp: необязательное поле, указывается id одной РПД для отправки в БАРС
    """
    year = request.data.get('year')
    send_semester = request.data.get('send_semester')
    # небольшой костыль из-за некоторых ньюансов

    one_wp = request.data.get('one_wp')
    setup_bars = (
        year, send_semester
    )  # Устанавливает корректную дату и семестр в барсе (аргумент для БАРС-функций)
    if send_semester == 0:
        send_semester = 1
    else:
        send_semester = 0
    if not one_wp:
        needed_wp = WorkProgram.objects.filter(
            expertise_with_rpd__expertise_status__contains='AC',
            bars=True).distinct()
    else:
        needed_wp = WorkProgram.objects.filter(pk=one_wp)
    all_sends = [
    ]  # Список всего того что отправили в барс, нужен для респонса

    for work_program in needed_wp:
        # Счетчик относительных семестров (-1 из-за цикла по семестрам с шагом 2)
        relative_bool = True
        count_relative = 1

        evaluation_tools = EvaluationTool.objects.filter(
            evaluation_tools__in=DisciplineSection.objects.filter(
                work_program__id=work_program.id))

        # Проверка для булевой переменной, идет ли дисциплина в нескольких семестрах
        min_sem = 12
        max_sem = 1
        for eva in evaluation_tools:
            if eva.semester == None:
                break
            if eva.semester < min_sem:
                min_sem = eva.semester
            if eva.semester > max_sem:
                max_sem = eva.semester
        if max_sem != min_sem:
            relative_bool = False

        # Блок отвечающий за поиск оценочных средств только в том типе семестра, который указан при отправке
        for now_semester in range(
                send_semester, 12,
                2):  # Цикл по семестрам, с шагом 2 (все весенние и все осенние
            imp_list = []  # Список всех учебных планов для этого семестра
            # Создание реуглярного выражения для того чтобы отфильтровать УП и инфу о РПД за этот семестр в цикле
            cred_regex = r""
            for i in range(12):
                if i == now_semester:
                    cred_regex += "[^0]\.[0-9],\s"
                else:
                    cred_regex += "(([0-9]\.[0-9])|[0]),\s"
            cred_regex = cred_regex[:-3]
            """# Непосредственное получение информации о РПД за нужные семестры
            wp_bars_data = WorkProgramIdStrUpForIsu.objects.filter(
                work_program_in_field_of_study__work_program=work_program, ze_v_sem__iregex=cred_regex).distinct()
            if wp_bars_data:  # Если информация выше нашлась, то прибавляем шаг 2 к относительному семестру
                count_relative += 2
            for data_isu in wp_bars_data:"""
            # Получаем все УП для данной информации о РПД (напоминание, она связывается с таблицей впинченджблок)
            implementation_of_academic_plan = ImplementationAcademicPlan.objects.filter(
                academic_plan__discipline_blocks_in_academic_plan__modules_in_discipline_block__change_blocks_of_work_programs_in_modules__work_program
                =work_program,
                year=datetime.now().year - now_semester //
                2,  # Чтобы Оценочные средства быль актуальны году
                academic_plan__discipline_blocks_in_academic_plan__modules_in_discipline_block__change_blocks_of_work_programs_in_modules__zuns_for_cb__zuns_for_wp__ze_v_sem__iregex
                =cred_regex).distinct()

            for imp in implementation_of_academic_plan:
                # создаем список направлений + уп с айдишниками ИСУ для БАРСа
                field_of_studies = FieldOfStudy.objects.get(
                    implementation_academic_plan_in_field_of_study=imp)
                imp_list.append(
                    generate_fos(imp.ns_id, field_of_studies.number,
                                 imp.title))
            imp_list = list({
                v['id']: v
                for v in imp_list
            }.values())  # Оставляем уникальные значения по айдишникам
            if imp_list:  # Если такой существует

                # Генерируем чекпоинт со всеми УП, прямыми и относиетльным семестром
                request_text = generate_single_checkpoint(
                    absolute_semester=now_semester + 1,
                    relative_semester=count_relative,
                    programs=imp_list,
                    work_program=work_program,
                    setup=setup_bars)
                # Получаем вернувшуюся информацию
                request_response, request_status_code = post_checkpoint_plan(
                    request_text, setup_bars)
                if request_status_code != 200:
                    #  если почему-то не отправилось продублируем респонс
                    print(request_text, request_response)
                # Пишем логи
                HistoryOfSendingToBars.objects.create(
                    work_program=work_program,
                    request_text=request_text,
                    request_response=request_response,
                    request_status=request_status_code)
                all_sends.append({
                    "status": request_status_code,
                    "request": request_text,
                    "response": request_response
                })
                # Если есть еще семестры, то добавляем плюсик к счетчику относительного семестра
                if implementation_of_academic_plan and not relative_bool:
                    count_relative += 2
    return Response(all_sends)