Saturday, 25 October 2014

Odoo/OpenERP : Call function on button

There are three ways to add functionality on button in OpenERP/Odoo:

1. Call function directly on button: You can directly call the function defined in model/class using type="object" attribute.


<button string="Check availability" name="check_username_availability" type="object" class="oe_highlight" />

In this case you have to define 'check_username_availablilty' function in model.

2. Using Workflow: Workflow is the most used functionality in OpenERP/Odoo to process flow of the activity. Default type of button is workflow i.e type="workflow".  Workflow itself is an vital topic so can't talk much about this here.

<button string="Accept" name="signal_accept" type="workflow" class="oe_highlight" />

3. Using action: You have to user type="action" if you want to call any action defined in the .xml file. For example if you want to open any wizard you can use following code snippet:

<button name="%(action_id)d" string="Button Label" type="action">

or you can replace %(action_id)d with action id from database.

Reference Links:

Thanks!!!!!!!!!! Enjoy Programming :)

Sunday, 5 October 2014

Odoo/OpenERP: one2one relational field example

one2one relational field is deprecated in OpenERP version>5 but you can achieve the same using many2one relational field. You can achieve it in following two ways :

1) using many2one field in both the objects (

2)  using inheritance by deligation

You can easily find the first solution with little search over internet so let's start with 2nd solution.

Scenario : 

I want to create a one2one relation between two objects of openerp




What I should do 

i. Add _inherits section in hr_employee class
ii. Add field medical_detail_id in hr_employee class

class hr_employee(osv.osv):
    _name = 'hr.employee'
    _inherits = {'hr.employee.medical.details': "medical_detail_id"}
    _inherit = 'hr.employee'    
    _columns = {
             'emp_code':fields.char('Employee Code', size=6, readonly=True),
             'medical_detail_id':fields.many2one('hr.employee.medical.details', 'Medical       
             Details',help="Link this employee to it's medical details", ondelete="cascade", required=True),

You don't have to do anything with 'hr.employee.medical.details' object

iii. Add fields in hr_employee_view.xml file

<group col="4" string="Medical Details">            
    <field name="medical_detail_id" invisible="1" required="0" colspan="4" />
    <field name="blood_group" />
    <field name="medicine" />
    <field name="medicine_desc" />
    <field name="allergies" />
    <field name="allergies_desc" />

and you are done. It will create exactly one record each employee entry in
hr.employee.medical.details table.

Please let me know if you are facing any issue to implement it.

Thanks!!!!!!!!!!!!!!!! Enjoy Programming :)

Saturday, 4 October 2014

Odoo/OpenERP: Generate Employee Code

Employee code can be generated in following three simple steps:

1. Create a sequence file


<?xml version="1.0" encoding="utf-8"?>
        <!-- Sequences for employee code -->
        <record id="emp_code_sequence" model="ir.sequence.type">
            <field name="name">Employee Code</field>
            <field name="code">hr.employee</field>

        <record id="seq_hr_employee" model="ir.sequence">
            <field name="name">Employee Code</field>
            <field name="code">hr.employee</field>
           <field name="prefix">EMP</field>
            <field name="padding">5</field>
            <field name="company_id" eval="False"/>
        <!-- End of Sequence code for employee code -->


2. Add new field to class

class hr_employee(osv.osv):
    _name = 'hr.employee'
    _inherit = 'hr.employee'    
    _columns = {
                'emp_code':fields.char('Employee Code', size=8, readonly=True)

3. Update database

def create(self, cr, uid, vals, context=None):
        vals['emp_code']=self.pool.get('ir.sequence').get(cr, uid,'hr.employee')
        res=super(hr_employee, self).create(cr, uid, vals)
        return res

create function will be called only when new employee is added.

and you are done.

Employee code will start from EMP00001

You can generate emp_code without sequence file as well and write code directly in create function as well. But standard way is using sequence file only.

Note: Don't forget to include 'emp_code_sequence_view.xml' file in data section of '' file.

Thanks!!!!!!!!! Enjoy Programming :)