xMerge branch 'master' of git:~/gitrepos/cam-template
						commit
						e173faba26
					
				|  | @ -0,0 +1,27 @@ | |||
| # -*- 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/>. | ||||
| # | ||||
| ############################################################################## | ||||
| 
 | ||||
| import trml2pdf | ||||
| import controllers | ||||
| 
 | ||||
| # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | ||||
|  | @ -0,0 +1,41 @@ | |||
| # -*- 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/>. | ||||
| # | ||||
| ############################################################################## | ||||
| 
 | ||||
| { | ||||
|     'name': 'Web Printscreen ZB', | ||||
|     'version': '1.0', | ||||
|     'category': 'Web', | ||||
|     'description': """ | ||||
|         Module to export current active tree view in to excel report | ||||
|     """, | ||||
|     'author': 'Zesty Beanz Technologies', | ||||
|     'website': 'http://www.zbeanztech.com', | ||||
|     'depends': ['web'], | ||||
|     'data': ['views/web_printscreen_zb.xml'], | ||||
|     'qweb': ['static/src/xml/web_printscreen_export.xml'], | ||||
|     'installable': True, | ||||
|     'auto_install': False, | ||||
|     'web_preload': False, | ||||
| } | ||||
| 
 | ||||
| # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | ||||
|  | @ -0,0 +1,185 @@ | |||
| # -*- 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: | ||||
|  | @ -0,0 +1,122 @@ | |||
| openerp.web_printscreen_zb = function(instance, m) { | ||||
|      | ||||
|     var _t = instance.web._t; | ||||
|     var QWeb = instance.web.qweb; | ||||
|      | ||||
|     instance.web.ListView.include({ | ||||
|         load_list: function () { | ||||
|             var self = this; | ||||
|             this._super.apply(this, arguments); | ||||
|             self.$pager.find(".oe_list_button_import_excel").unbind('click').click(function(event){self.export_to_excel("excel")}) | ||||
|             self.$pager.find(".oe_list_button_import_pdf").unbind('click').click(function(event){self.export_to_excel("pdf")}) | ||||
|         }, | ||||
|         export_to_excel: function(export_type) { | ||||
|             var self = this | ||||
|             var export_type = export_type | ||||
|             view = this.getParent() | ||||
|             // Find Header Element
 | ||||
|             header_eles = self.$el.find('.oe_list_header_columns') | ||||
|             header_name_list = [] | ||||
|             $.each(header_eles,function(){ | ||||
|                 $header_ele = $(this) | ||||
|                 header_td_elements = $header_ele.find('th') | ||||
|                 $.each(header_td_elements,function(){ | ||||
|                     $header_td = $(this) | ||||
|                     text = $header_td.text().trim() || "" | ||||
|                     data_id = $header_td.attr('data-id') | ||||
|                     if (text && !data_id){ | ||||
|                         data_id = 'group_name' | ||||
|                     } | ||||
|                     header_name_list.push({'header_name': text.trim(), 'header_data_id': data_id}) | ||||
|                    // }
 | ||||
|                 }); | ||||
|             }); | ||||
|              | ||||
|             //Find Data Element
 | ||||
|             data_eles = self.$el.find('.oe_list_content > tbody > tr') | ||||
|             export_data = [] | ||||
|             $.each(data_eles,function(){ | ||||
|                 data = [] | ||||
|                 $data_ele = $(this) | ||||
|                 is_analysis = false | ||||
|                 if ($data_ele.text().trim()){ | ||||
|                 //Find group name
 | ||||
| 	                group_th_eles = $data_ele.find('th') | ||||
| 	                $.each(group_th_eles,function(){ | ||||
| 	                    $group_th_ele = $(this) | ||||
| 	                    text = $group_th_ele.text().trim() || "" | ||||
| 	                    is_analysis = true | ||||
| 	                    data.push({'data': text, 'bold': true}) | ||||
| 	                }); | ||||
| 	                data_td_eles = $data_ele.find('td') | ||||
| 	                $.each(data_td_eles,function(){ | ||||
| 	                    $data_td_ele = $(this) | ||||
| 	                    text = $data_td_ele.text().trim() || "" | ||||
| 	                    if ($data_td_ele && $data_td_ele[0].classList.contains('oe_number') && !$data_td_ele[0].classList.contains('oe_list_field_float_time')){ | ||||
| 	                        text = text.replace('%', '') | ||||
| 	                        text = instance.web.parse_value(text, { type:"float" }) | ||||
| 	                        data.push({'data': text || "", 'number': true}) | ||||
| 	                    } | ||||
| 	                    else{ | ||||
| 	                        data.push({'data': text}) | ||||
| 	                    } | ||||
| 	                }); | ||||
| 	                export_data.push(data) | ||||
|                 } | ||||
|             }); | ||||
|              | ||||
|             //Find Footer Element
 | ||||
|              | ||||
|             footer_eles = self.$el.find('.oe_list_content > tfoot> tr') | ||||
|             $.each(footer_eles,function(){ | ||||
|                 data = [] | ||||
|                 $footer_ele = $(this) | ||||
|                 footer_td_eles = $footer_ele.find('td') | ||||
|                 $.each(footer_td_eles,function(){ | ||||
|                     $footer_td_ele = $(this) | ||||
|                     text = $footer_td_ele.text().trim() || "" | ||||
|                     if ($footer_td_ele && $footer_td_ele[0].classList.contains('oe_number')){ | ||||
|                         text = instance.web.parse_value(text, { type:"float" }) | ||||
|                         data.push({'data': text || "", 'bold': true, 'number': true}) | ||||
|                     } | ||||
|                     else{ | ||||
|                         data.push({'data': text, 'bold': true}) | ||||
|                     } | ||||
|                 }); | ||||
|                 export_data.push(data) | ||||
|             }); | ||||
|              | ||||
|             //Export to excel
 | ||||
|             $.blockUI(); | ||||
|             if (export_type === 'excel'){ | ||||
|                  view.session.get_file({ | ||||
|                      url: '/web/export/zb_excel_export', | ||||
|                      data: {data: JSON.stringify({ | ||||
|                             model : view.model, | ||||
|                             headers : header_name_list, | ||||
|                             rows : export_data, | ||||
|                      })}, | ||||
|                      complete: $.unblockUI | ||||
|                  }); | ||||
|              } | ||||
|              else{ | ||||
|                 console.log(view) | ||||
|                 new instance.web.Model("res.users").get_func("read")(this.session.uid, ["company_id"]).then(function(res) { | ||||
|                     new instance.web.Model("res.company").get_func("read")(res['company_id'][0], ["name"]).then(function(result) { | ||||
|                         view.session.get_file({ | ||||
|                              url: '/web/export/zb_pdf_export', | ||||
|                              data: {data: JSON.stringify({ | ||||
|                                     uid: view.session.uid, | ||||
|                                     model : view.model, | ||||
|                                     headers : header_name_list, | ||||
|                                     rows : export_data, | ||||
|                                     company_name: result['name'] | ||||
|                              })}, | ||||
|                              complete: $.unblockUI | ||||
|                          }); | ||||
|                     }); | ||||
|                 }); | ||||
|              } | ||||
|         }, | ||||
|     }); | ||||
| }; | ||||
|  | @ -0,0 +1,16 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <templates id="template" xml:space="preserve"> | ||||
| <t t-extend="ViewPager"> | ||||
|     <t t-jquery=".oe_pager_value" t-operation="prepend"> | ||||
|         <a t-if="(widget.ViewManager && widget.ViewManager.active_view) === 'list'"  | ||||
|                     class="oe_bold oe_list_button_import_pdf" | ||||
|                     id="button_export_pdf" | ||||
|                     href="#">PDF</a> | ||||
|                     <label t-if="(widget.ViewManager && widget.ViewManager.active_view) === 'list'">or</label> | ||||
|         <a t-if="(widget.ViewManager && widget.ViewManager.active_view) === 'list'"  | ||||
|                     class="oe_bold oe_list_button_import_excel" | ||||
|                     id="button_export_excel" | ||||
|                     href="#">Excel</a> | ||||
|     </t> | ||||
| </t> | ||||
| </templates> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,12 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- vim:fdn=3: | ||||
| --> | ||||
| <openerp> | ||||
|     <data> | ||||
|         <template id="assets_backend" name="web_printscreen_zb assets" inherit_id="web.assets_backend"> | ||||
|             <xpath expr="." position="inside"> | ||||
|                 <script type="text/javascript" src="/web_printscreen_zb/static/src/js/web_printscreen_export.js"></script> | ||||
|             </xpath> | ||||
|         </template> | ||||
|     </data> | ||||
| </openerp> | ||||
|  | @ -75,6 +75,11 @@ class Config(): | |||
|             'group_purchase_pricelist': True,      # Preislisten verwenden | ||||
|         } | ||||
|          | ||||
|         #Einstellungen Lager | ||||
|         self.stock_config = { | ||||
|             'group_stock_multiple_locations': True,      # Verwalten Sie mehrere Läger und Lagerorte | ||||
|         }   | ||||
|          | ||||
|         self.sequences = { | ||||
|             'sale.order':  {  | ||||
|                 'number_next_actual': 2000,  | ||||
|  | @ -122,7 +127,8 @@ class Config(): | |||
|             'cam_custom', | ||||
|             'cam_reports', | ||||
|             'account_cancel', | ||||
|             'cam_invoice_skonto',                                                 | ||||
|             'cam_invoice_skonto', | ||||
|             'web_printscreen_zb',                                                 | ||||
|             #'crm', | ||||
|             #'sale', | ||||
|             #'cam_hr_overtime', | ||||
|  |  | |||
|  | @ -137,7 +137,16 @@ class CamadeusFunctions(): | |||
|         vals = self._execute('sale.config.settings', 'default_get', []) | ||||
|         vals.update(self.config.sale_config) | ||||
|         wizard_id = self._execute('sale.config.settings', 'create', vals) | ||||
|         return self._execute('sale.config.settings', 'execute', [wizard_id])    | ||||
|         return self._execute('sale.config.settings', 'execute', [wizard_id]) | ||||
|      | ||||
|     def stock_config(self): | ||||
|         """Basiskonfiguration für Lager laden""" | ||||
| 
 | ||||
|         if hasattr(self.config, 'stock_config'): | ||||
|             vals = self._execute('stock.config.settings', 'default_get', [])   | ||||
|             vals.update(self.config.stock_config)            | ||||
|             wizard_id = self._execute('stock.config.settings', 'create', vals) | ||||
|             return self._execute('stock.config.settings', 'execute', [wizard_id])    | ||||
|      | ||||
|     def base_config(self): | ||||
|         """Allgemeine Konfiguration laden""" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue