{"action":"created","comment":{"url":"https://api.github.com/repos/odoo-dev/odoo/pulls/comments/26310784","id":26310784,"diff_hunk":"@@ -0,0 +1,378 @@\n+# -*- coding: utf-8 -*-\n+\n+from openerp import models, fields, api, _\n+from openerp.exceptions import UserError, ValidationError\n+\n+# TODO: multicurrency and multicompany\n+\n+class account_payment_method(models.Model):\n+    _name = \"account.payment.method\"\n+    _description = \"Payment Methods\"\n+\n+    name = fields.Char(required=True)\n+    code = fields.Char(required=True) # For internal identification\n+    type = fields.Selection([('inbound', 'Inbound'), ('outbound', 'Outbound')], required=True)\n+\n+\n+class account_register_payments(models.TransientModel):\n+    _name = \"account.register.payments\"\n+    _description = \"Register payments on multiple invoices\"\n+\n+    payment_type = fields.Selection([('outbound', 'Send Money'), ('inbound', 'Receive Money')])\n+    payment_method = fields.Many2one('account.payment.method', string='Payment Method', required=True)\n+    hide_payment_method = fields.Boolean(default=True, copy=False)\n+    date = fields.Date(string='Date', default=fields.Date.context_today, required=True)\n+    journal_id = fields.Many2one('account.journal', string='Cash / Bank Journal', required=True, domain=[('type', 'in', ('bank', 'cash'))])\n+    company_id = fields.Many2one('res.company', related='journal_id.company_id', string='Company', readonly=True)\n+\n+    @api.onchange('payment_type')\n+    def _onchange_payment_type(self):\n+        if self.payment_type:\n+            return {'domain': {'payment_method': [('type', '=', self.payment_type)]}}\n+\n+    @api.onchange('journal_id')\n+    def _onchange_journal(self):\n+        if self.journal_id:\n+            # Set default payment method (we consider the first to be the default one)\n+            payment_methods = self.payment_type == 'inbound' and self.journal_id.inbound_payment_methods or self.journal_id.outbound_payment_methods\n+            if payment_methods:\n+                self.payment_method = payment_methods[0]\n+            # Hide payment method if only 'Manual' is available\n+            self.hide_payment_method = len(payment_methods) == 1 and payment_methods[0].code == 'manual'\n+\n+    @api.model\n+    def default_get(self, fields):\n+        # TODO: return action False to close dialog if error\n+        res = super(account_register_payments, self).default_get(fields)\n+        context = dict(self._context or {})\n+        active_model = context.get('active_model')\n+        active_ids = context.get('active_ids')\n+\n+        if not active_model or not active_ids:\n+            raise osv.except_osv(_(\"Programmation error : wizard action executed without active_model or active_ids in context.\"))\n+        if active_model != 'account.invoice':\n+            raise osv.except_osv(_(\"Programmation error : the expected model for this action is 'account.invoice'. The provided one is '%d'.\" % active_model))\n+        records = self.env[active_model].browse(active_ids)\n+        if any(invoice.state != 'open' for invoice in records):\n+            raise UserError(_(\"You can only register payments for open invoices\"))\n+        if len(set(r.type for r in records)) > 1:\n+            raise UserError(_(\"You can only register batch payments for invoices of the same type.\"))\n+\n+        res.update({\n+            'payment_type': records[0].type in ('out_invoice', 'in_refund') and 'inbound' or 'outbound',\n+            'partner_type': records[0].type in ('out_invoice', 'out_refund') and 'customer' or 'supplier'\n+        })\n+        return res\n+\n+    @api.multi\n+    def button_register_payments(self):\n+        for invoice in self.env['account.invoice'].browse(self._context.get('active_ids')):\n+            self.env['account.payment'].create({\n+                'journal_id': self.journal_id.id,\n+                'payment_method': self.payment_method.id,\n+                'date': self.date,\n+                'invoice_id': invoice.id,\n+                'payment_type': self.payment_type,\n+                'amount': invoice.residual,\n+                'partner_id': invoice.partner_id.id,\n+            })\n+\n+\n+class account_payment(models.Model):\n+    _name = \"account.payment\"\n+    _description = \"Payments\"\n+\n+    @api.one\n+    @api.depends('invoice_id', 'payment_type', 'partner_type', 'partner_id')\n+    def _compute_destination_account_id(self):\n+        if self.invoice_id:\n+            self.destination_account_id = self.invoice_id.account_id.id\n+        elif self.payment_type == 'transfer':\n+            self.destination_account_id = self.env.user.company_id.transfer_account.id\n+        elif self.partner_id:\n+            if self.partner_type == 'customer':\n+                self.destination_account_id = self.partner_id.property_account_receivable.id\n+            else:\n+                self.destination_account_id = self.partner_id.property_account_payable.id\n+\n+    @api.one\n+    @api.depends('invoice_id', 'amount')\n+    def _compute_payment_difference(self):\n+        self.payment_difference = self.invoice_id and self.invoice_id.residual - self.amount or 0\n+\n+    name = fields.Char(readonly=True, copy=False)\n+    state = fields.Selection([('draft','Draft'), ('confirmed','Confirmed')], readonly=True, default='draft')\n+\n+    payment_type = fields.Selection([('outbound', 'Send Money'), ('inbound', 'Receive Money'), ('transfer', 'Transfer Money')], default='outbound', required=True)\n+    payment_method = fields.Many2one('account.payment.method', string='Payment Method', required=True)\n+    # default True to prevent a visual glitch\n+    hide_payment_method = fields.Boolean(default=True, copy=False)\n+    payment_state = fields.Selection([('todo', 'To Process'), ('done', 'Processed'), ('failed', 'Failed')], required=True, default=\"todo\")\n+\n+    partner_type = fields.Selection([('customer', 'Customer'), ('supplier', 'Supplier')], default='supplier')\n+    partner_id = fields.Many2one('res.partner', string='Partner')\n+\n+    amount = fields.Float(string='Amount', required=True, digits=0)\n+    date = fields.Date(string='Date', default=fields.Date.context_today, required=True, copy=False)\n+    reference = fields.Char('Ref', help=\"Transaction reference number.\")\n+    journal_id = fields.Many2one('account.journal', string='Cash / Bank Journal', required=True, domain=[('type', 'in', ('bank', 'cash'))])\n+    # Money flows from the journal_id's default_debit_account_id or default_credit_account_id to the destination_account_id\n+    destination_account_id = fields.Many2one('account.account', compute='_compute_destination_account_id', required=True)\n+    # For money transfer, money goes from journal_id to a transfer account, then from the transfer account to destination_journal_id\n+    destination_journal_id = fields.Many2one('account.journal', string='Transfer To', domain=[('type', 'in', ('bank', 'cash'))])\n+    company_id = fields.Many2one('res.company', related='journal_id.company_id', string='Company', readonly=True)\n+\n+    invoice_id = fields.Many2one('account.invoice', string=\"Invoice\", domain=[('state', '=', 'open')])\n+    payment_difference = fields.Float(compute='_compute_payment_difference')\n+    payment_difference_handling = fields.Selection([('open', 'Keep Open'), ('reconcile', 'Reconcile Payment Balance')], default='open', string=\"Payment Difference\")\n+    writeoff_account = fields.Many2one('account.account', string=\"Counterpart Account\", domain=[('deprecated', '=', False)])\n+\n+    move_lines = fields.One2many('account.move.line', 'payment_id', copy=False, readonly=True, ondelete='restrict')\n+\n+    @api.one\n+    @api.constrains('amount')\n+    def _check_amount(self):\n+        if self.amount == 0.0:\n+            raise ValidationError('Please enter payment amount.')\n+        if self.amount < 0.0:\n+            raise ValidationError('The payment amount must always be positive.')\n+        if self.invoice_id and self.amount > self.invoice_id.residual:\n+            raise ValidationError('The amount cannot be greater than the residual amount of the invoice.')\n+\n+    @api.onchange('partner_type')\n+    def _onchange_partner_type(self):\n+        # Check partner type isn't contradictory with invoice type, if so remove the invoice\n+        if self.invoice_id:\n+            expected_partner_type = self.invoice_id.type in ('out_invoice', 'out_refund') and 'customer' or 'supplier'\n+            if self.partner_type != expected_partner_type:\n+                self.invoice_id = False\n+        # Set partner_id domain\n+        if self.partner_type:\n+            return {'domain': {'partner_id': [(self.partner_type, '=', True)]}}\n+\n+    @api.onchange('payment_type')\n+    def _onchange_payment_type(self):\n+        # Check payment type isn't contradictory with invoice type, if so remove the invoice\n+        if self.invoice_id:\n+            expected_payment_type = self.invoice_id.type in ('out_invoice', 'in_refund') and 'inbound' or 'outbound'\n+            if self.payment_type != expected_payment_type:\n+                self.invoice_id = False\n+        # Set default partner type for the payment type\n+        if self.payment_type == 'inbound':\n+            self.partner_type = 'customer'\n+        elif self.payment_type == 'outbound':\n+            self.partner_type = 'supplier'\n+        # Set payment method domain\n+        return self._onchange_journal()\n+\n+    @api.onchange('invoice_id')\n+    def _onchange_invoice(self):\n+        if self.invoice_id:\n+            self.amount = self.invoice_id.residual\n+            self.payment_type = self.invoice_id.type in ('out_invoice', 'in_refund') and 'inbound' or 'outbound'\n+            self.partner_type = self.invoice_id.type in ('out_invoice', 'out_refund') and 'customer' or 'supplier'\n+            self.partner_id = self.invoice_id.partner_id\n+\n+    @api.onchange('journal_id')\n+    def _onchange_journal(self):\n+        if self.journal_id:\n+            # Set default payment method (we consider the first to be the default one)\n+            payment_methods = self.payment_type == 'inbound' and self.journal_id.inbound_payment_methods or self.journal_id.outbound_payment_methods\n+            if payment_methods:\n+                self.payment_method = payment_methods[0]\n+            # Hide payment method if only 'Manual' is available\n+            self.hide_payment_method = len(payment_methods) == 1 and payment_methods[0].code == 'manual'\n+            # Set payment method domain (restrict to methods enabled for the journal and to selected payment type)\n+            payment_type = self.payment_type in ('outbound', 'transfer') and 'outbound' or 'inbound'\n+            return {'domain': {'payment_method': [('type', '=', payment_type), ('id', 'in', payment_methods.ids)]}}\n+\n+    @api.model\n+    def default_get(self, fields):\n+        # Allows to pass invoice in context\n+        res = super(account_payment, self).default_get(fields)\n+        if self._context.get('invoice_id'):\n+            res.update({'invoice_id': self._context['invoice_id']})\n+            # payment_type and partner_type will be set by _onchange_invoice. Otherwise, _onchange_invoice()\n+            # might be called after _onchange_partner_type() or _onchange_payment_type(), which set\n+            # self.invoice_id = False resulting in a buggy behaviour.\n+            res.pop('payment_type', None)\n+            res.pop('partner_type', None)\n+        return res\n+\n+    def _get_move_vals(self, journal=None):\n+        \"\"\" Return dict to create the payment move \"\"\"\n+        journal = journal or self.journal_id\n+        if not journal.sequence_id:\n+            raise UserError(_('Configuration Error !'), _('The journal ' + journal.name + ' does not have a sequence, please specify one.'))","path":"addons/account/account_payment.py","position":206,"original_position":206,"commit_id":"b3886cb63b23109eeb42392cf5b755230b3eadee","original_commit_id":"b3886cb63b23109eeb42392cf5b755230b3eadee","user":{"login":"qdp-odoo","id":7628598,"avatar_url":"https://avatars.githubusercontent.com/u/7628598?v=3","gravatar_id":"","url":"https://api.github.com/users/qdp-odoo","html_url":"https://github.com/qdp-odoo","followers_url":"https://api.github.com/users/qdp-odoo/followers","following_url":"https://api.github.com/users/qdp-odoo/following{/other_user}","gists_url":"https://api.github.com/users/qdp-odoo/gists{/gist_id}","starred_url":"https://api.github.com/users/qdp-odoo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qdp-odoo/subscriptions","organizations_url":"https://api.github.com/users/qdp-odoo/orgs","repos_url":"https://api.github.com/users/qdp-odoo/repos","events_url":"https://api.github.com/users/qdp-odoo/events{/privacy}","received_events_url":"https://api.github.com/users/qdp-odoo/received_events","type":"User","site_admin":false},"body":"this:\r\n   ```_('The journal ' + journal.name + ' does not have a sequence, please specify one.'))```\r\nis not a valid string to translate. You must use\r\n   ```_('The journal %s does not have a sequence, please specify one.') % journal.name)```","created_at":"2015-03-12T15:19:18Z","updated_at":"2015-03-12T15:19:18Z","html_url":"https://github.com/odoo-dev/odoo/pull/93#discussion_r26310784","pull_request_url":"https://api.github.com/repos/odoo-dev/odoo/pulls/93","_links":{"self":{"href":"https://api.github.com/repos/odoo-dev/odoo/pulls/comments/26310784"},"html":{"href":"https://github.com/odoo-dev/odoo/pull/93#discussion_r26310784"},"pull_request":{"href":"https://api.github.com/repos/odoo-dev/odoo/pulls/93"}}},"pull_request":{"url":"https://api.github.com/repos/odoo-dev/odoo/pulls/93","id":30479696,"html_url":"https://github.com/odoo-dev/odoo/pull/93","diff_url":"https://github.com/odoo-dev/odoo/pull/93.diff","patch_url":"https://github.com/odoo-dev/odoo/pull/93.patch","issue_url":"https://api.github.com/repos/odoo-dev/odoo/issues/93","number":93,"state":"open","locked":false,"title":"New payments design","user":{"login":"Whisno","id":6009089,"avatar_url":"https://avatars.githubusercontent.com/u/6009089?v=3","gravatar_id":"","url":"https://api.github.com/users/Whisno","html_url":"https://github.com/Whisno","followers_url":"https://api.github.com/users/Whisno/followers","following_url":"https://api.github.com/users/Whisno/following{/other_user}","gists_url":"https://api.github.com/users/Whisno/gists{/gist_id}","starred_url":"https://api.github.com/users/Whisno/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Whisno/subscriptions","organizations_url":"https://api.github.com/users/Whisno/orgs","repos_url":"https://api.github.com/users/Whisno/repos","events_url":"https://api.github.com/users/Whisno/events{/privacy}","received_events_url":"https://api.github.com/users/Whisno/received_events","type":"User","site_admin":false},"body":"- Removed payment wizard used in invoices\r\n- Added account.payment model to use instead, with or without invoice\r\n- Added account.payment.method model and use it on account_journal with fields inbound_payment_methods and outbound_payment_methods\r\n- Added transfer_account on company","created_at":"2015-03-04T16:22:36Z","updated_at":"2015-03-12T15:19:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d70ae0c745a141e6a4b29c861a450423513f99b7","assignee":{"login":"qdp-odoo","id":7628598,"avatar_url":"https://avatars.githubusercontent.com/u/7628598?v=3","gravatar_id":"","url":"https://api.github.com/users/qdp-odoo","html_url":"https://github.com/qdp-odoo","followers_url":"https://api.github.com/users/qdp-odoo/followers","following_url":"https://api.github.com/users/qdp-odoo/following{/other_user}","gists_url":"https://api.github.com/users/qdp-odoo/gists{/gist_id}","starred_url":"https://api.github.com/users/qdp-odoo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/qdp-odoo/subscriptions","organizations_url":"https://api.github.com/users/qdp-odoo/orgs","repos_url":"https://api.github.com/users/qdp-odoo/repos","events_url":"https://api.github.com/users/qdp-odoo/events{/privacy}","received_events_url":"https://api.github.com/users/qdp-odoo/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/odoo-dev/odoo/pulls/93/commits","review_comments_url":"https://api.github.com/repos/odoo-dev/odoo/pulls/93/comments","review_comment_url":"https://api.github.com/repos/odoo-dev/odoo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/odoo-dev/odoo/issues/93/comments","statuses_url":"https://api.github.com/repos/odoo-dev/odoo/statuses/b3886cb63b23109eeb42392cf5b755230b3eadee","head":{"label":"odoo-dev:master-account-new-api-payment-ama","ref":"master-account-new-api-payment-ama","sha":"b3886cb63b23109eeb42392cf5b755230b3eadee","user":{"login":"odoo-dev","id":7466976,"avatar_url":"https://avatars.githubusercontent.com/u/7466976?v=3","gravatar_id":"","url":"https://api.github.com/users/odoo-dev","html_url":"https://github.com/odoo-dev","followers_url":"https://api.github.com/users/odoo-dev/followers","following_url":"https://api.github.com/users/odoo-dev/following{/other_user}","gists_url":"https://api.github.com/users/odoo-dev/gists{/gist_id}","starred_url":"https://api.github.com/users/odoo-dev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/odoo-dev/subscriptions","organizations_url":"https://api.github.com/users/odoo-dev/orgs","repos_url":"https://api.github.com/users/odoo-dev/repos","events_url":"https://api.github.com/users/odoo-dev/events{/privacy}","received_events_url":"https://api.github.com/users/odoo-dev/received_events","type":"Organization","site_admin":false},"repo":{"id":19853934,"name":"odoo","full_name":"odoo-dev/odoo","owner":{"login":"odoo-dev","id":7466976,"avatar_url":"https://avatars.githubusercontent.com/u/7466976?v=3","gravatar_id":"","url":"https://api.github.com/users/odoo-dev","html_url":"https://github.com/odoo-dev","followers_url":"https://api.github.com/users/odoo-dev/followers","following_url":"https://api.github.com/users/odoo-dev/following{/other_user}","gists_url":"https://api.github.com/users/odoo-dev/gists{/gist_id}","starred_url":"https://api.github.com/users/odoo-dev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/odoo-dev/subscriptions","organizations_url":"https://api.github.com/users/odoo-dev/orgs","repos_url":"https://api.github.com/users/odoo-dev/repos","events_url":"https://api.github.com/users/odoo-dev/events{/privacy}","received_events_url":"https://api.github.com/users/odoo-dev/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/odoo-dev/odoo","description":"RD Dev Repository","fork":true,"url":"https://api.github.com/repos/odoo-dev/odoo","forks_url":"https://api.github.com/repos/odoo-dev/odoo/forks","keys_url":"https://api.github.com/repos/odoo-dev/odoo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/odoo-dev/odoo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/odoo-dev/odoo/teams","hooks_url":"https://api.github.com/repos/odoo-dev/odoo/hooks","issue_events_url":"https://api.github.com/repos/odoo-dev/odoo/issues/events{/number}","events_url":"https://api.github.com/repos/odoo-dev/odoo/events","assignees_url":"https://api.github.com/repos/odoo-dev/odoo/assignees{/user}","branches_url":"https://api.github.com/repos/odoo-dev/odoo/branches{/branch}","tags_url":"https://api.github.com/repos/odoo-dev/odoo/tags","blobs_url":"https://api.github.com/repos/odoo-dev/odoo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/odoo-dev/odoo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/odoo-dev/odoo/git/refs{/sha}","trees_url":"https://api.github.com/repos/odoo-dev/odoo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/odoo-dev/odoo/statuses/{sha}","languages_url":"https://api.github.com/repos/odoo-dev/odoo/languages","stargazers_url":"https://api.github.com/repos/odoo-dev/odoo/stargazers","contributors_url":"https://api.github.com/repos/odoo-dev/odoo/contributors","subscribers_url":"https://api.github.com/repos/odoo-dev/odoo/subscribers","subscription_url":"https://api.github.com/repos/odoo-dev/odoo/subscription","commits_url":"https://api.github.com/repos/odoo-dev/odoo/commits{/sha}","git_commits_url":"https://api.github.com/repos/odoo-dev/odoo/git/commits{/sha}","comments_url":"https://api.github.com/repos/odoo-dev/odoo/comments{/number}","issue_comment_url":"https://api.github.com/repos/odoo-dev/odoo/issues/comments{/number}","contents_url":"https://api.github.com/repos/odoo-dev/odoo/contents/{+path}","compare_url":"https://api.github.com/repos/odoo-dev/odoo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/odoo-dev/odoo/merges","archive_url":"https://api.github.com/repos/odoo-dev/odoo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/odoo-dev/odoo/downloads","issues_url":"https://api.github.com/repos/odoo-dev/odoo/issues{/number}","pulls_url":"https://api.github.com/repos/odoo-dev/odoo/pulls{/number}","milestones_url":"https://api.github.com/repos/odoo-dev/odoo/milestones{/number}","notifications_url":"https://api.github.com/repos/odoo-dev/odoo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/odoo-dev/odoo/labels{/name}","releases_url":"https://api.github.com/repos/odoo-dev/odoo/releases{/id}","created_at":"2014-05-16T11:16:19Z","updated_at":"2015-03-02T11:42:16Z","pushed_at":"2015-03-12T15:14:22Z","git_url":"git://github.com/odoo-dev/odoo.git","ssh_url":"git@github.com:odoo-dev/odoo.git","clone_url":"https://github.com/odoo-dev/odoo.git","svn_url":"https://github.com/odoo-dev/odoo","homepage":"https://www.odoo.com","size":1077577,"stargazers_count":44,"watchers_count":44,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"open_issues_count":11,"forks":18,"open_issues":11,"watchers":44,"default_branch":"master"}},"base":{"label":"odoo-dev:master-account-new-api-mdi","ref":"master-account-new-api-mdi","sha":"fa06724484e9a4af4df1aeb22b0f1ef24fad2ce4","user":{"login":"odoo-dev","id":7466976,"avatar_url":"https://avatars.githubusercontent.com/u/7466976?v=3","gravatar_id":"","url":"https://api.github.com/users/odoo-dev","html_url":"https://github.com/odoo-dev","followers_url":"https://api.github.com/users/odoo-dev/followers","following_url":"https://api.github.com/users/odoo-dev/following{/other_user}","gists_url":"https://api.github.com/users/odoo-dev/gists{/gist_id}","starred_url":"https://api.github.com/users/odoo-dev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/odoo-dev/subscriptions","organizations_url":"https://api.github.com/users/odoo-dev/orgs","repos_url":"https://api.github.com/users/odoo-dev/repos","events_url":"https://api.github.com/users/odoo-dev/events{/privacy}","received_events_url":"https://api.github.com/users/odoo-dev/received_events","type":"Organization","site_admin":false},"repo":{"id":19853934,"name":"odoo","full_name":"odoo-dev/odoo","owner":{"login":"odoo-dev","id":7466976,"avatar_url":"https://avatars.githubusercontent.com/u/7466976?v=3","gravatar_id":"","url":"https://api.github.com/users/odoo-dev","html_url":"https://github.com/odoo-dev","followers_url":"https://api.github.com/users/odoo-dev/followers","following_url":"https://api.github.com/users/odoo-dev/following{/other_user}","gists_url":"https://api.github.com/users/odoo-dev/gists{/gist_id}","starred_url":"https://api.github.com/users/odoo-dev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/odoo-dev/subscriptions","organizations_url":"https://api.github.com/users/odoo-dev/orgs","repos_url":"https://api.github.com/users/odoo-dev/repos","events_url":"https://api.github.com/users/odoo-dev/events{/privacy}","received_events_url":"https://api.github.com/users/odoo-dev/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/odoo-dev/odoo","description":"RD Dev Repository","fork":true,"url":"https://api.github.com/repos/odoo-dev/odoo","forks_url":"https://api.github.com/repos/odoo-dev/odoo/forks","keys_url":"https://api.github.com/repos/odoo-dev/odoo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/odoo-dev/odoo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/odoo-dev/odoo/teams","hooks_url":"https://api.github.com/repos/odoo-dev/odoo/hooks","issue_events_url":"https://api.github.com/repos/odoo-dev/odoo/issues/events{/number}","events_url":"https://api.github.com/repos/odoo-dev/odoo/events","assignees_url":"https://api.github.com/repos/odoo-dev/odoo/assignees{/user}","branches_url":"https://api.github.com/repos/odoo-dev/odoo/branches{/branch}","tags_url":"https://api.github.com/repos/odoo-dev/odoo/tags","blobs_url":"https://api.github.com/repos/odoo-dev/odoo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/odoo-dev/odoo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/odoo-dev/odoo/git/refs{/sha}","trees_url":"https://api.github.com/repos/odoo-dev/odoo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/odoo-dev/odoo/statuses/{sha}","languages_url":"https://api.github.com/repos/odoo-dev/odoo/languages","stargazers_url":"https://api.github.com/repos/odoo-dev/odoo/stargazers","contributors_url":"https://api.github.com/repos/odoo-dev/odoo/contributors","subscribers_url":"https://api.github.com/repos/odoo-dev/odoo/subscribers","subscription_url":"https://api.github.com/repos/odoo-dev/odoo/subscription","commits_url":"https://api.github.com/repos/odoo-dev/odoo/commits{/sha}","git_commits_url":"https://api.github.com/repos/odoo-dev/odoo/git/commits{/sha}","comments_url":"https://api.github.com/repos/odoo-dev/odoo/comments{/number}","issue_comment_url":"https://api.github.com/repos/odoo-dev/odoo/issues/comments{/number}","contents_url":"https://api.github.com/repos/odoo-dev/odoo/contents/{+path}","compare_url":"https://api.github.com/repos/odoo-dev/odoo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/odoo-dev/odoo/merges","archive_url":"https://api.github.com/repos/odoo-dev/odoo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/odoo-dev/odoo/downloads","issues_url":"https://api.github.com/repos/odoo-dev/odoo/issues{/number}","pulls_url":"https://api.github.com/repos/odoo-dev/odoo/pulls{/number}","milestones_url":"https://api.github.com/repos/odoo-dev/odoo/milestones{/number}","notifications_url":"https://api.github.com/repos/odoo-dev/odoo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/odoo-dev/odoo/labels{/name}","releases_url":"https://api.github.com/repos/odoo-dev/odoo/releases{/id}","created_at":"2014-05-16T11:16:19Z","updated_at":"2015-03-02T11:42:16Z","pushed_at":"2015-03-12T15:14:22Z","git_url":"git://github.com/odoo-dev/odoo.git","ssh_url":"git@github.com:odoo-dev/odoo.git","clone_url":"https://github.com/odoo-dev/odoo.git","svn_url":"https://github.com/odoo-dev/odoo","homepage":"https://www.odoo.com","size":1077577,"stargazers_count":44,"watchers_count":44,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"open_issues_count":11,"forks":18,"open_issues":11,"watchers":44,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/odoo-dev/odoo/pulls/93"},"html":{"href":"https://github.com/odoo-dev/odoo/pull/93"},"issue":{"href":"https://api.github.com/repos/odoo-dev/odoo/issues/93"},"comments":{"href":"https://api.github.com/repos/odoo-dev/odoo/issues/93/comments"},"review_comments":{"href":"https://api.github.com/repos/odoo-dev/odoo/pulls/93/comments"},"review_comment":{"href":"https://api.github.com/repos/odoo-dev/odoo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/odoo-dev/odoo/pulls/93/commits"},"statuses":{"href":"https://api.github.com/repos/odoo-dev/odoo/statuses/b3886cb63b23109eeb42392cf5b755230b3eadee"}}}}