diff --git a/cie_infra/__init__.py b/cie_infra/__init__.py new file mode 100644 index 000000000..aa4d0fd63 --- /dev/null +++ b/cie_infra/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models diff --git a/cie_infra/__manifest__.py b/cie_infra/__manifest__.py new file mode 100644 index 000000000..b3b996884 --- /dev/null +++ b/cie_infra/__manifest__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Coop IT Easy Infrastructure", + + '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", + 'website': "http://coopiteasy.be", + "license": "AGPL-3", + + # 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': '12.0.1.0.0', + + # 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/cie_infra_server_views.xml', + 'views/cie_infra_instance_view.xml', + 'views/cie_infra_database_view.xml', + 'views/cie_infra_module_view.xml', + 'views/cie_infra_datacenter_view.xml', + 'views/server_list_template.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..b0f26a9a6 --- /dev/null +++ b/cie_infra/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import controllers diff --git a/cie_infra/controllers/controllers.py b/cie_infra/controllers/controllers.py new file mode 100644 index 000000000..b868b58c4 --- /dev/null +++ b/cie_infra/controllers/controllers.py @@ -0,0 +1,19 @@ +from odoo import http + +class CieInfra(http.Controller): + #@http.route('/cie_infra/index', auth='public') + #def index(self, **kw): + # return "Hello, world" + + @http.route('/cie_infra/server/', auth='public') + def list_server(self, **kw): + server=http.request.env['infra.server'] + servers=server.search([]) + return http.request.render('cie_infra.server_list_template', { + 'servers': servers + }) +# @http.route('/cie_infra/cie_infra/objects//', auth='public') +# def object(self, obj, **kw): +# return http.request.render('cie_infra.object', { +# 'object': obj +# }) diff --git a/cie_infra/demo/demo.xml b/cie_infra/demo/demo.xml new file mode 100644 index 000000000..f546d6a5b --- /dev/null +++ b/cie_infra/demo/demo.xml @@ -0,0 +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 + + + + + + + + + diff --git a/cie_infra/models/__init__.py b/cie_infra/models/__init__.py new file mode 100644 index 000000000..d35323f07 --- /dev/null +++ b/cie_infra/models/__init__.py @@ -0,0 +1,8 @@ +from . import infra_server +from . import infra_datacenter +from . import infra_location +from . import infra_instance +from . import infra_instance_database +from . import infra_instance_module_info +from . import infra_instance_module +from . import 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..a6b2cdcf1 --- /dev/null +++ b/cie_infra/models/infra_instance.py @@ -0,0 +1,81 @@ +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.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") + + @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): + """ + 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 new file mode 100644 index 000000000..18e17e224 --- /dev/null +++ b/cie_infra/models/infra_instance_database.py @@ -0,0 +1,89 @@ +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' + _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') + + @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_module(self): + """ + thanks to http request, the cron will recover daily + the different database based on a odoo's 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.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..72c937ad6 --- /dev/null +++ b/cie_infra/models/infra_instance_module_info.py @@ -0,0 +1,11 @@ +from odoo import fields , models + +class ModuleInfo(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..5469d96da --- /dev/null +++ b/cie_infra/models/infra_location.py @@ -0,0 +1,8 @@ +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') + datacenter_ids=fields.One2many('infra.datacenter','location_id', string='datacenter') diff --git a/cie_infra/models/infra_server.py b/cie_infra/models/infra_server.py new file mode 100644 index 000000000..f9fdfb620 --- /dev/null +++ b/cie_infra/models/infra_server.py @@ -0,0 +1,54 @@ +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') + 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('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') + + @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/models/infra_server_shortname.py b/cie_infra/models/infra_server_shortname.py new file mode 100644 index 000000000..9aa289e87 --- /dev/null +++ b/cie_infra/models/infra_server_shortname.py @@ -0,0 +1,8 @@ +from odoo import fields, models + +class ServerShortName(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..c5ce39c17 --- /dev/null +++ b/cie_infra/security/cie_infra_security.xml @@ -0,0 +1,30 @@ + + + + + Infrastructure + + + + + 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..9750adf19 --- /dev/null +++ b/cie_infra/security/ir.model.access.csv @@ -0,0 +1,17 @@ +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 \ 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..1f85cbeed --- /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..ea1d31cfc --- /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 new file mode 100644 index 000000000..78e311548 --- /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_module_view.xml b/cie_infra/views/cie_infra_module_view.xml new file mode 100644 index 000000000..c0b2af319 --- /dev/null +++ b/cie_infra/views/cie_infra_module_view.xml @@ -0,0 +1,32 @@ + + + + + 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 new file mode 100644 index 000000000..4c08d2b6e --- /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/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 new file mode 100644 index 000000000..c810ecb0f --- /dev/null +++ b/cie_infra/views/views.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..ede018dfb --- /dev/null +++ b/cie_infra_server_info/controllers/controllers.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +import odoo +from odoo import http +from contextlib import closing + +class CieInfraDatasend(http.Controller): + + +# @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("/server-info/databases", type="json", auth="none") + def databaselist(self, **kw): + list_db = http.db_list() + result = {"databases": 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) + + @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 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 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 @@ + + + + + + + + + + + + + + + + + + +