download pdf, refactor xls

feature/docker
Dmitriy Shesterkin 9 years ago
parent 4dd05235a4
commit cb13aee454
  1. 1
      requirements/base.txt
  2. 5
      src/commons/pdf_tools.py
  3. 1
      src/commons/xls/get_xlwt_style_list.py
  4. 15
      src/commons/xls/useful_tools.py
  5. 12
      src/commons/xls/xls_to_response.py
  6. 33
      src/docs/as_xls/render_to_xls.py
  7. 2
      src/docs/views/ajax.py
  8. 12
      src/docs/views/aktrabot.py
  9. 17
      src/docs/views/aktsverki.py
  10. 3
      src/docs/views/base_views.py
  11. 8
      src/docs/views/dover.py
  12. BIN
      src/xls_templates/aktrabot.xls
  13. BIN
      src/xls_templates/invoice.xls
  14. BIN
      stamp.png

@ -71,3 +71,4 @@ envvars==0.3.0
psycopg2==2.6
django-redis==4.8.0
redis==2.10.5
trans==2.1.0

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from io import BytesIO
from trans import trans
from xhtml2pdf import pisa
from django.template.loader import render_to_string
@ -12,6 +12,9 @@ def pdf_to_response(content, filename=None):
"""Выводит content в django.http.HttpResponse, который и возвращает."""
response = HttpResponse(content, content_type='application/pdf')
if filename:
filename = filename.replace('"', "''")
filename = filename.replace('', 'N')
filename = trans(filename)
response['Content-Disposition'] = ('attachment; filename="{}"'.format(filename))
return response

@ -1,5 +1,6 @@
import xlwt
def get_xlwt_style_list(rdbook):
wt_style_list = []
for rdxf in rdbook.xf_list:

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
def copy_cells(src_sheet, dst_sheet, style_list,
row_from=0, row_to=None, dst_row_shift=0,
col_from=0, col_to=None, dst_col_shift=0):
@ -11,8 +12,8 @@ def copy_cells(src_sheet, dst_sheet, style_list,
row_to = row_to or src_sheet.nrows-1
col_to = col_to or src_sheet.ncols-1
for row in xrange(row_from, row_to+1):
for col in xrange(col_from, col_to+1):
for row in range(row_from, row_to+1):
for col in range(col_from, col_to+1):
cell = src_sheet.cell(row, col)
# скопировать контент и стиль ячейки
dst_sheet.write(
@ -36,7 +37,7 @@ def height_rows(src_sheet, dst_sheet,
"""Задать в диапазоне строк [row_from, row_to] высоту как в исходном листе.
"""
row_to = row_to or src_sheet.nrows-1
for row in xrange(row_from, row_to+1):
for row in range(row_from, row_to+1):
src_rowinfo = src_sheet.rowinfo_map.get(row)
if src_rowinfo:
dst_sheet.row(row+dst_row_shift).height = src_rowinfo.height
@ -88,7 +89,7 @@ def width_cols(src_sheet, dst_sheet, col_from=0, col_to=None, dst_col_shift=0):
как в исходном листе.
"""
col_to = col_to or src_sheet.ncols-1
for col in xrange(col_from, col_to+1):
for col in range(col_from, col_to+1):
dst_sheet.col(col+dst_col_shift).width = (
src_sheet.computed_column_width(col))
@ -111,7 +112,7 @@ def clone_row(src_sheet, dst_sheet, style_list,
Размножить n_times раз строку из исходного листа, с сохранением стилей
форматирования.
"""
for offset in xrange(n_times+1):
for offset in range(n_times+1):
copy_cells(src_sheet, dst_sheet, style_list,
row_from=src_row, row_to=src_row,
dst_row_shift=dst_row_shift+offset)
@ -141,7 +142,7 @@ def sum_src_heights(src_sheet, row_from, row_to):
исходного листа.
"""
result = 0
for row in xrange(row_from, row_to+1):
for row in range(row_from, row_to+1):
src_rowinfo = src_sheet.rowinfo_map.get(row)
if src_rowinfo:
result += src_rowinfo.height
@ -153,6 +154,6 @@ def sum_dst_heights(dst_sheet, row_from, row_to):
на новом листе.
"""
result = 0
for row in xrange(row_from, row_to+1):
for row in range(row_from, row_to+1):
result += dst_sheet.row(row).height
return result

@ -1,12 +1,14 @@
# -*- coding: utf-8 -*-
from trans import trans
from django.http import HttpResponse
def xls_to_response(content, filename=None, filename_encode='windows-1251'):
def xls_to_response(content, filename=None):
"""Выводит content в django.http.HttpResponse, который и возвращает."""
response = HttpResponse(content, mimetype='application/ms-excel')
response = HttpResponse(content, content_type='application/ms-excel')
if filename:
if filename_encode:
filename = filename.encode(filename_encode)
response['Content-Disposition'] = ('attachment; filename="%s"' % filename.replace('"', "''"))
filename = filename.replace('"', "''")
filename = filename.replace('', 'N')
filename = trans(filename)
response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
return response

@ -2,11 +2,7 @@
import os
import re
import math
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
from io import BytesIO
import xlrd
import xlwt
@ -52,14 +48,14 @@ def render_xls_to_string(request, xls_template, dictionary=None):
# настройки
xls_settings = get_settings(src_book)
apply_page_settings(dst_sheet, xls_settings)
# import ipdb;ipdb.set_trace()
# заполнить данными
fill_xls(request, dictionary, src_sheet, dst_sheet, style_list,
xls_settings)
# закрыть исходную книгу и сохранить созданную
src_book.release_resources()
f=StringIO()
f = BytesIO()
dst_book.save(f)
xls_content = f.getvalue()
f.close()
@ -104,10 +100,10 @@ def fill_xls(request, dictionary, src_sheet, dst_sheet, style_list, xls_settings
row_to = row_to or src_sheet.nrows-1
col_to = col_to or src_sheet.ncols-1
for row in xrange(row_from, row_to+1):
for row in range(row_from, row_to+1):
cmd_fix_height = []
for col in xrange(col_from, col_to+1):
for col in range(col_from, col_to+1):
cell = src_sheet.cell(row, col)
cell_value = new_value = cell.value
@ -116,7 +112,7 @@ def fill_xls(request, dictionary, src_sheet, dst_sheet, style_list, xls_settings
cmd_draw_thin_bottom_border = False
# если в ячейке не строка - пропускаем
if not isinstance(new_value, unicode):
if not isinstance(new_value, str):
continue
# поискать шаблонные теги и переменные в ячейке
@ -149,7 +145,7 @@ def fill_xls(request, dictionary, src_sheet, dst_sheet, style_list, xls_settings
new_value = new_value.replace(u'@@FIX_HEIGHT@@', u'')
cmd_fix_height.append({
'col': col,
'value': unicode(new_value),
'value': new_value,
})
if new_value != cell_value:
@ -201,7 +197,7 @@ def fill_xls(request, dictionary, src_sheet, dst_sheet, style_list, xls_settings
for r1,r2,c1,c2 in src_sheet.merged_cells:
if r1 != row or c1 != fh['col']:
continue
for colx in xrange(c1, c2):
for colx in range(c1, c2):
width += src_sheet.computed_column_width(colx)
else:
break
@ -410,24 +406,21 @@ def fill_xls(request, dictionary, src_sheet, dst_sheet, style_list, xls_settings
def get_settings(src_book, sheet_name=u'settings'):
"""Загрузить настройки с листа settings."""
settings = {}
# import ipdb;ipdb.set_trace()
try:
src_sheet = src_book.sheet_by_name(sheet_name)
except xlrd.XLRDError:
return settings
for row in xrange(src_sheet.nrows):
for row in range(src_sheet.nrows):
key_cell = src_sheet.cell(row, 0).value
if key_cell:
key_name = unicode(key_cell).strip()
# import ipdb;ipdb.set_trace()
key_name = key_cell.strip()
if not key_name.startswith(u'#'):
val_cell = src_sheet.cell(row, 1).value
if (isinstance(val_cell, unicode) or
isinstance(val_cell, str)):
settings[key_name] = unicode(val_cell)
else:
if isinstance(val_cell, float) or isinstance(val_cell, int):
settings[key_name] = val_cell
return settings

@ -9,7 +9,7 @@ from django.core import serializers
from django.db.models.loading import get_model
from django.views.decorators.csrf import csrf_protect
from ..models import Invoice
from docs.models import Invoice
from customer.utils import raise_if_no_profile

@ -1,13 +1,13 @@
# -*- coding: utf-8 -*-
from decimal import Decimal
from ..models import AktRabot, AktRabotItem
from ..forms import AktRabotForm, AktRabotItemForm
from ..filters import AktRabotFilterSet
from .. import utils
from docs.models import AktRabot, AktRabotItem
from docs.forms import AktRabotForm, AktRabotItemForm
from docs.filters import AktRabotFilterSet
from docs import utils
from .base_views import BaseItemsViews
from .mixins import AddByInvoiceMethodMixin
from docs.views.base_views import BaseItemsViews
from docs.views.mixins import AddByInvoiceMethodMixin
class AktRabotViews(BaseItemsViews, AddByInvoiceMethodMixin):

@ -3,11 +3,11 @@ from decimal import Decimal
from customer.forms import ClientsListForm
from ..models import AktSverki, AktSverkiItem
from ..forms import AktSverkiForm, AktSverkiItemForm
from ..filters import AktSverkiFilterSet
from docs.models import AktSverki, AktSverkiItem
from docs.forms import AktSverkiForm, AktSverkiItemForm
from docs.filters import AktSverkiFilterSet
from .base_views import BaseItemsViews
from docs.views.base_views import BaseItemsViews
class AktSverkiViews(BaseItemsViews):
@ -86,11 +86,14 @@ class AktSverkiViews(BaseItemsViews):
obj.sum_debit += item.debit
obj.sum_credit += item.credit
if obj.sum_debit == obj.sum_credit: # нет задолженности
if obj.sum_debit == obj.sum_credit:
# нет задолженности
obj.sum_debit = obj.sum_credit = 0
elif obj.sum_debit > obj.sum_credit: # задолженность нам
elif obj.sum_debit > obj.sum_credit:
# задолженность нам
obj.sum_debit -= obj.sum_credit
obj.sum_credit = 0
elif obj.sum_debit < obj.sum_credit: # задолженность контрагенту
elif obj.sum_debit < obj.sum_credit:
# задолженность контрагенту
obj.sum_credit -= obj.sum_debit
obj.sum_debit = 0

@ -542,7 +542,8 @@ class BaseViews(object):
initial = {}
client = getattr(self.get_obj(kwargs['id']), 'client', None)
if client:
initial['to'] = client.contact_email # подставить в форму email клиента
# подставить в форму email клиента
initial['to'] = client.contact_email
form = self.EMAIL_FORM_CLASS(initial=initial)
dictionary = {

@ -3,11 +3,11 @@ import datetime
from customer.forms import ClientsListForm
from ..models import Dover, DoverItem
from ..forms import DoverForm, DoverItemForm
from ..filters import DoverFilterSet
from docs.models import Dover, DoverItem
from docs.forms import DoverForm, DoverItemForm
from docs.filters import DoverFilterSet
from .base_views import BaseItemsViews
from docs.views.base_views import BaseItemsViews
class DoverViews(BaseItemsViews):

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 KiB

Loading…
Cancel
Save