From 272ba9911b60998094e7aa4d1f9ca98d2dbf2d1f Mon Sep 17 00:00:00 2001 From: Maciej Wawro Date: Tue, 6 Nov 2018 16:18:40 +0100 Subject: [PATCH] [environment_checkup] Fix description --- galicea_environment_checkup/README.md | 1 + galicea_environment_checkup/README.rst | 88 ------------------ galicea_environment_checkup/__manifest__.py | 7 +- .../static/description/icon.png | Bin 41196 -> 3465 bytes .../custom_screenshot.png} | Bin .../dependencies_screenshot.png} | Bin .../static/description/index.html | 79 ++++++++++++++++ 7 files changed, 86 insertions(+), 89 deletions(-) create mode 100644 galicea_environment_checkup/README.md delete mode 100644 galicea_environment_checkup/README.rst rename galicea_environment_checkup/static/description/{custom.png => images/custom_screenshot.png} (100%) rename galicea_environment_checkup/static/description/{dependencies.png => images/dependencies_screenshot.png} (100%) create mode 100644 galicea_environment_checkup/static/description/index.html diff --git a/galicea_environment_checkup/README.md b/galicea_environment_checkup/README.md new file mode 100644 index 0000000..131745f --- /dev/null +++ b/galicea_environment_checkup/README.md @@ -0,0 +1 @@ +[See add-on page on odoo.com](https://apps.odoo.com/apps/modules/10.0/galicea_environment_checkup/) diff --git a/galicea_environment_checkup/README.rst b/galicea_environment_checkup/README.rst deleted file mode 100644 index b82dd29..0000000 --- a/galicea_environment_checkup/README.rst +++ /dev/null @@ -1,88 +0,0 @@ -About -===== - -This add-on allows you to: - -- programmatically check software dependencies required by your add-on, as well as inform the Administrator as to how to meet them, -- add custom verification for Odoo instance set-up and inform the Administrator about any inconsistencies. - -Dependency checks -================= -.. image:: /galicea_environment_checkup/static/description/dependencies.png - -How-to ------- -Just add ``environment_checkup`` entry to ``__manifest__.py`` - -.. code:: - - { - ... - 'environment_checkup': { - 'dependencies': { - 'python': [ - { - 'name': 'Crypto', - 'version': '>=2.6.2', - 'install': "pip install 'PyCrypto>=2.6.1'" - }, - ], - 'external': [ - { - 'name': 'wkhtmltopdf', - 'install': "apt install wkhtmltopdf" - }, - { - 'name': 'git', - 'version': '^3.0.0', - 'install': "apt install git" - } - ], - 'internal': [ - { - 'name': 'web', - 'version': '~10.0.1.0' - } - ] - } - } - } - -Custom in-code checks -===================== -.. image:: /galicea_environment_checkup/static/description/custom.png - -How-to ------- - -1. Add the check - -``system_checks.py`` - -.. code:: - - # -*- coding: utf-8 -*- - - import cgi - from odoo.addons.galicea_environment_checkup import custom_check, CheckSuccess, CheckWarning, CheckFail - - @custom_check - def check_mail(env): - users_without_emails = env['res.users'].sudo().search([('email', '=', False)]) - - if users_without_emails: - raise CheckWarning( - 'Some users don\'t have their e-mails set up.', - details='See user {}.'.format(cgi.escape(users_without_emails[0].name)) - ) - - return CheckSuccess('All users have their e-mails set.') - -2. Make sure it's loaded - -``__init__.py`` - -.. code:: - - # -*- coding: utf-8 -*- - from . import system_checks diff --git a/galicea_environment_checkup/__manifest__.py b/galicea_environment_checkup/__manifest__.py index b8948db..2d82ce7 100644 --- a/galicea_environment_checkup/__manifest__.py +++ b/galicea_environment_checkup/__manifest__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- { - 'name': "Galicea Enviromnent Check-up", + 'name': "Galicea Environment Check-up", 'summary': """ Programmatically validate environment, including internal and external @@ -23,5 +23,10 @@ 'qweb': ['static/src/xml/templates.xml'], + 'images': [ + 'static/description/images/custom_screenshot.png', + 'static/description/images/dependencies_screenshot.png' + ], + 'installable': True } diff --git a/galicea_environment_checkup/static/description/icon.png b/galicea_environment_checkup/static/description/icon.png index 548dfc9e9bd7edb89699b19c009cc2bbd366ece3..7b923bd0298547fbebd6d52caaca73746ffaf2f9 100644 GIT binary patch literal 3465 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 literal 41196 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 diff --git a/galicea_environment_checkup/static/description/custom.png b/galicea_environment_checkup/static/description/images/custom_screenshot.png similarity index 100% rename from galicea_environment_checkup/static/description/custom.png rename to galicea_environment_checkup/static/description/images/custom_screenshot.png diff --git a/galicea_environment_checkup/static/description/dependencies.png b/galicea_environment_checkup/static/description/images/dependencies_screenshot.png similarity index 100% rename from galicea_environment_checkup/static/description/dependencies.png rename to galicea_environment_checkup/static/description/images/dependencies_screenshot.png diff --git a/galicea_environment_checkup/static/description/index.html b/galicea_environment_checkup/static/description/index.html new file mode 100644 index 0000000..d592e8a --- /dev/null +++ b/galicea_environment_checkup/static/description/index.html @@ -0,0 +1,79 @@ +
+
+
+

Galicea Environment Check-up

+

+ Programmatically validate Odoo environment, including internal and external dependencies of your add-on +

+ This add-on allows you to: +
    +
  • programmatically check software dependencies required by your add-on, as well as inform the Administrator as to how to meet them,
  • +
  • add custom verification for Odoo instance set-up and inform the Administrator about any inconsistencies.
  • +
+

Add-on dependency verification

+ +

How-to

+ Just add 'environment_checkup' entry to __manifest__.py. +
+{
+    ...
+    'environment_checkup': {
+        'dependencies': {
+            'python': [
+                {
+                    'name': 'Crypto',
+                    'version': '>=2.6.2',
+                    'install': "pip install 'PyCrypto>=2.6.1'"
+                },
+            ],
+            'external': [
+                {
+                    'name': 'wkhtmltopdf',
+                    'install': "apt install wkhtmltopdf"
+                },
+                {
+                    'name': 'git',
+                    'version': '^3.0.0',
+                    'install': "apt install git"
+                }
+            ],
+            'internal': [
+                {
+                    'name': 'web',
+                    'version': '~10.0.1.0'
+                }
+            ]
+        }
+    }
+}
+        
+

Custom environment verification

+ +

How-to

+ 1. Add the check, e.g. in the system_checks.py file: +
+# -*- coding: utf-8 -*-
+
+import cgi
+from odoo.addons.galicea_environment_checkup import custom_check, CheckSuccess, CheckWarning, CheckFail
+
+@custom_check
+def check_mail(env):
+    users_without_emails = env['res.users'].sudo().search([('email', '=', False)])
+
+    if users_without_emails:
+        raise CheckWarning(
+            'Some users don\'t have their e-mails set up.',
+            details='See user {}.'.format(cgi.escape(users_without_emails[0].name))
+        )
+
+    return CheckSuccess('All users have their e-mails set.')
+        
+ 2. Make sure it's loaded by __init__.py +
+# -*- coding: utf-8 -*-
+from . import system_checks
+        
+
+
+