2016-09-09 8 views
0

Ниже приведен код функции я использую для отчета печати от мастера ..Получение проблема с печатью Qweb-отчета в odoo v8

class manager_monthly_salary_report_wizard(osv.osv_memory): 
    _name = "manager.monthly.salary.report.wizard" 

    _columns = { 
     'month': fields.integer("Month"), 
     'year': fields.integer("Year"), 
    } 

    def check_report(self, cr, uid, ids, context=None): 
     print "context -> ", context 
     print "ids -> ", ids 

     if context is None: 
      context = {} 

     self_read = self.read(cr, uid, ids)[0] 

     if (self_read['month'] >= 12 or self_read['month'] <= 0) and len(str(self_read['year'])) != 4: 
      raise osv.except_osv(_("Warning"), 
           _("You have invalid month/year ! please select correct one ... ")) 
     else: 
      print "working normally ... " 

     if self_read['month'] in [1, 2, 3, 4, 5, 6, 7, 8, 9]: 
      month_year = str("0" + str(self_read['month']) or self_read['month']) 
     elif self_read['month'] in [10, 11, 12]: 
      month_year = str(self_read['month']) 

     month_year = month_year + " - " + str(self_read['year']) 
     print "month_year ", month_year 

     departments = [] 
     office_staff = [] 

     for deprt in first_level_department_brws: 
      office_staff_ids = empl_obj.search(cr, uid, [('department_id', '=', deprt.id), '|', ('manager', '=', True), ('office_staff', '=', True)]) 
      office_staff_brw = empl_obj.browse(cr, uid, office_staff_ids) 
      print " office_staff_brw ", office_staff_brw 

      department = { 
       'name': deprt.name, 
       'office_staff': office_staff 
      } 
      for dep_employee in office_staff_brw: 

       office_staff.append({ 
        'name': dep_employee.name,... 
       }) 
       department['office_staff'] = office_staff 
       print "office_staff -> ", office_staff 

      office_staff = [] 
      departments.append(department) 
      print "Departments-> ", office_staff 
      department = {} 
      print "\n" 

     data = { 
      'ids': context.get('active_ids', []), 
      'model': context.get('active_model', 'ir.ui.menu'), 
      'form': departments 
     } 
     print "data -> ", data 
     print "__end__\n\n" 

     return self.pool['report'].get_action(cr, uid, [], 'custom_module.my_report', data=data, context=context) 

THe файл XML выглядит отчет ..

<?xml version="1.0" encoding="utf-8"?> 
<openerp> 
    <data> 
     <template id="my_report"> 
      <t t-call="report.html_container"> 
       <div class="page"> 
        <!--header --> 
        <!--<t t-call="report.internal_layout">--> 
        <!--content--> 

        <div class="row"> 
         <span >"====="</span> 
         <span t-esc="Departments"/> 
         <t t-esc="data"/> 

         <t t-set="model" t-value="data['model']"/> 
         <t t-set="data" t-value="data['form']"/> 
         <t t-esc="data"/> 
         <span >"++++++"</span> 
        </div> 
       </div> 
      </t> 
     </template> 
    </data> 
</openerp> 

Если departmens в данных [ «форма»] представляет собой тип словаря, я был в состоянии напечатать, но теперь я изменил в список, и я ма получаю ниже ошибки при печати отчета о

Traceback (most recent call last): 
    File "/home/demo/project/odoo/odoo_8/addons/report/controllers/main.py", line 120, in report_download 
    response = self.report_routes(reportname, converter='pdf', **dict(data)) 
    File "/home/demo/project/odoo/odoo_8/openerp/http.py", line 410, in response_wrap 
    response = f(*args, **kw) 
    File "/home/demo/project/odoo/odoo_8/addons/report/controllers/main.py", line 65, in report_routes 
    pdf = report_obj.get_pdf(cr, uid, docids, reportname, data=options_data, context=context) 
    File "/home/demo/project/odoo/odoo_8/openerp/api.py", line 268, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/demo/project/odoo/odoo_8/addons/report/models/report.py", line 192, in get_pdf 
    html = self.get_html(cr, uid, ids, report_name, data=data, context=context) 
    File "/home/demo/project/odoo/odoo_8/openerp/api.py", line 268, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/demo/project/odoo/odoo_8/addons/report/models/report.py", line 167, in get_html 
    return particularreport_obj.render_html(cr, uid, ids, data=data, context=context) 
    File "/home/demo/project/odoo/odoo_8/openerp/api.py", line 268, in wrapper 
    return old_api(self, *args, **kwargs) 
    File "/home/demo/project/odoo/odoo_8/addons/report/models/abstract_report.py", line 35, in render_html 
    if data and data.get('form', {}).get('landscape'): 
AttributeError: 'list' object has no attribute 'get' 

обновление в ру кода

Я только что изменил на

data = { 
     'ids': context.get('active_ids', []), 
     'model': context.get('active_model', 'ir.ui.menu'), 
     'form': {'departments': departments} 
    } 

и отчет становится печататься .... Вопрос в том, почему они не могут непосредственно печатать отчет, если я использую

data = { 
     'ids': context.get('active_ids', []), 
     'model': context.get('active_model', 'ir.ui.menu'), 
     'form': departments 
    } 

список вместо dict в data['form'] ... ??

ответ

0

Я не уверен, однако, я думаю, что существует конфликт в использовании вами данных ['form']. Он упоминается в файле abstract_report.py, на который ссылается ваша ошибка. Если вы следуете документации для Odoo Reports, они описывают переопределение функции render_html следующим образом. Вместо использования данных ['form'] в вашем qweb попытайтесь использовать отделы напрямую, поскольку переменная должна быть доступна.

class MyReport(models.AbstractModel): 
    _name = 'report.custom_module.my_report' 

    @api.multi 
    def render_html(self, data=None): 
     departments = [] 
     office_staff = [] 

     for deprt in first_level_department_brws: 
      office_staff_ids = empl_obj.search(cr, uid, [('department_id', '=', deprt.id), '|', ('manager', '=', True), ('office_staff', '=', True)]) 
      office_staff_brw = empl_obj.browse(cr, uid, office_staff_ids) 
      print " office_staff_brw ", office_staff_brw 

      department = { 
       'name': deprt.name, 
       'office_staff': office_staff 
      } 

      for dep_employee in office_staff_brw: 
       office_staff.append({ 
        'name': dep_employee.name, ... 
       }) 

      department['office_staff'] = office_staff 
      print "office_staff -> ", office_staff 

      office_staff = [] 
      departments.append(department) 
      print "Departments-> ", office_staff 
      department = {} 

     report = self.env['report']._get_report_from_name('custom_addon.my_report') 
     docs = self.env['custom_addon.model_name'].browse(context.get('active_ids', [])) 

     docargs = { 
      'doc_model': report.model, 
      'docs': docs, 
      'departments': departments 
     } 
     return report_obj.render('custom_addon.my_report', docargs) 

Попробуйте определить другой varwe var var var или что-нибудь еще, кроме данных. Есть несколько ссылок на данные, и мне интересно, есть ли конфликт. Ваш оригинальный метод не выглядит совершенно неправильным, но использование имен переменных, которые odoo уже использует, таких как данные и форма, может быть конфликтом. Если вы посмотрите на /addons/report/abstract_report.py, вы заметите, что они используют данные ['form'], но это не похоже на то, что вы передаете как форму. Они пытаются определить, является ли форма ландшафтной или нет, а ваши данные ['form'], по-видимому, связаны с записями, для которых вы создаете отчет. Не макет отчета.

<?xml version="1.0" encoding="utf-8"?> 
<openerp> 
    <data> 
     <template id="my_report"> 
      <t t-call="report.html_container"> 
       <div class="page"> 
        <!--header --> 
        <!--<t t-call="report.internal_layout">--> 
        <!--content--> 

        <div class="row"> 
         <span >"====="</span> 
         <span>Departments</span> 
         <t t-raw="departments"/> 

         <span >"++++++"</span> 
        </div> 
       </div> 
      </t> 
     </template> 
    </data> 
</openerp> 
+0

Спасибо, но это то, что мой формат 'данных = { 'форма': [{ 'а': 1, 'Ь': [{..}]}, { 'а': 1 , 'b': [{..}]}, ..] ' , и в отчете я просто попытался напечатать' data ['form'] ', который является списком, а не доступом к любому элементу ... 't t-esc =" data "/> '... с вашим примером Я просто пытаюсь напечатать' form', прежде чем я смогу сделать '... – Bhuro

+0

Используйте t-raw, посмотрите на мое редактирование –

+0

Такая же ошибка ...' -> -> -> -> '... – Bhuro

Смежные вопросы