2016-11-24 3 views
1

사용자 정의 모델 'product_images.product_image'에 대한 Odoo 게시 워크 플로를 구현하려고합니다.Odoo의 워크 플로 모델의 상태

내 모델은 다음과 같이 :

# product_images/models/models.py 
# -*- coding: utf-8 -*- 
from odoo import models, fields, api, tools 

class PublishingStatus(models.Model): 
    _name = 'product_images.publishing_status' 
    _description = 'Publishing status' 

    name = fields.Char(string="Name") 
    slug = fields.Char(string="Slug") 


class ProductImage(models.Model): 
    _name = 'product_images.product_image' 
    _description = 'Product image' 

    name = fields.Char(string="Alternative text") 
    product_id = fields.Many2one('product.product', string='Product', ondelete='set null', index=True) 
    original_image = fields.Binary(string='Original image') 

    @api.model 
    def _get_default_state(self): 
     return self.env['product_images.publishing_status'].search([['slug', '=', 'draft']]) 

    @api.model 
    def _get_all_states(self, groups, domain, order): 
     state_ids = self.env['product_images.publishing_status'].search([]) 
     return state_ids 

    state_id = fields.Many2one(
     'product_images.publishing_status', 
     string='Publishing status', 
     default=_get_default_state, 
     group_expand='_get_all_states', 
    ) 

    @api.multi 
    def action_set_to_draft(self): 
     self.state_id = self.env['product_images.publishing_status'].search([['slug', '=', 'draft']]) 

    @api.multi 
    def action_request_for_approval(self): 
     self.state_id = self.env['product_images.publishing_status'].search([['slug', '=', 'pending']]) 

    @api.multi 
    def action_approve(self): 
     self.state_id = self.env['product_images.publishing_status'].search([['slug', '=', 'approved']]) 

    @api.multi 
    def action_reject(self): 
     self.state_id = self.env['product_images.publishing_status'].search([['slug', '=', 'rejected']]) 

가 그럼 난 게시 상태에 대한 일부 데이터 기록이 :

<!-- product_images/data/data.xml --> 
<odoo> 
    <data> 
     <!-- explicit list view definition --> 
     <record model="product_images.publishing_status" id="product_images.publishing_status_draft"> 
      <field name="name">Draft</field> 
      <field name="slug">draft</field> 
     </record> 
     <record model="product_images.publishing_status" id="product_images.publishing_status_pending"> 
      <field name="name">Pending</field> 
      <field name="slug">pending</field> 
     </record> 
     <record model="product_images.publishing_status" id="product_images.publishing_status_approved"> 
      <field name="name">Approved</field> 
      <field name="slug">approved</field> 
     </record> 
     <record model="product_images.publishing_status" id="product_images.publishing_status_rejected"> 
      <field name="name">Rejected</field> 
      <field name="slug">rejected</field> 
     </record> 
    </data> 
</odoo> 
나는 또한 사이를 전환 할 수있는 워크 플로를 만들 몇 가지 기록이

게시 상태 :

<odoo> 
    <data> 
     <record model="workflow" id="product_images.wkf_image_publishing"> 
      <field name="name">Product Image Publishing Workflow</field> 
      <field name="osv">product_images.product_image</field> 
      <field name="on_create">True</field> 
     </record> 

     <record model="workflow.activity" id="product_images.wkf_activity_draft"> 
      <field name="name">Draft</field> 
      <field name="wkf_id" ref="product_images.wkf_image_publishing" /> 
      <field name="flow_start" eval="True" /> 
      <field name="kind">function</field> 
      <field name="action">action_set_to_draft()</field> 
     </record> 
     <record model="workflow.activity" id="product_images.wkf_activity_pending"> 
      <field name="name">Pending</field> 
      <field name="wkf_id" ref="product_images.wkf_image_publishing" /> 
      <field name="kind">function</field> 
      <field name="action">action_request_for_approval()</field> 
     </record> 
     <record model="workflow.activity" id="product_images.wkf_activity_approved"> 
      <field name="name">Approved</field> 
      <field name="wkf_id" ref="product_images.wkf_image_publishing" /> 
      <field name="flow_stop" eval="True" /> 
      <field name="kind">function</field> 
      <field name="action">action_approve()</field> 
     </record> 
     <record model="workflow.activity" id="product_images.wkf_activity_rejected"> 
      <field name="name">Rejected</field> 
      <field name="wkf_id" ref="product_images.wkf_image_publishing" /> 
      <field name="flow_stop" eval="True" /> 
      <field name="kind">function</field> 
      <field name="action">action_reject()</field> 
     </record> 

     <record model="workflow.transition" id="product_images.wkf_transition_draft_to_pending"> 
      <field name="act_from" ref="product_images.wkf_activity_draft" /> 
      <field name="act_to" ref="product_images.wkf_activity_pending" /> 
      <field name="condition">name != "" and original_image != ""</field> 
      <field name="signal">pending</field> 
     </record> 
     <record model="workflow.transition" id="product_images.wkf_transition_pending_to_draft"> 
      <field name="act_from" ref="product_images.wkf_activity_pending" /> 
      <field name="act_to" ref="product_images.wkf_activity_draft" /> 
      <field name="signal">draft</field> 
     </record> 
     <record model="workflow.transition" id="product_images.wkf_transition_pending_to_approved"> 
      <field name="act_from" ref="product_images.wkf_activity_pending" /> 
      <field name="act_to" ref="product_images.wkf_activity_approved" /> 
      <field name="signal">approve</field> 
     </record> 
     <record model="workflow.transition" id="product_images.wkf_transition_pending_to_rejected"> 
      <field name="act_from" ref="product_images.wkf_activity_pending" /> 
      <field name="act_to" ref="product_images.wkf_activity_rejected" /> 
      <field name="signal">reject</field> 
     </record> 
    </data> 
</odoo> 

이제 가장 진부한 부분! 워크 플로 상태와 현재 활성 상태를 나타내는 상태 표시 줄 사이를 전환하는 단추가있는 양식이 필요합니다. 내가 가진

<record model="ir.ui.view" id="product_images.form"> 
     <field name="name">Product Image</field> 
     <field name="model">product_images.product_image</field> 
     <field name="arch" type="xml"> 
      <form> 
       <header> 
        <!-- 
        <button name="draft" 
          type="workflow" 
          string="Set to draft" 
          attrs="{'invisible': [('state_id.slug','not in',['pending'])]}" 
        /> 
        <button name="pending" 
          type="workflow" 
          string="Request for approval" 
          attrs="{'invisible': [('state_id.slug','not in',['draft'])]}" 
        /> 
        <button name="approve" 
          type="workflow" 
          string="Approve" 
          attrs="{'invisible': [('state_id.slug','not in',['pending'])]}" 
          class="oe_highlight" 
        /> 
        <button name="reject" 
          type="workflow" 
          string="Reject" 
          attrs="{'invisible': [('state_id.slug','not in',['pending'])]}" 
          class="oe_highlight" 
        /> 
        --> 
        <field name="state_id" widget="statusbar" /> 
       </header> 

       <sheet> 
        <group> 
         <field name="product_id" /> 
         <field name="name" string="Alternative text" /> 
         <field name="original_image" widget="image" class="oe_avatar" /> 
         <field name="state_id" /> 
        </group> 
       </sheet> 
      </form> 
     </field> 
    </record> 

문제점 :

  1. 상태 표시 줄이 표시되어 있지만, 현재의 게시 상태가 활성화되지 않은 이것은 내가 뭘하려합니다. 나는 무엇을 놓치고

Uncaught Error: Unknown field state_id.slug in domain [["state_id.slug","not in",["pending"]]]

: 나는 버튼을 주석 처리를 제거하면

  • , 그들은 잘못된 도메인에 대한 오류를 던져?

  • 답변

    1

    도메인 속성에서 우리는 왼쪽에 parent 필드를 사용할 수 없습니다. 귀하의 경우 관련 분야를 추가해야합니다. 예를 들어

    : 이보기 파일 <button>

    <field name="slug" invisible="1"/> 
    

    이제 주석 코드에을 STATE_ID 후

    class ProductImage(models.Model): 
        _name = 'product_images.product_image' 
    
        slug = fields.Char(related='state_id.slug', string='Slug', store=True) 
    

    슬러그 필드를 넣습니다.

    그런 다음 Odoo 서버를 다시 시작하고 사용자 정의 모듈을 업그레이드하십시오.

    +1

    감사합니다. 그것은 효과가 있었다. 이 단추를 다음과 같이 수정해야했습니다.

    +0

    예. 맞습니다. * state_id.slug * in * 버튼 attrs * 필요가 없습니다. –