From 96387a1f7575edc2746e0fe1a173c7ac06924788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Endika=20Iglesias=20Garc=C3=ADa?= Date: Fri, 18 Sep 2015 13:02:15 +0200 Subject: [PATCH 01/14] [ADD] res_users_with_gravatar --- res_users_with_gravatar/README.rst | 33 +++++++++++++++ res_users_with_gravatar/__init__.py | 6 +++ res_users_with_gravatar/__openerp__.py | 34 +++++++++++++++ res_users_with_gravatar/i18n/es.po | 40 ++++++++++++++++++ .../i18n/res_users_with_gravatar.pot | 40 ++++++++++++++++++ res_users_with_gravatar/models/__init__.py | 6 +++ res_users_with_gravatar/models/res_users.py | 38 +++++++++++++++++ .../static/description/icon.png | Bin 0 -> 14801 bytes .../views/res_users_view.xml | 28 ++++++++++++ 9 files changed, 225 insertions(+) create mode 100644 res_users_with_gravatar/README.rst create mode 100644 res_users_with_gravatar/__init__.py create mode 100644 res_users_with_gravatar/__openerp__.py create mode 100644 res_users_with_gravatar/i18n/es.po create mode 100644 res_users_with_gravatar/i18n/res_users_with_gravatar.pot create mode 100644 res_users_with_gravatar/models/__init__.py create mode 100644 res_users_with_gravatar/models/res_users.py create mode 100644 res_users_with_gravatar/static/description/icon.png create mode 100644 res_users_with_gravatar/views/res_users_view.xml diff --git a/res_users_with_gravatar/README.rst b/res_users_with_gravatar/README.rst new file mode 100644 index 000000000..ad13f8117 --- /dev/null +++ b/res_users_with_gravatar/README.rst @@ -0,0 +1,33 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License: AGPL-3 + +Synchronize Gravatar image +========================== + +Use you Gravatar image in to your Odoo + + +License +======= + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + + +Credits +======= + +Contributors +------------ + +* Endika Iglesias diff --git a/res_users_with_gravatar/__init__.py b/res_users_with_gravatar/__init__.py new file mode 100644 index 000000000..054c8853d --- /dev/null +++ b/res_users_with_gravatar/__init__.py @@ -0,0 +1,6 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## + +from . import models diff --git a/res_users_with_gravatar/__openerp__.py b/res_users_with_gravatar/__openerp__.py new file mode 100644 index 000000000..cac8e92e7 --- /dev/null +++ b/res_users_with_gravatar/__openerp__.py @@ -0,0 +1,34 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright : +# Endika Iglesias +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': 'Synchronize Gravatar image', + 'version': '1', + 'author': 'Endika Iglesias', + 'category': 'Tools', + 'website': 'http://www.endikaiglesias.com', + 'depends': ['base'], + 'data': [ + 'views/res_users_view.xml', + ], + 'installable': True, +} diff --git a/res_users_with_gravatar/i18n/es.po b/res_users_with_gravatar/i18n/es.po new file mode 100644 index 000000000..c99a1e31a --- /dev/null +++ b/res_users_with_gravatar/i18n/es.po @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * res_users_with_gravatar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-09-18 10:53+0000\n" +"PO-Revision-Date: 2015-09-18 10:53+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: res_users_with_gravatar +#: view:res.users:res_users_with_gravatar.view_users_form_gravatar +#: view:res.users:res_users_with_gravatar.view_users_form_simple_modif_gravatar +msgid "Get Gravatar image" +msgstr "Obtener imagen de Gravatar" + +#. module: res_users_with_gravatar +#: code:addons/res_users_with_gravatar/models/res_users.py:25 +#, python-format +msgid "Sorry Gravatar not found." +msgstr "Lo siento, Gravatar no funciona." + +#. module: res_users_with_gravatar +#: model:ir.model,name:res_users_with_gravatar.model_res_users +msgid "Users" +msgstr "Usuarios" + +#. module: res_users_with_gravatar +#: code:addons/res_users_with_gravatar/models/res_users.py:36 +#, python-format +msgid "You don't have Gravatar image to this %s email." +msgstr "No tiene imagen de Gravatar para este %s email." + diff --git a/res_users_with_gravatar/i18n/res_users_with_gravatar.pot b/res_users_with_gravatar/i18n/res_users_with_gravatar.pot new file mode 100644 index 000000000..59a83f6dc --- /dev/null +++ b/res_users_with_gravatar/i18n/res_users_with_gravatar.pot @@ -0,0 +1,40 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * res_users_with_gravatar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-09-18 10:53+0000\n" +"PO-Revision-Date: 2015-09-18 10:53+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: res_users_with_gravatar +#: view:res.users:res_users_with_gravatar.view_users_form_gravatar +#: view:res.users:res_users_with_gravatar.view_users_form_simple_modif_gravatar +msgid "Get Gravatar image" +msgstr "" + +#. module: res_users_with_gravatar +#: code:addons/res_users_with_gravatar/models/res_users.py:25 +#, python-format +msgid "Sorry Gravatar not found." +msgstr "" + +#. module: res_users_with_gravatar +#: model:ir.model,name:res_users_with_gravatar.model_res_users +msgid "Users" +msgstr "" + +#. module: res_users_with_gravatar +#: code:addons/res_users_with_gravatar/models/res_users.py:36 +#, python-format +msgid "You don't have Gravatar image to this %s email." +msgstr "" + diff --git a/res_users_with_gravatar/models/__init__.py b/res_users_with_gravatar/models/__init__.py new file mode 100644 index 000000000..b7b7a6689 --- /dev/null +++ b/res_users_with_gravatar/models/__init__.py @@ -0,0 +1,6 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## + +from . import res_users diff --git a/res_users_with_gravatar/models/res_users.py b/res_users_with_gravatar/models/res_users.py new file mode 100644 index 000000000..12c2bdfb5 --- /dev/null +++ b/res_users_with_gravatar/models/res_users.py @@ -0,0 +1,38 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## + +from openerp import models, api +from openerp.exceptions import Warning +from openerp.tools.translate import _ +import base64 +import hashlib +import urllib2 + + +class ResUsers(models.Model): + _inherit = 'res.users' + + def _get_gravatar_base64(self, email=''): + url = 'http://www.gravatar.com/avatar/{}?s=200' + _hash = hashlib.md5(email).hexdigest() + try: + res = urllib2.urlopen(url.format(_hash)) + raw_image = res.read() + return base64.encodestring(raw_image) + except urllib2.HTTPError: + raise Warning(_('Sorry Gravatar not found.')) + + @api.one + def get_gravatar_image(self): + email = str(self.email) or '' + fail_example = self._get_gravatar_base64('fail@email.gravatar') + user_gravatar = self._get_gravatar_base64(email) + if fail_example != user_gravatar: + self.write({'image': user_gravatar}) + else: + raise Warning( + _("You don't have Gravatar image to this %s email." % ( + email))) + return True diff --git a/res_users_with_gravatar/static/description/icon.png b/res_users_with_gravatar/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..871a69c1816f303d57169d03ae4327359b6b0f6c GIT binary patch literal 14801 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 + + + + + res.users.form.gravatar + res.users + + + +