Browse Source

Merge pull request #918 from Tecnativa/9.0-module_auto_update

[MIG][module_auto_update] Backport from v10
pull/941/head
Pedro M. Baeza 7 years ago
committed by GitHub
parent
commit
c0a0b9aa08
  1. 77
      module_auto_update/README.rst
  2. 7
      module_auto_update/__init__.py
  3. 30
      module_auto_update/__openerp__.py
  4. 15
      module_auto_update/data/cron_data.xml
  5. 14
      module_auto_update/hooks.py
  6. 59
      module_auto_update/i18n/ca.po
  7. 59
      module_auto_update/i18n/de.po
  8. 59
      module_auto_update/i18n/es.po
  9. 59
      module_auto_update/i18n/es_MX.po
  10. 59
      module_auto_update/i18n/hr.po
  11. 59
      module_auto_update/i18n/it.po
  12. 59
      module_auto_update/i18n/nl_NL.po
  13. 59
      module_auto_update/i18n/pt_BR.po
  14. 59
      module_auto_update/i18n/sl.po
  15. 59
      module_auto_update/i18n/tr.po
  16. 5
      module_auto_update/models/__init__.py
  17. 80
      module_auto_update/models/module.py
  18. 6
      module_auto_update/tests/__init__.py
  19. 220
      module_auto_update/tests/test_module.py
  20. 44
      module_auto_update/tests/test_module_upgrade.py
  21. 49
      module_auto_update/views/module_views.xml
  22. 5
      module_auto_update/wizards/__init__.py
  23. 33
      module_auto_update/wizards/module_upgrade.py
  24. 1
      requirements.txt

77
module_auto_update/README.rst

@ -0,0 +1,77 @@
.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
==================
Module Auto Update
==================
This module will automatically check for and apply module upgrades on a schedule.
Upgrade checking is accomplished by comparing the SHA1 checksums of currently-installed modules to the checksums of corresponding modules in the addons directories.
Installation
============
Prior to installing this module, you need to:
#. Install checksumdir with `pip install checksumdir`
#. Ensure all installed modules are up-to-date. When installed, this module will assume the versions found in the addons directories are currently installed.
Configuration
=============
The default time for checking and applying upgrades is 3:00 AM (UTC). To change this schedule, modify the "Perform Module Upgrades" scheduled action.
This module will ignore .pyc and .pyo file extensions by default. To modify this, create a module_auto_update.checksum_excluded_extensions system parameter with the desired extensions listed as comma-separated values.
Usage
=====
Modules scheduled for upgrade can be viewed by clicking the "Updates" menu item in the Apps sidebar.
To perform upgrades manually, click the "Apply Scheduled Upgrades" menu item in the Apps sidebar.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/149/9.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/server-tools/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smash it by providing detailed and welcomed feedback.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* Brent Hughes <brent.hughes@laslabs.com>
* Juan José Scarafía <jjs@adhoc.com.ar>
* Jairo Llopis <jairo.llopis@tecnativa.com>
Do not contact contributors directly about support or help with technical issues.
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit https://odoo-community.org.

7
module_auto_update/__init__.py

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from . import models
from . import wizards
from .hooks import post_init_hook

30
module_auto_update/__openerp__.py

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
{
'name': 'Module Auto Update',
'summary': 'Automatically update Odoo modules',
'version': '9.0.1.0.0',
'category': 'Extra Tools',
'website': 'https://odoo-community.org/',
'author': 'LasLabs, '
'Juan José Scarafía, '
'Odoo Community Association (OCA)',
'license': 'LGPL-3',
'application': False,
'installable': True,
'post_init_hook': 'post_init_hook',
'external_dependencies': {
'python': [
'checksumdir',
],
},
'depends': [
'base',
],
'data': [
'views/module_views.xml',
'data/cron_data.xml',
],
}

15
module_auto_update/data/cron_data.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record model="ir.cron" id="module_check_upgrades_cron">
<field name="name">Perform Module Upgrades</field>
<field name="active" eval="True"/>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="nextcall" eval="(DateTime.now() + timedelta(days= +1)).strftime('%Y-%m-%d 3:00:00')"/>
<field name="model">base.module.upgrade</field>
<field name="function">upgrade_module</field>
<field name="args" eval="'()'"/>
</record>
</odoo>

14
module_auto_update/hooks.py

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from openerp import SUPERUSER_ID, api
def post_init_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
installed_modules = env['ir.module.module'].search([
('state', '=', 'installed'),
])
for r in installed_modules:
r.checksum_installed = r.checksum_dir

59
module_auto_update/i18n/ca.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Mòdul"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/de.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# Niki Waibel <niki.waibel@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: Niki Waibel <niki.waibel@gmail.com>, 2017\n"
"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Modul"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr "Modul aktualisieren"
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/es.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: Pedro M. Baeza <pedro.baeza@gmail.com>, 2017\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Módulo"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr "Actualización de módulo"
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/es_MX.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/es_MX/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_MX\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Módulo"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/hr.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# Bole <bole@dajmi5.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>, 2017\n"
"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: hr\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Modul"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/it.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Modulo"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/nl_NL.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# Peter Hageman <hageman.p@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: Peter Hageman <hageman.p@gmail.com>, 2017\n"
"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/teams/23907/nl_NL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: nl_NL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Module"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/pt_BR.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/23907/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Módulo"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/sl.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Modul"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

59
module_auto_update/i18n/tr.po

@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * module_auto_update
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-21 02:43+0000\n"
"PO-Revision-Date: 2017-07-21 02:43+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
"Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_dir
msgid "Checksum dir"
msgstr ""
#. module: module_auto_update
#: model:ir.model.fields,field_description:module_auto_update.field_ir_module_module_checksum_installed
msgid "Checksum installed"
msgstr ""
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_ir_module_module
msgid "Module"
msgstr "Modül"
#. module: module_auto_update
#: model:ir.model,name:module_auto_update.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.menu_default_modules
msgid "Modules"
msgstr ""
#. module: module_auto_update
#: model:ir.actions.server,name:module_auto_update.module_action_open_updates
msgid "Open Updates and Update Apps List Server Action"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.view,arch_db:module_auto_update.module_view_search
msgid "Scheduled Upgrades"
msgstr ""
#. module: module_auto_update
#: model:ir.ui.menu,name:module_auto_update.module_menu_updates
msgid "Updates"
msgstr ""

5
module_auto_update/models/__init__.py

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from . import module

80
module_auto_update/models/module.py

@ -0,0 +1,80 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
import logging
from openerp import api, fields, models
from openerp.modules.module import get_module_path
_logger = logging.getLogger(__name__)
try:
from checksumdir import dirhash
except ImportError:
_logger.debug('Cannot `import checksumdir`.')
class Module(models.Model):
_inherit = 'ir.module.module'
checksum_dir = fields.Char(
compute='_compute_checksum_dir',
)
checksum_installed = fields.Char()
@api.depends('name')
def _compute_checksum_dir(self):
exclude = self.env["ir.config_parameter"].get_param(
"module_auto_update.checksum_excluded_extensions",
"pyc,pyo",
).split(",")
for r in self:
try:
r.checksum_dir = dirhash(
get_module_path(r.name),
'sha1',
excluded_extensions=exclude,
)
except TypeError:
_logger.debug(
"Cannot compute dir hash for %s, module not found",
r.display_name)
def _store_checksum_installed(self, vals):
if self.env.context.get('retain_checksum_installed'):
return
if 'checksum_installed' not in vals:
if vals.get('state') == 'installed':
for r in self:
r.checksum_installed = r.checksum_dir
elif vals.get('state') == 'uninstalled':
self.write({'checksum_installed': False})
@api.multi
def button_uninstall_cancel(self):
# TODO Use super() like in v10 after pull is merged
# HACK https://github.com/odoo/odoo/pull/18597
return self.with_context(retain_checksum_installed=True).write({
'state': 'installed',
})
@api.multi
def button_upgrade_cancel(self):
# TODO Use super() like in v10 after pull is merged
# HACK https://github.com/odoo/odoo/pull/18597
return self.with_context(retain_checksum_installed=True).write({
'state': 'installed',
})
@api.model
def create(self, vals):
res = super(Module, self).create(vals)
res._store_checksum_installed(vals)
return res
@api.multi
def write(self, vals):
res = super(Module, self).write(vals)
self._store_checksum_installed(vals)
return res

6
module_auto_update/tests/__init__.py

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from . import test_module
from . import test_module_upgrade

220
module_auto_update/tests/test_module.py

@ -0,0 +1,220 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
import logging
import os
import tempfile
import mock
from openerp.modules import get_module_path
from openerp.tests.common import TransactionCase
from .. import post_init_hook
_logger = logging.getLogger(__name__)
try:
from checksumdir import dirhash
except ImportError:
_logger.debug('Cannot `import checksumdir`.')
model = 'openerp.addons.module_auto_update.models.module'
class TestModule(TransactionCase):
def setUp(self):
super(TestModule, self).setUp()
module_name = 'module_auto_update'
self.own_module = self.env['ir.module.module'].search([
('name', '=', module_name),
])
self.own_dir_path = get_module_path(module_name)
self.own_checksum = dirhash(
self.own_dir_path,
'sha1',
excluded_extensions=['pyc', 'pyo'],
)
self.own_writeable = os.access(self.own_dir_path, os.W_OK)
@mock.patch('%s.get_module_path' % model)
def create_test_module(self, vals, get_module_path_mock):
get_module_path_mock.return_value = self.own_dir_path
test_module = self.env['ir.module.module'].create(vals)
return test_module
def test_compute_checksum_dir(self):
"""It should compute the directory's SHA-1 hash"""
self.assertEqual(
self.own_module.checksum_dir, self.own_checksum,
'Module directory checksum not computed properly',
)
def test_compute_checksum_dir_ignore_excluded(self):
"""It should exclude .pyc/.pyo extensions from checksum
calculations"""
if not self.own_writeable:
self.skipTest("Own directory not writeable")
with tempfile.NamedTemporaryFile(
suffix='.pyc', dir=self.own_dir_path):
self.assertEqual(
self.own_module.checksum_dir, self.own_checksum,
'SHA1 checksum does not ignore excluded extensions',
)
def test_compute_checksum_dir_recomputes_when_file_added(self):
"""It should return a different value when a non-.pyc/.pyo file is
added to the module directory"""
if not self.own_writeable:
self.skipTest("Own directory not writeable")
with tempfile.NamedTemporaryFile(
suffix='.py', dir=self.own_dir_path):
self.assertNotEqual(
self.own_module.checksum_dir, self.own_checksum,
'SHA1 checksum not recomputed',
)
def test_store_checksum_installed_state_installed(self):
"""It should set the module's checksum_installed equal to
checksum_dir when vals contain state 'installed'"""
self.own_module.checksum_installed = 'test'
self.own_module._store_checksum_installed({'state': 'installed'})
self.assertEqual(
self.own_module.checksum_installed, self.own_module.checksum_dir,
'Setting state to installed does not store checksum_dir '
'as checksum_installed',
)
def test_store_checksum_installed_state_uninstalled(self):
"""It should clear the module's checksum_installed when vals
contain state 'uninstalled'"""
self.own_module.checksum_installed = 'test'
self.own_module._store_checksum_installed({'state': 'uninstalled'})
self.assertEqual(
self.own_module.checksum_installed, False,
'Setting state to uninstalled does not clear checksum_installed',
)
def test_store_checksum_installed_vals_contain_checksum_installed(self):
"""It should not set checksum_installed to False or checksum_dir when
a checksum_installed is included in vals"""
self.own_module.checksum_installed = 'test'
self.own_module._store_checksum_installed({
'state': 'installed',
'checksum_installed': 'test',
})
self.assertEqual(
self.own_module.checksum_installed, 'test',
'Providing checksum_installed in vals did not prevent overwrite',
)
def test_store_checksum_installed_with_retain_context(self):
"""It should not set checksum_installed to False or checksum_dir when
self has context retain_checksum_installed=True"""
self.own_module.checksum_installed = 'test'
self.own_module.with_context(
retain_checksum_installed=True,
)._store_checksum_installed({'state': 'installed'})
self.assertEqual(
self.own_module.checksum_installed, 'test',
'Providing retain_checksum_installed context did not prevent '
'overwrite',
)
def test_button_uninstall_cancel(self):
"""It should preserve checksum_installed when cancelling uninstall"""
self.own_module.write({'state': 'to remove'})
self.own_module.checksum_installed = 'test'
self.own_module.button_uninstall_cancel()
self.assertEqual(
self.own_module.checksum_installed, 'test',
'Uninstall cancellation does not preserve checksum_installed',
)
def test_button_upgrade_cancel(self):
"""It should preserve checksum_installed when cancelling upgrades"""
self.own_module.write({'state': 'to upgrade'})
self.own_module.checksum_installed = 'test'
self.own_module.button_upgrade_cancel()
self.assertEqual(
self.own_module.checksum_installed, 'test',
'Upgrade cancellation does not preserve checksum_installed',
)
def test_create(self):
"""It should call _store_checksum_installed method"""
_store_checksum_installed_mock = mock.MagicMock()
self.env['ir.module.module']._patch_method(
'_store_checksum_installed',
_store_checksum_installed_mock,
)
vals = {
'name': 'module_auto_update_test_module',
'state': 'installed',
}
self.create_test_module(vals)
_store_checksum_installed_mock.assert_called_once_with(vals)
self.env['ir.module.module']._revert_method(
'_store_checksum_installed',
)
@mock.patch('%s.get_module_path' % model)
def test_get_module_list(self, module_path_mock):
"""It should change the state of modules with different
checksum_dir and checksum_installed to 'to upgrade'"""
module_path_mock.return_value = self.own_dir_path
vals = {
'name': 'module_auto_update_test_module',
'state': 'installed',
}
test_module = self.create_test_module(vals)
test_module.checksum_installed = 'test'
self.env['base.module.upgrade'].get_module_list()
self.assertEqual(
test_module.state, 'to upgrade',
'List update does not mark upgradeable modules "to upgrade"',
)
@mock.patch('%s.get_module_path' % model)
def test_get_module_list_only_changes_installed(self, module_path_mock):
"""It should not change the state of a module with a former state
other than 'installed' to 'to upgrade'"""
module_path_mock.return_value = self.own_dir_path
vals = {
'name': 'module_auto_update_test_module',
'state': 'uninstalled',
}
test_module = self.create_test_module(vals)
self.env['base.module.upgrade'].get_module_list()
self.assertNotEqual(
test_module.state, 'to upgrade',
'List update changed state of an uninstalled module',
)
def test_write(self):
"""It should call _store_checksum_installed method"""
_store_checksum_installed_mock = mock.MagicMock()
self.env['ir.module.module']._patch_method(
'_store_checksum_installed',
_store_checksum_installed_mock,
)
vals = {'state': 'installed'}
self.own_module.write(vals)
_store_checksum_installed_mock.assert_called_once_with(vals)
self.env['ir.module.module']._revert_method(
'_store_checksum_installed',
)
def test_post_init_hook(self):
"""It should set checksum_installed equal to checksum_dir for all
installed modules"""
installed_modules = self.env['ir.module.module'].search([
('state', '=', 'installed'),
])
post_init_hook(self.env.cr, None)
self.assertListEqual(
installed_modules.mapped('checksum_dir'),
installed_modules.mapped('checksum_installed'),
'Installed modules did not have checksum_installed stored',
)

44
module_auto_update/tests/test_module_upgrade.py

@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
import mock
from openerp.modules import get_module_path
from openerp.modules.registry import RegistryManager
from openerp.tests.common import TransactionCase
class TestModuleUpgrade(TransactionCase):
def setUp(self):
super(TestModuleUpgrade, self).setUp()
module_name = 'module_auto_update'
self.own_module = self.env['ir.module.module'].search([
('name', '=', module_name),
])
self.own_dir_path = get_module_path(module_name)
def test_upgrade_module_cancel(self):
"""It should preserve checksum_installed when cancelling upgrades"""
self.own_module.write({'state': 'to upgrade'})
self.own_module.checksum_installed = 'test'
self.env['base.module.upgrade'].upgrade_module_cancel()
self.assertEqual(
self.own_module.checksum_installed, 'test',
'Upgrade cancellation does not preserve checksum_installed',
)
@mock.patch.object(RegistryManager, 'new')
def test_upgrade_module(self, new_mock):
"""Calls get_module_list when upgrading in api.model mode"""
get_module_list_mock = mock.MagicMock()
try:
self.env['base.module.upgrade']._patch_method(
'get_module_list',
get_module_list_mock,
)
self.env['base.module.upgrade'].upgrade_module()
get_module_list_mock.assert_called_once_with()
finally:
self.env['base.module.upgrade']._revert_method('get_module_list')

49
module_auto_update/views/module_views.xml

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Module Search View -->
<record id="module_view_search" model="ir.ui.view">
<field name="name">updates.module.search</field>
<field name="model">ir.module.module</field>
<field name="inherit_id" ref="base.view_module_filter"/>
<field name="arch" type="xml">
<field name="category_id" position="after">
<filter name="scheduled_upgrades" string="Scheduled Upgrades" domain="[('state', '=', 'to upgrade')]"/>
</field>
</field>
</record>
<!--Open Updates Action (updates apps list first)-->
<record id="module_action_open_updates" model="ir.actions.server">
<field name="name">Open Updates and Update Apps List Server Action</field>
<field name="model_id" ref="model_ir_module_module"/>
<field name="code">
if model.update_list():
action = {
'name': 'Updates',
'type': 'ir.actions.act_window',
'res_model': 'ir.module.module',
'view_type': 'form',
'view_mode': 'tree,form',
'target': 'main',
'context': '{"search_default_scheduled_upgrades": 1}',
}
</field>
</record>
<!--Apps / Updates menu item-->
<menuitem
name="Updates"
action="module_action_open_updates"
id="module_menu_updates"
groups="base.group_no_one"
parent="base.menu_management"
sequence="20"/>
<!-- Menu in Settings > Technical for standard Updates link -->
<menuitem parent="base.menu_custom" sequence="27" name="Modules" id="menu_default_modules"/>
<!-- Moved standard Updates link -->
<record model="ir.ui.menu" id="base.menu_module_updates">
<field name="parent_id" ref="menu_default_modules"/>
</record>
</odoo>

5
module_auto_update/wizards/__init__.py

@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from . import module_upgrade

33
module_auto_update/wizards/module_upgrade.py

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from openerp import api, models
class ModuleUpgrade(models.TransientModel):
_inherit = 'base.module.upgrade'
@api.model
def get_module_list(self):
Module = self.env["ir.module.module"]
installed_modules = Module.search([('state', '=', 'installed')])
upgradeable_modules = installed_modules.filtered(
lambda r: r.checksum_dir != r.checksum_installed,
)
upgradeable_modules.button_upgrade()
return super(ModuleUpgrade, self).get_module_list()
@api.multi
def upgrade_module_cancel(self):
return super(
ModuleUpgrade,
self.with_context(retain_checksum_installed=True),
).upgrade_module_cancel()
@api.multi
def upgrade_module(self):
# Compute updates by checksum when called in @api.model fashion
if not self:
self.get_module_list()
return super(ModuleUpgrade, self).upgrade_module()

1
requirements.txt

@ -1,3 +1,4 @@
checksumdir
python-ldap python-ldap
unidecode unidecode
acme_tiny acme_tiny

Loading…
Cancel
Save