예제 #1
0
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
예제 #2
0
    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