def run(format, newpath): global flag if remove_old and os.path.exists(newpath): remove_file(newpath) if not os.path.exists(newpath): if unoconv(self, format, oldpath, newpath, remove_log): flag = True return True return False
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 save(self): if self.id: old = Document.objects.get(id=self.id) try: old.report_file.path except: pass else: if self.report_file != old.report_file: remove_file(old.report_file.path) if not self.title: self.title = force_text(self) super(Document, self).save()