2017-01-13 9 views
0

«Обычный способ» отображения данных записи: нажмите кнопку меню, выберите запись в древовидном представлении, и вы увидите вид формы для этой конкретной записи.Показать форму существующего идентификатора после нажатия кнопки меню в odoo 8?

Поскольку у меня есть только одна запись, содержащая графики с высоким графиком, я бы пропустил древовидное представление и после нажатия кнопки меню хотел бы увидеть вид формы этой одной записи, что означает графики.

Я попытался определить только представление формы и отсутствие древовидного изображения, но при нажатии кнопки меню открывается новая запись вместо существующей. Я также искал эту проблему, но не нашел ничего полезного.

Так что любая помощь очень приветствуется. Возможно, есть и другие способы отображения данных/графиков без использования формы.

Вот код до сих пор:

menu.xml

<record model="ir.actions.act_window" id="statistics_action"> 
    <field name="name">Total Data</field> 
    <field name="res_model">reminders.statistics</field> 
    <field name="view_type">form</field> 
    <field name="view_mode">tree,form</field> 
    <field name="domain">[('id', '=', 1)]</field> 
</record> 

<menuitem id="statistics_group" name="Statistics" parent="reminder.main_reminder_menu"/> 
<menuitem id="total_data_menu" name="My Graph" parent="reminder.statistics_group" action="statistics_action"/> 

statistics_view.xml (вид дерева, я хотел бы избежать/пропустить)

<record model="ir.ui.view" id="statistics_tree_view"> 
    <field name="name">reminder_statistics.tree</field> 
    <field name="model">reminders.statistics</field> 
    <field name="arch" type="xml"> 
     <tree edit="false" create="false" delete="false"> 
      <field name="id"/> 
     </tree> 
    </field> 
</record> 

<record model="ir.ui.view" id="statistics_form_view"> 
    <field name="name">reminder_statistics.form</field> 
    <field name="model">reminders.statistics</field> 
    <field name="arch" type="xml"> 
     <form edit="true" create="false" delete="false"> 
      <group string="Title of some Graph"> 
       <field name="some_graph" widget="charts_widget" nolabel="1" chart-type="stacked"/> 
      </group> 
     </form> 
    </field> 
</record> 

Каждый день выполняется задание cron, выполняющее этот метод для получения данных графиков:

reminder_statistics.py

class Stats(models.Model): 
    _name = 'reminders.statistics' 

    some_graph = fields.Text() 

    @api.one 
    def collect_stats_data(self): 
     data = some dictionary (may change every day) 

     graph_data = { 
      "title": { 
       "text": "" 
      }, 
      "xAxis": { 
       "categories": [key for (key, value) in data.items()] 
      }, 
      "yAxis": { 
       "title": { 
        "text": "Total Count" 
       } 
      }, 
      "series": [{ 
       "type": "column", 
       "name": "Total Count", 
       "data": [value for (key, value) in data.items()], 
       "dataLabels": { 
        "enabled": True, 
       } 
      }, 
      ], 
      "tooltip": { 
       "enabled": False 
      } 
     } 

     self.some_graph = json.dumps(graph_data) 

ответ

0

Вы можете передать идентификатор записи, чтобы открыть с действием, установив res_id поле для window action. Однако этот подход является хрупким, если запись не существует.

Лучшим способом сделать это будет создание начальной записи при установке модуля, а затем передать идентификатор этой записи в действие окна с использованием XML-идентификатора записи, например.

data.xml

<data noupdate="1"> 
    <record model="reminders.statistics" id="my_unique_record"> 
     <field name="some_graph">{}</field> 
    </record> 
</data> 

menu.xml

<record model="ir.actions.act_window" id="statistics_ref_action"> 
    <field name="name">Total Data (With XML ID)</field> 
    <field name="res_model">reminders.statistics</field> 
    <field name="view_type">form</field> 
    <field name="view_mode">form,tree</field> 
    <field name="res_id" ref="reminder.my_unique_record"/> 
</record> 

<menuitem id="total_data_menu_with_xml_id" name="My Graph (Using XML ID)" 
      parent="reminder.statistics_group" action="statistics_ref_action"/> 

Еще более динамичный подход будет использовать server action и внутри него искать какой-то существующей записи (например, , самый новый) и вернуть действие окна с найденной записью:

menu.xml

<record model="ir.actions.server" id="statistics_server_action"> 
    <field name="name">Statistics Server Action</field> 
    <field name="model_id" ref="model_reminders_statistics"/> 
    <field name="state">code</field> 
    <field name="code"> 
ids = self.search(cr, user.id, [], order='create_date desc', limit=1, context=context) 
action = { 
    "name": "Total Data (From Server Action)", 
    "type": "ir.actions.act_window", 
    "view_type": "form", 
    "view_mode": "form,tree", 
    "res_model": self._name, 
    "res_id": ids and ids[0] or None, 
} 
    </field> 
</record> 

<menuitem id="total_data_menu_server_action" name="My Graph (Using a Server Action)" 
      parent="reminder.statistics_group" action="statistics_server_action"/> 
+0

Я использовал действие сервера, и он работает как шарм! Я думал об использовании действия сервера, но не знал, как его объединить с действием окна. Так что еще раз спасибо за ваш ответ и за то, что научили меня чему-то новому! – gve

+0

'ValueError: :" name 'self' не определен "при оценке'. Где мы можем получить это' self' здесь в поле зрения ... У меня есть модель 'xx.yy' и я попробовал 'model_xx_yy', потому что я определил модель в коде, я не могу получить ее внешний идентификатор. Просто попытался следовать вашему стилю – Sami