2013-03-25 14 views
5

Ho un campo di selezione (campo di divisione da molti a uno) se seleziono una divisione è necessario caricare i suoi 'dipendenti nella sezione' notebook '. come implementarlo in openerp 7?Come caricare da uno a molti bambini nell'evento onchange?

se ho selezionato il relativo ID dell'immobile poi bisogno di caricare rilevanti divisione divisions.if selezionare poi bisogno di caricare i lavoratori interessati nella successiva fase

<record model="ir.ui.view" id="bpl_work_offer_form"> 
<field name="name">bpl.work.offer.form</field> 
<field name="model">bpl.work.offer</field> 
<field name="arch" type="xml"> 
<form string='bpl_work_offer' version='7.0'> 
<sheet> 

<group> 
    <group> 
     <field name='bpl_estate_id' /> 
     <field name='bpl_division_id' /> 
     <field name='user_id' /> 
    </group> 
    <group> 
     <field name='date_of_offer' /> 
     <field name='payment_type' /> 
     <field name='select_by' /> 
     <field name='no_of_workers' attrs="{'invisible':[('select_by','=','by_name')]}" /> 
     <field name='work_type' /> 

    </group> 
</group> 
<div name="Worker Selection"></div> 
<separator string='Select workers' /> 
<notebook attrs="{'invisible':[('select_by','=','by_count')]}"> 
    <page string="Tea Workers" attrs="{'readonly':[('work_type','!=','tea')]}"> 
     <field name='selected_tea_workers_line_ids' nolabel='1'> 
      <tree string='List' editable='bottom'> 
       <field name='worker_id' /> 
       <field name='is_selected' /> 
      </tree> 
     </field> 
     <group class='oe_subtotal_footer oe_right'> 
      <field name='total_workers' /> 
     </group> 
     <br /> 
     <br /> 
    </page> 
    <page string="Rubber Workers" attrs="{'readonly':[('work_type','!=','rubber')]}"> 
     <field name='selected_rubber_workers_line_ids' nolabel='1'> 
      <tree string='List' editable='bottom'> 
       <field name='worker_id' /> 
       <field name='is_selected' /> 
      </tree> 
     </field> 
     <group class='oe_subtotal_footer oe_right'> 
      <field name='total_workers' /> 
     </group> 
     <br /> 
     <br /> 
    </page> 
    <page string="Sundry Workers" attrs="{'readonly':[('work_type','!=','sundry')]}"> 
     <field name='selected_sundry_workers_line_ids' nolabel='1'> 
      <tree string='List' editable='bottom'> 
       <field name='worker_id' /> 
       <field name='is_selected' /> 
      </tree> 
     </field> 
     <group class='oe_subtotal_footer oe_right'> 
      <field name='total_workers' /> 
     </group> 
     <br /> 
     <br /> 
    </page> 
</notebook> 
</sheet> 
</form> 
</field> 
</record> 

<record model="ir.actions.act_window" id="bpl_work_offer_action"> 
<field name="name">bpl.work.offer.action</field> 
<field name="res_model">bpl.work.offer</field> 
<field name="view_type">form</field> 
<field name="view_mode">form</field> 
</record> 

codice modello

class company_new_registration(osv.osv): 
    _name = "bpl.company.n.registration" 
    _description = "Company" 
    _columns = { 
       'name': fields.char('Company Name', size=128, required=True), 
       'estates': fields.one2many('bpl.estate.n.registration', 'company_id', 'Estate')           
    } 
# Bill of Material 
company_new_registration() 

class estate_new_registration(osv.osv): 
    _name = "bpl.estate.n.registration" 
    _description = "Estates" 
    _columns = { 
     'name': fields.char('Estate Name', size=128, required=True), 
     'company_id': fields.many2one('bpl.company.n.registration', 'Company Name', select=True), 
     'divisions': fields.one2many('bpl.division.n.registration', 'estate_id', 'Division') 
    } 

estate_new_registration() 

class division_new_registration(osv.osv): 
    _name = "bpl.division.n.registration" 
    _description = "Divisions" 
    _columns = { 
     'name': fields.char('Division Name', size=128, required=True), 
     'estate_id': fields.many2one('bpl.estate.n.registration', 'Estate Name', select=True), 
    } 

division_new_registration() 

e necessaria per la mappatura quell'offerta di lavoro (progetto di piantagione)

class bpl_work_offer(osv.osv): 
    _name = "bpl.work.offer" 
    _description = "BPL Work Offer" 
    _columns = { 
     'user_id': fields.many2one('res.users', 'User Name'), 
     'date_of_offer': fields.date('Date'), 
     'bpl_estate_id':fields.many2one('bpl.estate.n.registration', 'Estate', help='Estate'), 
     'bpl_division_id':fields.many2one('bpl.division.n.registration', 'Division', help='Division'), 
     'payment_type': fields.selection([('normal_work', 'Normal Work'), ('cash_work', 'Cash Work')], 'Payment Type'), 
     'select_by': fields.selection([('by_name', 'By Names'), ('by_count', 'By Count')], 'Select By'), 
     'no_of_workers': fields.integer('No of Workers'), 
     'work_type': fields.selection([('tea', 'Tea'), ('rubber', 'Rubber'), ('sundry', 'Sundry')], 'Work Type'), 
     'total_workers': fields.integer('Total Workers'), 
     'selected_tea_workers_line_ids': fields.one2many('bpl.selected.tea.workers.line', 'worker_id', 'Tea Workers', ondelete="cascade"), 
     'selected_rubber_workers_line_ids': fields.one2many('bpl.selected.rubber.workers.line', 'worker_id', 'Rubber Workers', ondelete="cascade"), 
     'selected_sundry_workers_line_ids': fields.one2many('bpl.selected.sundry.workers.line', 'worker_id', 'Sundry Workers', ondelete="cascade"), 
    } 

bpl_work_offer() 

class selected_tea_workers_line_ids(osv.osv): 
    _name = 'bpl.selected.tea.workers.line' 
    _description = 'BPL Selected Tea Workers line' 
    _columns = { 
     'worker_id':fields.many2one('bpl.worker', 'Tea Worker', ondelete='cascade', help='Worker'), 
     'is_selected': fields.boolean('Select', help="Selected or not"), 
     } 

selected_tea_workers_line_ids() 

class selected_rubber_workers_line_ids(osv.osv): 
    _name = 'bpl.selected.rubber.workers.line' 
    _description = 'BPL Selected Rubber Workers line' 
    _columns = { 
     'worker_id':fields.many2one('bpl.worker', 'Rubber Worker', ondelete='cascade', help='Worker'), 
     'is_selected': fields.boolean('Select', help="Selected or not"), 
     } 

selected_rubber_workers_line_ids() 

class selected_sundry_workers_line_ids(osv.osv): 
    _name = 'bpl.selected.sundry.workers.line' 
    _description = 'BPL Selected Sundry Workers line' 
    _columns = { 
     'worker_id':fields.many2one('bpl.worker', 'Sundry Worker', ondelete='cascade', help='Worker'), 
     'is_selected': fields.boolean('Select', help="Selected or not"), 
     } 

selected_sundry_workers_line_ids() 
+0

prego ci mostra il codice è scritto in modo che possiamo aiutarvi – furins

+0

@furins codice added.shall i spedisco tutto il mio modulo per voi se volete.? ora il codice del modello ha aggiunto anche –

+0

Grazie @AnneMary per lo snippet, per quanto riguarda l'invio del codice: No, grazie, poiché non sarà accessibile ad altri utenti in modo che nessuno possa imparare dalla tua risposta. Per favore usa github, bitbucket, gist o qualsiasi altro servizio come questo per rendere pubblica parte del tuo codice o prova a riassumere, con le parti essenziali – furins

risposta

1

Utilizzare (1, ID, { values }) per aggiornare One2Many valori

def on_change(self,cr,uid,ids,ur_field,context=None): 
    if context is None: 
     context = {} 
    value_list = val = [] 
    if ur_field: 
     ur_conditions here 
     value_list = (1,ID,{Values}) 
     val = {'one2manyfield':value_list} 
    if not ur_field: 
     val = {'one2manyfield':False} 
    return {'val':val} 
2

È possibile utilizzare il seguente esempio per creare la vostra funzione onchange. Questa è una funzione onchange ho creato per fattura (solo un esempio)

def onchange_partner_id(self, cr, uid, ids, type, partner_id,\ 
     date_invoice=False, payment_term=False, partner_bank_id=False, company_id=False): 
    res = super(account_invoice, self).onchange_partner_id(cr, uid, ids, type, partner_id, 
      date_invoice=date_invoice, payment_term=payment_term, partner_bank_id=partner_bank_id, 
      company_id=company_id) 

    invoice_lines = [] 
    product_ids = self.pool.get('product.product').search(cr, uid, [],limit=5) 
    for p in self.pool.get('product.product').browse(cr, uid, product_ids): 
     invoice_lines.append((0,0,{'product_id':p.id,'name':p.name, 
          'account_id':p.categ_id.property_account_income_categ.id, 
          }))#this dict contain keys which are fields of one2many field 
    res['value']['invoice_line']=invoice_lines 
    return res 

se v'è solo singola linea da aggiungere poi res [ 'valore'] aggiornamento ({ 'one2many_fieldmname':. [(0,0, {'field1': value1, 'field2': value2, 'fieldn': valuen}) })

Nell'esempio precedente sto cercando 5 prodotti e questi prodotti sono stati aggiunti nella linea di trasmissione. Quindi nella tua funzione di onchange devi anche cercare il dipendente che rientra nella divisione.

Nel codice, nella forma "bpl_work_offer_form" Hai aggiungere la funzione onchange al bpl_division_id campo. (Nel mio esempio partner_id è il campo many2one e invoice_line è il campo One2Many.)

Hai bisogno di più attento quando si usa onchange per caricare il campo one2many. Nella funzione onchange devi prima scollegare tutti i record caricati nel tuo campo many2one. perché se una volta il record viene salvato, se l'onchange viene caricato nuovamente, verrà creata una nuova linea. quindi devi gestirlo correttamente.

Riferimento: http://doc.openerp.com/trunk/developers/server/06_misc_on_change_tips/

+0

Ciao Anom, puoi adattare la tua risposta alla domanda di Anne Mary e fornire alcuni collegamenti alla documentazione? Grazie – furins

+0

ho fornito un esempio corretto. Anne Mary può testarlo e con poche modifiche Anne Mary può raggiungere questo semplicemente. – OmaL

+0

Aspettiamo l'accettazione di Anne Mary così. Nella domanda ci sono due relazioni uno-a-due a cascata, quindi l'esempio è solo parzialmente pertinente, ed è per questo che ho chiesto una risposta più dettagliata. Ho messo la taglia anche per fornire aiuto ai futuri lettori, non solo Anne Mary: quindi sarebbe bello se spiegassi come adattare il tuo codice tagliato e incollato e se fornisci riferimenti alla documentazione. – furins

Problemi correlati