{"action":"created","comment":{"url":"https://api.github.com/repos/odoo/odoo/pulls/comments/43492541","id":43492541,"diff_hunk":"@@ -0,0 +1,246 @@\n+# -*- coding: utf-8 -*-\n+# Part of Odoo. See LICENSE file for full copyright and licensing details.\n+\n+import logging\n+import poplib\n+import time\n+from imaplib import IMAP4, IMAP4_SSL\n+from poplib import POP3, POP3_SSL\n+\n+from odoo import api, fields, models, tools, _\n+from odoo.exceptions import UserError\n+\n+_logger = logging.getLogger(__name__)\n+MAX_POP_MESSAGES = 50\n+MAIL_TIMEOUT = 60\n+\n+# Workaround for Python 2.7.8 bug https://bugs.python.org/issue23906\n+poplib._MAXLINE = 65536\n+\n+class FetchmailServer(models.Model):\n+    \"\"\"Incoming POP/IMAP mail server account\"\"\"\n+    _name = 'fetchmail.server'\n+    _description = \"POP/IMAP Server\"\n+    _order = 'priority'\n+\n+    name = fields.Char(required=True, readonly=False)\n+    active = fields.Boolean(required=False, default=True)\n+    state = fields.Selection([\n+        ('draft', 'Not Confirmed'),\n+        ('done', 'Confirmed'),\n+    ], string='Status', index=True, readonly=True, copy=False, default='draft')\n+    server = fields.Char(string='Server Name', readonly=True, help=\"Hostname or IP of the mail server\", states={'draft':[('readonly', False)]})\n+    port = fields.Integer(readonly=True, states={'draft':[('readonly', False)]})\n+    server_type = fields.Selection([\n+        ('pop', 'POP Server'),\n+        ('imap', 'IMAP Server'),\n+        ('local', 'Local Server'),\n+    ], 'Server Type', index=True, required=True, readonly=False, default='pop', oldname=\"type\")\n+    is_ssl = fields.Boolean(string='SSL/TLS', help=\"Connections are encrypted with SSL/TLS through a dedicated port (default: IMAPS=993, POP3S=995)\")\n+    attach = fields.Boolean(string='Keep Attachments', help=\"Whether attachments should be downloaded. \"\n+                                                     \"If not enabled, incoming emails will be stripped of any attachments before being processed\", default=True)\n+    original = fields.Boolean(string='Keep Original', help=\"Whether a full original copy of each email should be kept for reference\"\n+                                                    \"and attached to each processed message. This will usually double the size of your message database.\")\n+    date = fields.Datetime(string='Last Fetch Date', readonly=True)\n+    user = fields.Char(string='Username', readonly=True, states={'draft':[('readonly', False)]})\n+    password = fields.Char(readonly=True, states={'draft':[('readonly', False)]})\n+    action_id = fields.Many2one('ir.actions.server', string='Server Action', help=\"Optional custom server action to trigger for each incoming mail, \"\n+                                                                           \"on the record that was created or updated by this mail\")\n+    object_id = fields.Many2one('ir.model', string=\"Create a New Record\", help=\"Process each incoming mail as part of a conversation \"\n+                                                                                         \"corresponding to this document type. This will create \"\n+                                                                                         \"new documents for new conversations, or attach follow-up \"\n+                                                                                         \"emails to the existing conversations (documents).\")\n+    priority = fields.Integer(string='Server Priority', readonly=True, states={'draft':[('readonly', False)]}, help=\"Defines the order of processing, \"\n+                                                                                                              \"lower values mean higher priority\", default=5)\n+    message_ids = fields.One2many('mail.mail', 'fetchmail_server_id', string='Messages', readonly=True)\n+    configuration = fields.Text(readonly=True)\n+    script = fields.Char(readonly=True, default='/mail/static/scripts/openerp_mailgate.py')\n+\n+    @api.onchange('server_type', 'is_ssl', 'object_id')\n+    def onchange_server_type(self):\n+        self.port = 0\n+        if self.server_type == 'pop':\n+            self.port = self.is_ssl and 995 or 110\n+        elif self.server_type == 'imap':\n+            self.port = self.is_ssl and 993 or 143\n+        else:\n+            self.server = ''\n+\n+        conf = {\n+            'dbname': self.env.cr.dbname,\n+            'uid': self.env.uid,\n+        }\n+        conf['model'] = self.object_id.model if self.object_id else 'MODELNAME'\n+        self.configuration = \"\"\"Use the below script with the following command line options with your Mail Transport Agent (MTA)\n+\n+openerp_mailgate.py --host=HOSTNAME --port=PORT -u %(uid)d -p PASSWORD -d %(dbname)s\n+\n+Example configuration for the postfix mta running locally:\n+\n+/etc/postfix/virtual_aliases:\n+@youdomain openerp_mailgate@localhost\n+\n+/etc/aliases:\n+openerp_mailgate: \"|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p PASSWORD -d %(dbname)s\"\n+\n+\"\"\" % conf\n+\n+    @api.model\n+    def create(self, values):\n+        res = super(FetchmailServer, self).create(values)\n+        self._update_cron()\n+        return res\n+\n+    @api.multi\n+    def write(self, values):\n+        res = super(FetchmailServer, self).write(values)\n+        self._update_cron()\n+        return res\n+\n+    @api.multi\n+    def unlink(self):\n+        res = super(FetchmailServer, self).unlink()\n+        self._update_cron()\n+        return res\n+\n+    @api.multi\n+    def set_draft(self):\n+        self.ensure_one()","path":"addons/fetchmail/models/fetchmail.py","position":108,"original_position":108,"commit_id":"a8c1f848e5f4c62e26751dfb33ba14d34f439867","original_commit_id":"a8c1f848e5f4c62e26751dfb33ba14d34f439867","user":{"login":"hmo-odoo","id":6368068,"avatar_url":"https://avatars.githubusercontent.com/u/6368068?v=3","gravatar_id":"","url":"https://api.github.com/users/hmo-odoo","html_url":"https://github.com/hmo-odoo","followers_url":"https://api.github.com/users/hmo-odoo/followers","following_url":"https://api.github.com/users/hmo-odoo/following{/other_user}","gists_url":"https://api.github.com/users/hmo-odoo/gists{/gist_id}","starred_url":"https://api.github.com/users/hmo-odoo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hmo-odoo/subscriptions","organizations_url":"https://api.github.com/users/hmo-odoo/orgs","repos_url":"https://api.github.com/users/hmo-odoo/repos","events_url":"https://api.github.com/users/hmo-odoo/events{/privacy}","received_events_url":"https://api.github.com/users/hmo-odoo/received_events","type":"User","site_admin":false},"body":"remove ensure_one(). use write method to update state.","created_at":"2015-10-30T11:27:52Z","updated_at":"2015-10-30T11:27:52Z","html_url":"https://github.com/odoo/odoo/pull/8073#discussion_r43492541","pull_request_url":"https://api.github.com/repos/odoo/odoo/pulls/8073","_links":{"self":{"href":"https://api.github.com/repos/odoo/odoo/pulls/comments/43492541"},"html":{"href":"https://github.com/odoo/odoo/pull/8073#discussion_r43492541"},"pull_request":{"href":"https://api.github.com/repos/odoo/odoo/pulls/8073"}}},"pull_request":{"url":"https://api.github.com/repos/odoo/odoo/pulls/8073","id":42441400,"html_url":"https://github.com/odoo/odoo/pull/8073","diff_url":"https://github.com/odoo/odoo/pull/8073.diff","patch_url":"https://github.com/odoo/odoo/pull/8073.patch","issue_url":"https://api.github.com/repos/odoo/odoo/issues/8073","number":8073,"state":"open","locked":false,"title":"[MIG] fetchmail: convert in to new api","user":{"login":"kga-odoo","id":12183876,"avatar_url":"https://avatars.githubusercontent.com/u/12183876?v=3","gravatar_id":"","url":"https://api.github.com/users/kga-odoo","html_url":"https://github.com/kga-odoo","followers_url":"https://api.github.com/users/kga-odoo/followers","following_url":"https://api.github.com/users/kga-odoo/following{/other_user}","gists_url":"https://api.github.com/users/kga-odoo/gists{/gist_id}","starred_url":"https://api.github.com/users/kga-odoo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kga-odoo/subscriptions","organizations_url":"https://api.github.com/users/kga-odoo/orgs","repos_url":"https://api.github.com/users/kga-odoo/repos","events_url":"https://api.github.com/users/kga-odoo/events{/privacy}","received_events_url":"https://api.github.com/users/kga-odoo/received_events","type":"User","site_admin":false},"body":"<strong>Task</strong> : https://www.odoo.com/web#id=13719&view_type=form&model=project.task&action=327\r\n<strong>Pad</strong> : https://pad.odoo.com/p/r.0ihtzhRz3qNvp1F9","created_at":"2015-08-14T10:10:15Z","updated_at":"2015-10-30T11:27:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"40569c875512e25328c835959b1e5a6405bc63ef","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/odoo/odoo/pulls/8073/commits","review_comments_url":"https://api.github.com/repos/odoo/odoo/pulls/8073/comments","review_comment_url":"https://api.github.com/repos/odoo/odoo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/odoo/odoo/issues/8073/comments","statuses_url":"https://api.github.com/repos/odoo/odoo/statuses/a8c1f848e5f4c62e26751dfb33ba14d34f439867","head":{"label":"odoo-dev:master-fetchmail-new-api-kga","ref":"master-fetchmail-new-api-kga","sha":"a8c1f848e5f4c62e26751dfb33ba14d34f439867","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-10-13T05:17:28Z","pushed_at":"2015-10-30T11:27:29Z","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":1451840,"stargazers_count":62,"watchers_count":62,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":24,"mirror_url":null,"open_issues_count":0,"forks":24,"open_issues":0,"watchers":62,"default_branch":"master"}},"base":{"label":"odoo:master","ref":"master","sha":"cc552c008bb78be930937b5291853216265811e4","user":{"login":"odoo","id":6368483,"avatar_url":"https://avatars.githubusercontent.com/u/6368483?v=3","gravatar_id":"","url":"https://api.github.com/users/odoo","html_url":"https://github.com/odoo","followers_url":"https://api.github.com/users/odoo/followers","following_url":"https://api.github.com/users/odoo/following{/other_user}","gists_url":"https://api.github.com/users/odoo/gists{/gist_id}","starred_url":"https://api.github.com/users/odoo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/odoo/subscriptions","organizations_url":"https://api.github.com/users/odoo/orgs","repos_url":"https://api.github.com/users/odoo/repos","events_url":"https://api.github.com/users/odoo/events{/privacy}","received_events_url":"https://api.github.com/users/odoo/received_events","type":"Organization","site_admin":false},"repo":{"id":19745004,"name":"odoo","full_name":"odoo/odoo","owner":{"login":"odoo","id":6368483,"avatar_url":"https://avatars.githubusercontent.com/u/6368483?v=3","gravatar_id":"","url":"https://api.github.com/users/odoo","html_url":"https://github.com/odoo","followers_url":"https://api.github.com/users/odoo/followers","following_url":"https://api.github.com/users/odoo/following{/other_user}","gists_url":"https://api.github.com/users/odoo/gists{/gist_id}","starred_url":"https://api.github.com/users/odoo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/odoo/subscriptions","organizations_url":"https://api.github.com/users/odoo/orgs","repos_url":"https://api.github.com/users/odoo/repos","events_url":"https://api.github.com/users/odoo/events{/privacy}","received_events_url":"https://api.github.com/users/odoo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/odoo/odoo","description":"Odoo (formerly OpenERP). Open Source Apps To Grow Your Business.","fork":false,"url":"https://api.github.com/repos/odoo/odoo","forks_url":"https://api.github.com/repos/odoo/odoo/forks","keys_url":"https://api.github.com/repos/odoo/odoo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/odoo/odoo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/odoo/odoo/teams","hooks_url":"https://api.github.com/repos/odoo/odoo/hooks","issue_events_url":"https://api.github.com/repos/odoo/odoo/issues/events{/number}","events_url":"https://api.github.com/repos/odoo/odoo/events","assignees_url":"https://api.github.com/repos/odoo/odoo/assignees{/user}","branches_url":"https://api.github.com/repos/odoo/odoo/branches{/branch}","tags_url":"https://api.github.com/repos/odoo/odoo/tags","blobs_url":"https://api.github.com/repos/odoo/odoo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/odoo/odoo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/odoo/odoo/git/refs{/sha}","trees_url":"https://api.github.com/repos/odoo/odoo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/odoo/odoo/statuses/{sha}","languages_url":"https://api.github.com/repos/odoo/odoo/languages","stargazers_url":"https://api.github.com/repos/odoo/odoo/stargazers","contributors_url":"https://api.github.com/repos/odoo/odoo/contributors","subscribers_url":"https://api.github.com/repos/odoo/odoo/subscribers","subscription_url":"https://api.github.com/repos/odoo/odoo/subscription","commits_url":"https://api.github.com/repos/odoo/odoo/commits{/sha}","git_commits_url":"https://api.github.com/repos/odoo/odoo/git/commits{/sha}","comments_url":"https://api.github.com/repos/odoo/odoo/comments{/number}","issue_comment_url":"https://api.github.com/repos/odoo/odoo/issues/comments{/number}","contents_url":"https://api.github.com/repos/odoo/odoo/contents/{+path}","compare_url":"https://api.github.com/repos/odoo/odoo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/odoo/odoo/merges","archive_url":"https://api.github.com/repos/odoo/odoo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/odoo/odoo/downloads","issues_url":"https://api.github.com/repos/odoo/odoo/issues{/number}","pulls_url":"https://api.github.com/repos/odoo/odoo/pulls{/number}","milestones_url":"https://api.github.com/repos/odoo/odoo/milestones{/number}","notifications_url":"https://api.github.com/repos/odoo/odoo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/odoo/odoo/labels{/name}","releases_url":"https://api.github.com/repos/odoo/odoo/releases{/id}","created_at":"2014-05-13T15:38:58Z","updated_at":"2015-10-30T10:52:42Z","pushed_at":"2015-10-30T11:02:00Z","git_url":"git://github.com/odoo/odoo.git","ssh_url":"git@github.com:odoo/odoo.git","clone_url":"https://github.com/odoo/odoo.git","svn_url":"https://github.com/odoo/odoo","homepage":"https://www.odoo.com","size":1608715,"stargazers_count":3310,"watchers_count":3310,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2948,"mirror_url":null,"open_issues_count":2712,"forks":2948,"open_issues":2712,"watchers":3310,"default_branch":"9.0"}},"_links":{"self":{"href":"https://api.github.com/repos/odoo/odoo/pulls/8073"},"html":{"href":"https://github.com/odoo/odoo/pull/8073"},"issue":{"href":"https://api.github.com/repos/odoo/odoo/issues/8073"},"comments":{"href":"https://api.github.com/repos/odoo/odoo/issues/8073/comments"},"review_comments":{"href":"https://api.github.com/repos/odoo/odoo/pulls/8073/comments"},"review_comment":{"href":"https://api.github.com/repos/odoo/odoo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/odoo/odoo/pulls/8073/commits"},"statuses":{"href":"https://api.github.com/repos/odoo/odoo/statuses/a8c1f848e5f4c62e26751dfb33ba14d34f439867"}}}}