Thursday, 13 October 2016

Odoo(OpenERP) : Menu badge count


Steps to add Menu badge as shown in 'Next Activities' menu in Sales Module:
1) Inherit ('ir.needaction_mixin) class in your  the class as shown below.

          class YourClass(models.Model):
                   _name = "your.class"
                   _inherit = ['ir.needaction_mixin']

2) Add '_needaction_domain_get' function in your class as shown below code.Here we have to give domain filter based on which the count is calculatated and displayed in the menu.

         @api.model
         def _needaction_domain_get(self):
                  return [('state', '=', 'on_going')]



Monday, 3 October 2016

Odoo Python Tips : change unicode list into normat list format


The following code is useful to change the unicode string list format into normal list
-------------
employee_list = [int(i) for i in self.employee_list.strip('[]').split(',')]
-------------

Odoo Python Date Range : Find out the date range as list using two date.


Step 1 : Create a file as validations.py and put the below code
-------------------
def get_date_range(date_from, date_to):
    date_from_year = date_from[:4]
    date_from_month = date_from[5:7]
    date_from_date = date_from[8:11]
   
    date_to_year = date_to[:4]
    date_to_month = date_to[5:7]
    date_to_date = date_to[8:11]
   
    d1 = date(int(date_from_year), int(date_from_month), int(date_from_date))
    d2 = date(int(date_to_year), int(date_to_month), int(date_to_date))
    delta = d2 - d1
    date_range_list = []
    for i in range(delta.days + 1):
        r_date = d1 + td(days=i)
        date_range_list.append(str(r_date))
    return date_range_list
--------------------

Step 2 : Use the following code in wherever you want to find out the date range and to return in list format.
--------------------
date_list = validations.get_date_range(date_from, date_to)
--------------------

FUI:
you can separate the date as year, month, date using below code too.
date_from_year = date_from[:4]
    date_from_month = date_from[5:7]
    date_from_date = date_from[8:11]

Thursday, 28 July 2016

Odoo/OpenERP: Set 'Multi Companies' and 'Multi Currencies' by default for admin and other users.

Using XML :
<!-- Set Multi Companies and Multi Currencies by default for admin user
Note : This XMl code will be useful for only admin user alone.If you want to set it for all the users you can use py below code. -->
 <record model="res.groups" id="base.group_multi_company">
            <field name="name">Multi Companies</field>
            <field name="category_id" ref="base.module_category_extra" />
            <field name="implied_ids" eval="[(4, ref('base.group_light_multi_company'))]"/>
            <field name="users" eval="[(4, ref('base.user_root'))]"/>
        </record>
        <record model="res.groups" id="base.group_multi_currency">
            <field name="name">Multi Currencies</field>
            <field name="category_id" ref="base.module_category_extra" />
            <field name="implied_ids" eval="[(4, ref('base.group_light_multi_company'))]"/>
            <field name="users" eval="[(4, ref('base.user_root'))]"/>
        </record>
<!-- End -->

Using PY
class ResUsers(models.Model):
    _inherit = "res.users"

   groups_id = fields.Many2many('res.groups', 'res_groups_users_rel', 'uid', 'gid', 'Groups', default=_get_group)
    # Purpose : Set 'Multi Companies' and 'Multi Currencies' by default for res user - Added by Nivas
    @api.model
    def _get_group(self):
        dataobj = self.pool['ir.model.data']
        result = []
        try:
            dummy,group_id = dataobj.get_object_reference(self._cr, self._uid, 'base', 'group_user')
            result.append(group_id)
            # Purpose : Set 'Multi Companies' group as default
            dummy,group_id = dataobj.get_object_reference(self._cr, SUPERUSER_ID, 'base', 'group_multi_company')
            result.append(group_id)
            # Purpose : Set 'Multi Currencies' group as default
            dummy,group_id = dataobj.get_object_reference(self._cr, SUPERUSER_ID, 'base', 'group_multi_currency')
            result.append(group_id)
            # End
            dummy,group_id = dataobj.get_object_reference(self._cr, SUPERUSER_ID, 'base', 'group_partner_manager')
            result.append(group_id)
        except ValueError:
            # If these groups does not exists anymore
            pass
        return result


In Old API(odoo 8 and 7 you can use the following code)

class res_users(osv.osv):
    _inherit = "res.users"

    def _get_group(self,cr, uid, context=None):
        dataobj = self.pool.get('ir.model.data')
        result = []
        try:
            dummy,group_id = dataobj.get_object_reference(cr, SUPERUSER_ID, 'base', 'group_user')
            result.append(group_id)
            # Purpose : Set 'Multi Companies' group as default
            dummy,group_id = dataobj.get_object_reference(cr, SUPERUSER_ID, 'base', 'group_multi_company')
            result.append(group_id)
            # Purpose : Set 'Multi Currencies' group as default
            dummy,group_id = dataobj.get_object_reference(cr, SUPERUSER_ID, 'base', 'group_multi_currency')
            result.append(group_id)
            # End
            dummy,group_id = dataobj.get_object_reference(cr, SUPERUSER_ID, 'base', 'group_partner_manager')
            result.append(group_id)
        except ValueError:
            # If these groups does not exists anymore
            pass
        return result

    _defaults = {    
        'groups_id': _get_group,
    }

Odoo/OpenERP: Set 'Multi Companies' and 'Multi Currencies' by default for admin and other users.

Using XML :
<!-- Set Multi Companies and Multi Currencies by default for admin user -->
 <record model="res.groups" id="base.group_multi_company">
            <field name="name">Multi Companies</field>
            <field name="category_id" ref="base.module_category_extra" />
            <field name="implied_ids" eval="[(4, ref('base.group_light_multi_company'))]"/>
            <field name="users" eval="[(4, ref('base.user_root'))]"/>
        </record>
        <record model="res.groups" id="base.group_multi_currency">
            <field name="name">Multi Currencies</field>
            <field name="category_id" ref="base.module_category_extra" />
            <field name="implied_ids" eval="[(4, ref('base.group_light_multi_company'))]"/>
            <field name="users" eval="[(4, ref('base.user_root'))]"/>
        </record>
<!-- End -->

Using PY
class ResUsers(models.Model):
    _inherit = "res.users"

   groups_id = fields.Many2many('res.groups', 'res_groups_users_rel', 'uid', 'gid', 'Groups', default=_get_group)
    # Purpose : Set 'Multi Companies' and 'Multi Currencies' by default for res user - Added by Nivas
    @api.model
    def _get_group(self):
        dataobj = self.pool['ir.model.data']
        result = []
        try:
            dummy,group_id = dataobj.get_object_reference(self._cr, self._uid, 'base', 'group_user')
            result.append(group_id)
            # Purpose : Set 'Multi Companies' group as default
            dummy,group_id = dataobj.get_object_reference(self._cr, SUPERUSER_ID, 'base', 'group_multi_company')
            result.append(group_id)
            # Purpose : Set 'Multi Currencies' group as default
            dummy,group_id = dataobj.get_object_reference(self._cr, SUPERUSER_ID, 'base', 'group_multi_currency')
            result.append(group_id)
            # End
            dummy,group_id = dataobj.get_object_reference(self._cr, SUPERUSER_ID, 'base', 'group_partner_manager')
            result.append(group_id)
        except ValueError:
            # If these groups does not exists anymore
            pass
        return result


In Old API(odoo 8 and 7 you can use the following code)

class res_users(osv.osv):
    _inherit = "res.users"

    def _get_group(self,cr, uid, context=None):
        dataobj = self.pool.get('ir.model.data')
        result = []
        try:
            dummy,group_id = dataobj.get_object_reference(cr, SUPERUSER_ID, 'base', 'group_user')
            result.append(group_id)
            # Purpose : Set 'Multi Companies' group as default
            dummy,group_id = dataobj.get_object_reference(cr, SUPERUSER_ID, 'base', 'group_multi_company')
            result.append(group_id)
            # Purpose : Set 'Multi Currencies' group as default
            dummy,group_id = dataobj.get_object_reference(cr, SUPERUSER_ID, 'base', 'group_multi_currency')
            result.append(group_id)
            # End
            dummy,group_id = dataobj.get_object_reference(cr, SUPERUSER_ID, 'base', 'group_partner_manager')
            result.append(group_id)
        except ValueError:
            # If these groups does not exists anymore
            pass
        return result
 
    _defaults = {      
        'groups_id': _get_group,
    }

Tuesday, 12 July 2016

Odoo Menu : Hiding ,Deleting, replacing name or showing the menu only in debug mode


To delete the menu
<delete model="ir.ui.menu" id="mail.menu_contacts"/>

To replace name of menu id
<record model="ir.ui.menu" id="hr.menu_hr_root">
<field name="name">HR</field>      
</record>

To show the menu only in debug mode by using 'base.group_no_one' 
<record model="ir.ui.menu" id="hr.menu_hr_root">
<field name="name">Employees</field>
<field eval="[(6,0,[ref('base.group_no_one')])]" name="groups_id"/>
</record>
Note : 
  eval="[(6,0,[ref('base.group_no_one')])]"

It will replace all existing group ids with 'base.group_no_one' id in applied in 'hr.menu_hr_root' menu id .

<record model="ir.ui.menu" id="hr.menu_hr_root">
<field name="groups_id" eval="[(4,ref('base.group_no_one'))]"/>
</record>
   eval="[(4,ref('base.group_no_one'))]"
It will update given group id with existing group ids applied in 'hr.menu_hr_root' menu.



Monday, 27 June 2016

Odoo 9 : Adding background image for login screen

1) create a new xml file as 'webclient_templates.xml' an add below code.
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
 
        <template id="login_layout_inherited_your_module" inherit_id="web.login_layout">
            <xpath expr="." position="inside">
                <link rel="stylesheet" href="/your_module/static/src/css/your_css_file.css"/>
            </xpath>
        </template>

        </data>
</openerp>

2) Create a new .css file your  module and add below code.

.container {
background-image: url('/your_module/static/src/img/your_image.jpg');
}

Odoo 9 : Replace 'Powered by Odoo' Footer string

1) Create a new xml file as 'webclient_templates.xml' and add below code.

<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
       
        <!-- Purpose : Replace Odoo string and link as per your company's link and name - Added by Nivas M -->
        <template id="inherited_web_menu_secondary" inherit_id="web.menu_secondary">
        <xpath expr="//div[@class='oe_footer']" position="replace">
           <div class="oe_footer">
              Powered by <a href="http://yourcompany.com/" target="_blank"><span>Your Company</span></a>
           </div>
            </xpath>
        </template>

</data>
</openerp>




Friday, 24 June 2016

Odoo 9 Database Backup and Restore

Taking DB backup:

1)      Go to database Manager
2)      Click on backup link in your database
3)      Enter your master password (if you have set Master password).Backup format as: zip (includes filestore)
4)      Extract the downloaded zip file
5)      Your db is now in sql format as dump.sql

Restoring sql format db in new db

1) Create a new db in local with owner selection
2) Go to location
                C:\Program Files\PostgreSQL\9.2\bin -> select psql.exe file
                2.1) (menu)File -> Open commant prompt 


3) Go to comment prompt  and type

   psql.exe  –U db_user db_name < “your sql file location”

4) Enter db_user password
                It data will be start to move from sql format db to your created db.
5) Finally.You can check your data in created db now.





Wednesday, 16 March 2016

Odoo 9 : Customizing Login page design.

1) Create a new xml file as webclient_templates.xml
2) Add the below code.
<!-- Redesigning odoo 9 login form - Nivas M  -->
<template id="web.login" name="Login">
<style>
.form_wrapper{
background:#fff;
border:1px solid #ddd;
margin:0 auto;
width:350px;
-moz-box-shadow:1px 1px 7px #ccc;
-webkit-box-shadow:1px 1px 7px #ccc;
box-shadow:5px 5px 7px #ccc;

font-family: "Times New Roman", Georgia, Serif;
}
.form_wrapper h3{
padding:20px 30px 20px 30px;
background-color:#28517A;
color:#fff;
font-size:25px;
border-bottom:1px solid #ddd;
}
.form_wrapper h1{
padding:20px 30px 50px 30px;
background-color:#28517A;
color:#fff;
font-size:25px;
border-bottom:1px solid #ddd;
}
.form_wrapper form{
background:#fff;
}
.form_wrapper label, h1{
display:block;
padding:0px 30px 0px;
margin:10px 0px 0px 0px;

font-family: "Times New Roman", Georgia, Serif;;
font-weight: lighter;
font-size: 16px;
}
.form_wrapper input[type="text"],
.form_wrapper input[type="password"]{
border: solid 1px #E5E5E5;
background: #FFFFFF;
margin: 5px 30px 0px 30px;
padding: 9px;
display:block;
font-size:16px;
width:76%;
background:
-webkit-gradient(
linear,
left top,
left 25,
from(#FFFFFF),
color-stop(4%, #EEEEEE),
to(#FFFFFF)
);
background:
-moz-linear-gradient(
top,
#FFFFFF,
#EEEEEE 1px,
#FFFFFF 25px
);
-moz-box-shadow: 0px 0px 8px #f0f0f0;
-webkit-box-shadow: 0px 0px 8px #f0f0f0;
box-shadow: 0px 0px 8px #f0f0f0;
}
.form_wrapper input[type="text"]:focus,
.form_wrapper input[type="password"]:focus{
background:#feffef;
}

.form_wrapper button[type="submit"] {
background: #e3e3e3;
border: 1px solid #ccc;
color: #333;
font-family: "Trebuchet MS", "Myriad Pro", sans-serif;
font-size: 14px;
font-weight: bold;
text-align: center;
width: 150px;
       height: 35px;
cursor:pointer;
float:right;
       margin: 0px 80px 30px 0px;
text-shadow: 0px 1px 0px #fff;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
-moz-box-shadow: 0px 0px 2px #fff inset;
-webkit-box-shadow: 0px 0px 2px #fff inset;
box-shadow: 0px 0px 2px #fff inset;
}
.form_wrapper button[type="submit"]:hover {
background: #d9d9d9;
-moz-box-shadow: 0px 0px 2px #eaeaea inset;
-webkit-box-shadow: 0px 0px 2px #eaeaea inset;
box-shadow: 0px 0px 2px #eaeaea inset;
color: #222;

}
</style>
            <t t-call="web.login_layout">

                <form class="form_wrapper" role="form" t-attf-action="/web/login{{ '?debug' if debug else '' }}" method="post" onsubmit="this.action = this.action + location.hash">
                   <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>

<h3>Login</h3>

                    <div class="form-group field-db" t-if="databases and len(databases) &gt; 1">
                        <label for="db" class="control-label">Database</label>
                        <div class="input-group">
                            <input type="text" name="db" t-att-value="request.db" id="db" class="form-control" required="required" readonly="readonly"/>
                            <span class="input-group-btn">
                              <a href="/web/database/selector" class="btn btn-default">Select <i class="fa fa-database"></i></a>
                            </span>
                        </div>
                    </div>

                    <div class="form-group field-login">
                        <label for="login" class="control-label">Username</label>
                        <input type="text" name="login" t-att-value="login" id="login" class="form-control" required="required" autofocus="autofocus"/>
                    </div>

                    <div class="form-group field-password">
                        <label for="password" class="control-label">Password</label>
                        <input type="password" name="password" id="password" class="form-control" required="required" t-att-autofocus="'autofocus' if login else None"/>
                    </div>

                    <p class="alert alert-danger" t-if="error">
                        <t t-esc="error"/>
                    </p>
                    <p class="alert alert-success" t-if="message">
                        <t t-esc="message"/>
                    </p>

                    <input type="hidden" name="redirect" t-att-value="redirect"/>
               <h1><button type="submit" >Login</button> </h1>

                </form>
            </t>
        </template>
<!-- End -->

Output :