Пример #1
0
class Document(object):
    def __init__(self, templ_docx):
        self._doc = DocxTemplate(templ_docx)
        self._pic_to_render = {}
        self._context = {}
        self._chapter = {}
        self._sequence = 0

    def sequence(self):
        self._sequence = self._sequence + 1
        return self._sequence

    def add_context(self, context={}):
        self._context = context.copy()

    def add_heading(self, title, level=1):
        docx = self._doc.get_docx()
        docx.add_heading(title, level)

    def add_chapter(self, chapter, title=None, level=2, remove_file=True):
        try:
            docx = self._doc.get_docx()

            if title is not None:
                docx.add_heading(title, level)

            id = "chapter" + str(self.sequence())

            chapter.render()

            docx.add_paragraph("{{p " + id + "}}")

            self._chapter[id] = self._doc.new_subdoc(chapter.get_filename())

            pic_to_add = chapter.get_pic_to_add()
            if pic_to_add:
                for pic in pic_to_add:
                    path = pic_to_add[pic]["path"]
                    width = pic_to_add[pic]["width"]

                    self._pic_to_render[pic] = InlineImage(self._doc,
                                                           path,
                                                           width=Mm(width))
        finally:
            if remove_file:
                chapter.remove_file()

    def inlineimage(self, image_file, image_width=147):
        return InlineImage(self._doc, image_file, width=Mm(image_width))

    def render(self):
        if self._chapter or self._context:
            self._context.update(self._chapter)
            self._doc.render(self._context)

        if self._pic_to_render:
            self._doc.render(self._pic_to_render)

    def save(self, filename):
        self._doc.save(filename)
Пример #2
0
def print_form(name):
    filename = os.path.join(FORMS_FOLDER, name)
    doc = DocxTemplate(filename)
    doc.render(request.args.to_dict())
    stream = BytesIO()
    doc.get_docx().save(stream)
    stream.seek(0)
    return send_file(stream, mimetype='docx')
Пример #3
0
def fill_table_4(template: DocxTemplate, context: Dict[str, Any]) -> None:
    """ Заполняем таблицу с содержанием СРС в разделе 4 """
    themes = context['course'].themes
    themes_count = len(themes)
    subject = context['subject']
    homeworks = distribute(subject.get_hours('homeworks'), themes_count)

    table = template.get_docx().tables[5]
    core.add_table_rows(table,
                        themes_count + 1)  # последняя строка - для итога

    hw_text = "Проработка теоретического материала, подготовка к выполнению лабораторной работы"
    hw_control = "Вопросы к итоговому тесту"

    i = 0
    for theme in themes:
        i += 1
        core.set_cell_text(table, i, 0, core.CENTER, str(i))
        core.set_cell_text(table, i, 1, core.CENTER, theme['тема'])
        core.set_cell_text(table, i, 2, core.CENTER, hw_text)
        core.set_cell_text(table, i, 3, core.CENTER,
                           str_or_dash(homeworks[i - 1]))
        core.set_cell_text(table, i, 4, core.CENTER, hw_control)

    i += 1
    core.set_cell_text(table, i, 1, core.JUSTIFY, 'Всего часов')
    core.set_cell_text(table, i, 3, core.CENTER, str_or_dash(sum(homeworks)))
    core.fix_table_borders(table)
Пример #4
0
def fill_table_3_1(template: DocxTemplate, context: Dict[str, Any]) -> None:
    """ Заполняем таблицу с содержанием курса в разделе 3.1 """

    # Извлекаем названия тем и форматируем для заполнения таблицы
    course, subject = context['course'], context['subject']
    themes = [
        'Тема %d. %s' % (i + 1, t['тема']) for i, t in enumerate(course.themes)
    ]

    # Равномерно размазываем часы по темам
    themes_count = len(themes)
    lectures = distribute(subject.get_hours('lectures'), themes_count)
    practices = distribute(subject.get_hours('practices'), themes_count)
    labworks = distribute(subject.get_hours('labworks'), themes_count)
    controls = distribute(subject.get_hours('controls'), themes_count)
    homeworks = distribute(subject.get_hours('homeworks'), themes_count)
    totals = [
        sum(t) for t in zip(lectures, practices, labworks, controls, homeworks)
    ]

    # Заполняем таблицу
    table = template.get_docx().tables[4]
    core.add_table_rows(table,
                        themes_count + 1)  # последняя строка - для итога
    fill_table_column(table, 2, [0], themes + ['Всего часов'])
    fill_table_column(table, 2, [1], totals + [subject.get_total_hours()])
    fill_table_column(table, 2, [2], lectures + [sum(lectures)])
    fill_table_column(table, 2, [4], practices + [sum(practices)])
    fill_table_column(table, 2, [6], labworks + [sum(labworks)])
    fill_table_column(table, 2, [10], controls + [sum(controls)])
    fill_table_column(table, 2, [11], homeworks + [sum(homeworks)])
    fill_table_column(table, 2, [3, 5, 7, 8, 9],
                      [0] * (themes_count + 1))  # пустые значения
    core.fix_table_borders(table)
Пример #5
0
def fill_section_2_2(template: DocxTemplate, context: Dict[str, any]) -> None:
    """ Заполнение раздела 2.2 """
    marker = None
    for paragraph in template.get_docx().paragraphs:
        keywords = ['оценочные средства для', 'государственной итоговой аттестации']
        if all(kw in paragraph.text.lower() for kw in keywords):
            marker = paragraph
            break

    plan: EducationPlan = context['plan']
    subjects = sorted(plan.subject_codes.values(), key=Subject.repr)
    for subj in subjects:
        rpd = get_rpd(subj.name)
        if not rpd:
            continue

        paragraph = marker.insert_paragraph_before('%s %s' % (subj.code, subj.name))
        paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
        paragraph.paragraph_format.first_line_indent = Cm(0)
        for run in paragraph.runs:
            run.bold = True

        for item in iterate_items(Document(rpd)):
            if isinstance(item, Paragraph):
                paragraph = marker.insert_paragraph_before(item.text)
                paragraph.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
                paragraph.paragraph_format.first_line_indent = Cm(0)
Пример #6
0
def fill_table_4(template: DocxTemplate, context: Dict[str, any]) -> None:
    """ Заполнение бланка "Лист сформированности компетенций" """
    plan: EducationPlan = context['plan']
    table: Table = template.get_docx().tables[-1]
    row_number = 0
    for competence in sorted(plan.competence_codes.values(), key=Competence.repr):
        core.add_table_rows(table, 1)
        row_index = len(table.rows) - 1
        row_number += 1
        core.set_cell_text(table, row_index, 0, core.CENTER, str(row_number))
        core.set_cell_text(table, row_index, 1, core.JUSTIFY, competence.code + ' ' + competence.description)
        subjects = [plan.subject_codes[s] for s in competence.subjects]
        for subject in sorted(subjects, key=Subject.repr):
            core.add_table_rows(table, 1)
            row_index = len(table.rows) - 1
            core.set_cell_text(table, row_index, 1, core.JUSTIFY, subject.code + ' ' + subject.name)

    core.add_table_rows(table, 1)
    row_number += 1
    row_index = len(table.rows) - 1
    core.set_cell_text(table, row_index, 0, core.CENTER, str(row_number))
    core.set_cell_text(table, row_index, 1, core.JUSTIFY, 'Практики')

    core.add_table_rows(table, 1)
    row_number += 1
    row_index = len(table.rows) - 1
    core.set_cell_text(table, row_index, 0, core.CENTER, str(row_number))
    core.set_cell_text(table, row_index, 1, core.JUSTIFY, 'НИР')

    core.fix_table_borders(table)
Пример #7
0
def fill_table_7(template: DocxTemplate, context: Dict[str, Any]) -> None:
    """ Заполняем таблицу со ссылками на литературу в разделе 7 """
    if context['lit_images']:
        return  # вместо таблицы будет скан страницы с печатью

    def append_table_7_section(caption, books):
        rows_count = len(table.rows)
        core.add_table_rows(table, len(books) + 1)  # доп. строка для заголовка
        table.cell(rows_count, 0).merge(table.cell(rows_count, 4))
        core.set_cell_text(table, rows_count, 0, core.CENTER, caption)
        for i, book in enumerate(books):
            core.set_cell_text(table, rows_count + i + 1, 0, core.CENTER,
                               str(i + 1))
            core.set_cell_text(table, rows_count + i + 1, 1, core.CENTER,
                               book['гост'])
            core.set_cell_text(table, rows_count + i + 1, 2, core.CENTER,
                               book['гриф'])
            core.set_cell_text(table, rows_count + i + 1, 3, core.CENTER,
                               book['экз'])
            core.set_cell_text(table, rows_count + i + 1, 4, core.CENTER,
                               book['эбс'])

    table = template.get_docx().tables[9]
    append_table_7_section('Основная литература',
                           context['course'].primary_books)
    append_table_7_section('Дополнительная литература',
                           context['course'].secondary_books)
    core.fix_table_borders(table)
Пример #8
0
def fill_table_2_1(template: DocxTemplate, context: Dict[str, any]) -> None:
    """ Заполнение таблицы в разделе 2.1 """
    plan: EducationPlan = context['plan']
    table: Table = template.get_docx().tables[3]
    for subject in sorted(plan.subject_codes.values(), key=Subject.repr):
        core.add_table_rows(table, 1)
        row_index = len(table.rows) - 1
        core.set_cell_text(table, row_index, 0, core.CENTER, subject.code)
        core.set_cell_text(table, row_index, 1, core.JUSTIFY, subject.name)
    core.fix_table_borders(table)
Пример #9
0
class Chapter(object):
    def __init__(self, templ_docx):
        self._templ = DocxTemplate(templ_docx)
        self._uuid = str(uuid.uuid1()).replace("-", "")
        self._context = {}
        self._pic_to_add = {}

    def uuid(self):
        return self._uuid

    def add_context(self, context={}):
        self._context = context.copy()

    def add_picture(self, name, path, width=147):
        pic_name = "%s_%s" % (name, self._uuid)
        self._context[name] = "{{" + pic_name + "}}"
        self._pic_to_add[pic_name] = {"path": path, "width": width}

    def render(self, to_save_file=None):
        self._templ.render(self._context)

        if to_save_file is None:
            self.save(self.uuid() + ".docx")
        else:
            self.save(to_save_file)

    def save(self, filename=None):
        self._templ.save(filename)
        self._filename = filename

    def get_filename(self):
        return self._filename

    def get_docx(self):
        self._templ.get_docx()

    def remove_file(self):
        os.remove(self._filename)

    def get_pic_to_add(self):
        return self._pic_to_add
Пример #10
0
    def get(self, request, *args, **kwargs):
        obj = self.get_object()
        self.object = obj
        acc = get_object_or_404(Abon, username=self.kwargs.get('uname'))

        try:
            doc = DocxTemplate(obj.doc_template.path)
            context = self.get_context_data(object=obj)
            context.update(self.get_context_account(acc))
            doc.render(context)

            destination_document_file = BytesIO()
            doc.get_docx().save(destination_document_file)
            resp = HttpResponse(destination_document_file.getvalue(),
                                content_type=CONTENT_TYPE.WML_DOCUMENT)
            resp[
                'Content-Disposition'] = 'attachment; filename="document.docx"'
            return resp
        except (UndefinedError, ValidationError, TemplateSyntaxError) as e:
            messages.error(request, str(e))
        return redirect('docsapp:docs_list')
Пример #11
0
def create_file_docx_from_template(template_path, data):
    file_name = get_filename(template_path, prefix='doc')
    document = DocxTemplate(template_path)
    document.render(data)
    file = document.get_docx()
    stream = BytesIO()
    file.save(stream)
    stream.seek(0)
    try:
        storage.upload_file_obj(stream, file_name, DOCX_MINE_TYPE)
        stream.close()
    except Exception as e:
        raise ApplicationError(str(e))
    return file_name
Пример #12
0
def create_order(context: Union[dict, Box]) -> None:
    doc = DocxTemplate(join(TEMPLATES_FOLDER, "Order.docx"))

    target_folder = join(TASKS_FOLDER, context.order_number)

    try:
        mkdir(target_folder)
    except FileExistsError:
        warn(f"Directory {target_folder} exist")

    doc.render(context)
    remove_row(doc.get_docx().tables[0], 1)
    filename = f"ЗН №{context.order_number}"
    file_path = join(target_folder, f"{filename}.docx")
    doc.save(file_path)
def create_act(order_number):
    target_folder = join(TASKS_FOLDER, order_number)

    try:
        context = get_context_from_order(
            join(TASKS_FOLDER, order_number, f"ЗН №{order_number}.docx"))
        context.order_number = order_number
    except FileNotFoundError:
        print("Заказа с данным номером нет")
        return

    doc = DocxTemplate(join(TEMPLATES_FOLDER, "Act.docx"))
    doc.render(context)
    remove_row(doc.get_docx().tables[0], 1)
    filename = join(target_folder, f"Акт №{order_number}.docx")
    doc.save(filename)
    doc2pdf(filename, join(target_folder, f"Акт №{order_number}.pdf"))
Пример #14
0
def fill_table_1(template: DocxTemplate, context: Dict[str, any]) -> None:
    """ Заполнение таблиц с формами контроля """
    control_fancy_name = {
        CT_EXAM: 'Экзамен',
        CT_CREDIT_GRADE: 'Зачет с оценкой',
        CT_CREDIT: 'Зачет',
        CT_COURSEWORK: 'Курсовой проект',
    }

    plan: EducationPlan = context['plan']
    if plan.degree == core.BACHELOR:
        core.remove_table(template, 1)
    elif plan.degree == core.MASTER:
        core.remove_table(template, 2)
    table: Table = template.get_docx().tables[1]

    row_number = 0
    for competence in sorted(plan.competence_codes.values(),
                             key=Competence.repr):
        core.add_table_rows(table, 1)
        row = len(table.rows) - 1
        row_number += 1
        core.set_cell_text(table, row, 0, core.CENTER, str(row_number))
        core.set_cell_text(table, row, 1, core.JUSTIFY,
                           competence.code + ' ' + competence.description)
        table.cell(row, 1).merge(table.cell(row, len(table.columns) - 1))
        subjects = [plan.subject_codes[s] for s in competence.subjects]
        for subject in sorted(subjects, key=Subject.repr):
            core.add_table_rows(table, 1)
            row = len(table.rows) - 1
            row_number += 1
            core.set_cell_text(table, row, 0, core.CENTER, str(row_number))
            core.set_cell_text(table, row, 1, core.JUSTIFY,
                               subject.code + ' ' + subject.name)
            for number, semester in subject.semesters.items():
                controls = [control_fancy_name[c] for c in semester.control]
                core.set_cell_text(table, row, number + 1, core.CENTER,
                                   ', '.join(controls))

    core.fix_table_borders(table)
Пример #15
0
def fill_table_1_2(template: DocxTemplate, context: Dict[str, Any]) -> None:
    """ Заполняем таблицу с компетенциями в разделе 1.2 """
    table = template.get_docx().tables[1]
    core.add_table_rows(table, len(context['subject'].competencies))

    row = 0
    competencies = [
        context['plan'].competence_codes[c]
        for c in context['subject'].competencies
    ]
    for competence in sorted(competencies, key=Competence.repr):
        row += 1
        core.set_cell_text(table, row, 0, core.CENTER, competence.category)
        core.set_cell_text(table, row, 1, core.JUSTIFY,
                           competence.code + ' ' + competence.description)
        core.set_cell_text(table, row, 4, core.CENTER,
                           context['course'].assessment)

        for ind_code in sorted(competence.indicator_codes):
            indicator = competence.indicator_codes[ind_code]
            core.set_cell_text(table, row, 2, core.JUSTIFY,
                               ind_code + ' ' + indicator.description)

    def add_study_results(attr: str, caption: str) -> None:
        """ Добавить в ячейку таблицы результаты обучения """
        results = context['course'].__getattribute__(attr)
        if results:
            core.set_cell_text(table, 1, 3, core.JUSTIFY, caption)
            for elem in results:
                core.set_cell_text(table, 1, 3, 'Table List', '•\t' + elem)

    table.cell(1, 3).merge(table.cell(row, 3))
    add_study_results('knowledge', 'Знать:')
    add_study_results('abilities', 'Уметь:')
    add_study_results('skills', 'Владеть:')
    core.fix_table_borders(table)
Пример #16
0
def fill_table_2(template: DocxTemplate, context: Dict[str, any]) -> None:
    """ Заполнение таблиц с формами контроля """
    global fileslist
    control_fancy_name = {
        CT_EXAM: 'Экзамен',
        CT_CREDIT_GRADE: 'Зачет с оценкой',
        CT_CREDIT: 'Зачет',
        CT_COURSEWORK: 'Курсовой проект',
    }

    plan: EducationPlan = context['plan']
    table: Table = template.get_docx().tables[2]
    fileslist = [
        filename[:-5] for filename in os.listdir('./rpds')
        if filename.endswith('.docx')
    ]

    row_number = 0
    for competence in sorted(plan.competence_codes.values(),
                             key=Competence.repr):
        core.add_table_rows(table, 1)
        row = len(table.rows) - 1
        row_number += 1
        core.set_cell_text(table, row, 0, core.CENTER, str(row_number))
        core.set_cell_text(table, row, 1, core.JUSTIFY,
                           competence.code + ' ' + competence.description)
        for runover in range(2, 8):
            core.set_cell_text(table, row, runover, core.JUSTIFY, ' ')
        # table.cell(row, 1).merge(table.cell(row, len(table.columns) - 1))
        subjects = [plan.subject_codes[s] for s in competence.subjects]
        for subject in sorted(subjects, key=Subject.repr):
            # core.add_table_rows(table, 1)
            # row = len(table.rows) - 1
            # len(table.rows) - 1
            # row_number += 1
            controls = []
            for number, semester in subject.semesters.items():
                controls += [control_fancy_name[c] for c in semester.control]

            sem = 0
            for control in controls:
                core.add_table_rows(table, 1)
                row = len(table.rows) - 1
                zuv_criteria = find_rpd(subject.code, subject.name, control,
                                        controls, sem)
                sem += 1
                if len(zuv_criteria) == 6:
                    core.set_cell_text(table, row, 0, core.CENTER, ' ')
                    core.set_cell_text(table, row, 1, core.JUSTIFY,
                                       subject.code + ' ' + subject.name)
                    core.set_cell_text(table, row, 2, core.JUSTIFY,
                                       zuv_criteria[0])
                    if control == 'Зачет':
                        core.set_cell_text(table, row, 3, core.JUSTIFY,
                                           zuv_criteria[1])
                        core.set_cell_text(table, row, 4, core.JUSTIFY, ' ')
                        core.set_cell_text(table, row, 5, core.JUSTIFY, ' ')
                        core.set_cell_text(table, row, 6, core.JUSTIFY,
                                           zuv_criteria[4])
                        table.cell(row, 3).merge(table.cell(row, 5))
                    else:
                        core.set_cell_text(table, row, 3, core.JUSTIFY,
                                           zuv_criteria[1])
                        core.set_cell_text(table, row, 4, core.JUSTIFY,
                                           zuv_criteria[2])
                        core.set_cell_text(table, row, 5, core.JUSTIFY,
                                           zuv_criteria[3])
                        core.set_cell_text(table, row, 6, core.JUSTIFY,
                                           zuv_criteria[4])
                    core.set_cell_text(table, row, 7, core.JUSTIFY,
                                       zuv_criteria[5])

    core.fix_table_borders(table)
Пример #17
0
def main():
    config = configparser.ConfigParser()
    config.read('autotemplation.ini')
    template_folder_ids = config['DEFAULT']['TemplateFolderID'].split(',')
    destination_folder_name = config['DEFAULT']['DestinationFolderName']
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    drive_service = discovery.build('drive', 'v3', http=http)
    destination_folder_id = get_or_create_destination_folder_id(
        drive_service, destination_folder_name)
    template_file = get_template(drive_service, template_folder_ids)
    mime_type, is_sheet = get_mime_type(template_file['mimeType'])
    request = drive_service.files().export_media(
        fileId=template_file['id'],
        mimeType=mime_type)
    fh = io.BytesIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print("Download %d%%." % int(status.progress() * 100))
    if is_sheet:
        print("Spreadsheet selected, converting to Doc. (Slow)")
        table_data = get_sheet_data(fh)
        row_count = len(table_data)
        col_count = len(table_data[0])
        document = Document()
        doc_table = document.add_table(rows=row_count,
                                       cols=col_count)
        for r, row in enumerate(table_data):
            row_cells = doc_table.rows[r].cells
            print("Converting row {}/{}...".format(r+1, row_count), end="\r")
            for i, cell in enumerate(row):
                if cell:
                    row_cells[i].text = cell
        print("Conversion complete. "
              "Warning: Processing large sheets will take some time.")
        temp_doc_file = io.BytesIO()
        document.save(temp_doc_file)
        doc = DocxTemplate(temp_doc_file)
    else:
        doc = DocxTemplate(fh)
    full_doc = doc.get_docx()

    template_vars = get_template_variables(full_doc, template_file['name'])
    if any('__' in x for x in template_vars):
        worksheet = get_worksheet(credentials)
        worksheet_headers = get_worksheet_headers(worksheet)
    context = dict()
    get_date_and_set_context(context)
    for var in template_vars:
        if var not in context:
            if '__' in var:
                context[var] = worksheet_lookup(
                    worksheet, worksheet_headers, var)
            else:
                context[var] = input("Enter a value for {}:  ".format(var))
    new_file_name = get_target_name(template_file['name'], context)
    doc.render(context)
    temp_file = tempfile.NamedTemporaryFile()
    doc.save(temp_file)
    if is_sheet:
        csv_name = '{}.csv'.format(new_file_name)
        doc_csv = DocxTemplate(temp_file)
        csv_data = get_table_data_for_csv(doc_csv)
        if csv_data:
            with open(csv_name, 'w') as output:
                writer = csv.writer(output, lineterminator='\n')
                writer.writerows(csv_data)
            print('{} created in local folder'.format(csv_name))
        else:
            print('Unable to create CSV. '
                  'Less than or more than 1 table found.')
        workbook = Workbook()
        sheet = workbook.get_active_sheet()
        for row in csv_data:
            sheet.append(row)
        workbook.save(temp_file)
        upload_mimetype = 'application/vnd.google-apps.spreadsheet'
    else:
        upload_mimetype = 'application/vnd.google-apps.document'

    file_metadata = {
        'name': new_file_name,
        'parents': [destination_folder_id],
        'mimeType': upload_mimetype
    }
    media = MediaFileUpload(temp_file.name,
                            mimetype=mime_type,
                            resumable=True)
    drive_service.files().create(body=file_metadata,
                                 media_body=media,
                                 fields='id').execute()
    print('{} placed in folder {}.'.format(new_file_name,
                                           destination_folder_name))
    temp_file.close()
Пример #18
0
def remove_table(template: DocxTemplate, table_index: int) -> None:
    """ Удаляем таблицу из шаблона по её индексу """
    docx = template.get_docx()
    table_element = docx.tables[table_index]._element  # pylint: disable=protected-access
    parent_element = table_element.getparent()
    parent_element.remove(table_element)
Пример #19
0
def fill_table_1(template: DocxTemplate, context: Dict[str, any]) -> None:
    """ Заполнение таблиц с формами контроля """
    # control_fancy_name = {
    #     core.CT_EXAM: 'Экзамен',
    #     core.CT_CREDIT_GRADE: 'Зачет с оценкой',
    #     core.CT_CREDIT: 'Зачет',
    #     core.CT_COURSEWORK: 'Курсовой проект',
    # }

    plan: EducationPlan = context['plan']
    if plan.degree == core.BACHELOR:
        core.remove_table(template, 1)
    elif plan.degree == core.MASTER:
        core.remove_table(template, 2)
    table: Table = template.get_docx().tables[1]

    row_number = 0
    for competence in sorted(plan.competence_codes.values(), key=Competence.repr):
        core.add_table_rows(table, 1)
        row = len(table.rows) - 1
        row_number += 1
        core.set_cell_text(table, row, 0, core.CENTER, str(row_number))
        core.set_cell_text(table, row, 1, core.JUSTIFY, competence.code + ' ' + competence.description)
        for number in range(1, 9 if plan.degree == core.BACHELOR else 5):
            cell_components = []
            subjects = [plan.subject_codes[s] for s in competence.subjects]
            subjects.sort(key=lambda s: s.code)
            for subject in subjects:
                for sem_num, sem_work in subject.semesters.items():
                    if sem_num == number:
                        if sem_work.control:
                            values = subject.code, subject.name, ', '.join(sem_work.control)
                            cell_components.append('%s %s (%s)' % values)
                        else:
                            values = subject.code, subject.name
                            cell_components.append('%s %s' % values)
            core.set_cell_text(table, row, number + 1, core.CENTER, '\n'.join(cell_components))
    core.fix_table_borders(table)

    rpd_dict = context['rpd_dict']
    table: Table = template.get_docx().tables[2]
    row_number1 = 0
    for competence in sorted(plan.competence_codes.values(), key=Competence.repr):
        core.add_table_rows(table, 1)
        row = len(table.rows) - 1
        row_number1 += 1
        core.set_cell_text(table, row, 0, core.CENTER, str(row_number1))
        core.set_cell_text(table, row, 1, core.JUSTIFY, competence.code + ' ' + competence.description)
        values = ['%s %s' % (k, v.description) for k, v in competence.indicator_codes.items()]
        core.set_cell_text(table, row, 2, core.JUSTIFY, '\n'.join(values))
        row_number2 = 0
        subjects = [plan.subject_codes[s] for s in competence.subjects]
        for subject in subjects:
            if not subject.code.startswith('Б1'):
                continue
            zuv_raw = ''
            rpd = rpd_dict.get(subject.code)
            if rpd:
                zuv = rpd.competences.get(competence.code)
                if zuv:
                    zuv_raw = zuv.raw
            core.add_table_rows(table, 1)
            row = len(table.rows) - 1
            row_number2 += 1
            core.set_cell_text(table, row, 0, core.CENTER, '%d.%d' % (row_number1, row_number2))
            core.set_cell_text(table, row, 1, core.JUSTIFY, subject.code + ' ' + subject.name)
            core.set_cell_text(table, row, 3, core.JUSTIFY, zuv_raw)
            core.set_cell_text(table, row, 4, core.JUSTIFY, zuv_raw)
            core.set_cell_text(table, row, 5, core.JUSTIFY, zuv_raw)
            core.set_cell_text(table, row, 6, core.JUSTIFY, zuv_raw)
    core.fix_table_borders(table)
Пример #20
0
def fill_section_2_2(template: DocxTemplate, context: Dict[str, any]) -> None:
    global table_flazhok
    control_fancy_name = {
        CT_EXAM: 'Экзамен',
        CT_CREDIT_GRADE: 'Зачет с оценкой',
        CT_CREDIT: 'Зачет',
        CT_COURSEWORK: 'Курсовой проект',
    }
    """ Заполнение раздела 2.2 """
    # marker = None
    # for p1 in template.get_docx().paragraphs:
    #     keywords = ['оценочные средства для', 'государственной итоговой аттестации']
    #     if all(kw in p1.text.lower() for kw in keywords):
    #         marker = p1
    #         break
    global fileslist
    fileslist = [
        filename[:-5] for filename in os.listdir('./rpds')
        if filename[-4:] == 'docx'
    ]

    plan: EducationPlan = context['plan']
    middle[
        1] += 'магистратуры' if plan.degree == core.MASTER else 'бакалавриата'
    middle[4] += plan.program
    middle[3] = plan.code + ' ' + plan.name
    subjects = sorted(plan.subject_codes.values(), key=Subject.repr)
    for s in subjects:
        rpd = difflib.get_close_matches(s.code + ' ' + s.name, fileslist)
        if len(rpd) < 1:
            continue
        rpd = './rpds/' + str(rpd[0]) + '.docx'
        rpd_doc = Document(rpd)

        # титульная страница
        document = template.get_docx()
        document.add_page_break()
        document.add_paragraph('\n'.join(header))
        document.paragraphs[-1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
        controls = []
        for number, semester in s.semesters.items():
            controls += [control_fancy_name[c] for c in semester.control]
        middle[0] = s.code + ' ' + s.name
        middle[6] = ' / '.join(controls)
        for ind, line in enumerate(middle):
            document.add_paragraph(line)
            document.paragraphs[-1].runs[0].bold = middleBold[ind]
            document.paragraphs[-1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
        document.add_paragraph('\n'.join(footer))
        document.paragraphs[-1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
        document.add_page_break()
        ''' флажок, чтобы забрать все таблицы между двумя группами ключевых слов '''
        table_flazhok = False
        for table in rpd_doc.tables:
            tablen = table2list(table)
            if preceding_paragraph(document, ' '.join(tablen[0][:6])):
                list2docx(document, *tablen)
        ''' таблицы все включены, теперь забираем все абзацы '''
        text_heap = findout_fos(rpd_doc)
        document.add_paragraph(text_heap)
        if 'Методические материалы, определяющие' not in text_heap:
            document.add_paragraph('\n'.join(method_mater))
Пример #21
0
def fill_table_6_1(template: DocxTemplate, context: Dict[str, Any]):
    """ Заполняем таблицу в разделе 6.1 """
    def add_study_results(attr: str, caption: str, row: int, col: int) -> None:
        """ Добавить в ячейку таблицы результаты обучения """
        results = course.__getattribute__(attr)
        if results:
            core.set_cell_text(table, row, col, core.JUSTIFY, caption)
            for elem in results:
                core.set_cell_text(table, row, col, 'Table List', '•\t' + elem)

    course, subject = context['course'], context['subject']

    # Уровни освоения
    control = [s.control for s in subject.semesters.values()]
    control = functools.reduce(
        lambda x, y: x + y
        if isinstance(x, list) else set.union(x, y), control)
    if CT_EXAM in control:
        levels = [
            ('Высокий', 'Отлично'),
            ('Базовый', 'Хорошо'),
            ('Минимальный', 'Удовлетворительно'),
            ('Не освоены', 'Неудовлетворительно'),
        ]
    elif CT_CREDIT_GRADE in control:
        levels = [
            ('Высокий', 'Зачтено (отлично)'),
            ('Базовый', 'Не зачтено (хорошо)'),
            ('Минимальный', 'Зачтено (удовлетворительно)'),
            ('Не освоены', 'Не зачтено'),
        ]
    else:
        levels = [('Освоено', 'Зачтено'), ('Не освоено', 'Не зачтено')]

    # Строки таблицы
    table = template.get_docx().tables[8]
    rows_count = len(subject.competencies) * len(levels)
    core.add_table_rows(table, rows_count)

    # Компетенции и индикаторы
    start_row = 2
    for code in subject.competencies:
        competence = context['plan'].competence_codes[code]
        table.cell(start_row,
                   0).merge(table.cell(start_row + len(levels) - 1, 0))
        core.set_cell_text(table, start_row, 0, core.JUSTIFY,
                           competence.code + ' ' + competence.description)
        table.cell(start_row,
                   1).merge(table.cell(start_row + len(levels) - 1, 1))
        for ind_code in sorted(competence.indicator_codes):
            indicator = competence.indicator_codes[ind_code]
            core.set_cell_text(table, start_row, 1, core.JUSTIFY,
                               ind_code + ' ' + indicator.description)
        start_row += len(levels)

    # Знать, уметь, владеть
    start_row = 2
    table.cell(start_row, 2).merge(table.cell(start_row + rows_count - 1, 2))
    add_study_results('knowledge', 'Знать:', 2, 2)
    add_study_results('abilities', 'Уметь:', 2, 2)
    add_study_results('skills', 'Владеть:', 2, 2)

    # Уровни освоения
    start_row = 2
    for level, grade in levels:
        table.cell(start_row, 3).merge(
            table.cell(start_row + len(subject.competencies) - 1, 3))
        core.set_cell_text(table, start_row, 3, core.CENTER, level)
        table.cell(start_row, 4).merge(
            table.cell(start_row + len(subject.competencies) - 1, 4))
        if CT_CREDIT in control:
            if level == 'Освоено':
                add_study_results('knowledge', 'Обучаемый знает:', start_row,
                                  4)
                add_study_results('abilities', 'Обучаемый умеет:', start_row,
                                  4)
                add_study_results('skills', 'Обучаемый владеет:', start_row, 4)
            else:
                add_study_results('knowledge', 'Обучаемый не знает:',
                                  start_row, 4)
                add_study_results('abilities', 'Обучаемый не умеет:',
                                  start_row, 4)
                add_study_results('skills', 'Обучаемый не владеет:', start_row,
                                  4)
        else:
            if level == 'Высокий':
                add_study_results('knowledge', 'Обучаемый знает:', start_row,
                                  4)
                add_study_results('abilities', 'Обучаемый умеет:', start_row,
                                  4)
                add_study_results('skills', 'Обучаемый владеет:', start_row, 4)
            elif level == 'Базовый':
                add_study_results('knowledge', 'Обучаемый знает:', start_row,
                                  4)
                add_study_results('abilities', 'Обучаемый не умеет:',
                                  start_row, 4)
                add_study_results('skills', 'Обучаемый владеет:', start_row, 4)
            elif level == 'Минимальный':
                add_study_results('knowledge', 'Обучаемый не знает:',
                                  start_row, 4)
                add_study_results('abilities', 'Обучаемый не умеет:',
                                  start_row, 4)
                add_study_results('skills', 'Обучаемый владеет:', start_row, 4)
            else:
                add_study_results('knowledge', 'Обучаемый не знает:',
                                  start_row, 4)
                add_study_results('abilities', 'Обучаемый не умеет:',
                                  start_row, 4)
                add_study_results('skills', 'Обучаемый не владеет:', start_row,
                                  4)
        table.cell(start_row, 5).merge(
            table.cell(start_row + len(subject.competencies) - 1, 5))
        core.set_cell_text(table, start_row, 5, core.CENTER, grade)
        start_row += len(subject.competencies)

    core.fix_table_borders(table)