Monday, 28 November 2016

Unable to git clone , Failed to connect to github.com port 443: Network is unreachable

Recently, I have encountered following problem. Might be useful for others who face same error.

I have two different Internet service provider. With one ISP, it works fine but with others it fails.

For example:

git clone https://github.com/odoo/odoo.git

It throws me following error:

fatal: unable to access 'https://github.com/odoo/odoo.git': Failed to connect to github.com port 443: Network is unreachable

I have solved with following trick.

ping github.com
PING github.com (192.30.253.112) 56(84) bytes of data.


Add  192.30.253.112 github.com in /etc/hosts file.


Saturday, 12 November 2016

How to create server actions in Odoo 10?

Below is example of server actions in Odoo 8.

<?xml version="1.0" encoding="utf-8" ?>
<odoo>
    <data>
        <record id="action" model="ir.actions.server">
            <field name="name">My Action</field>
            <field name="model_id" ref="model_module_model"/>
            <field name="code">self.action(cr, uid, context=context)</field>
       </record>
    </data>
</odoo>

Following is example for Server actions in Odoo 10.

<?xml version="1.0" encoding="utf-8" ?>
<odoo>

    <data>
        <record id="action" model="ir.actions.server">
            <field name="name">My Action</field>
            <field name="model_id" ref="model_module_model"/>
            <field name="code">
           
            if context.get('active_model') == 'your.module.model' and context.get('active_ids'):
                    action = env['module.model'].browse(context['active_ids']).action()
          
            </field>
       </record>
    </data>
</odoo>


There is no need of self variable to declare server action in Odoo 10.

Tuesday, 8 November 2016

How to activate the developer mode in Odoo version 10?

Developer mode has moved from the user screen to Settings.

Click on link "Active the developer mode" or "Active the developer mode (with assets)"


Active Developer mode


What is different between "Active the developer mode" or "Active the developer mode (with assets)" ?

Active the developer mode :- Used by Administrator User to enables Menus, Fields, kind of security access rights.


Active the developer mode (with assets) :- Used by Odoo developers to track js, css, files, which will helpful to improve further performance.





Thursday, 7 July 2016

Error when override orm write method in Odoo 8 or 9

If you try override write method with following new API:

         @api.model
         def write(self, vals):
            ....
            return super(MyClass, self).write(vals)

You will see the following error:

        Traceback (most recent call last):
          File "/opt/odoo/odoo-server/openerp/http.py", line 530, in _handle_exception
            return super(JsonRequest, self)._handle_exception(exception)
          File "/opt/odoo/odoo-server/openerp/http.py", line 567, in dispatch
            result = self._call_function(**self.params)
          File "/opt/odoo/odoo-server/openerp/http.py", line 303, in _call_function
            return checked_call(self.db, *args, **kwargs)
          File "/opt/odoo/odoo-server/openerp/service/model.py", line 113, in wrapper
            return f(dbname, *args, **kwargs)
          File "/opt/odoo/odoo-server/openerp/http.py", line 300, in checked_call
            return self.endpoint(*a, **kw)
          File "/opt/odoo/odoo-server/openerp/http.py", line 796, in __call__
            return self.method(*args, **kw)
          File "/opt/odoo/odoo-server/openerp/http.py", line 396, in response_wrap
            response = f(*args, **kw)
          File "/opt/odoo/odoo-server/addons/web/controllers/main.py", line 939, in call_button
            action = self._call_kw(model, method, args, {})
          File "/opt/odoo/odoo-server/addons/web/controllers/main.py", line 927, in _call_kw
            return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs)
          File "/opt/odoo/odoo-server/openerp/api.py", line 241, in wrapper
            return old_api(self, *args, **kwargs)
          File "/opt/odoo/odoo-server/openerp/api.py", line 239, in wrapper
            return new_api(self, *args, **kwargs)
        TypeError: write() got an unexpected keyword argument 'context'

Question: How to resolved mentioned error ?

Solution:

The method write should be decorated with decorator @api.multi. The mapping new API → old API defined by @api.model is inadequate (argument ids is missing).

Try with following code:

         @api.multi
         def write(self, vals):
            ....
            return super(MyClass, self).write(vals)

For more details Odoo documentation 

Wednesday, 8 June 2016

How to keep track of employee expenses?

Employee expenses are charges incurred on behalf of the company. The company then reimburses these expenses to the employee. The receipts encountered most frequently are:


  • car travel, reimbursed per unit of distance (mile or kilometer),
  • subsistence expenses, reimbursed based on the bill,
  • other purchases, such as stationery and books, destined for the company but carried out by the employee.

The expenses workflow

 

 * Record a new expense

Every employee of the company can register their expenses from Expenses application ‣ My Expenses. The workflow for personal expenses work that way:
  1. an employee record his expense, and submit it to the manager
  2. the manager approve or refuse the expense
  3. the accountant post journal entries
  4. the company reimburse the employee expense (the employee is like a vendor, with a payable account)
  5. if the expense is linked to an analytic account, the company can reinvoice the customer
For every expense, the employee should record at least:
  • a description: that should include the reference of the ticket / bill
  • a product: the expense type
  • a price (e.g. hotel) or a quantity (e.g. reimburse km if travel with his own car)
Depending of the policy of the company, he might have to attach a scan or a photo of the expense. To do that, just a write a message in the bottom of the expense with the scan of the bill/ticket in attachment.

If the expense is linked to a customer project, you should not forget to set an analytic account, related to the customer project or sale order (you might have to activate analytic accounts in the accounting settings to get this feature).
Once the expense is fully recorded, the employee has to click the button Submit to Manager.

In some companies, employees should submit their expenses grouped at the end of the month, or at the end of a business trip.

An employee can submit all his expenses in batch, using the Submit Expenses action from the list view of expenses, or the small icons in the list view.

* Validation by the manager

Managers should receive an email for every expense to be approved (the manager of an employee is defined on the employee form). They can use the menu To Approve to check all expenses that are waiting for validation.
The manager can:
  • discuss on an expense to ask for more information (e.g., if a scan of the bill is missing);
  • reject an expense;
  • approve an expense.

 

* Control by the accountant

Then, all expenses that have been validated by the manager should be posted by the accountant. When an expense is posted, the related journal entry is created and posted in your accounting.
If the accountant wants to create only one journal entry for a batch of expenses, he can post expenses in batch from the list view of all expenses.

 

* Reinvoice expenses to customers

If the expense was linked to an analytic account related to a sale order, the sale order has a new line related to the expense. This line is not invoiced to the customer yet and will be included in the next invoice that will be send to the customer (charge travel and accommodations on a customer project)
To invoice the customer, just click on the invoice button on his sale order. (or it will be done automatically at the end of the week/month if you invoice all your orders in batch)

 

* Reimburse the employee

If the expense was paid with the employee's own money, the company should reimburse the employee. In such a case, the employee will appear in the aged payable balance until the company reimburse him his expenses.
All you have to do is to create a payment to this employee for the amount due.

 

Youtube video 

 

Reference link

Wednesday, 11 May 2016

How to find last day of current month and first day of current month in Python ?

For finding last day of current month, we need to use calendar and datetime python libraries.

Following is an example of it.

>>> import calendar
>>> import datetime

>>> calendar.mdays[datetime.date.today().month]
31

>>> datetime.datetime.today().replace(day=1)
It will replace today's date with starting date of month.

I hope you like this article. Share your views to improve content. Happy Learning !!!

Friday, 18 December 2015

Login in Odoo with Google Acoount

This article will help us to login In Odoo with Google account.

If you have Google Apps then you probably want to allow your Odoo users to login with their Google account. The good news is Odoo supports OAuth authentication which means it plays nicely with Google Apps.

However setting this up can be quite tricky. In this guide I’m going to step you through the process so you can get it working first time.


Note that Google Apps is different to standalone GMail. You must follow each of the steps below in sequence otherwise your authentication process will fail.

There are six main steps:
  1. Enable OAuth authentication support in Odoo
  2. Enable the Google App Engine Admin Console in your Google Apps domain
  3. Create Google Apps OAuth2 access for Odoo
  4. Add Google OAuth2 credentials to Odoo
  5. Create a new Odoo user with Google Apps authentication
  6. Activating Google Apps authentication for new user
Important: Make sure Odoo is correctly configured to send email before starting this. Odoo will need to email an activation link when you enable OAUTH.

So, let’s get started.

Please follow steps for more details

Monday, 23 November 2015

How to clone single branch from the GitHub?

Generally GitHub repository has multiple branch on it. But sometime we don't want to clone whole branch.

This command "git clone git://github/repository.git" will take all branches of its. But we want to only clone "Sub_Branch_2" branch.

For Example:

Main_Branch
        '
        ' - > Sub_Branch_1
       
        '
        ' - > Sub_Branch_2
       
        '
        ' - > Sub_Branch_3
 

This blog will help you for cloning single branch from GitHub.

First we need to check system git version using below command.

git --version

If git version is less than 1.8.x than we must to upgrade git version using below command.

sudo add-apt-repository ppa:pdoes/ppa
sudo apt-get update
sudo apt-get install git
git --version

Afterwards use below command for clone single branch

git clone -b branch_name --single-branch git://github/repository.git

For example:

git clone -b Sub_Branch_2 --single-branch git://github/repository.git

For more details, you may visit Git tutorial

I hope you like this article. Share your views to improve content. Happy Learning !!!

Tuesday, 29 September 2015

Domain in Odoo

In this article, we will see some theory of domain.

A domain is a list of criteria, each criteria being a triple (either a list or a tuple) of (field_name, operator, value).

Where,

 - field_name:

         It's string type and must be from the current model or any relational traversal field through the Many2one field using membership (.) dot operator.

 - operator:

         It's for comparing field's value with passed value.
Valid operator list (>, >=, <, <=, =, !=, =?, ilike, like =like, =ilike, not like, not ilike, childs_of, in, not in)

 - value:

         It's for comparing with field's value.

Multiple criteria can be joined with three logical operators. Logical AND, logical OR, logical NOT.

Let's take a real inputs example:

Suppose we have 10 records like:

Record 1: Openerp

Record 2: openerp

Record 3: Opensource

Record 4: opensource

Record 5: Open

Record 6: open

Record 7: Odoo

Record 8: odoo

Record 9: Odooopenerp

Record 10: OdooOpenerp

OUTPUT:

'like':

[('input', 'like', 'open')] -  Returns case sensitive (wildcards - '%open%') search.

O/p: open, opensource, openerp, Odooopenerp

'not like':

[('input', 'not like', 'open')] -  Returns results not matched with case sensitive (wildcards - '%open%') search.

O/p: Openerp, Opensource, Open, Odoo, odoo, OdooOpenerp

'=like':

[('name', '=like', 'open')] - Returns exact (=  'open') case sensitive search.

O/p: open

'ilike':


[('name', 'ilike', 'open')] - Returns exact case insensitive (wildcards - '%open%') search.

O/p: Openerp, openerp, Opensource, opensource, Open, open, Odooopenerp, OdooOpenerp

'not ilike': [('name', 'not ilike', 'open')] - Returns results not matched with exact case insensitive (wildcards - '%open%') search.

O/p: Odoo, odoo

'=ilike':

[('name', '=ilike', 'open')] - Returns exact (=  'open' or 'Open') case insensitive search.

O/p: Open, open

'=?': 

name = 'odoo'
parent_id = False
[('name', 'like', name), ('parent_id', '=?', parent_id)] - Returns name domain result & True

name = 'odoo'
parent_id = 'openerp'
[('name', 'like', name), ('parent_id', '=?', parent_id)] - Returns name domain result & parent_id domain result

'=?' is a short-circuit that makes the term TRUE if right is None or False, '=?' behaves like '=' in other cases

'in':

[('value1', 'in', ['value1', 'value2'])] - in operator will check the value1 is present or not in list of right term

'not in':

[('value1', 'not in', ['value2'])] - not in operator will check the value1 is not present in list of right term
While these 'in' and 'not in' works with list/tuple of values, the latter
'=' and '!=' works with string

'=':

value = 10
[('value','=',value)] - term left side has 10 in db and term right our value 10 will match

'!=':


value = 15
[('value','!=',value)] - term left side has 10 in db and term right our value 10 will not match

'child_of':


parent_id = '1' #Agrolait
'child_of':
[('partner_id', 'child_of', parent_id)]
- return left and right list of partner_id for given parent_id

'<=', '<', '>', '>=':

These operators are largely used in openerp for comparing dates - [('date', '>=', date_begin), ('date', '<=', date_end)]. You can use these operators to compare int or float also.



For details/reference visit domains in Odoo

I hope you like this article. Share your views to improve content. Happy Learning !!!

Sunday, 27 September 2015

Email validation in Odoo

This article will help us to validate Email field on Partner form.

First of all, we need to understand argument of _constraints.

    _constraint has list of arguments in which

          1. Method is name,

          2. Warning/Error message and

          3. List of field name.

Method will be fire based on, change of field value given as third argument in _constraint.

Now we need to set constraint for Email field.

Here is code for constraint.
  
    _constraints = [
        (_validate_email, 'Please enter a valid email address.', ['email']),
    ]

Here is code for method.

    @api.multi
    def _validate_email(self):
        for partner in self:
            if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", partner.email) == None:
                return False
        return True

NOTE:

         Warning/Error message will be populate, only when method will return False.

I hope you like this article. Share your views to improve content. Happy Learning !!!

Monday, 17 August 2015

one2many, many2many, many2one field in openerp


In OpenERP/Odoo, we have one2many and many2many datatype field. For add, update, delete we have some trick to link with record, which are listed below.

1. (0, 0,  { values })    link to a new record that needs to be created with the given values dictionary

2. (1, ID, { values })    update the linked record with id = ID (write *values* on it)

3. (2, ID)                     remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well)

4. (3, ID)                     cut the link to the linked record with id = ID (delete the relationship between the two objects but does not delete the target object itself)

5. (4, ID)                     link to existing record with id = ID (adds a relationship)

6. (5)                          unlink all (like using (3,ID) for all linked records)

7. (6, 0, [IDs])             replace the list of linked IDs (like using (5) then (4,ID) for each ID in the list of IDs)


one2mnay we will use 1,2,3 points and for many2many we will use all the points.

For many2one field we only need to set record ID.


For more details, Please visit Odoo documentation

Youtube Video 

ModuleNotFoundError: No module named 'psycopg2'

  Odoo 18:  Traceback (most recent call last): File "/home/bodedra/odoo18/demo/src/odoo/./odoo-bin", line 5, in ...