def unoconv(document, format, oldpath, newpath, remove_log=True): if not unoconv_exe: raise RuntimeError('Please install unoconv into your system.') newname = os.path.basename(newpath) dwd = os.path.dirname(newpath) cwd = os.getcwd() os.chdir(dwd) proc = [unoconv_exe] proc.extend(random_unoconv_con(document=document)) proc.extend(['-f', format, os.path.basename(oldpath)]) out = os.path.join(dwd, 'convert.out.%s.log' % (format if format == 'pdf' else 'odf',)) err = os.path.join(dwd, 'convert.error.%s.log' % (format if format == 'pdf' else 'odf',)) p = subprocess.Popen(proc, shell=False, stdout=open(out, 'w+b'), stderr=open(err, 'w+b'), cwd=dwd) p.wait() ready = os.path.exists(newpath) f = open(err, 'r') err_txt = f.read().decode('utf-8') f.close() # Когда LO создаёт файл, то может несколько раз попытаться # создать временный каталог. Такие ошибки тоже попадают в лог # Поэтому единственно верным признаком успеха является # наличие конечного файла if err_txt and not ready: deep_to_dict(document.details, err.replace('.log', ''), err_txt) f = open(out, 'r') out_txt = f.read().decode('utf-8') f.close() if out_txt: deep_to_dict(document.details, out.replace('.log', ''), out_txt) os.chdir(cwd) if ready: if remove_log: remove_file(err) remove_file(out) return True else: return False
def render(self, document, filters, save=False, request=None): """ Формирование файла отчёта. """ context = self.get_context(document=document, filters=filters, request=request) if not 'BRAND_TEXT' in context: context['BRAND_TEXT'] = REPORTAPI_BRAND_TEXT if not 'BRAND_COLOR' in context: context['BRAND_COLOR'] = REPORTAPI_BRAND_COLOR if not request: context['user'] = SystemUser() # set temporary properties for document document.convert_to_pdf = self.convert_to_pdf document.convert_to_odf = self.convert_to_odf document.mimetype = self.mimetype document.details = deep_to_dict(document.details, 'filters', filters) # create title document._filters_data = self.get_filters_data(filters, request=request) document.title = self.get_document_title(document) if self.page: context['PAGE'] = self.page.checked() context['DOCUMENT'] = document context['FILTERS'] = document._filters_data.values() content = render_to_string(self.template_name, context, request) _file = ContentFile(content.encode('utf-8') or \ force_text(_('Unspecified render error in template.'))) document.report_file.save(self.get_filename(), _file, save=save) return document