2
votes

i'm trying to create a new wizard and i hadn't understood a lot about how to do that :( In some guides i find this code:

<wizard
    id="test_wizard"
    keyword="client_action_multi"
    model="product.product"
    name="product.product.product_id"
    string="Test wizard" />

and in the technical memento i found this:

<record id="action_idea_cleanup_wizard" model="ir.actions.act_window"> 
 <field name="name">Cleanup</field> 
 <field name="type">ir.actions.act_window</field> 
 <field name="res_model">idea.cleanup.wizard</field> 
 <field name="view_type">form</field> 
 <field name="view_mode">form</field> 
 <field name="target">new</field> 
</record>

which syntax should i use?


EDIT: I've tried to do the wizard, here's the code:

python file:

from openerp.osv import osv
from openerp.osv import fields


class create_ean(osv.osv_memory):
    _name='generate.ean'

    _columns = {
        'product_def_code' : fields.text('Product Default Code'),
        'product_gen_code' : fields.text('Product Generated EAN13', readonly = True),
    }

    #defaults calls a function that will browse your main object and fill the field with the existing information
    _defaults = {
        'product_def_code': lambda self, cr, uid, context: self._get_product_id(cr, uid, context),
        'product_gen_code': lambda self, cr, uid, context: self.generate_ean(),
    }

    def save_code(self, cr, uid, ids, context=None):
        if 'active_id' in context:
            info = self.browse(cr,uid,ids)
            self.pool.get('ean13').write(cr,uid,context['active_id'],{'ean13': info[0].product_gen_code})

        return {
            'type': 'ir.actions.act_window_close',
            }
    def generate_ean(self):
        return "ouhdeguosAB13"

    def _get_product_id(self, cr, uid, context=None):
        if 'active_id' in context:
            return self.pool.get('product.product').browse(cr, uid, context['active_id'], context).product_id

    create_ean()

XML File:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
    <!-- create a view with a unique id -->
    <record id="view_generate_ean13_code_wizard" model="ir.ui.view">
        <field name="name">generate_ean13_code.form</field>
        <field name="model">product.product</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
        <!-- create a normal form view, with the fields you've created on your python file -->
            <form string="Insert reformulation info" version="7.0">
                <group >
                    <separator string="EAN13 Code Generator" colspan="2"/>
                    <field name="product_def_code" string="Product Default Code"/>
                    <field name="product_gen_code" string="Product EAN13 Generated Code"/>
                    <newline/>
                </group>
                <div style="text-align:right">
                    <button  icon="gtk-cancel" special="cancel" string="Cancel"/>
                    <button  icon="gtk-ok" name="save_code" string="Save the code" type="object" />
                </div>

           </form>
        </field>
    </record>
    <!-- your action window refers to the view_id you've just created -->
    <record id="action_generate_ean" model="ir.actions.act_window">
        <field name="name">Generate EAN13</field>
        <field name="type">ir.actions.act_window</field>
        <field name="res_model">generate.ean</field>
        <field name="view_type">form</field>
        <field name="view_mode">form</field>
        <field name="view_id" ref="view_generate_ean13_code_wizard"/>
        <field name="target">new</field> 
    </record>

    <act_window id="action_generate_ean"
            name="Generate EAN13"
            res_model="generate.ean"
            view_mode="form" 
            target="new"
    />
</data>
</openerp>

I'll explain what i need to do, substantially i need to take the product_id of the product and with that i generate the ean13, i made a test method for the generation of the code but i have not understand how to save the generated code in the ean13 field and how use my method to generate that code by passing him the product_id

1
I guess, then, that you're not looking for a wizard, but you want to call a python function from a button click. For that, you can include a button on you XML file form view. Something like: <button name="create_ean" string="Create EAN code" type="object" /> And include in your python a function named create_ean, in that function you loop through your records and update the field ean13 for each record. - Filipe Castanheira
Alright, now i have only 1 problem, how can i loop through my records and update the field? I watched on the documentation but i didn't found anything :( - barbaanto
Something like this should do it: for prod in self.browse(cr, uid, ids, context=context): my_ean13 = some_algoritm_that_generates_ean_code_based_on_product_id(prod.id) self.write(cr, uid, prod.id, {'ean13': my_ean13 }) - Filipe Castanheira
@FilipeCastanheira I used that loop, but it works only for one field at time, maybe it's because i've added the button in the form view, but i have no idea how to put it in the tree view, if it is possible - barbaanto
You're right, forgot that calling from the view form, you are passing the id. You can do it from the tree view, selecting the ids of your products or you can look at this answer: stackoverflow.com/questions/16101719/… (then you can loop through your ids!) Good luck! - Filipe Castanheira

1 Answers

4
votes

Documentation on wizard is a little unclear, I had (still have) some difficulty to understand how it works, but I'll leave you here an example of a working wizard with a text field, that saves into a calling object (you have to change the names of the tables to adapt it to your needs).

Create a python file like:

from openerp.osv import osv
from openerp.osv import fields
from openerp.tools.translate import _

class ref_generic_request(osv.osv_memory):

    # create a table in osv_memory, with the columns you need
    # to fill in your wizard
    _name = 'ref.generic.request'

    _columns = {
        'reformulation_info': fields.text(
            'Reformulation instructions',
            help='Instructions for the requestor justification the reformulation needs'),
            }

    # create a function that will save the info from your wizard into
    # your model (active_id is the id of the record you called the wizard
    # from, so you will save the info entered in wizard in that record)
    def save_info(self, cr, uid, ids, context=None):
        if 'active_id' in context:
            info = self.browse(cr, uid, ids)[0].reformulation_info
            gen_req = self.pool.get('generic.request')
            gen_req.write(
                    cr, uid, context['active_id'],
                    {'reformulation_info':info, 'needs_reformulation':1}
                    )
        return {'type':'ir.actions.act_window_close'}
ref_generic_request()

Then create the views to display your wizard:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <!-- create a view with a unique id -->
        <record id="view_reformulate_generic_request_wizard" model="ir.ui.view">
            <field name="name">reformulate_generic_request_wizard.form</field>
            <field name="model">ref.generic.request</field>
            <field name="type">form</field>
            <field name="arch" type="xml">
            <!-- create a normal form view, with the fields you've created on your python file -->
                <form string="Insert reformulation info" version="7.0">
                    <group >
                        <separator string="Please insert instruction for the reformulation of this request" colspan="2"/>
                        <field name="reformulation_info" string="Reformulation info"/>
                        <newline/>
                    </group>
                    <div style="text-align:right">
                        <button  icon="gtk-cancel" special="cancel" string="Cancel"/>
                        <button  icon="gtk-ok" name="save_info" string="Send to reformulation" type="object" /> 
                    </div>

               </form>
            </field>
        </record>
        <!-- your action window refers to the view_id you've just created -->
        <record id="action_reformulate_generic_request" model="ir.actions.act_window">
            <field name="name">Reformulate Request</field>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">ref.generic.request</field>
            <field name="view_type">form</field>
            <field name="view_mode">form</field>
            <field name="view_id" ref="view_reformulate_generic_request_wizard"/>
            <field name="target">new</field> 
        </record>

        <act_window id="action_reformulate_generic_request"
                name="Reformulate Request"
                res_model="ref.generic.request" 
                view_mode="form" 
                target="new"
        />
    </data>
</openerp>

EDIT - You might want to use wizard to update info that already is stored in your database, to do so you have to do a search and load the wizard with this information in it. This is the way I am doing it (not sure if it is the best way, I'll leave it here maybe someone will comment a correct it!)

class review_opinion(osv.osv_memory):
    _name='review.opinion'

    _columns = {
        'opinion_emission': fields.text('Opinion emission'),
        'notes': fields.text('Additional notes'),
    }

    #defaults calls a function that will browse your main object and fill the field with the existing information
    _defaults={
        'opinion_emission': lambda self, cr, uid, context: self._get_opinion(cr, uid, context), 
        'notes': lambda self, cr, uid, context: self._get_notes(cr, uid, context), # populates requestor field with actual user id

    }
    def save_info(self, cr, uid, ids, context=None):
        if 'active_id' in context:
            info = self.browse(cr,uid,ids)
            self.pool.get('opinion').write(cr,uid,context['active_id'],{'opinion_emission': info[0].opinion_emission,'notes': info[0].notes})

        return {
            'type': 'ir.actions.act_window_close',
         }

    #functions that get the info stored in db
    def _get_opinion(self, cr, uid, context=None):
        if 'active_id' in context:
            return self.pool.get('opinion').browse(cr, uid, context['active_id'], context).opinion_emission

    def _get_notes(self, cr, uid, context=None):
        if 'active_id' in context:
            return self.pool.get('opinion').browse(cr, uid, context['active_id'], context).notes

review_opinion()