diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/mail/models/update.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/mail/models/update.py')
| -rw-r--r-- | addons/mail/models/update.py | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/addons/mail/models/update.py b/addons/mail/models/update.py new file mode 100644 index 00000000..edf5b4f2 --- /dev/null +++ b/addons/mail/models/update.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import datetime +import logging + +import requests +import werkzeug.urls + +from ast import literal_eval + +from odoo import api, release, SUPERUSER_ID +from odoo.exceptions import UserError +from odoo.models import AbstractModel +from odoo.tools.translate import _ +from odoo.tools import config, misc, ustr + +_logger = logging.getLogger(__name__) + + +class PublisherWarrantyContract(AbstractModel): + _name = "publisher_warranty.contract" + _description = 'Publisher Warranty Contract' + + @api.model + def _get_message(self): + Users = self.env['res.users'] + IrParamSudo = self.env['ir.config_parameter'].sudo() + + dbuuid = IrParamSudo.get_param('database.uuid') + db_create_date = IrParamSudo.get_param('database.create_date') + limit_date = datetime.datetime.now() + limit_date = limit_date - datetime.timedelta(15) + limit_date_str = limit_date.strftime(misc.DEFAULT_SERVER_DATETIME_FORMAT) + nbr_users = Users.search_count([('active', '=', True)]) + nbr_active_users = Users.search_count([("login_date", ">=", limit_date_str), ('active', '=', True)]) + nbr_share_users = 0 + nbr_active_share_users = 0 + if "share" in Users._fields: + nbr_share_users = Users.search_count([("share", "=", True), ('active', '=', True)]) + nbr_active_share_users = Users.search_count([("share", "=", True), ("login_date", ">=", limit_date_str), ('active', '=', True)]) + user = self.env.user + domain = [('application', '=', True), ('state', 'in', ['installed', 'to upgrade', 'to remove'])] + apps = self.env['ir.module.module'].sudo().search_read(domain, ['name']) + + enterprise_code = IrParamSudo.get_param('database.enterprise_code') + + web_base_url = IrParamSudo.get_param('web.base.url') + msg = { + "dbuuid": dbuuid, + "nbr_users": nbr_users, + "nbr_active_users": nbr_active_users, + "nbr_share_users": nbr_share_users, + "nbr_active_share_users": nbr_active_share_users, + "dbname": self._cr.dbname, + "db_create_date": db_create_date, + "version": release.version, + "language": user.lang, + "web_base_url": web_base_url, + "apps": [app['name'] for app in apps], + "enterprise_code": enterprise_code, + } + if user.partner_id.company_id: + company_id = user.partner_id.company_id + msg.update(company_id.read(["name", "email", "phone"])[0]) + return msg + + @api.model + def _get_sys_logs(self): + """ + Utility method to send a publisher warranty get logs messages. + """ + msg = self._get_message() + arguments = {'arg0': ustr(msg), "action": "update"} + + url = config.get("publisher_warranty_url") + + r = requests.post(url, data=arguments, timeout=30) + r.raise_for_status() + return literal_eval(r.text) + + def update_notification(self, cron_mode=True): + """ + Send a message to Odoo's publisher warranty server to check the + validity of the contracts, get notifications, etc... + + @param cron_mode: If true, catch all exceptions (appropriate for usage in a cron). + @type cron_mode: boolean + """ + try: + try: + result = self._get_sys_logs() + except Exception: + if cron_mode: # we don't want to see any stack trace in cron + return False + _logger.debug("Exception while sending a get logs messages", exc_info=1) + raise UserError(_("Error during communication with the publisher warranty server.")) + # old behavior based on res.log; now on mail.message, that is not necessarily installed + user = self.env['res.users'].sudo().browse(SUPERUSER_ID) + poster = self.sudo().env.ref('mail.channel_all_employees') + if not (poster and poster.exists()): + if not user.exists(): + return True + poster = user + for message in result["messages"]: + try: + poster.message_post(body=message, subtype_xmlid='mail.mt_comment', partner_ids=[user.partner_id.id]) + except Exception: + pass + if result.get('enterprise_info'): + # Update expiration date + set_param = self.env['ir.config_parameter'].sudo().set_param + set_param('database.expiration_date', result['enterprise_info'].get('expiration_date')) + set_param('database.expiration_reason', result['enterprise_info'].get('expiration_reason', 'trial')) + set_param('database.enterprise_code', result['enterprise_info'].get('enterprise_code')) + set_param('database.already_linked_subscription_url', result['enterprise_info'].get('database_already_linked_subscription_url')) + set_param('database.already_linked_email', result['enterprise_info'].get('database_already_linked_email')) + set_param('database.already_linked_send_mail_url', result['enterprise_info'].get('database_already_linked_send_mail_url')) + + except Exception: + if cron_mode: + return False # we don't want to see any stack trace in cron + else: + raise + return True |
