From b29b5f41913b9543f28ce141aa29195617719ab1 Mon Sep 17 00:00:00 2001 From: eliotvangoethem Date: Mon, 15 Feb 2021 11:52:42 +0100 Subject: [PATCH 1/6] [ADD] cie_infra : new module --- cie_infra/__init__.py | 4 + cie_infra/__manifest__.py | 37 +++++++++ cie_infra/controllers/__init__.py | 3 + cie_infra/controllers/controllers.py | 20 +++++ cie_infra/demo/demo.xml | 30 +++++++ cie_infra/models/__init__.py | 3 + cie_infra/models/infra_datacenter.py | 9 +++ cie_infra/models/infra_instance.py | 11 +++ cie_infra/models/infra_instance_database.py | 10 +++ cie_infra/models/infra_instance_module.py | 8 ++ .../models/infra_instance_module_info.py | 9 +++ cie_infra/models/infra_location.py | 7 ++ cie_infra/models/infra_server.py | 15 ++++ cie_infra/models/infra_server_shortname.py | 8 ++ cie_infra/security/cie_infra_security.xml | 30 +++++++ cie_infra/security/ir.model.access.csv | 22 ++++++ cie_infra/views/templates.xml | 22 ++++++ cie_infra/views/views.xml | 78 +++++++++++++++++++ 18 files changed, 326 insertions(+) create mode 100644 cie_infra/__init__.py create mode 100644 cie_infra/__manifest__.py create mode 100644 cie_infra/controllers/__init__.py create mode 100644 cie_infra/controllers/controllers.py create mode 100644 cie_infra/demo/demo.xml create mode 100644 cie_infra/models/__init__.py create mode 100644 cie_infra/models/infra_datacenter.py create mode 100644 cie_infra/models/infra_instance.py create mode 100644 cie_infra/models/infra_instance_database.py create mode 100644 cie_infra/models/infra_instance_module.py create mode 100644 cie_infra/models/infra_instance_module_info.py create mode 100644 cie_infra/models/infra_location.py create mode 100644 cie_infra/models/infra_server.py create mode 100644 cie_infra/models/infra_server_shortname.py create mode 100644 cie_infra/security/cie_infra_security.xml create mode 100644 cie_infra/security/ir.model.access.csv create mode 100644 cie_infra/views/templates.xml create mode 100644 cie_infra/views/views.xml diff --git a/cie_infra/__init__.py b/cie_infra/__init__.py new file mode 100644 index 000000000..511a0ca3a --- /dev/null +++ b/cie_infra/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models \ No newline at end of file diff --git a/cie_infra/__manifest__.py b/cie_infra/__manifest__.py new file mode 100644 index 000000000..dd8a26c2a --- /dev/null +++ b/cie_infra/__manifest__.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +{ + 'name': "cie_infra", + + 'summary': """ + this module allows to visualize our servers throught an inventary. """, + + 'description': """ + The purpose of this module is to visualize all the information + contains on our server. It means the datacenter, the location, + the different instance on it and finally the different module. + """, + + 'author': "CoopItEasy/EliotVanGoethem", + 'website': "http://coopiteasy.be", + + # Categories can be used to filter modules in modules listing + # Check https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml + # for the full list + #'category': 'Uncategorized', + #'version': '0.1', + + # any module necessary for this one to work correctly + 'depends': ['base'], + + # always loaded + 'data': [ + 'security/cie_infra_security.xml', + 'security/ir.model.access.csv', + 'views/views.xml', + 'views/templates.xml', + ], + # only loaded in demonstration mode + #'demo': [ + # 'demo/demo.xml', + #], +} diff --git a/cie_infra/controllers/__init__.py b/cie_infra/controllers/__init__.py new file mode 100644 index 000000000..457bae27e --- /dev/null +++ b/cie_infra/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import controllers \ No newline at end of file diff --git a/cie_infra/controllers/controllers.py b/cie_infra/controllers/controllers.py new file mode 100644 index 000000000..9bac8aa31 --- /dev/null +++ b/cie_infra/controllers/controllers.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from odoo import http + +# class CieInfra(http.Controller): +# @http.route('/cie_infra/cie_infra/', auth='public') +# def index(self, **kw): +# return "Hello, world" + +# @http.route('/cie_infra/cie_infra/objects/', auth='public') +# def list(self, **kw): +# return http.request.render('cie_infra.listing', { +# 'root': '/cie_infra/cie_infra', +# 'objects': http.request.env['cie_infra.cie_infra'].search([]), +# }) + +# @http.route('/cie_infra/cie_infra/objects//', auth='public') +# def object(self, obj, **kw): +# return http.request.render('cie_infra.object', { +# 'object': obj +# }) \ No newline at end of file diff --git a/cie_infra/demo/demo.xml b/cie_infra/demo/demo.xml new file mode 100644 index 000000000..69a6005ff --- /dev/null +++ b/cie_infra/demo/demo.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cie_infra/models/__init__.py b/cie_infra/models/__init__.py new file mode 100644 index 000000000..f7226c8d3 --- /dev/null +++ b/cie_infra/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import infra_server,infra_datacenter, infra_location, infra_instance, infra_instance_database, infra_instance_module_info,infra_instance_module, infra_server_shortname diff --git a/cie_infra/models/infra_datacenter.py b/cie_infra/models/infra_datacenter.py new file mode 100644 index 000000000..49bf94224 --- /dev/null +++ b/cie_infra/models/infra_datacenter.py @@ -0,0 +1,9 @@ +from odoo import models, fields + + +class Datacenter(models.Model): + _name = 'infra.datacenter' + _description = 'datacenter' + name = fields.Char('Datacenter', required=True) + location_id = fields.Many2one('infra.location', string='location') + server_ids = fields.One2many('infra.server', 'datacenter_id', string='Server') diff --git a/cie_infra/models/infra_instance.py b/cie_infra/models/infra_instance.py new file mode 100644 index 000000000..d2281631b --- /dev/null +++ b/cie_infra/models/infra_instance.py @@ -0,0 +1,11 @@ +from odoo import models, fields + +class Instance(models.Model): + _name='infra.instance' + _description='instance' + name=fields.Char('name', required=True) + url=fields.Html('URL') + note=fields.Text('text') + server_id=fields.Many2one('infra.server', string='server') + database_ids=fields.One2many('infra.instance.database','instance_id',string='database') + diff --git a/cie_infra/models/infra_instance_database.py b/cie_infra/models/infra_instance_database.py new file mode 100644 index 000000000..18dad21a4 --- /dev/null +++ b/cie_infra/models/infra_instance_database.py @@ -0,0 +1,10 @@ +from odoo import fields, models + + +class Database(models.Model): + _name='infra.instance.database' + _description='database' + name=fields.Char('name', required=True) + instance_id=fields.Many2one('infra.instance',string='instance') + installed_module_ids=fields.One2many('infra.instance.module.info','database_id',string='installed_module') + diff --git a/cie_infra/models/infra_instance_module.py b/cie_infra/models/infra_instance_module.py new file mode 100644 index 000000000..6aa9999e1 --- /dev/null +++ b/cie_infra/models/infra_instance_module.py @@ -0,0 +1,8 @@ +from odoo import fields, models + +class Module(models.Model): + _name='infra.instance.module' + _description='module' + name=fields.Char('name',required=True) + module_info_ids=fields.One2many('infra.instance.module.info','module_id',string='module_info') + diff --git a/cie_infra/models/infra_instance_module_info.py b/cie_infra/models/infra_instance_module_info.py new file mode 100644 index 000000000..380483f2f --- /dev/null +++ b/cie_infra/models/infra_instance_module_info.py @@ -0,0 +1,9 @@ +from odoo import fields , models + +class Module_info(models.Model): + _name='infra.instance.module.info' + _description='module.info' + installed_version=fields.Char('installed_version',required=True) + available_version=fields.Char('available_version') + database_id=fields.Many2one('infra.instance.database',string='database') + module_id=fields.Many2one('infra.instance.module',string='module') diff --git a/cie_infra/models/infra_location.py b/cie_infra/models/infra_location.py new file mode 100644 index 000000000..6e75037f4 --- /dev/null +++ b/cie_infra/models/infra_location.py @@ -0,0 +1,7 @@ +from odoo import fields, models + +class Location(models.Model): + _name='infra.location' + _description='location' + name=fields.Char('name', required=True) + country_id=fields.Many2one('res.country', string='country') diff --git a/cie_infra/models/infra_server.py b/cie_infra/models/infra_server.py new file mode 100644 index 000000000..39a3cec68 --- /dev/null +++ b/cie_infra/models/infra_server.py @@ -0,0 +1,15 @@ +from odoo import fields, models + +class Server(models.Model): + _name = 'infra.server' + _description = 'server' + name = fields.Char('name', required=True) + ipv4 = fields.Char('ipv4', required=True) + ipv6 = fields.Char('ipv6', required=True) + datacenter_info = fields.Char('Datacenter info') + ovh_address = fields.Char('OVH\'s adress', required=True) + cie_address = fields.Char('cie adress', required=True) + note = fields.Text('text') + datacenter_id = fields.Many2one('infra.datacenter', string='Datacenter') + shortname_ids=fields.One2many('infra.server.shortname','server_id',string='shortname') + instance_ids=fields.One2many('infra.instance','server_id',string='instance') diff --git a/cie_infra/models/infra_server_shortname.py b/cie_infra/models/infra_server_shortname.py new file mode 100644 index 000000000..511234ba2 --- /dev/null +++ b/cie_infra/models/infra_server_shortname.py @@ -0,0 +1,8 @@ +from odoo import fields, models + +class Server_shortname(models.Model): + _name='infra.server.shortname' + _description='server.shortname' + name=fields.Char('name') + server_id=fields.Many2one('infra.server',string='server') + diff --git a/cie_infra/security/cie_infra_security.xml b/cie_infra/security/cie_infra_security.xml new file mode 100644 index 000000000..43dc8acc7 --- /dev/null +++ b/cie_infra/security/cie_infra_security.xml @@ -0,0 +1,30 @@ + + + + + cie_infra + + + + + User + + + + + + + Manager + + + + + + + + diff --git a/cie_infra/security/ir.model.access.csv b/cie_infra/security/ir.model.access.csv new file mode 100644 index 000000000..d4d2e79fd --- /dev/null +++ b/cie_infra/security/ir.model.access.csv @@ -0,0 +1,22 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_cie_infra_datacenter_user,cie_infra_datacenter_user,model_infra_datacenter,cie_infra_usergroup,1,0,0,0 +access_cie_infra_datacenter_manager,cie_infra_datacenter_manager,model_infra_datacenter,cie_infra_managergroup,1,1,1,1 +access_cie_infra_instance_user,cie_infra_instance_user,model_infra_instance,cie_infra_usergroup,1,0,0,0 +access_cie_infra_instance_manager,cie_infra_instance_manager,model_infra_instance,cie_infra_managergroup,1,1,1,1 +access_cie_infra_database_user,cie_infra_database_user,model_infra_instance_database,cie_infra_usergroup,1,0,0,0 +access_cie_infra_database_manager,cie_infra_database_manager,model_infra_instance_database,cie_infra_managergroup,1,1,1,1 +access_cie_infra_module_user,cie_infra_module_user,model_infra_instance_module,cie_infra_usergroup,1,0,0,0 +access_cie_infra_module_manager,cie_infra_module_manager,model_infra_instance_module,cie_infra_managergroup,1,1,1,1 +access_cie_infra_moduleinfo_user,cie_infra_moduleinfo_user,model_infra_instance_module_info,cie_infra_usergroup,1,0,0,0 +access_cie_infra_moduleinfo_manager,cie_infra_moduleinfo_manager,model_infra_instance_module_info,cie_infra_managergroup,1,1,1,1 +access_cie_infra_location_user,cie_infra_location_user,model_infra_location,cie_infra_usergroup,1,0,0,0 +access_cie_infra_location_manager,cie_infra_location_manager,model_infra_location,cie_infra_managergroup,1,1,1,1 +access_cie_infra_server_user,cie_infra_server_user,model_infra_server,cie_infra_usergroup,1,0,0,0 +access_cie_infra_server_manager,cie_infra_server_manager,model_infra_server,cie_infra_managergroup,1,1,1,1 +access_cie_infra_servername_user,cie_infra_servername_user,model_infra_server_shortname,cie_infra_usergroup,1,0,0,0 +access_cie_infra_servername_manager,cie_infra_servername_manager,model_infra_server_shortname,cie_infra_managergroup,1,1,1,1 + + + + + diff --git a/cie_infra/views/templates.xml b/cie_infra/views/templates.xml new file mode 100644 index 000000000..ba61acd8c --- /dev/null +++ b/cie_infra/views/templates.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cie_infra/views/views.xml b/cie_infra/views/views.xml new file mode 100644 index 000000000..d264a8ea7 --- /dev/null +++ b/cie_infra/views/views.xml @@ -0,0 +1,78 @@ + + + + + + + + CoopItEasy Server + infra.server + tree,form + + + CoopItEasy Database + infra.instance.database + tree,form + + + Module + infra.instance.module + tree,form + + + Instance d'Odoo + infra.instance + tree,form + + + + + + + + + + + + + + + + + + + + + + + From 68d91f7d7a1c2fb04602397839116ba030f2f987 Mon Sep 17 00:00:00 2001 From: eliotvangoethem Date: Tue, 16 Feb 2021 09:54:42 +0100 Subject: [PATCH 2/6] [ADD] search --- cie_infra/__manifest__.py | 4 +- cie_infra/models/infra_server.py | 51 ++++++++++++++++++--- cie_infra/views/cie_infra_instance_view.xml | 39 ++++++++++++++++ cie_infra/views/cie_infra_server_views.xml | 44 ++++++++++++++++++ cie_infra/views/templates.xml | 22 --------- cie_infra/views/views.xml | 28 +++++++++-- 6 files changed, 154 insertions(+), 34 deletions(-) create mode 100644 cie_infra/views/cie_infra_instance_view.xml create mode 100644 cie_infra/views/cie_infra_server_views.xml delete mode 100644 cie_infra/views/templates.xml diff --git a/cie_infra/__manifest__.py b/cie_infra/__manifest__.py index dd8a26c2a..fe4621fb7 100644 --- a/cie_infra/__manifest__.py +++ b/cie_infra/__manifest__.py @@ -6,7 +6,7 @@ this module allows to visualize our servers throught an inventary. """, 'description': """ - The purpose of this module is to visualize all the information + The purpose of this module is to visualize all the information contains on our server. It means the datacenter, the location, the different instance on it and finally the different module. """, @@ -29,6 +29,8 @@ 'security/ir.model.access.csv', 'views/views.xml', 'views/templates.xml', + 'views/cie_infra_server_views.xml', + 'views/cie_infra_instance_view.xml' ], # only loaded in demonstration mode #'demo': [ diff --git a/cie_infra/models/infra_server.py b/cie_infra/models/infra_server.py index 39a3cec68..f9fdfb620 100644 --- a/cie_infra/models/infra_server.py +++ b/cie_infra/models/infra_server.py @@ -1,15 +1,54 @@ -from odoo import fields, models +from odoo import fields, models, api +from odoo.exceptions import Warning + class Server(models.Model): _name = 'infra.server' _description = 'server' name = fields.Char('name', required=True) - ipv4 = fields.Char('ipv4', required=True) - ipv6 = fields.Char('ipv6', required=True) + ipv4 = fields.Char('ipv4') + ipv6 = fields.Char('ipv6') datacenter_info = fields.Char('Datacenter info') ovh_address = fields.Char('OVH\'s adress', required=True) cie_address = fields.Char('cie adress', required=True) - note = fields.Text('text') + note = fields.Text('Note') datacenter_id = fields.Many2one('infra.datacenter', string='Datacenter') - shortname_ids=fields.One2many('infra.server.shortname','server_id',string='shortname') - instance_ids=fields.One2many('infra.instance','server_id',string='instance') + shortname_ids = fields.One2many('infra.server.shortname', 'server_id', string='shortname') + instance_ids = fields.One2many('infra.instance', 'server_id', string='instance') + + @api.multi + def _check_ipv4(self, IP): + def isIPv4(s): + try: + return str(int(s)) == s and 0 <= int(s) <= 255 + except: + return False + + if IP.count(".") == 3 and all(isIPv4(i) for i in IP.split(".")): + return True + return False + + @api.multi + def _check_ipv6(self, IP): + def isIPv6(s): + if len(s) > 4: + return False + try: + return int(s, 16) >= 0 and s[0] != '-' + except: + return False + + if IP.count(":") == 7 and all(isIPv6(i) for i in IP.split(":")): + return True + return False + + @api.multi + def button_check_ipv(self): + for server in self: + if not server.ipv4 and not server.ipv6: + raise Warning('Please provide an ipv4 or ipv6 for %s' % server.name) + if server.ipv6 and not server._check_ipv6(self.ipv6): + raise Warning('%s is an invalid ipv6 address' % server.ipv6) + if server.ipv4 and not server._check_ipv4(self.ipv4): + raise Warning('%s is an invalid ipv4 address' % server.ipv4) + return True diff --git a/cie_infra/views/cie_infra_instance_view.xml b/cie_infra/views/cie_infra_instance_view.xml new file mode 100644 index 000000000..b64a59e4b --- /dev/null +++ b/cie_infra/views/cie_infra_instance_view.xml @@ -0,0 +1,39 @@ + + + + + CoopIteasy Infrastructure + infra.instance + +
+
+ +
+ + + + + + + + + +
+
+
+ + Instance filter + infra.instance + + + + + + + + + +
diff --git a/cie_infra/views/cie_infra_server_views.xml b/cie_infra/views/cie_infra_server_views.xml new file mode 100644 index 000000000..55d7215c2 --- /dev/null +++ b/cie_infra/views/cie_infra_server_views.xml @@ -0,0 +1,44 @@ + + + + + CoopIteasy Infrastructure + infra.server + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + Server filter + infra.server + + + + + + + + + + +
diff --git a/cie_infra/views/templates.xml b/cie_infra/views/templates.xml deleted file mode 100644 index ba61acd8c..000000000 --- a/cie_infra/views/templates.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cie_infra/views/views.xml b/cie_infra/views/views.xml index d264a8ea7..586b43863 100644 --- a/cie_infra/views/views.xml +++ b/cie_infra/views/views.xml @@ -15,7 +15,7 @@ --> - + + + + + + + - - + - + @@ -66,7 +84,7 @@ - + User @@ -23,8 +23,8 @@ eval="[(4, ref('cie_infra.cie_infra_usergroup'))]"/> - - + + diff --git a/cie_infra/security/ir.model.access.csv b/cie_infra/security/ir.model.access.csv index d4d2e79fd..9750adf19 100644 --- a/cie_infra/security/ir.model.access.csv +++ b/cie_infra/security/ir.model.access.csv @@ -14,9 +14,4 @@ access_cie_infra_location_manager,cie_infra_location_manager,model_infra_locatio access_cie_infra_server_user,cie_infra_server_user,model_infra_server,cie_infra_usergroup,1,0,0,0 access_cie_infra_server_manager,cie_infra_server_manager,model_infra_server,cie_infra_managergroup,1,1,1,1 access_cie_infra_servername_user,cie_infra_servername_user,model_infra_server_shortname,cie_infra_usergroup,1,0,0,0 -access_cie_infra_servername_manager,cie_infra_servername_manager,model_infra_server_shortname,cie_infra_managergroup,1,1,1,1 - - - - - +access_cie_infra_servername_manager,cie_infra_servername_manager,model_infra_server_shortname,cie_infra_managergroup,1,1,1,1 \ No newline at end of file diff --git a/cie_infra/views/cie_infra_database_view.xml b/cie_infra/views/cie_infra_database_view.xml new file mode 100644 index 000000000..49f73f4e2 --- /dev/null +++ b/cie_infra/views/cie_infra_database_view.xml @@ -0,0 +1,36 @@ + + + + + CoopIteasy Infrastructure + infra.instance.database + +
+
+ +
+ + + + + + + +
+
+
+ + Database filter + infra.instance.database + + + + + + + + +
diff --git a/cie_infra/views/cie_infra_datacenter_view.xml b/cie_infra/views/cie_infra_datacenter_view.xml new file mode 100644 index 000000000..ad7ea63f7 --- /dev/null +++ b/cie_infra/views/cie_infra_datacenter_view.xml @@ -0,0 +1,36 @@ + + + + + CoopIteasy Infrastructure + infra.datacenter + +
+
+ +
+ + + + + + + +
+
+
+ + Datacenter filter + infra.datacenter + + + + + + + + +
diff --git a/cie_infra/views/cie_infra_instance_view.xml b/cie_infra/views/cie_infra_instance_view.xml index b64a59e4b..4993ede63 100644 --- a/cie_infra/views/cie_infra_instance_view.xml +++ b/cie_infra/views/cie_infra_instance_view.xml @@ -15,16 +15,16 @@ - - - + + + - + Instance filter infra.instance diff --git a/cie_infra/views/cie_infra_module_view.xml b/cie_infra/views/cie_infra_module_view.xml new file mode 100644 index 000000000..19765e609 --- /dev/null +++ b/cie_infra/views/cie_infra_module_view.xml @@ -0,0 +1,33 @@ + + + + + CoopIteasy Infrastructure + infra.instance.module + +
+
+ +
+ + + + + + +
+
+
+ + Database filter + infra.instance.module + + + + + + +
diff --git a/cie_infra/views/cie_infra_server_views.xml b/cie_infra/views/cie_infra_server_views.xml index 55d7215c2..6b8557e50 100644 --- a/cie_infra/views/cie_infra_server_views.xml +++ b/cie_infra/views/cie_infra_server_views.xml @@ -20,8 +20,8 @@ - - + + diff --git a/cie_infra/views/server_list_template.xml b/cie_infra/views/server_list_template.xml new file mode 100644 index 000000000..41c1a352a --- /dev/null +++ b/cie_infra/views/server_list_template.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/cie_infra/views/views.xml b/cie_infra/views/views.xml index 586b43863..0abea426b 100644 --- a/cie_infra/views/views.xml +++ b/cie_infra/views/views.xml @@ -53,6 +53,10 @@ name="instance" res_model="infra.instance" view_mode="tree,form"/> + @@ -80,6 +84,7 @@ + From 6cda94d5b0ba5b41964ceaaa246953435f721bc8 Mon Sep 17 00:00:00 2001 From: eliotvangoethem Date: Thu, 25 Feb 2021 15:13:41 +0100 Subject: [PATCH 4/6] modif cie_infra + add cie_infra_server --- cie_infra/demo/demo.xml | 57 +++++++++-------- cie_infra/models/infra_instance.py | 63 ++++++++++++++++--- cie_infra/models/infra_instance_database.py | 1 + cie_infra/models/infra_location.py | 1 + cie_infra/views/cie_infra_database_view.xml | 2 +- cie_infra/views/cie_infra_datacenter_view.xml | 2 +- cie_infra/views/cie_infra_instance_view.xml | 2 +- cie_infra/views/cie_infra_module_view.xml | 3 +- cie_infra/views/cie_infra_server_views.xml | 6 +- cie_infra/views/views.xml | 20 +++--- cie_infra_server_info/__init__.py | 4 ++ cie_infra_server_info/__manifest__.py | 35 +++++++++++ cie_infra_server_info/controllers/__init__.py | 3 + .../controllers/controllers.py | 40 ++++++++++++ cie_infra_server_info/demo/demo.xml | 30 +++++++++ cie_infra_server_info/models/__init__.py | 3 + cie_infra_server_info/models/models.py | 15 +++++ .../security/ir.model.access.csv | 2 + cie_infra_server_info/views/templates.xml | 22 +++++++ cie_infra_server_info/views/views.xml | 60 ++++++++++++++++++ 20 files changed, 320 insertions(+), 51 deletions(-) create mode 100644 cie_infra_server_info/__init__.py create mode 100644 cie_infra_server_info/__manifest__.py create mode 100644 cie_infra_server_info/controllers/__init__.py create mode 100644 cie_infra_server_info/controllers/controllers.py create mode 100644 cie_infra_server_info/demo/demo.xml create mode 100644 cie_infra_server_info/models/__init__.py create mode 100644 cie_infra_server_info/models/models.py create mode 100644 cie_infra_server_info/security/ir.model.access.csv create mode 100644 cie_infra_server_info/views/templates.xml create mode 100644 cie_infra_server_info/views/views.xml diff --git a/cie_infra/demo/demo.xml b/cie_infra/demo/demo.xml index 69a6005ff..f546d6a5b 100644 --- a/cie_infra/demo/demo.xml +++ b/cie_infra/demo/demo.xml @@ -1,30 +1,37 @@ - + + - - - - - - - - - - - - - - - - - - - - - + + + localhost:0101 + 192.168.1.1 + OVH plus grand base de serveur d'EUROPE + ovh.servercenter@ovh.be + coopit.easy@cip.be + pas de pb depuis 6mois + + + + France + 208 + + + + OVH Compiegne + + + + OdooV1 + CoopItEasy/odooV1 + Instance utilisé par coopvelib et coopvrap + + - - + + - \ No newline at end of file + diff --git a/cie_infra/models/infra_instance.py b/cie_infra/models/infra_instance.py index d2281631b..a920ba629 100644 --- a/cie_infra/models/infra_instance.py +++ b/cie_infra/models/infra_instance.py @@ -1,11 +1,58 @@ -from odoo import models, fields +from odoo import models +from odoo import fields +from odoo import api +from odoo import _ +import requests +import json +from werkzeug.exceptions import BadRequest, InternalServerError, NotFound +from odoo.exceptions import AccessDenied, Warning as UserError + class Instance(models.Model): - _name='infra.instance' - _description='instance' - name=fields.Char('name', required=True) - url=fields.Html('URL') - note=fields.Text('text') - server_id=fields.Many2one('infra.server', string='server') - database_ids=fields.One2many('infra.instance.database','instance_id',string='database') + _name='infra.instance' + _description='instance' + name=fields.Char('name', required=True) + url=fields.Html('URL') + note=fields.Text('text') + server_id=fields.Many2one('infra.server', string='server') + database_ids=fields.One2many('infra.instance.database','instance_id', string="database") + + @api.multi + def http_get(self, url, params, headers): + self.ensure_one() + if url.startswith("/"): + url = self.url + url + return requests.get(url,params,headers) + + def _process_response(self, response): + if response.status_code == 200: + content = response.content.decode("utf-8") + return json.loads(content) + elif response.status_code == 400: + content = response.content.decode("utf-8") + raise BadRequest("%s" % content) + elif response.status_code == 403: + raise AccessDenied( + _("You are not allowed to access this resource") + ) + elif response.status_code == 404: + raise NotFound( + _("Resource not found %s on server" % response.status_code) + ) + else: # 500 et al. + content = response.content.decode("utf-8") + raise InternalServerError(_("%s" % content)) + + @api.multi + def http_get_content(self, url, params=None, headers=None): + self.ensure_one() + response = self.http_get(url, params=params, headers=headers) + return self._process_response(response) + + + + + + + diff --git a/cie_infra/models/infra_instance_database.py b/cie_infra/models/infra_instance_database.py index dd7869dcf..39421d6be 100644 --- a/cie_infra/models/infra_instance_database.py +++ b/cie_infra/models/infra_instance_database.py @@ -9,3 +9,4 @@ class Database(models.Model): installed_module_ids=fields.One2many('infra.instance.module.info','database_id',string='installed_module') + diff --git a/cie_infra/models/infra_location.py b/cie_infra/models/infra_location.py index 6e75037f4..5469d96da 100644 --- a/cie_infra/models/infra_location.py +++ b/cie_infra/models/infra_location.py @@ -5,3 +5,4 @@ class Location(models.Model): _description='location' name=fields.Char('name', required=True) country_id=fields.Many2one('res.country', string='country') + datacenter_ids=fields.One2many('infra.datacenter','location_id', string='datacenter') diff --git a/cie_infra/views/cie_infra_database_view.xml b/cie_infra/views/cie_infra_database_view.xml index 49f73f4e2..1f85cbeed 100644 --- a/cie_infra/views/cie_infra_database_view.xml +++ b/cie_infra/views/cie_infra_database_view.xml @@ -16,7 +16,7 @@ - + diff --git a/cie_infra/views/cie_infra_datacenter_view.xml b/cie_infra/views/cie_infra_datacenter_view.xml index ad7ea63f7..ea1d31cfc 100644 --- a/cie_infra/views/cie_infra_datacenter_view.xml +++ b/cie_infra/views/cie_infra_datacenter_view.xml @@ -16,7 +16,7 @@ - + diff --git a/cie_infra/views/cie_infra_instance_view.xml b/cie_infra/views/cie_infra_instance_view.xml index 4993ede63..78e311548 100644 --- a/cie_infra/views/cie_infra_instance_view.xml +++ b/cie_infra/views/cie_infra_instance_view.xml @@ -17,7 +17,7 @@ - + diff --git a/cie_infra/views/cie_infra_module_view.xml b/cie_infra/views/cie_infra_module_view.xml index 19765e609..c0b2af319 100644 --- a/cie_infra/views/cie_infra_module_view.xml +++ b/cie_infra/views/cie_infra_module_view.xml @@ -10,12 +10,11 @@
-
- +
diff --git a/cie_infra/views/cie_infra_server_views.xml b/cie_infra/views/cie_infra_server_views.xml index 6b8557e50..4c08d2b6e 100644 --- a/cie_infra/views/cie_infra_server_views.xml +++ b/cie_infra/views/cie_infra_server_views.xml @@ -20,8 +20,8 @@ - - + + @@ -35,7 +35,7 @@ - + diff --git a/cie_infra/views/views.xml b/cie_infra/views/views.xml index 0abea426b..c810ecb0f 100644 --- a/cie_infra/views/views.xml +++ b/cie_infra/views/views.xml @@ -40,23 +40,23 @@ + view_mode="tree,form,activity,graph,pivot"/> + view_mode="tree,form,activity,graph,pivot"/> + view_mode="tree,form,activity,graph,pivot"/> + view_mode="tree,form,activity,graph,pivot"/> + view_mode="tree,form,activity,graph,pivot"/> @@ -83,11 +83,11 @@ - - - - - + + + + + diff --git a/cie_infra_server_info/__init__.py b/cie_infra_server_info/__init__.py new file mode 100644 index 000000000..f46e4c05f --- /dev/null +++ b/cie_infra_server_info/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import controllers +#from . import models diff --git a/cie_infra_server_info/__manifest__.py b/cie_infra_server_info/__manifest__.py new file mode 100644 index 000000000..d6b4a4f28 --- /dev/null +++ b/cie_infra_server_info/__manifest__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +{ + 'name': "cie_infra_server_info", + + 'summary': """ + Short (1 phrase/line) summary of the module's purpose, used as + subtitle on modules listing or apps.openerp.com""", + + 'description': """ + Long description of module's purpose + """, + + 'author': "My Company", + 'website': "http://www.yourcompany.com", + + # Categories can be used to filter modules in modules listing + # Check https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml + # for the full list + 'category': 'Uncategorized', + 'version': '0.1', + + # any module necessary for this one to work correctly + 'depends': ['base'], + + # always loaded + 'data': [ + # 'security/ir.model.access.csv', + #'views/views.xml', + #'views/templates.xml', + ], + # only loaded in demonstration mode + 'demo': [ + 'demo/demo.xml', + ], +} diff --git a/cie_infra_server_info/controllers/__init__.py b/cie_infra_server_info/controllers/__init__.py new file mode 100644 index 000000000..457bae27e --- /dev/null +++ b/cie_infra_server_info/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import controllers \ No newline at end of file diff --git a/cie_infra_server_info/controllers/controllers.py b/cie_infra_server_info/controllers/controllers.py new file mode 100644 index 000000000..2688312da --- /dev/null +++ b/cie_infra_server_info/controllers/controllers.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +import odoo +from odoo import http +from contextlib import closing + +class CieInfraDatasend(http.Controller): +# @http.route('/cie_infra_server_info/cie_infra_server_info/', auth='public') +# def index(self, **kw): +# return "Hello, world" + +# @http.route('/cie_infra_server_info/cie_infra_server_info/objects/', auth='public') +# def list(self, **kw): +# return http.request.render('cie_infra_server_info.listing', { +# 'root': '/cie_infra_server_info/cie_infra_server_info', +# 'objects': http.request.env['cie_infra_server_info.cie_infra_server_info'].search([]), +# }) + +# @http.route('/cie_infra_server_info/cie_infra_server_info/objects//', auth='public') +# def object(self, obj, **kw): +# return http.request.render('cie_infra_server_info.object', { +# 'object': obj +# }) + + @http.route("/web/database/list_database", type="http", auth="none") + def databaselist(self, **kw): + result = "" + list_db = http.db_list() + result += " ".join(list_db) + return result + + @http.route("/web/database//modules", type="http", auth="none") + def modulelist(self,dbname, **kw): + list_db = http.db_list() + # List installed modules + modules = [] + db = odoo.sql_db.db_connect(dbname) + with closing(db.cursor()) as cr: + cr.execute("SELECT name, latest_version, published_version, state, shortdesc FROM ir_module_module WHERE state = 'installed'") + modules.append(cr.fetchall()) + return str(modules) diff --git a/cie_infra_server_info/demo/demo.xml b/cie_infra_server_info/demo/demo.xml new file mode 100644 index 000000000..c5aa37e70 --- /dev/null +++ b/cie_infra_server_info/demo/demo.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cie_infra_server_info/models/__init__.py b/cie_infra_server_info/models/__init__.py new file mode 100644 index 000000000..5305644df --- /dev/null +++ b/cie_infra_server_info/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models \ No newline at end of file diff --git a/cie_infra_server_info/models/models.py b/cie_infra_server_info/models/models.py new file mode 100644 index 000000000..01d957b5e --- /dev/null +++ b/cie_infra_server_info/models/models.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api + +# class cie_infra_server_info(models.Model): +# _name = 'cie_infra_server_info.cie_infra_server_info' + +# name = fields.Char() +# value = fields.Integer() +# value2 = fields.Float(compute="_value_pc", store=True) +# description = fields.Text() +# +# @api.depends('value') +# def _value_pc(self): +# self.value2 = float(self.value) / 100 diff --git a/cie_infra_server_info/security/ir.model.access.csv b/cie_infra_server_info/security/ir.model.access.csv new file mode 100644 index 000000000..ebd4e3ad9 --- /dev/null +++ b/cie_infra_server_info/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_cie_infra_datasend_cie_infra_datasend,cie_infra_datasend.cie_infra_datasend,model_cie_infra_datasend_cie_infra_datasend,,1,0,0,0 \ No newline at end of file diff --git a/cie_infra_server_info/views/templates.xml b/cie_infra_server_info/views/templates.xml new file mode 100644 index 000000000..ba61acd8c --- /dev/null +++ b/cie_infra_server_info/views/templates.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cie_infra_server_info/views/views.xml b/cie_infra_server_info/views/views.xml new file mode 100644 index 000000000..5d202287e --- /dev/null +++ b/cie_infra_server_info/views/views.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + From ebef15cf09325d013ca661a70e5122831c772627 Mon Sep 17 00:00:00 2001 From: eliotvangoethem Date: Fri, 26 Feb 2021 09:56:00 +0100 Subject: [PATCH 5/6] [ADD] cron get db [MODIF] html to json route --- cie_infra/models/infra_instance.py | 1 - cie_infra/models/infra_instance_database.py | 28 ++++++++++++++--- .../controllers/controllers.py | 31 ++++++++++++++----- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/cie_infra/models/infra_instance.py b/cie_infra/models/infra_instance.py index a920ba629..acacc172c 100644 --- a/cie_infra/models/infra_instance.py +++ b/cie_infra/models/infra_instance.py @@ -55,4 +55,3 @@ def http_get_content(self, url, params=None, headers=None): - diff --git a/cie_infra/models/infra_instance_database.py b/cie_infra/models/infra_instance_database.py index 39421d6be..e3da754c5 100644 --- a/cie_infra/models/infra_instance_database.py +++ b/cie_infra/models/infra_instance_database.py @@ -2,11 +2,29 @@ class Database(models.Model): - _name='infra.instance.database' - _description='database' - name=fields.Char('name', required=True) - instance_id=fields.Many2one('infra.instance',string='instance') - installed_module_ids=fields.One2many('infra.instance.module.info','database_id',string='installed_module') + _name = 'infra.instance.database' + _description = 'database' + name=fields.Char('name', required=True) + instance_id=fields.Many2one('infra.instance', string='instance') + installed_module_ids=fields.One2many( + comodel_name='infra.instance.module.info', + inverse_name='database_id', + string='installed_module') + def cron_get_database(self): + """ + thanks to http request, the cron will recover daily + the different database based on a odoo's instance + """ + route="/web/database/list_database" + databases = self.env['infra.instance'].http_get_content(route) + instance = self.env['infra.instance'].search([]) + for db in databases["databases"]: + self.env["infra.instance.database"].create({ + "name": db, + "instance_id":instance + }) + db_instance= + diff --git a/cie_infra_server_info/controllers/controllers.py b/cie_infra_server_info/controllers/controllers.py index 2688312da..0c4dc3b57 100644 --- a/cie_infra_server_info/controllers/controllers.py +++ b/cie_infra_server_info/controllers/controllers.py @@ -21,20 +21,37 @@ class CieInfraDatasend(http.Controller): # 'object': obj # }) - @http.route("/web/database/list_database", type="http", auth="none") +# @http.route("/web/database/list_database", type="http", auth="none") +# def databaselist(self, **kw): +# result = "" +# list_db = http.db_list() +# result += " ".join(list_db) +# return result + + @http.route("/web/database/list_database", type="json", auth="none") def databaselist(self, **kw): - result = "" list_db = http.db_list() - result += " ".join(list_db) + result = {"databases": list_db} return result - @http.route("/web/database//modules", type="http", auth="none") +# @http.route("/web/database//modules", type="http", auth="none") +# def modulelist(self,dbname, **kw): +# list_db = http.db_list() +# # List installed modules +# modules = [] +# db = odoo.sql_db.db_connect(dbname) +# with closing(db.cursor()) as cr: +# cr.execute("SELECT name, latest_version, published_version, state, shortdesc FROM ir_module_module WHERE state = 'installed'") +# modules.append(cr.fetchall()) +# return str(modules) + + @http.route("/web/database//modules", type="json", auth="none") def modulelist(self,dbname, **kw): list_db = http.db_list() # List installed modules - modules = [] + modules = {"database":dbname} db = odoo.sql_db.db_connect(dbname) with closing(db.cursor()) as cr: cr.execute("SELECT name, latest_version, published_version, state, shortdesc FROM ir_module_module WHERE state = 'installed'") - modules.append(cr.fetchall()) - return str(modules) + modules["modules"]= cr.fetchall() + return modules From 5b85c7d3de1ae2b3cc6cc43f20b1e0ca7237ee0f Mon Sep 17 00:00:00 2001 From: eliotvangoethem Date: Wed, 10 Mar 2021 15:51:12 +0100 Subject: [PATCH 6/6] [ADD] cron get module [MODIF] data organisation of the module dictionnary --- cie_infra/models/infra_instance.py | 26 +++++- cie_infra/models/infra_instance_database.py | 83 ++++++++++++++++--- .../models/infra_instance_module_info.py | 2 + .../controllers/controllers.py | 40 ++++----- 4 files changed, 119 insertions(+), 32 deletions(-) diff --git a/cie_infra/models/infra_instance.py b/cie_infra/models/infra_instance.py index acacc172c..a6b2cdcf1 100644 --- a/cie_infra/models/infra_instance.py +++ b/cie_infra/models/infra_instance.py @@ -12,7 +12,7 @@ class Instance(models.Model): _name='infra.instance' _description='instance' name=fields.Char('name', required=True) - url=fields.Html('URL') + url=fields.Char('URL') note=fields.Text('text') server_id=fields.Many2one('infra.server', string='server') database_ids=fields.One2many('infra.instance.database','instance_id', string="database") @@ -50,8 +50,32 @@ def http_get_content(self, url, params=None, headers=None): return self._process_response(response) + def cron_get_database(self): + """ + thanks to http request, the cron will recover daily + the different database based on a odoo's instance + """ + route="/web/databases" + instances = self.env['infra.instance'].search([]) + for instance in instances: + databases = instance.http_get_content(route) + for db in databases["databases"]: + if not instance.is_db_already_exist(db) : + self.env["infra.instance.database"].create({ + "name": db, + "instance_id": instance.id, + }) + instance.write({ + "database_ids": db, + }) + def is_db_already_exist(self, new_db): + databases=self.env["infra.instance.database"].search([]) + for old_db in databases: + if new_db == old_db.name : + return 1 + return 0 diff --git a/cie_infra/models/infra_instance_database.py b/cie_infra/models/infra_instance_database.py index e3da754c5..18e17e224 100644 --- a/cie_infra/models/infra_instance_database.py +++ b/cie_infra/models/infra_instance_database.py @@ -1,5 +1,11 @@ -from odoo import fields, models - +from odoo import models +from odoo import fields +from odoo import api +from odoo import _ +import requests +import json +from werkzeug.exceptions import BadRequest, InternalServerError, NotFound +from odoo.exceptions import AccessDenied, Warning as UserError class Database(models.Model): _name = 'infra.instance.database' @@ -11,20 +17,73 @@ class Database(models.Model): inverse_name='database_id', string='installed_module') + @api.multi + def http_get(self, url, params, headers): + self.ensure_one() + if url.startswith("/"): + url = self.url + url + return requests.get(url,params,headers) + + def _process_response(self, response): + if response.status_code == 200: + content = response.content.decode("utf-8") + return json.loads(content) + elif response.status_code == 400: + content = response.content.decode("utf-8") + raise BadRequest("%s" % content) + elif response.status_code == 403: + raise AccessDenied( + _("You are not allowed to access this resource") + ) + elif response.status_code == 404: + raise NotFound( + _("Resource not found %s on server" % response.status_code) + ) + else: # 500 et al. + content = response.content.decode("utf-8") + raise InternalServerError(_("%s" % content)) + + @api.multi + def http_get_content(self, url, params=None, headers=None): + self.ensure_one() + response = self.http_get(url, params=params, headers=headers) + return self._process_response(response) - def cron_get_database(self): + + def cron_get_module(self): """ thanks to http request, the cron will recover daily the different database based on a odoo's instance """ - route="/web/database/list_database" - databases = self.env['infra.instance'].http_get_content(route) - instance = self.env['infra.instance'].search([]) - for db in databases["databases"]: - self.env["infra.instance.database"].create({ - "name": db, - "instance_id":instance - }) - db_instance= + + databases = self.env['infra.instance.database'].search([]) + for database in databases: + route = "/server-info/databases/"+database.name+"/modules" + modules = database.http_get_content(route) + for module in modules: + if not self.is_module_already_installed(module): + new_module = self.env['infra.instance.module'].create({ + "name": module["name"], + }) + module_info=self.env["infra.instance.module.info"].create({ + "installed_version": module["published_version"], + }) + new_module.write({ + "module_info_ids": module_info.id, + }) + module_info.write({ + "module_id":new_module.id, + }) + database.write({ + "installed_module_ids": module_info.id, + }) + return + + def is_module_already_installed(self,module): + modules = self.env["infra.instance.module"].search([]) + for old_module in modules: + if module["name"] == old_module.name: + return 1 + return 0 diff --git a/cie_infra/models/infra_instance_module_info.py b/cie_infra/models/infra_instance_module_info.py index 6d727afd8..72c937ad6 100644 --- a/cie_infra/models/infra_instance_module_info.py +++ b/cie_infra/models/infra_instance_module_info.py @@ -7,3 +7,5 @@ class ModuleInfo(models.Model): available_version=fields.Char('available_version') database_id=fields.Many2one('infra.instance.database',string='database') module_id=fields.Many2one('infra.instance.module',string='module') + + diff --git a/cie_infra_server_info/controllers/controllers.py b/cie_infra_server_info/controllers/controllers.py index 0c4dc3b57..ede018dfb 100644 --- a/cie_infra_server_info/controllers/controllers.py +++ b/cie_infra_server_info/controllers/controllers.py @@ -4,22 +4,7 @@ from contextlib import closing class CieInfraDatasend(http.Controller): -# @http.route('/cie_infra_server_info/cie_infra_server_info/', auth='public') -# def index(self, **kw): -# return "Hello, world" -# @http.route('/cie_infra_server_info/cie_infra_server_info/objects/', auth='public') -# def list(self, **kw): -# return http.request.render('cie_infra_server_info.listing', { -# 'root': '/cie_infra_server_info/cie_infra_server_info', -# 'objects': http.request.env['cie_infra_server_info.cie_infra_server_info'].search([]), -# }) - -# @http.route('/cie_infra_server_info/cie_infra_server_info/objects//', auth='public') -# def object(self, obj, **kw): -# return http.request.render('cie_infra_server_info.object', { -# 'object': obj -# }) # @http.route("/web/database/list_database", type="http", auth="none") # def databaselist(self, **kw): @@ -28,7 +13,7 @@ class CieInfraDatasend(http.Controller): # result += " ".join(list_db) # return result - @http.route("/web/database/list_database", type="json", auth="none") + @http.route("/server-info/databases", type="json", auth="none") def databaselist(self, **kw): list_db = http.db_list() result = {"databases": list_db} @@ -45,13 +30,30 @@ def databaselist(self, **kw): # modules.append(cr.fetchall()) # return str(modules) - @http.route("/web/database//modules", type="json", auth="none") + @http.route("/server-info/databases//modules", type="json", auth="none") def modulelist(self,dbname, **kw): list_db = http.db_list() # List installed modules modules = {"database":dbname} db = odoo.sql_db.db_connect(dbname) with closing(db.cursor()) as cr: - cr.execute("SELECT name, latest_version, published_version, state, shortdesc FROM ir_module_module WHERE state = 'installed'") - modules["modules"]= cr.fetchall() + cr.execute("SELECT name FROM ir_module_module WHERE state = 'installed'") + modules["name"]= cr.fetchall() + cr.execute( "SELECT latest_version FROM ir_module_module WHERE state = 'installed'") + modules["latest_version"] = cr.fetchall() + cr.execute("SELECT published_version FROM ir_module_module WHERE state = 'installed'") + modules["published_version"] = cr.fetchall() + cr.execute("SELECT state FROM ir_module_module WHERE state = 'installed'") + modules["state"] = cr.fetchall() + cr.execute("SELECT shortdesc FROM ir_module_module WHERE state = 'installed'") + modules["shortdesc"] = cr.fetchall() + #cr.execute("SELECT name,latest_version, published_version, state, shortdesc FROM ir_module_module WHERE state = 'installed'") + #records=cr.fetchall() + #for row in records : + #modules["name"]=row[0] + #modules["latest_version"]=row[1] + #modules["published_version"]=row[2] + #modules["state"]=row[3] + #modules["shortdesc"]=row[4] + return modules