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} ч)') # if mapping[course] != 'нет': # document.add_paragraph( # f'Для набора 2019 г. – {c2019[mapping[course]].complexity} з.е. ({c2019[mapping[course]].total} ч)') # document.add_paragraph('Форма промежуточной аттестации') 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)}') # if mapping[course] != 'нет': # control_string = [] # for c in c2019[mapping[course]].control: # if len(c2019[mapping[course]].control[c]) > 0: # control_string.append(f'{c} семестр - {", ".join(c2019[mapping[course]].control[c])}') # document.add_paragraph(f'Для набора 2019 г.: {", ".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 = 'Всего, ч' # # 2019 # if mapping[course] != 'нет': # p = document.add_paragraph('Набор 2019') # p.alignment = 1 # # columns = c2019[mapping[course]].number_of_semesters # semesters = c2019[mapping[course]].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 # 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} ч самостоятельная работа обучающегося;') # if mapping[course] != 'нет': # semesters = c2019[mapping[course]].semesters # document.add_paragraph( # f'для набора 2019 г.: {c2019[mapping[course]].complexity} з.е., {c2019[mapping[course]].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() # def generate_reports(): # competents_short = read_short_competents_description() # competents_long = read_long_competents_description() # # mapping = read_mapping() # # for course in mapping: # if not course == 'нет': # 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 = 'владеть' # # # # for competence in c2017[course].competents: # cells = first_comp_table.add_row().cells # cells[0].text = competence + " " + competents_short[competence] # cells[1].text = competents_long[competence]['знать'].replace("Знает","") # cells[2].text = competents_long[competence]['уметь'].replace("Умеет","") # cells[3].text = competents_long[competence]['владеть'].replace("Владеет","") # # chap2heading = "2. Место дисциплины в структуре образовательной программы" # document.add_heading(chap2heading) # # chap3heading = "3. Трудоемкость дисциплины в зачетных единицах с указанием количества академических часов, выделенных на контактную работу обучающегося с преподавателем (по видам учебных занятий) и на самостоятельную работу обучающегося" # # document.add_heading(chap3heading) # document.add_paragraph('Трудоемкость дисциплины') # document.add_paragraph(f'Для набора 2017 г. – {c2017[course].complexity} з.е. ({c2017[course].total} ч)') # if mapping[course] != 'нет': # document.add_paragraph( # f'Для набора 2019 г. – {c2019[mapping[course]].complexity} з.е. ({c2019[mapping[course]].total} ч)') # document.add_paragraph('Форма промежуточной аттестации') # # control_string = [] # for c in c2017[course].control: # if len(c2017[course].control[c]) > 0: # control_string.append(f'{c} семестр - {", ".join(c2017[course].control[c])}') # document.add_paragraph(f'Для набора 2017 г.: {", ".join(control_string)}') # if mapping[course] != 'нет': # control_string = [] # for c in c2019[mapping[course]].control: # if len(c2019[mapping[course]].control[c]) > 0: # control_string.append(f'{c} семестр - {", ".join(c2019[mapping[course]].control[c])}') # document.add_paragraph(f'Для набора 2019 г.: {", ".join(control_string)}') # # p = document.add_paragraph('Набор 2017') # p.alignment = 1 # # columns = c2017[course].number_of_semesters # semesters = c2017[course].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 # 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 = 'Всего, ч' # # # 2019 # if mapping[course] != 'нет': # p = document.add_paragraph('Набор 2019') # p.alignment = 1 # # columns = c2019[mapping[course]].number_of_semesters # semesters = c2019[mapping[course]].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 # 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"Для реализации дисциплины «{c2017[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) # # chap101heading = "10.1 Порядок проведения текущего контроля и промежуточной аттестации по дисциплине" # document.add_heading(chap101heading, level=2) # # chap102heading = f"10.2. Описание критериев и шкал оценивания индикаторов достижения результатов обучения по дисциплине «{c2017[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 c2017[course].competents: # cells = second_comp_table.add_row().cells # cells[0].text = competence # cells[1].text = competents_long[competence]['знать'] # cells = second_comp_table.add_row().cells # cells[1].text = competents_long[competence]['уметь'] # cells = second_comp_table.add_row().cells # cells[1].text = competents_long[competence]['владеть'] # # 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"Лист актуализации рабочей программы дисциплины «{c2017[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'Аннотация по дисциплине «{c2017[course].title}»').bold = True # p.alignment = 1 # # document.add_paragraph('Дисциплина нацелена на формирование следующих компетенций: ') # for competence in c2017[course].competents: # p = document.add_paragraph() # p.add_run(competence).bold = True # p.add_run('. ' + competents_short[competence]) # # document.add_paragraph('Общая трудоёмкость дисциплины составляет:') # document.add_paragraph(f'для набора 2017 г.: {c2017[course].complexity} з.е., {c2017[course].total} ч.') # semesters = c2017[course].semesters # 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} ч самостоятельная работа обучающегося;') # # if mapping[course] != 'нет': # semesters = c2019[mapping[course]].semesters # document.add_paragraph( # f'для набора 2019 г.: {c2019[mapping[course]].complexity} з.е., {c2019[mapping[course]].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}.docx')