rpd/main.py
2020-11-23 16:56:10 +07:00

696 lines
36 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from docx.shared import Cm
from openpyxl import load_workbook
import csv
from dataclasses import dataclass, field
from typing import List
from typing import Dict
import pprint
import json
from dataclasses_json import dataclass_json
import sqlite3
conn = sqlite3.connect("rpd.db")
cursor = conn.cursor()
#cursor.execute('DROP TABLE IF EXISTS courses;')
#cursor.execute('CREATE TABLE courses (chapter TEXT NOT NULL, title TEXT NOT NULL, year INTEGER NOT NULL, total INTEGER NOT NULL, semesters TEXT NOT NULL, complexity INTEGER NOT NULL, competents TEXT NOT NULL, control TEXT NOT NULL);')
#cursor.execute('CREATE TABLE courses_clean (chapter TEXT NOT NULL, title TEXT NOT NULL, year INTEGER NOT NULL, total INTEGER NOT NULL, semesters TEXT NOT NULL, complexity INTEGER NOT NULL, competents TEXT NOT NULL, control TEXT NOT NULL);')
#conn.commit()
from docx import Document
pp = pprint.PrettyPrinter(indent=4)
@dataclass_json
@dataclass
class Semester:
lectures: int
auditoria: int
contact_work_in_attestation: int
consults_before_exam: int
self_work_in_class: int
self_work_during_intermediate_attestation: int
total: int
complexity: int
electronic: int = 0
contact_work: int = field(init=False)
total_hours: int = field(init=False)
individual_practice: int = 0
individual_work_with_tearcher: int = 0
midcourse_consults: int = 0
diploma: int = 0
gosexam: int = 0
def __post_init__(self):
self.contact_work = self.auditoria + self.consults_before_exam + self.contact_work_in_attestation
self.total_hours = self.lectures + self.auditoria + self.contact_work_in_attestation \
+ self.consults_before_exam + self.self_work_in_class \
+ self.self_work_during_intermediate_attestation + self.electronic \
+ self.individual_practice + self.individual_work_with_tearcher \
+ self.midcourse_consults + self.diploma + self.gosexam
@dataclass_json
@dataclass
class Course:
title: str
total: int
number_of_semesters: int
semesters: Dict[int, Semester]
complexity: int
competents: List[str]
control: Dict[int, List]
@dataclass_json
@dataclass
class Chapter:
title: str
year: int
courses: Dict[str, Course]
def read_mapping():
mapping = {}
with open('/Users/jim/Nextcloud/Documents/РПД/source data/Kursy_po_godam.csv', newline='') as csvfile:
comp_reader = csv.reader(csvfile, delimiter=';', quotechar="\"")
next(comp_reader, None)
for row in comp_reader:
mapping[row[0].replace('\n', ' ').strip()] = row[1].replace('\n', ' ').strip()
return mapping
def parse_competents(raw_comp: str):
res = []
ok_start = raw_comp.find('ОК-')
if ok_start != -1:
i = ok_start + 3
while (i < len(raw_comp)) and (raw_comp[i] != 'О') and (raw_comp[i] != 'П'):
i += 1
for item in list(filter(None, raw_comp[ok_start + 3:i].strip().split(','))):
res.append('ОК-' + str(item))
raw_comp = raw_comp[0: ok_start:] + raw_comp[i::]
opk_start = raw_comp.find('ОПК-')
if opk_start != -1:
i = opk_start + 4
while (i < len(raw_comp)) and (raw_comp[i] != 'О') and (raw_comp[i] != 'П'):
i += 1
for item in list(filter(None, raw_comp[opk_start + 4:i].strip().split(','))):
res.append('ОПК-' + str(item))
raw_comp = raw_comp[0: opk_start:] + raw_comp[i::]
pk_start = raw_comp.find('ПК-')
if pk_start != -1:
i = pk_start + 3
while (i < len(raw_comp)) and (raw_comp[i] != 'О'):
i += 1
for item in list(filter(None, raw_comp[pk_start + 3:i].strip().split(','))):
res.append('ПК-' + str(item))
return res
def xint(s):
if s is None:
return 0
return int(s)
def dash(s):
if s == 0:
return '-'
else:
return str(s)
def read_short_competents_description():
competents_short = {}
with open('/Users/jim/Nextcloud/Documents/РПД/source data/Компетенции_кратко.csv', newline='') as csvfile:
comp_reader = csv.reader(csvfile, delimiter=';', quotechar="\"")
for row in comp_reader:
competents_short[row[0].strip()] = row[1].strip()
return competents_short
def read_long_competents_description():
competents = {}
with open('/Users/jim/Nextcloud/Documents/РПД/source data/Компетенции.csv', newline='') as csvfile:
comp_reader = csv.reader(csvfile, delimiter=';', quotechar="\"")
next(comp_reader, None)
for row in comp_reader:
name = row[0].strip()
know = row[1].strip()
can = row[2].strip()
can_do = row[3].strip()
competents[name] = {'знать': know, 'уметь': can, 'владеть': can_do}
return competents
def fill_control(row):
control = {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: []}
if not row[2] is None:
for semester in str(row[2]).replace('\n', ' ').strip().split(','):
control[int(semester)].append('экзамен')
if not row[3] is None:
for semester in str(row[3]).replace('\n', ' ').strip().split(','):
control[int(semester)].append('зачет')
if not row[4] is None:
for semester in str(row[4]).replace('\n', ' ').strip().split(','):
control[int(semester)].append('государственый экзамен')
if not row[5] is None:
for semester in str(row[5]).replace('\n', ' ').strip().split(','):
control[int(semester)].append('дифференцированный зачет')
if not row[6] is None:
for semester in str(row[6]).replace('\n', ' ').strip().split(','):
control[int(semester)].append('защита ВКР')
if not row[7] is None:
for semester in str(row[7]).replace('\n', ' ').strip().split(','):
control[int(semester)].append('курсовая работа')
return control
def fill_competents(filename, rows):
up_workbook = load_workbook(filename)
up_sheet = up_workbook.active
for row in up_sheet.iter_rows(min_row=3, max_row=rows, values_only=True):
title = row[1].replace('\n', ' ').strip()
competents = parse_competents(row[90].replace("\n", "").replace(' ', ''))
#print(title, competents)
q = 'update courses set competents=? where title=?;'
cursor.execute(q, (json.dumps(competents), str(title)))
conn.commit()
def read_course(filename, rows, read_compenents, year, chapter):
up_workbook = load_workbook(filename)
up_sheet = up_workbook.active
courses = {}
for row in up_sheet.iter_rows(min_row=3, max_row=rows, values_only=True):
title = row[1].replace('\n', ' ').strip()
#print(title)
control = fill_control(row)
total = xint(row[8])
total_complexity = xint(row[13])
# print(title, total, total_complexity)
first_semester_start = 14
second_semester_start = 22
third_semester_start = 30
fourth_semester_start = 38
fifth_semester_start = 47
sixth_semester_start = 55
seventh_semester_start = 66
eighth_semester_start = 76
metadata_start = 89
semesters = {}
# read first semester
data = []
for i in range(first_semester_start, second_semester_start):
data.append(xint(row[i]))
if not all(v == 0 for v in data):
semesters[1] = Semester(individual_practice=0,
lectures=data[0],
auditoria=data[1],
contact_work_in_attestation=data[2],
consults_before_exam=data[3],
self_work_in_class=data[4],
self_work_during_intermediate_attestation=data[5],
total=data[6],
complexity=data[7])
# read second semester
data = []
for i in range(second_semester_start, third_semester_start):
data.append(xint(row[i]))
if not all(v == 0 for v in data):
semesters[2] = Semester(individual_practice=0,
lectures=data[0],
auditoria=data[1],
contact_work_in_attestation=data[2],
consults_before_exam=data[3],
self_work_in_class=data[4],
self_work_during_intermediate_attestation=data[5],
total=data[6],
complexity=data[7])
# read third semester
data = []
for i in range(third_semester_start, fourth_semester_start):
data.append(xint(row[i]))
if not all(v == 0 for v in data):
semesters[3] = Semester(individual_practice=0,
lectures=data[0],
auditoria=data[1],
contact_work_in_attestation=data[2],
consults_before_exam=data[3],
self_work_in_class=data[4],
self_work_during_intermediate_attestation=data[5],
total=data[6],
complexity=data[7])
# read fourth semester
data = []
for i in range(fourth_semester_start, fifth_semester_start):
data.append(xint(row[i]))
if not all(v == 0 for v in data):
semesters[4] = Semester(individual_practice=0,
lectures=data[0],
auditoria=data[1],
individual_work_with_tearcher=data[2],
contact_work_in_attestation=data[3],
consults_before_exam=data[4],
self_work_in_class=data[5],
self_work_during_intermediate_attestation=data[6],
total=data[7],
complexity=data[8])
# read fifth semester
data = []
for i in range(fifth_semester_start, sixth_semester_start):
data.append(xint(row[i]))
if not all(v == 0 for v in data):
semesters[5] = Semester(individual_practice=0,
lectures=data[0],
auditoria=data[1],
contact_work_in_attestation=data[2],
consults_before_exam=data[3],
self_work_in_class=data[4],
self_work_during_intermediate_attestation=data[5],
total=data[6],
complexity=data[7])
# read sixth semester
data = []
for i in range(sixth_semester_start, seventh_semester_start):
data.append(xint(row[i]))
if not all(v == 0 for v in data):
semesters[6] = Semester(individual_practice=data[0],
lectures=data[1],
auditoria=data[2],
midcourse_consults=data[3],
individual_work_with_tearcher=data[4],
contact_work_in_attestation=data[5],
consults_before_exam=data[6],
self_work_in_class=data[7],
self_work_during_intermediate_attestation=data[8],
total=data[9],
complexity=data[10])
# read seventh semester
data = []
for i in range(seventh_semester_start, eighth_semester_start):
data.append(xint(row[i]))
if not all(v == 0 for v in data):
semesters[7] = Semester(individual_practice=data[0],
lectures=data[1],
auditoria=data[2],
midcourse_consults=data[3],
contact_work_in_attestation=data[4],
consults_before_exam=data[5],
self_work_in_class=data[6],
self_work_during_intermediate_attestation=data[7],
total=data[8],
complexity=data[9])
# read eighth semester
data = []
for i in range(eighth_semester_start, metadata_start):
data.append(xint(row[i]))
if not all(v == 0 for v in data):
semesters[8] = Semester(gosexam=data[0],
individual_practice=data[1],
diploma=data[2],
lectures=data[3],
auditoria=data[4],
midcourse_consults=data[5],
individual_work_with_tearcher=data[6],
contact_work_in_attestation=data[7],
consults_before_exam=data[8],
self_work_in_class=data[8],
self_work_during_intermediate_attestation=data[10],
total=data[11],
complexity=data[12])
if read_compenents:
compements = parse_competents(row[90])
else:
compements = []
courses[title] = Course(title=title,
total=total,
number_of_semesters=len(semesters),
semesters=semesters,
complexity=total_complexity,
competents=compements,
control=control)
q = 'INSERT INTO courses(chapter, title, year, total, semesters, complexity, competents, control) VALUES(?, ?, ?, ?, ?, ?, ?, ?)'
# serialize semesters
serialized_semesters = {}
for semester in semesters:
serialized_semesters[semester] =semesters[semester].to_dict()
cursor.execute(q, (chapter, title, year, total, json.dumps(serialized_semesters), total_complexity, json.dumps(compements), json.dumps(control)))
conn.commit()
return Chapter(title=chapter,
year=year,
courses=courses)
# # 2017
#
# mkk_2017 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/МКК2017.xlsx', rows=68, read_compenents=False, year=2017, chapter='МКК')
# mkk_nemc_2017 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/МККНем2017.xlsx', rows=66, read_compenents=False, year=2017, chapter='МККНем')
# perevod_2017 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/Перевод2017.xlsx', rows=72, read_compenents=False, year=2017, chapter='Перевод')
# prepod_2017 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/Преподаватели2017.xlsx', rows=60, read_compenents=False, year=2017, chapter='Препод')
#
# # # 2018
# mkk_2018 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/МКК2018.xlsx', rows=62, read_compenents=False, year=2018, chapter='МКК')
# perevod_2018 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/Перевод2018.xlsx', rows=67, read_compenents=False, year=2018, chapter='Перевод')
# perev_fr_2018 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/ПереводФр2018.xlsx', rows=62, read_compenents=False, year=2018, chapter='ПереводФр')
# prepod_2018 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/Преподаватели2018.xlsx', rows=67, read_compenents=False, year=2018, chapter='Препод')
# #
# #
# # # 2019
# #
# mkk_2019 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/МКК2019.xlsx', rows=69, read_compenents=False, year=2019, chapter='МКК')
# mkk_nemc_2019 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/МККНем2019.xlsx', rows=74, read_compenents=False, year=2019, chapter='МККНем')
# perevod_2019 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/Перевод2019.xlsx', rows=70, read_compenents=False, year=2019, chapter='Перевод')
# #
# # # 2020
# #
# mkk_2020 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/МКК2020.xlsx', rows=56, read_compenents=False, year=2020, chapter='МКК')
# perevod_2020 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/Перевод2020.xlsx', rows=56, read_compenents=False, year=2020, chapter='Перевод')
# perevod_fr_2020 = read_course(filename='/Users/jim/Nextcloud/Documents/РПД/Новые учебные планы (xls)/ПереводФр2020.xlsx', rows=56, read_compenents=False, year=2020, chapter='ПереводФр')
#
# fill_competents(filename='/Users/jim/Nextcloud/Documents/РПД/Старые учебные планы (xls)/2017/МКК2017 (факультативы).xlsx', rows=67)
# fill_competents(filename='/Users/jim/Nextcloud/Documents/РПД/Старые учебные планы (xls)/2017/МККНем2017.xlsx', rows=65)
# fill_competents(filename='/Users/jim/Nextcloud/Documents/РПД/Старые учебные планы (xls)/2017/Преподы2017 (факультативы).xlsx', rows=59)
# fill_competents(filename='/Users/jim/Nextcloud/Documents/РПД/Старые учебные планы (xls)/2017/Перевод2017 (факультативы).xlsx', rows=71)
#
def semesters_to_dict(semesters):
serialized_semesters = []
for semester in semesters:
serialized_semesters.append(semesters[semester].to_dict())
return serialized_semesters
def semesters_from_dict(semesters):
dataclass_semesters = {}
for semester in semesters:
dataclass_semesters[int(semester)]=Semester.from_dict(semesters[semester])
return dataclass_semesters
def update_competents():
q = 'select distinct title from courses where year=2017;'
cursor.execute(q)
rows = cursor.fetchall()
for row in rows:
q = 'select * from courses where title=? and year=2017;'
#print(row[0])
cursor.execute(q, (str(row[0]),))
for course in cursor.fetchall():
competents = json.loads(str(course[6]))
q = 'update courses set competents=? where title=? and not year=2017;'
cursor.execute(q, (json.dumps(competents), str(row[0])))
conn.commit()
#update_competents()
def generate_reports():
competents_short = read_short_competents_description()
competents_long = read_long_competents_description()
mapping = read_mapping()
q = 'select distinct title from courses_clean'
cursor.execute(q)
course_titles = cursor.fetchall()
for course_title_row in course_titles:
course_title = str(course_title_row[0])
document = Document()
chap1heading = "1. Перечень планируемых результатов обучения по дисциплине, соотнесенных с планируемыми результатами освоения образовательной программы"
document.add_heading(chap1heading)
first_comp_table = document.add_table(rows=2, cols=4)
first_comp_table.style = 'TableGrid'
first_comp_table_header = first_comp_table.rows[0].cells
first_comp_table_header[0].text = 'Результаты освоения образовательной программы(компетенции)'
first_comp_table_header[1].text = 'В результате изучения дисциплины обучающиеся должны:'
first_comp_table_sub_header = first_comp_table.rows[1].cells
first_comp_table_sub_header[1].text = 'знать'
first_comp_table_sub_header[2].text = 'уметь'
first_comp_table_sub_header[3].text = 'владеть'
q = 'select distinct competents from courses_clean where title=?'
cursor.execute(q, (course_title,))
competents = json.loads(str(cursor.fetchone()[0]))
for competence in competents:
cells = first_comp_table.add_row().cells
cells[0].text = competence.replace("\n", "").replace(" ", "") + " " + competents_short[competence.replace(" ", "")]
cells[1].text = competents_long[competence.replace("\n", "").replace(" ", "")]['знать'].replace("Знает", "")
cells[2].text = competents_long[competence.replace("\n", "").replace(" ", "")]['уметь'].replace("Умеет", "")
cells[3].text = competents_long[competence.replace("\n", "").replace(" ", "")]['владеть'].replace("Владеет", "")
chap2heading = "2. Место дисциплины в структуре образовательной программы"
document.add_heading(chap2heading)
chap3heading = "3. Трудоемкость дисциплины в зачетных единицах с указанием количества академических часов, выделенных на контактную работу обучающегося с преподавателем (по видам учебных занятий) и на самостоятельную работу обучающегося"
document.add_heading(chap3heading)
document.add_paragraph('Трудоемкость дисциплины')
# get related years
q = 'select distinct year from courses_clean where title=?'
cursor.execute(q, (course_title,))
years = list(cursor.fetchall())
for year in years:
q = 'select total, complexity, control, semesters from courses_clean where title=? and year=?'
cursor.execute(q, (course_title, int(year[0])))
res = cursor.fetchone()
total = res[0]
complexity = res[1]
control = json.loads(str(res[2]))
semesters = semesters_from_dict(json.loads(str(res[3])))
document.add_paragraph(f'Для набора {year[0]} г. {complexity} з.е. ({total} ч)')
control_string = []
for c in control:
if len(control[c]) > 0:
control_string.append(f'{c} семестр - {", ".join(control[c])}')
document.add_paragraph(f'Для набора {year[0]} г.: {", ".join(control_string)}')
for year in years:
p = document.add_paragraph(f'Набор {year[0]}')
p.alignment = 1
q = 'select semesters from courses_clean where title=? and year=?'
cursor.execute(q, (course_title, int(year[0])))
res = cursor.fetchone()
semesters = semesters_from_dict(json.loads(str(res[0])))
columns = len(semesters)
table = document.add_table(rows=12, cols=columns + 2)
table.style = 'TableGrid'
table.cell(0, 0).text = ''
table.cell(0, 1).text = 'Вид деятельности'
table.cell(0, 2).text = 'Семестр'
count = 2
if course_title == 'Практическая фонетика немецкого языка':
print(semesters)
for semester_num in semesters:
table.cell(1, count).text = str(semester_num)
table.cell(2, count).text = dash(semesters[semester_num].lectures)
table.cell(3, count).text = dash(semesters[semester_num].auditoria)
table.cell(4, count).text = dash(semesters[semester_num].contact_work)
table.cell(5, count).text = dash(semesters[semester_num].auditoria)
table.cell(6, count).text = dash(semesters[semester_num].electronic)
table.cell(7, count).text = dash(semesters[semester_num].consults_before_exam)
table.cell(8, count).text = dash(semesters[semester_num].contact_work_in_attestation)
table.cell(9, count).text = dash(semesters[semester_num].self_work_in_class)
table.cell(10, count).text = dash(semesters[semester_num].self_work_during_intermediate_attestation)
table.cell(11, count).text = dash(semesters[semester_num].total_hours)
count += 1
for i in range(2, 12):
table.cell(i, 0).text = str(i - 1)
table.cell(2, 1).text = 'Лекции, ч'
table.cell(3, 1).text = 'Практические занятия, ч'
table.cell(4, 1).text = 'Контактная работа, ч, из них'
table.cell(5, 1).text = '\tаудиторных занятий, ч'
table.cell(6, 1).text = '\tв электронной форме, ч'
table.cell(7, 1).text = '\tконсультаций, ч'
table.cell(8, 1).text = '\tпромежуточная аттестация, ч'
table.cell(9, 1).text = 'Самостоятельная работа во вре-мя занятий, ч'
table.cell(10, 1).text = 'Самостоятельная работа во вре-мя промежуточной аттестации, ч'
table.cell(11, 1).text = 'Всего, ч'
chap4heading = "4. Содержание дисциплины, структурированное по темам (разделам) с указанием отведенного на них количества академических часов и видов учебных занятий"
document.add_heading(chap4heading)
chap5heading = "5. Перечень учебной литературы"
document.add_heading(chap5heading)
chap6heading = "6.Перечень учебно-методических материаловпо самостоятельной работе обучающихся"
document.add_heading(chap6heading)
chap7heading = "7. Перечень ресурсов информационно-телекоммуникационной сети «Интернет», не-обходимых для освоения дисциплины"
document.add_heading(chap7heading)
chap71heading = "7.1. Современные профессиональные базы данных:"
document.add_heading(chap71heading, level=2)
chap72heading = "7.2. Информационные справочные системы"
document.add_heading(chap72heading, level=2)
chap8heading = "8. Перечень информационных технологий, используемых при осуществлении образовательного процесса по дисциплине"
document.add_heading(chap8heading)
chap81heading = "8.1 Перечень программного обеспечения"
document.add_heading(chap81heading, level=2)
chap82heading = "8.2 Информационные справочные системы"
document.add_heading(chap82heading, level=2)
chap9heading = "9. Материально-техническая база, необходимая для осуществления образовательного процесса по дисциплине"
document.add_heading(chap9heading)
document.add_paragraph(
f"Для реализации дисциплины «{course_title}» используются специальные помещения:")
document.add_paragraph(
"1) учебные аудитории для проведения занятий семинарского типа, групповых и индивидуальных консультаций, текущего контроля, промежуточной и итоговой аттестации;")
document.add_paragraph("2) помещения для самостоятельной работы обучающихся.")
document.add_paragraph(
"Учебные аудитории укомплектованы специализированной мебелью и техническими средствами обучения, служащими для представления учебной информации большой аудитории.")
document.add_paragraph(
"Помещения для самостоятельной работы обучающихся оснащены компьютерной техникой с возможностью подключения к сети «Интернет» и обеспечением доступа в электронную информационно-образовательную среду НГУ.")
document.add_paragraph(
"Материально-техническое обеспечение образовательного процесса по дисциплине для обучающихся из числа лиц с ограниченными возможностями здоровья осуществляется согласно «Порядку организации и осуществления образовательной деятельности по образовательным программам для инвалидов и лиц с ограниченными возможностями здоровья в Новосибирском государственном университете».")
document.add_paragraph(
"Реализация дисциплины может осуществляться с применением дистанционных образовательных технологий.")
chap10heading = "10. Оценочные средства для проведения текущего контроля и промежуточной аттестации по дисциплине"
document.add_heading(chap10heading)
document.add_paragraph(f'Перечень результатов обучения по дисциплине «{course_title}» и индикаторов их достижения представлен в виде знаний, умений и владений в разделе 1')
chap101heading = "10.1 Порядок проведения текущего контроля и промежуточной аттестации по дисциплине"
document.add_heading(chap101heading, level=2)
chap102heading = f"10.2. Описание критериев и шкал оценивания индикаторов достижения результатов обучения по дисциплине «{course_title}»"
document.add_heading(chap102heading, level=2)
document.add_paragraph('Таблица 10.2.1')
second_comp_table = document.add_table(rows=1, cols=3)
second_comp_table.style = 'TableGrid'
second_comp_table_header = second_comp_table.rows[0].cells
second_comp_table_header[0].text = 'Код компетенции'
second_comp_table_header[1].text = 'Результат обучения по дисциплине'
second_comp_table_header[2].text = 'Оценочное средство'
for competence in competents:
cells = second_comp_table.add_row().cells
cells[0].text = competence.replace(" ", "")
cells[1].text = competents_long[competence.replace(" ", "")]['знать']
cells = second_comp_table.add_row().cells
cells[1].text = competents_long[competence.replace(" ", "")]['уметь']
cells = second_comp_table.add_row().cells
cells[1].text = competents_long[competence.replace(" ", "")]['владеть']
document.add_paragraph('Таблица 10.2.2')
third_comp_table = document.add_table(rows=1, cols=2)
third_comp_table.style = 'TableGrid'
third_comp_table_header = third_comp_table.rows[0].cells
third_comp_table_header[0].text = 'Критерии оценивания результатов обучения'
third_comp_table_header[1].text = 'Шкала оценивания'
chap103heading = "10.3. Типовые контрольные задания и иные материалы, необходимые для оценки результатов обучения"
document.add_heading(chap103heading, level=2)
document.add_paragraph(
"Оценочные материалы (приложение 2), предназначенные для проверки соответ-ствия уровня подготовки по дисциплине требованиям ФГОС, хранятся на кафедре-разработчике РПД в печатном и электронном виде.")
document.add_page_break()
document.add_heading(f"Лист актуализации рабочей программы дисциплины «{course_title}»")
annot_table = document.add_table(rows=8, cols=4)
annot_table.style = 'TableGrid'
annot_table.cell(0, 0).text = ''
annot_table.cell(0, 1).text = 'Характеристика внесенных изменений (с указанием пунктов документа)'
annot_table.cell(0, 2).text = 'Дата и № протокола ученого совета Гуманитарного института'
annot_table.cell(0, 3).text = 'Подпись ответственного'
for i in range(1, len(annot_table.rows)):
annot_table.rows[i].height = Cm(2)
document.add_page_break()
appendix1 = 'Приложение 1'
document.add_heading(appendix1)
p = document.add_paragraph()
p.add_run(f'Аннотация по дисциплине «{course_title}»').bold = True
p.alignment = 1
document.add_paragraph('Дисциплина нацелена на формирование следующих компетенций: ')
for competence in competents:
p = document.add_paragraph()
p.add_run(competence.replace(" ", "")).bold = True
p.add_run('. ' + competents_short[competence.replace(" ", "")])
document.add_paragraph('Общая трудоёмкость дисциплины составляет:')
for year in years:
q = 'select total, complexity, control, semesters from courses_clean where title=? and year=?'
cursor.execute(q, (course_title, int(year[0])))
res = cursor.fetchone()
total = res[0]
complexity = res[1]
control = json.loads(str(res[2]))
semesters = semesters_from_dict(json.loads(str(res[3])))
document.add_paragraph(f'для набора {year[0]} г.: {complexity} з.е., {total} ч.')
for semester_num in semesters:
document.add_paragraph(
f'В {semester_num}-м семестре {semesters[semester_num].complexity} з.е., {semesters[semester_num].total} ч, из которых {semesters[semester_num].contact_work} ч составляет контактная работа обучающегося с преподавателем, {semesters[semester_num].total - semesters[semester_num].contact_work} ч самостоятельная работа обучающегося;')
document.save(f'data/{course_title}.docx')
generate_reports()