From dc87bd93a43fd6279a0c5c4c76c87b7e41657e1a Mon Sep 17 00:00:00 2001 From: Bachurin Sergey Date: Wed, 23 Jul 2014 16:23:41 +0300 Subject: [PATCH] preview --- project/docs/forms/base_forms.py | 6 ++- project/docs/urls.py | 3 ++ project/docs/views/base_views.py | 52 +++++++++++++++++++++++ project/static/css/style.css | 1 + project/templates/docs/_base/preview.html | 28 ++++++++++++ 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 project/templates/docs/_base/preview.html diff --git a/project/docs/forms/base_forms.py b/project/docs/forms/base_forms.py index c7f3089..30a4d72 100644 --- a/project/docs/forms/base_forms.py +++ b/project/docs/forms/base_forms.py @@ -36,8 +36,10 @@ class BaseModelForm(MyBaseModelForm): # Настроить атрибуты виджетов # TODO вынести в _MySuperForm (сделать там настройку полей с datepicker-ами из словаря) f['doc_date'].widget.attrs['class'] = 'has-datepicker' - f['plat_doc_date'].widget.attrs['class'] = 'has-datepicker' - f['fix_doc_date'].widget.attrs['class'] = 'has-datepicker' + if f.get('plat_doc_date'): + f['plat_doc_date'].widget.attrs['class'] = 'has-datepicker' + if f.get('fix_doc_date'): + f['fix_doc_date'].widget.attrs['class'] = 'has-datepicker' # Если в форме есть поле bank_account, настроить связь с BankAccount: чтобы можно было выбрать __только__ # расчетные счета данного пользователя. Также убрать пустой вариант из селекта. diff --git a/project/docs/urls.py b/project/docs/urls.py index 368ae68..e2f8d4b 100644 --- a/project/docs/urls.py +++ b/project/docs/urls.py @@ -42,6 +42,9 @@ for name, klass in klasses: # сохранить в pdf url(r'^%s/(?P\d+)/pdf/$' % name, getview, {'klass': klass, 'oper': 'as_pdf',}, name='docs_%s_pdf' % name), + # показать картинку + url(r'^%s/(?P\d+)/preview/$' % name, getview, {'klass': klass, 'oper': 'as_img',}, + name='docs_%s_img' % name), # сохранить в excel url(r'^%s/(?P\d+)/xls/$' % name, getview, {'klass': klass, 'oper': 'as_xls',}, name='docs_%s_xls' % name), diff --git a/project/docs/views/base_views.py b/project/docs/views/base_views.py index 5a4b59b..52b194b 100644 --- a/project/docs/views/base_views.py +++ b/project/docs/views/base_views.py @@ -1,9 +1,14 @@ # -*- coding: utf-8 -*- +import os +import glob from datetime import datetime +import tempfile from email.header import Header from time import time import simplejson as json +import ghostscript + from django.shortcuts import render, get_object_or_404, redirect from django.http import HttpResponseServerError, HttpResponseBadRequest, HttpResponse from django.utils.decorators import method_decorator @@ -33,6 +38,8 @@ from project.customer.decorators import license_required DEBUG = getattr(settings, 'DEBUG', False) SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL', '') +MEDIA_ROOT = getattr(settings, 'MEDIA_ROOT', '') +MEDIA_URL = getattr(settings, 'MEDIA_URL', '') ORDER_VAR = 'o' ORDER_TYPE_VAR = 'ot' @@ -76,6 +83,7 @@ class BaseViews(object): TEMPLATE_EDIT = 'docs/_base/base_edit.html' TEMPLATE_DELETE = 'docs/_base/base_delete.html' TEMPLATE_FORM = 'docs/_base/base_form.html' + TEMPLATE_IMG = 'docs/_base/preview.html' TEMPLATE_FORM_JS = 'docs/stub_js.html' TEMPLATE_EMAIL = 'docs/email/base_email.html' @@ -368,6 +376,50 @@ class BaseViews(object): print '%s generation time (seconds): %s' % (self.XLS_TEMPLATE, time()-c1,) return xls + def as_img(self, *args, **kwargs): + """Вывести превью документа.""" + try: + pdf = self.get_pdf(*args, **kwargs) + _, filename = tempfile.mkstemp() + + tmp_media_dir = os.path.join(MEDIA_ROOT, 'tmp') + if not os.path.exists(tmp_media_dir): + os.makedirs(tmp_media_dir) + + tmp_dir = tempfile.mkdtemp(dir=tmp_media_dir) + tmp_dirname = os.path.split(tmp_dir)[1] + + f = open(filename, 'w') + f.write(pdf) + f.close() + args = ["", + "-dNOPAUSE", "-dBATCH", "-dSAFER", + "-sDEVICE=png16m", + "-r150", + "-sOutputFile=%s" % os.path.join(tmp_dir, "page-%03d.png"), + "-f", filename + ] + GS = ghostscript.Ghostscript(*args) + os.remove(filename) + filename = '%s.pdf' % self.get_filename(*args, **kwargs) + imgs = glob.glob(os.path.join(tmp_dir, '*.png')) + imgs = [os.path.split(i)[1] for i in imgs] + imgs = ['%stmp/%s/%s' % (MEDIA_URL, tmp_dirname, i) for i in imgs] + + dictionary = { + 'images': imgs, + 'padeji': self.PADEJI, + 'padeji_mnoj': self.PADEJI_MNOJ, + 'url_prefix': self.URL_PREFIX, + } + return render(self.request, self.TEMPLATE_IMG, dictionary) + except: + if DEBUG: + raise + else: + return HttpResponseServerError('Server error. Try later.') + + def as_pdf(self, *args, **kwargs): """Вывести документ в формате PDF в HttpResponse.""" try: diff --git a/project/static/css/style.css b/project/static/css/style.css index 3978f94..8d8b4c9 100644 --- a/project/static/css/style.css +++ b/project/static/css/style.css @@ -214,3 +214,4 @@ div.blockMsg { width: 100%; height: 100%; top: 0; left: 0; text-align: center; } .header {font-weight:bold; } #menu ul li {display:inline;} +.preview {width:1000px;height:500px;overflow:scroll;} diff --git a/project/templates/docs/_base/preview.html b/project/templates/docs/_base/preview.html new file mode 100644 index 0000000..ff02922 --- /dev/null +++ b/project/templates/docs/_base/preview.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} + +{% block title %}Просмотр {{ padeji.rodit }}{% endblock %} + +{% block content %} + {% url url_prefix|add:'list' as url_list %} + {% url url_prefix|add:'delete' id=obj.pk as url_delete %} + + + Вернуться к списку + + +

Просмотр {{ padeji.rodit }}

+ +
+ {% for img in images %} + Страница {{ forloop.conter }} + {% endfor %} +
+
+ +{% endblock %} + +{% block dialogs %} +{% endblock %} + +{% block js %} +{% endblock %}