def split_printout(result): person = result.person if not person or not person.group: raise NoResultToPrintException('No results to print') obj = race() course = obj.find_course(result) if person.group and course: printer = Config().printer.get('split') template_path = obj.get_setting( 'split_template', template_dir('split', '1_split_printout.html')) s = GroupSplits(obj, person.group).generate(True) result.check_who_can_win() if not str(template_path).endswith('.html') and platform.system( ) == 'Windows': # Internal split printout, pure python. Works faster, than jinja2 template + pdf size = 60 # base scale factor is 60, used win32con.MM_TWIPS MapMode (unit = 1/20 of dot, 72dpi) array = str(template_path).split(_('scale') + '=') if len(array) > 1: scale = array[1] if scale.isdecimal(): size = int(scale) * size // 100 pr = SportorgPrinter( printer, size, int(obj.get_setting('print_margin_left', 5.0)), int(obj.get_setting('print_margin_top', 5.0))) pr.print_split(result) pr.end_doc() return organization = person.organization if not organization: organization = Organization() template = get_text_from_file(template_path, race=obj.to_dict(), person=person.to_dict(), result=result.to_dict(), group=person.group.to_dict(), course=course.to_dict(), organization=organization.to_dict(), items=s.to_dict()) if not printer: raise NoPrinterSelectedException('No printer selected') print_html( printer, template, obj.get_setting('print_margin_left', 5.0), obj.get_setting('print_margin_top', 5.0), obj.get_setting('print_margin_right', 5.0), obj.get_setting('print_margin_bottom', 5.0), )
def get_text_from_file(path, **kwargs): kwargs['name'] = config.NAME kwargs['version'] = str(config.VERSION) if os.path.isfile(path): return template.get_text_from_path(path, **kwargs) else: return template.get_text_from_template(config.template_dir(), path, **kwargs)
def get_templates(path='', exclude_path=''): if not path: path = config.template_dir() if not exclude_path: exclude_path = config.template_dir() files = [] for p in os.listdir(path): full_path = os.path.join(path, p) if os.path.isdir(full_path): fs = get_templates(full_path) for f in fs: f = f.replace(exclude_path, '') f = f.replace('\\', '/') files.append(f) else: full_path = full_path.replace(exclude_path, '') full_path = full_path.replace('\\', '/') files.append(full_path) return files
def split_printout(result): person = result.person if not person or not person.group: raise NoResultToPrintException('No results to print') obj = race() course = obj.find_course(result) if person.group and course: printer = Config().printer.get('split') template_path = obj.get_setting( 'split_template', template_dir('split', 'split_printout.html')) organization = person.organization if not organization: organization = Organization() s = GroupSplits(obj, person.group).generate(True) template = get_text_from_file(template_path, race=obj.to_dict(), person=person.to_dict(), result=result.to_dict(), group=person.group.to_dict(), course=course.to_dict(), organization=organization.to_dict(), items=s.to_dict()) if not printer: raise NoPrinterSelectedException('No printer selected') print_html( printer, template, obj.get_setting('print_margin_left', 5.0), obj.get_setting('print_margin_top', 5.0), obj.get_setting('print_margin_right', 5.0), obj.get_setting('print_margin_bottom', 5.0), )
def init_ui(self): self.setWindowTitle(_('Printer settings')) self.setWindowIcon(QIcon(config.ICON)) self.setSizeGripEnabled(False) self.setModal(True) self.layout = QFormLayout(self) self.label_printer = QLabel(_('Default printer')) self.printer_selector = QPushButton(_('select')) def select_main_printer(): printer = self.select_printer() self.selected_printer.setText(printer) self.printer_selector.clicked.connect(select_main_printer) self.label_split_printer = QLabel(_('Default split printer')) self.split_printer_selector = QPushButton(_('select')) def select_split_printer(): printer = self.select_printer() self.selected_split_printer.setText(printer) self.split_printer_selector.clicked.connect(select_split_printer) self.selected_printer = QLabel() self.selected_split_printer = QLabel() self.layout.addRow(self.label_printer, self.printer_selector) self.layout.addRow(self.selected_printer) self.layout.addRow(self.label_split_printer, self.split_printer_selector) self.layout.addRow(self.selected_split_printer) self.label_template = QLabel(_('Template')) self.item_template = AdvComboBox() self.item_template.setMaximumWidth(200) self.item_template.addItems(get_templates(config.template_dir('split'))) self.layout.addRow(self.label_template, self.item_template) self.item_custom_path = QPushButton(_('Choose template')) def select_custom_path(): file_name = get_open_file_name(_('Open HTML template'), _("HTML file (*.html)")) self.item_template.setCurrentText(file_name) self.item_custom_path.clicked.connect(select_custom_path) self.layout.addRow(self.item_custom_path) self.print_splits_checkbox = QCheckBox(_('Print splits')) self.layout.addRow(self.print_splits_checkbox) self.margin_group_box = QGroupBox(_('Margins')) self.margin_layout = QFormLayout() self.item_margin_left = QDoubleSpinBox() self.margin_layout.addRow(QLabel(_('Left')), self.item_margin_left) self.item_margin_top = QDoubleSpinBox() self.margin_layout.addRow(QLabel(_('Top')), self.item_margin_top) self.item_margin_right = QDoubleSpinBox() self.margin_layout.addRow(QLabel(_('Right')), self.item_margin_right) self.item_margin_bottom = QDoubleSpinBox() self.margin_layout.addRow(QLabel(_('Bottom')), self.item_margin_bottom) self.margin_group_box.setLayout(self.margin_layout) self.layout.addRow(self.margin_group_box) self.set_values() def cancel_changes(): self.close() def apply_changes(): try: self.apply_changes_impl() except Exception as e: logging.error(str(e)) self.close() button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.button_ok = button_box.button(QDialogButtonBox.Ok) self.button_ok.setText(_('OK')) self.button_ok.clicked.connect(apply_changes) self.button_cancel = button_box.button(QDialogButtonBox.Cancel) self.button_cancel.setText(_('Cancel')) self.button_cancel.clicked.connect(cancel_changes) self.layout.addRow(button_box) self.show()
def init_ui(self): self.setWindowTitle(_('Start list')) self.setWindowIcon(QIcon(config.ICON)) self.setSizeGripEnabled(False) self.setModal(True) self.layout = QFormLayout(self) self.label_template = QLabel(_('Template')) self.item_template = AdvComboBox() self.item_template.addItems(get_templates( config.template_dir('start'))) self.layout.addRow(self.label_template, self.item_template) if _settings['last_template'] is not None: self.item_template.setCurrentText(_settings['last_template']) self.item_custom_path = QPushButton(_('Choose template')) def select_custom_path(): file_name = get_open_file_name(_('Open HTML template'), _("HTML file (*.html)")) self.item_template.setCurrentText(file_name) self.item_custom_path.clicked.connect(select_custom_path) self.layout.addRow(self.item_custom_path) self.item_open_in_browser = QCheckBox(_('Open in browser')) self.item_open_in_browser.setChecked(_settings['open_in_browser']) self.layout.addRow(self.item_open_in_browser) self.item_save_to_last_file = QCheckBox(_('Save to last file')) self.item_save_to_last_file.setChecked(_settings['save_to_last_file']) self.layout.addRow(self.item_save_to_last_file) if _settings['last_file'] is None: self.item_save_to_last_file.setDisabled(True) self.item_selected = QCheckBox(_('Send selected')) self.item_selected.setChecked(_settings['selected']) self.layout.addRow(self.item_selected) def cancel_changes(): self.close() def apply_changes(): try: self.apply_changes_impl() except FileNotFoundError as e: logging.error(str(e)) except Exception as e: logging.exception(str(e)) self.close() button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.button_ok = button_box.button(QDialogButtonBox.Ok) self.button_ok.setText(_('Save to file')) self.button_ok.clicked.connect(apply_changes) self.button_cancel = button_box.button(QDialogButtonBox.Cancel) self.button_cancel.setText(_('Cancel')) self.button_cancel.clicked.connect(cancel_changes) self.layout.addRow(button_box) self.show() self.button_ok.setFocus()
def apply_changes_impl(self): obj = race() mw = GlobalAccess().get_main_window() map_items = [obj.persons, obj.results, obj.groups, obj.courses, obj.organizations] map_names = ['persons', 'results', 'groups', 'courses', 'organizations'] selected_items = { 'persons': [], 'results': [], 'groups': [], 'courses': [], 'organizations': [], } template_path = self.item_template.currentText() _settings['last_template'] = template_path _settings['open_in_browser'] = self.item_open_in_browser.isChecked() _settings['save_to_last_file'] = self.item_save_to_last_file.isChecked() _settings['selected'] = self.item_selected.isChecked() if _settings['selected']: cur_items = map_items[mw.current_tab] for i in mw.get_selected_rows(): selected_items[map_names[mw.current_tab]].append(cur_items[i].to_dict()) ResultCalculation(obj).process_results() RaceSplits(obj).generate() ScoreCalculation(obj).calculate_scores() races_dict = [r.to_dict() for r in races()] if template_path.endswith('.docx'): # DOCX template processing full_path = config.template_dir() + template_path doc = DocxTemplate(full_path) context = {} context['race'] = races_dict[get_current_race_index()] context['name'] = config.NAME context['version'] = str(config.VERSION) doc.render(context) if _settings['save_to_last_file']: file_name = _settings['last_file'] else: file_name = get_save_file_name(_('Save As MS Word file'), _("MS Word file (*.docx)"), '{}_official'.format(obj.data.get_start_datetime().strftime("%Y%m%d"))) if file_name: doc.save(file_name) os.startfile(file_name) else: template = get_text_from_file( template_path, race=races_dict[get_current_race_index()], races=races_dict, rent_cards=list(RentCards().get()), current_race=get_current_race_index(), selected=selected_items ) if _settings['save_to_last_file']: file_name = _settings['last_file'] else: file_name = get_save_file_name(_('Save As HTML file'), _("HTML file (*.html)"), '{}_report'.format(obj.data.get_start_datetime().strftime("%Y%m%d"))) if len(file_name): _settings['last_file'] = file_name with codecs.open(file_name, 'w', 'utf-8') as file: file.write(template) file.close() # Open file in your browser if _settings['open_in_browser']: webbrowser.open('file://' + file_name, new=2)