def selectSubject(self): """ Обработка выбора предмета из списка. :return: None. """ select_subject = self.comboBoxSubjects.currentText() data = load_excel.load_table( filename=PATH_TO_DB_SCHOOL_SUBJECTS)['Данные'] subject = list( filter(lambda item: item['Предмет'] == select_subject, data))[0] self.lineEditTitleSubject.setText( subject['Название предмета д.п.'].lower()) self.lineEditDate.setText( date_to_rus_string.date_to_rus_string(subject['Дата'])) self.lineEditLocation.setText(subject['Место проведения']) for i in range(len(self.lineEditCountPlayers)): if (subject[f'Шифр {self.numberClass[i]} класс'] != None): self.lineEditCountPlayers[i].setEnabled(True) self.lineEditPrefixes[i].setText( subject[f'Шифр {self.numberClass[i]} класс']) else: self.lineEditCountPlayers[i].setEnabled(False) self.lineEditCountPlayers[i].setText('') self.lineEditPrefixes[i].setText('')
def clickedButtonMakeCertificate(self): """ Событие: нажатие на кнопку "Сгенерировать". :return: """ subject_title = self.comboBoxSubjects.currentText() data = load_excel.load_table( filename=PATH_TO_DB_SCHOOL_SUBJECTS)['Данные'] data = list( filter( lambda it: it['Название предмета д.п.'].lower() == subject_title, data)) subject_title = data[0]['Название предмета д.п.'] subject_title = subject_title[0:1].lower() + subject_title[1:] self.pushButtonMakeCertificate.setEnabled(False) (count, path) = logic_certificate.make_certificate( path_template=self.lineEditPathTemplate.text(), dir_out=self.lineEditDirOut.text(), filename=self.lineEditFilename.text(), subject_title=subject_title, path_peoples_input=os.path.abspath( self.lineEditPathPeoplesInput.text())) QMessageBox.about( self, 'Сертификаты сгенерированы!', f'Количество: {count}.\nПуть к файлу с сертификатами: {path}') self.pushButtonMakeCertificate.setEnabled(True)
def loadSubject(self): """ Загрузка списка дней. :return: None. """ data = load_excel.load_table(filename=PATH_TO_DB_SCHOOL_SUBJECTS)['Данные'] data = sorted(data, key=lambda item: item['Дата']) date_min = datetime.datetime.today() - datetime.timedelta(2) data = list(filter(lambda item: item['Дата'] >= date_min, data)) self.comboBoxSubjects.clear() self.comboBoxSubjects.addItems(list(map(lambda item: item['Предмет'], data)))
def loadSubject(self): """ Загрузка списка дней. :return: None. """ data = load_excel.load_table(filename=PATH_TO_DB_SCHOOL_SUBJECTS)['Данные'] data = sorted(data, key=lambda item: item['Дата']) date_min = datetime.datetime.today() - datetime.timedelta(2) # data = list(filter(lambda item: item['Дата'] >= date_min, data)) data = list(map(lambda item: item['Название предмета д.п.'], data)) newData = [] for subject in data: if (subject not in newData): newData.append(subject) self.comboBoxSubject.clear() self.comboBoxSubject.addItems(newData)
def make_certificate(path_template, dir_out, filename, subject_title, path_peoples_input): table = load_excel.load_table(path_peoples_input)['Общий список'] table = list(filter(lambda it: it['ФИО'] != None, table)) count = 0 template_document = '' for people in table: if (people['ФИО'] == None): break certificate = "\Certificate{%s}{%s}{%s}{%s}{%s}" % ( subject_title, people['Класс'], people['ФИО'], people['Учебное заведение'], people['Муниципалитет'] ) template_document = certificate + '\n' + template_document count = count + 1 return (count, make_pdf.make_pdf(path_template, dir_out, filename, {"%%{{template_document}}": template_document}))
def load_peoples(filename, sheetnames): wb = load_workbook(filename=filename, read_only=True, data_only=True) sheetnames = sheetnames.split('$') sheetnames = list(map(lambda it: it.strip(), sheetnames)) sheetnames = list(filter(lambda it: it != "", sheetnames)) peoples = [] for sheetname in sheetnames: ws = wb[sheetname] rows = tuple(ws.rows) i = find_head(rows) table = load_excel.load_table(filename, head_row=i)[sheetname] table = list(filter(lambda it: it['ФИО'] != None, table)) table = list(filter(lambda it: it['Тип диплома'] != None, table)) peoples.extend(list(map(lambda it: sheetname + ' ' + it['ФИО'], table))) return peoples
def make_voucher(path_template, dir_out, filename, subject, count_order_voucher, count_spare_voucher): # Проверка пути к шаблону. if not os.path.isfile( path_template) or os.path.splitext(path_template)[1] != '.tex': raise Exception('Некорректно задан путь к шаблону.') # Проверка пути к директории вывода. if not os.path.isdir(dir_out): raise Exception('Некорректно задана директория вывода.') # Проверка имени исходного файла. if filename.strip() == '': raise Exception('Некорректно задано имя файла.') # Формирование даты, которая будет печаться на талоне. data = load_excel.load_table(filename=PATH_TO_DB_SCHOOL_SUBJECTS)['Данные'] data = list(filter(lambda item: item['Предмет'] == subject, data)) if (len(data) != 1): raise Exception('Некорректно задан предмет.') date = date_to_rus_string.date_to_rus_string(data[0]['Дата']).upper() # Вычисление количество всех и запасных талонов. (count_all_voucher, count_calc_space_voucher) = calc_voucher(count_order_voucher, count_spare_voucher) count_page = count_all_voucher // VOUCHERS_IN_PAGE # Заполнение шаблона документа. template_value = {} template_value[ '%%{{template_footer}}'] = f'Количество основных талоны: {count_order_voucher}. Количество запасных талонов: {count_calc_space_voucher}.' template_value['%%{{template_document}}'] = ('\\VoucherTable{' + date + '}\n') * count_page # Генерация pdf. return make_pdf.make_pdf(path_template, dir_out, filename, template_value)
def make_encryption_sheets(path_template, dir_out, filename, subject_title, count_players): """ Генерация шифровок. :param path_template: путь к файлу с шаблоном. :param dir_out: путь к директории вывода. :param filename: имя итоговой файла. :param subject_title: предмет. :param count_players: количество участников по классам. :return: """ # Проверка пути к шаблону. if not os.path.isfile( path_template) or os.path.splitext(path_template)[1] != '.tex': raise Exception('Некорректно задан путь к шаблону.') # Проверка пути к директории вывода. if not os.path.isdir(dir_out): raise Exception('Некорректно задана директория вывода.') # Проверка имени итогового файла. if filename.strip() == '': raise Exception('Некорректно задано имя файла.') # Проверка корректности заданого предмета. data = load_excel.load_table(filename=PATH_TO_DB_SCHOOL_SUBJECTS)['Данные'] data = list(filter(lambda item: item['Предмет'] == subject_title, data)) if (len(data) != 1): raise Exception('Некорректно задан предмет.') else: subject = data[0] # Проверка, что количество учеников задано корректно. try: for key in count_players.keys(): count_players[key] = int(count_players[key]) if count_players[key] < 0: raise Exception() except Exception: raise Exception('Некорректно задано количество учеников.') codes = [] p = {} for key in sorted(count_players.keys()): count = count_players[key] if count == 0: continue numbers = list(range(1, count + 1)) if count >= 13: numbers.append(count + 1) numbers.remove(13) numbers.sort() prefix = subject[f'Шифр {key} класс'] if (prefix == None) or (len(prefix) == 0): raise Exception('Заданы не существующие шифровки.') else: p[prefix] = p.get(prefix, 0) + count for prefix in p.keys(): count = p[prefix] if count == 0: continue numbers = list(range(1, count + 1)) if count >= 13: numbers.append(count + 1) numbers.remove(13) numbers.sort() codes.extend( list(map(lambda number: prefix + '-' + ("%02d" % number), numbers))) if (len(codes) % 2 == 1): codes.append('Я лишняя!!!') title = subject['Название предмета д.п.'] title = title[:1].lower() + title[1:] '\TwoEncryption{истории}{18 января 2019}{г. Красноярск}{РЯ11-19}{РЯ11-20}' temp = '\TwoEncryption{%s}{%s}{%s}{%%s}{%%s}\n' % ( title, date_to_ru_string.date_to_rus_string( subject['Дата']), subject['Место проведения']) template_value = '' for i in range(0, len(codes) - 1, 2): template_value = template_value + (temp % (codes[i], codes[i + 1])) return make_pdf.make_pdf(path_template, dir_out, filename, {'%%{{template_document}}': template_value})
def make_diplom(filename, target, path_template, dir_out, filename_out, reg_number, number, subject): wb = load_workbook(filename=filename, read_only=True, data_only=True) peoples = [] for sheetname in wb.sheetnames: ws = wb[sheetname] rows = tuple(ws.rows) i = find_head(rows) table = load_excel.load_table(filename, head_row=i)[sheetname] table = list(filter(lambda it: it['ФИО'] != None, table)) table = list(filter(lambda it: it['Тип диплома'] != None, table)) for k in range(len(table)): table[k]['Имя листа'] = sheetname peoples.extend(table) target = target.split("\n") target = list(map(lambda it: it.strip(), target)) target = list(filter(lambda it: it != "", target)) peoples = list(filter(lambda it: (it['Имя листа'] + " " + it['ФИО']) in target, peoples)) data = load_excel.load_table(filename=PATH_TO_DB_SCHOOL_SUBJECTS)['Данные'] data = list(filter(lambda item: item['Дата награждения'] != None, data)) data = list(filter(lambda item: item['Название предмета д.п.'].lower() == subject.lower(), data)) if len(data) != 1: raise Exception(11) sub = data[0] name = sub['Название предмета д.п.'] name = name[0:1].lower() + name[1:] out = "" template_document_win = '' template_document_no_win = '' preview_win = [] preview_no_win = [] date = sub['Дата награждения'] reg_number = int(reg_number) number = int(number) for people in peoples: if people['ФИО'] == 'Бит - Зая Георгий Александрович': fio = [] fio.append('Бит - Зая') fio.append('Георгий') fio.append('Александрович') else: fio = people['ФИО'].split(' ') fio = list(filter(lambda it: it != "", fio)) while (len(fio) < 3): fio.append('') school = people['Учебное заведение (полностью)'] school = school.split("\n", 3) school = list(map(lambda it: it.strip(), school)) school = list(map(lambda it: " ".join(it.split("\n")), school)) school = list(filter(lambda it: it != "", school)) school.append(people['Муниципалитет']) while (len(school) < 5): school.append("") num = "24 %s РЭ %06d" % (people['Тип диплома'][:2].upper(), number) diplom = "\Diplom" + "{%s}" * 16 diplom = diplom % ( name, fio[0], fio[1], " ".join(fio[2:]), people['Класс'], school[0], school[1], school[2], school[3], school[4], str(date.day), date_to_rus_string.month_to_rus_string(date), str(date.year % 100), sub['Место проведения'], num, str(reg_number) ) preview_temp = "%s %s (%s класс, %s, %s)" % ( fio[0], fio[1], people['Класс'], people['Учебное заведение'], people['Муниципалитет']) if people['Тип диплома'].lower() == "победитель": template_document_win += diplom + '\n' preview_win.append(preview_temp) else: template_document_no_win += diplom + '\n' preview_no_win.append(preview_temp) out_people = str(reg_number) out_people += '\t' + num out_people += '\t' + name out_people += '\t' + people['ФИО'] out_people += '\t' + people['Учебное заведение'] + ", " + people['Муниципалитет'] + ", " + str( people['Класс']) + " кл." out += out_people + '\n' number += 1 reg_number += 1 make_pdf.make_pdf(path_template, dir_out, filename_out + " (победители)", {"%%{{template_document}}": template_document_win}) path = make_pdf.make_pdf(path_template, dir_out, filename_out + " (призёры)", {"%%{{template_document}}": template_document_no_win}) tt = sub['Название предмета д.п.'] tt = tt[0].lower() + tt[1:] preview = '' preview += 'Победителями олимпиады по %s стали: %s' % (tt, ', '.join(preview_win)) preview += '\n\n\n' preview += 'Дипломы призёров получили следующие участники: %s' % (', '.join(preview_no_win)) return (out, path, preview)