186 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
# -*- encoding: utf-8 -*-
 | 
						|
##############################################################################
 | 
						|
#
 | 
						|
#    Copyright (c) 2013 ZestyBeanz Technologies Pvt. Ltd.
 | 
						|
#    (http://wwww.zbeanztech.com)
 | 
						|
#    contact@zbeanztech.com
 | 
						|
#    prajul@zbeanztech.com
 | 
						|
#
 | 
						|
#    This program is free software: you can redistribute it and/or modify
 | 
						|
#    it under the terms of the GNU General Public License as published by
 | 
						|
#    the Free Software Foundation, either version 3 of the License, or
 | 
						|
#    (at your option) any later version.
 | 
						|
#
 | 
						|
#    This program is distributed in the hope that it will be useful,
 | 
						|
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
#    GNU General Public License for more details.
 | 
						|
#
 | 
						|
#    You should have received a copy of the GNU General Public License
 | 
						|
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
#
 | 
						|
##############################################################################
 | 
						|
 | 
						|
try:
 | 
						|
    import json
 | 
						|
except ImportError:
 | 
						|
    import simplejson as json
 | 
						|
import openerp.addons.web.http as openerpweb
 | 
						|
from openerp.addons.web.controllers.main import ExcelExport
 | 
						|
from openerp.addons.web.controllers.main import Export
 | 
						|
import re
 | 
						|
from cStringIO import StringIO
 | 
						|
from lxml  import etree
 | 
						|
import trml2pdf
 | 
						|
import time, os
 | 
						|
import locale
 | 
						|
import openerp.tools as tools
 | 
						|
try:
 | 
						|
    import xlwt
 | 
						|
except ImportError:
 | 
						|
    xlwt = None
 | 
						|
 | 
						|
class ZbExcelExport(ExcelExport):
 | 
						|
    _cp_path = '/web/export/zb_excel_export'
 | 
						|
 | 
						|
    def from_data(self, fields, rows):
 | 
						|
        workbook = xlwt.Workbook()
 | 
						|
        worksheet = workbook.add_sheet('Sheet 1')
 | 
						|
        style = xlwt.easyxf('align: wrap yes')
 | 
						|
        font = xlwt.Font()
 | 
						|
        font.bold = True
 | 
						|
        style.font = font
 | 
						|
        ignore_index = []
 | 
						|
        count = 0
 | 
						|
        for i, fieldname in enumerate(fields):
 | 
						|
            if fieldname.get('header_data_id', False):
 | 
						|
                field_name = fieldname.get('header_name', '')
 | 
						|
                worksheet.write(0, i-count, field_name, style)
 | 
						|
                worksheet.col(i).width = 8000
 | 
						|
            else:
 | 
						|
                count += 1
 | 
						|
                ignore_index.append(i)
 | 
						|
        style = xlwt.easyxf('align: wrap yes')
 | 
						|
        bold_style = xlwt.easyxf('align: wrap yes')
 | 
						|
        font = xlwt.Font()
 | 
						|
        font.bold = True
 | 
						|
        bold_style.font = font
 | 
						|
        for row_index, row in enumerate(rows):
 | 
						|
            count = 0
 | 
						|
            for cell_index, cell_value in enumerate(row):
 | 
						|
                if cell_index not in ignore_index:
 | 
						|
                    cell_style = style
 | 
						|
                    if cell_value.get('bold', False):
 | 
						|
                        cell_style = bold_style
 | 
						|
                    cellvalue = cell_value.get('data', '')
 | 
						|
                    if isinstance(cellvalue, basestring):
 | 
						|
                        cellvalue = re.sub("\r", " ", cellvalue)
 | 
						|
                    if cell_value.get('number', False) and cellvalue:
 | 
						|
                        cellvalue = float(cellvalue)
 | 
						|
                    if cellvalue is False: cellvalue = None
 | 
						|
                    worksheet.write(row_index + 1, cell_index - count, cellvalue, cell_style)
 | 
						|
                else:
 | 
						|
                    count += 1
 | 
						|
        fp = StringIO()
 | 
						|
        workbook.save(fp)
 | 
						|
        fp.seek(0)
 | 
						|
        data = fp.read()
 | 
						|
        fp.close()
 | 
						|
        return data
 | 
						|
    
 | 
						|
    @openerpweb.httprequest
 | 
						|
    def index(self, req, data, token):
 | 
						|
        data = json.loads(data)
 | 
						|
        return req.make_response(
 | 
						|
            self.from_data(data.get('headers', []), data.get('rows', [])),
 | 
						|
                           headers=[
 | 
						|
                                    ('Content-Disposition', 'attachment; filename="%s"'
 | 
						|
                                        % data.get('model', 'Export.xls')),
 | 
						|
                                    ('Content-Type', self.content_type)
 | 
						|
                                    ],
 | 
						|
                                 cookies={'fileToken': token}
 | 
						|
                                 )
 | 
						|
 | 
						|
class ExportPdf(Export):
 | 
						|
    _cp_path = '/web/export/zb_pdf'
 | 
						|
    fmt = {
 | 
						|
        'tag': 'pdf',
 | 
						|
        'label': 'PDF',
 | 
						|
        'error': None
 | 
						|
    }
 | 
						|
    
 | 
						|
    @property
 | 
						|
    def content_type(self):
 | 
						|
        return 'application/pdf'
 | 
						|
    
 | 
						|
    def filename(self, base):
 | 
						|
        return base + '.pdf'
 | 
						|
    
 | 
						|
    def from_data(self, uid, fields, rows, company_name):
 | 
						|
        pageSize=[210.0,297.0]
 | 
						|
        new_doc = etree.Element("report")
 | 
						|
        config = etree.SubElement(new_doc, 'config')
 | 
						|
        def _append_node(name, text):
 | 
						|
            n = etree.SubElement(config, name)
 | 
						|
            n.text = text
 | 
						|
        _append_node('date', time.strftime(str(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y'))))
 | 
						|
        _append_node('PageSize', '%.2fmm,%.2fmm' % tuple(pageSize))
 | 
						|
        _append_node('PageWidth', '%.2f' % (pageSize[0] * 2.8346,))
 | 
						|
        _append_node('PageHeight', '%.2f' %(pageSize[1] * 2.8346,))
 | 
						|
        _append_node('PageFormat', 'a4')
 | 
						|
        _append_node('header-date', time.strftime(str(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y'))))
 | 
						|
        _append_node('company', company_name)
 | 
						|
        l = []
 | 
						|
        t = 0
 | 
						|
        temp = []
 | 
						|
        tsum = []
 | 
						|
        skip_index = []
 | 
						|
        header = etree.SubElement(new_doc, 'header')
 | 
						|
        i = 0
 | 
						|
        for f in fields:
 | 
						|
            if f.get('header_data_id', False):
 | 
						|
                value = f.get('header_name', "")
 | 
						|
                field = etree.SubElement(header, 'field')
 | 
						|
                field.text = tools.ustr(value)
 | 
						|
            else:
 | 
						|
                skip_index.append(i)
 | 
						|
            i += 1
 | 
						|
        lines = etree.SubElement(new_doc, 'lines')
 | 
						|
        for row_lines in rows:
 | 
						|
            node_line = etree.SubElement(lines, 'row')
 | 
						|
            j = 0
 | 
						|
            for row in row_lines:
 | 
						|
                if not j in skip_index:
 | 
						|
                    para = "yes"
 | 
						|
                    tree = "no"
 | 
						|
                    value = row.get('data', '')
 | 
						|
                    if row.get('bold', False):
 | 
						|
                        para = "group"
 | 
						|
                    if row.get('number', False):
 | 
						|
                        tree = "float"
 | 
						|
                    col = etree.SubElement(node_line, 'col', para=para, tree=tree)
 | 
						|
                    col.text = tools.ustr(value)
 | 
						|
                j += 1
 | 
						|
        transform = etree.XSLT(
 | 
						|
            etree.parse(os.path.join(tools.config['root_path'],
 | 
						|
                                     'addons/base/report/custom_new.xsl')))
 | 
						|
        rml = etree.tostring(transform(new_doc))
 | 
						|
        self.obj = trml2pdf.parseNode(rml, title='Printscreen')
 | 
						|
        return self.obj
 | 
						|
 | 
						|
class ZbPdfExport(ExportPdf):
 | 
						|
    _cp_path = '/web/export/zb_pdf_export'
 | 
						|
    
 | 
						|
    @openerpweb.httprequest
 | 
						|
    def index(self, req, data, token):
 | 
						|
        data = json.loads(data)
 | 
						|
        uid = data.get('uid', False)
 | 
						|
        return req.make_response(self.from_data(uid, data.get('headers', []), data.get('rows', []),
 | 
						|
                                                data.get('company_name','')),
 | 
						|
                                 headers=[('Content-Disposition',
 | 
						|
                                           'attachment; filename=PDF Export'),
 | 
						|
                                          ('Content-Type', self.content_type)])
 | 
						|
#                                  cookies={'fileToken': long(token)})
 | 
						|
 | 
						|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 |