From 47a1fe0ae8a9533e14e50b347b168e00886a74ef Mon Sep 17 00:00:00 2001 From: Michael Telahun Date: Fri, 13 Aug 2021 15:36:36 +0300 Subject: [PATCH 01/58] rename again: it_infrastructure -> itm (much shorter, easier to use) --- itm/README.rst | 55 ++ itm/__init__.py | 8 + itm/__manifest__.py | 53 ++ itm/data/application_license_data.xml | 236 ++++++++ itm/data/equipment_brand_data.xml | 38 ++ itm/data/equipment_db_engine_data.xml | 62 +++ itm/data/equipment_function.xml | 80 +++ itm/data/equipment_mapping_data.xml | 18 + itm/models/__init__.py | 28 + itm/models/access.py | 284 ++++++++++ itm/models/application.py | 60 ++ itm/models/application_license.py | 30 + itm/models/backup.py | 68 +++ itm/models/equipment.py | 325 +++++++++++ itm/models/equipment_configuration.py | 35 ++ itm/models/equipment_db.py | 42 ++ itm/models/equipment_dbsetting.py | 32 ++ itm/models/equipment_forward.py | 39 ++ itm/models/equipment_function.py | 28 + itm/models/equipment_ipreservation.py | 32 ++ itm/models/equipment_mapping.py | 60 ++ itm/models/equipment_network.py | 42 ++ itm/models/equipment_partition.py | 47 ++ itm/models/equipment_rule.py | 39 ++ itm/models/equipment_worklog.py | 38 ++ itm/models/partner.py | 49 ++ itm/models/service_ad.py | 311 +++++++++++ itm/models/service_dhcp.py | 22 + itm/models/service_proxy.py | 34 ++ itm/models/service_vpn.py | 39 ++ itm/models/service_wireless.py | 56 ++ itm/models/site.py | 71 +++ itm/readme/CREDITS.rst | 1 + itm/readme/DESCRIPTION.rst | 1 + itm/security/ir.model.access.csv | 96 ++++ itm/security/it_security.xml | 123 ++++ itm/static/description/icon.jpg | Bin 0 -> 16599 bytes itm/static/description/icon.png | Bin 0 -> 56194 bytes itm/static/description/index.html | 78 +++ itm/static/src/img/asset.png | Bin 0 -> 190361 bytes itm/static/src/img/credential.png | Bin 0 -> 53657 bytes .../src/img/default_image_equipment.png | Bin 0 -> 4970 bytes itm/static/src/img/main_screenshot.png | Bin 0 -> 279009 bytes itm/static/src/img/partner.png | Bin 0 -> 76567 bytes itm/tests/__init__.py | 4 + itm/tests/test_access.py | 41 ++ itm/views/access_view.xml | 214 +++++++ itm/views/application_license_view.xml | 65 +++ itm/views/application_view.xml | 190 +++++++ itm/views/backup_view.xml | 170 ++++++ itm/views/brand_view.xml | 51 ++ itm/views/component_view.xml | 38 ++ itm/views/equipment_function_view.xml | 69 +++ itm/views/equipment_mapping_view.xml | 74 +++ itm/views/equipment_network_view.xml | 64 +++ itm/views/equipment_partition_view.xml | 64 +++ itm/views/equipment_view.xml | 524 ++++++++++++++++++ itm/views/equipment_worklog_view.xml | 57 ++ itm/views/it_menu_view.xml | 60 ++ itm/views/partner_view.xml | 133 +++++ itm/views/service_ad_view.xml | 257 +++++++++ itm/views/service_dhcp_view.xml | 80 +++ itm/views/site_view.xml | 219 ++++++++ itm/wizard/__init__.py | 5 + itm/wizard/create_credential.py | 80 +++ itm/wizard/create_credential_view.xml | 59 ++ 66 files changed, 5178 insertions(+) create mode 100644 itm/README.rst create mode 100644 itm/__init__.py create mode 100644 itm/__manifest__.py create mode 100644 itm/data/application_license_data.xml create mode 100644 itm/data/equipment_brand_data.xml create mode 100644 itm/data/equipment_db_engine_data.xml create mode 100644 itm/data/equipment_function.xml create mode 100644 itm/data/equipment_mapping_data.xml create mode 100644 itm/models/__init__.py create mode 100644 itm/models/access.py create mode 100644 itm/models/application.py create mode 100644 itm/models/application_license.py create mode 100644 itm/models/backup.py create mode 100644 itm/models/equipment.py create mode 100644 itm/models/equipment_configuration.py create mode 100644 itm/models/equipment_db.py create mode 100644 itm/models/equipment_dbsetting.py create mode 100644 itm/models/equipment_forward.py create mode 100644 itm/models/equipment_function.py create mode 100644 itm/models/equipment_ipreservation.py create mode 100644 itm/models/equipment_mapping.py create mode 100644 itm/models/equipment_network.py create mode 100644 itm/models/equipment_partition.py create mode 100644 itm/models/equipment_rule.py create mode 100644 itm/models/equipment_worklog.py create mode 100644 itm/models/partner.py create mode 100644 itm/models/service_ad.py create mode 100644 itm/models/service_dhcp.py create mode 100644 itm/models/service_proxy.py create mode 100644 itm/models/service_vpn.py create mode 100644 itm/models/service_wireless.py create mode 100644 itm/models/site.py create mode 100644 itm/readme/CREDITS.rst create mode 100644 itm/readme/DESCRIPTION.rst create mode 100644 itm/security/ir.model.access.csv create mode 100644 itm/security/it_security.xml create mode 100644 itm/static/description/icon.jpg create mode 100644 itm/static/description/icon.png create mode 100644 itm/static/description/index.html create mode 100644 itm/static/src/img/asset.png create mode 100644 itm/static/src/img/credential.png create mode 100644 itm/static/src/img/default_image_equipment.png create mode 100644 itm/static/src/img/main_screenshot.png create mode 100644 itm/static/src/img/partner.png create mode 100644 itm/tests/__init__.py create mode 100644 itm/tests/test_access.py create mode 100644 itm/views/access_view.xml create mode 100644 itm/views/application_license_view.xml create mode 100644 itm/views/application_view.xml create mode 100644 itm/views/backup_view.xml create mode 100644 itm/views/brand_view.xml create mode 100644 itm/views/component_view.xml create mode 100644 itm/views/equipment_function_view.xml create mode 100644 itm/views/equipment_mapping_view.xml create mode 100644 itm/views/equipment_network_view.xml create mode 100644 itm/views/equipment_partition_view.xml create mode 100644 itm/views/equipment_view.xml create mode 100644 itm/views/equipment_worklog_view.xml create mode 100644 itm/views/it_menu_view.xml create mode 100644 itm/views/partner_view.xml create mode 100644 itm/views/service_ad_view.xml create mode 100644 itm/views/service_dhcp_view.xml create mode 100644 itm/views/site_view.xml create mode 100644 itm/wizard/__init__.py create mode 100644 itm/wizard/create_credential.py create mode 100644 itm/wizard/create_credential_view.xml diff --git a/itm/README.rst b/itm/README.rst new file mode 100644 index 0000000..5413982 --- /dev/null +++ b/itm/README.rst @@ -0,0 +1,55 @@ +============== +Infrastructure +============== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/github-trevi-software%2Ftrevi--misc-lightgray.png?logo=github + :target: https://github.com/trevi-software/trevi-misc/tree/14.0/it + :alt: trevi-software/trevi-misc + +|badge1| |badge2| + +This module is used to record information about a site's IT infrastructure. You can record information about equipment, software, backups, networks and access credentials. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* TREVI Software +* Leandro Ezequiel Baldi + +Other credits +~~~~~~~~~~~~~ + +* Leandro Ezequiel Baldi + +Maintainers +~~~~~~~~~~~ + +This module is part of the `trevi-software/trevi-misc `_ project on GitHub. + +You are welcome to contribute. diff --git a/itm/__init__.py b/itm/__init__.py new file mode 100644 index 0000000..a3a1c55 --- /dev/null +++ b/itm/__init__.py @@ -0,0 +1,8 @@ +# Copyright (C) 2021 TREVI Software +# Copyright (C) 2014 Leandro Ezequiel Baldi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +# flake8: noqa +from . import models +from . import wizard +from . import tests diff --git a/itm/__manifest__.py b/itm/__manifest__.py new file mode 100644 index 0000000..4e450a5 --- /dev/null +++ b/itm/__manifest__.py @@ -0,0 +1,53 @@ +# Copyright (C) 2021 TREVI Software +# Copyright (C) 2014 Leandro Ezequiel Baldi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Infrastructure", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "category": "IT Infrastructure", + "summary": """IT Assets, Credentials, Backups, Applications.""", + "author": """TREVI Software, + Leandro Ezequiel Baldi""", + "website": "https://github.com/trevi-software/trevi-misc", + "images": [ + "static/src/img/main_screenshot.png", + "static/src/img/default_image_equipment.png", + ], + "depends": ["mail", "product"], + "data": [ + "security/it_security.xml", + "security/ir.model.access.csv", + "data/application_license_data.xml", + "data/equipment_brand_data.xml", + "data/equipment_db_engine_data.xml", + "data/equipment_function.xml", + "data/equipment_mapping_data.xml", + "wizard/create_credential_view.xml", + "views/it_menu_view.xml", + "views/equipment_view.xml", + "views/equipment_worklog_view.xml", + "views/equipment_network_view.xml", + "views/equipment_partition_view.xml", + "views/component_view.xml", + "views/access_view.xml", + "views/partner_view.xml", + "views/backup_view.xml", + "views/equipment_function_view.xml", + "views/equipment_mapping_view.xml", + "views/application_view.xml", + "views/application_license_view.xml", + "views/brand_view.xml", + "views/site_view.xml", + "views/service_ad_view.xml", + "views/service_dhcp_view.xml", + ], + "demo": [], + "test": [], + "external_dependencies": { + "python": ["cryptography"], + }, + "installable": True, + "application": True, +} diff --git a/itm/data/application_license_data.xml b/itm/data/application_license_data.xml new file mode 100644 index 0000000..be3e576 --- /dev/null +++ b/itm/data/application_license_data.xml @@ -0,0 +1,236 @@ + + + + + + + + Academic Free License (AFL) + + + + AGPLv1 / Affero General Public License (version 1) + + + + AGPLv2 / Affero General Public License (version 2) + + + + Apache License + + + + Apple Public Source License (APSL) + + + + Artistic License 2.0 + + + + Berkeley Database License + + + + Boost Software License + + + + BDL / BSD Documentation License + + + + BSD license (original version) + + + + BSD 2-clause license + + + + CeCILL + + + + Common Public License + + + + Common Development and Distribution License (CDDL) + + + + Cryptix General License + + + + Eclipse Distribution License + + + + Eclipse Public License (EPL) + + + + EUPL - European Union Public License + + + + Free Solaris Binary License + + + + Free For non commercial Use + + + + AGPLv3 / GNU Affero General Public License (version 3) + + + + GPL / GNU General Public License + + + + GPLv3 / GNU General Public License v3 + + + + GNU LGPL / GNU Lesser General Public License + + + + IBM Public License + + + + Intel Open Source License + + + + ISC license + + + + LaTeX Project Public License (LPPL) + + + + License of Python + + + + MIT license + + + + Microsoft Reference License + + + + Microsoft Public License + + + + Microsoft Reciprocal License + + + + Microsoft's Shared Source + + + + Microsoft Windows' EULA + + + + Mozilla Public License (MPL) Version 1.1 + + + + Mozilla Public License (MPL) version 2.0 + + + + Netscape Public License (NPL) + + + + Open Software License + + + + OpenSSL license + + + + PHP License + + + + Public Domain + + + + Q Public License (QPL) + + + + Sun Industry Standards Source License (SISSL) + + + + Sun Public License + + + + W3C Software Notice and License + + + + WTFPL + + + + X11 license + + + + XFree86 1.1 License + + + + zlib/libpng license + + + + Zope Public License + + + + diff --git a/itm/data/equipment_brand_data.xml b/itm/data/equipment_brand_data.xml new file mode 100644 index 0000000..3d92917 --- /dev/null +++ b/itm/data/equipment_brand_data.xml @@ -0,0 +1,38 @@ + + + + + + Dell + + + + + + HP + + + + + + Cisco + + + + + D-Link + + + + + TP-Link + + + + + Ubiquiti + + + + + diff --git a/itm/data/equipment_db_engine_data.xml b/itm/data/equipment_db_engine_data.xml new file mode 100644 index 0000000..611f0c1 --- /dev/null +++ b/itm/data/equipment_db_engine_data.xml @@ -0,0 +1,62 @@ + + + + + + Cassandra + + + + Elasticsearch + + + + FileMaker + + + + IBM Db2 + + + + MariaDB + + + + Microsoft Access + + + + MS SQL Server + + + + MongoDB + + + + MySQL + + + + Oracle + + + + PostgreSQL + + + + Redis + + + + SAP HANA + + + + SQLite + + + + diff --git a/itm/data/equipment_function.xml b/itm/data/equipment_function.xml new file mode 100644 index 0000000..4ea6942 --- /dev/null +++ b/itm/data/equipment_function.xml @@ -0,0 +1,80 @@ + + + + + Active Directory + + + + Domain Controller + + + + Domain Name Server + + + + File Server + + + + Database Server + + + + Firewall + + + + VPN Server + + + + DHCP Server + + + + FTP Server + + + + VPS + + + + VM Host + + + + VM Guest + + + + Switch + + + + Router + + + + Web Server + + + + Wireless AP + + + + Wireless Bridge + + + + Wireless Extender + + + + Wireless Client + + + diff --git a/itm/data/equipment_mapping_data.xml b/itm/data/equipment_mapping_data.xml new file mode 100644 index 0000000..2511201 --- /dev/null +++ b/itm/data/equipment_mapping_data.xml @@ -0,0 +1,18 @@ + + + + + + Full Control + + + + Change + + + + Read + + + + diff --git a/itm/models/__init__.py b/itm/models/__init__.py new file mode 100644 index 0000000..7407040 --- /dev/null +++ b/itm/models/__init__.py @@ -0,0 +1,28 @@ +# Copyright (C) 2021 TREVI Software +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +# flake8: noqa +from . import access +from . import application +from . import application_license +from . import backup +from . import equipment +from . import equipment_configuration +from . import equipment_db +from . import equipment_dbsetting +from . import equipment_forward +from . import equipment_function +from . import equipment_ipreservation +from . import equipment_mapping +from . import equipment_network +from . import equipment_partition +from . import equipment_rule +from . import equipment_worklog +from . import partner +from . import service_ad +from . import service_dhcp +from . import service_proxy +from . import service_vpn +from . import service_wireless +from . import site diff --git a/itm/models/access.py b/itm/models/access.py new file mode 100644 index 0000000..c4f9347 --- /dev/null +++ b/itm/models/access.py @@ -0,0 +1,284 @@ +# Copyright (C) 2021 TREVI Software +# Copyright (C) 2014 Leandro Ezequiel Baldi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +import base64 +import os +from random import choice + +from cryptography.fernet import Fernet +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC + +from odoo import _, api, fields, models +from odoo.exceptions import AccessDenied + +PARAM_PASS = "it_passkey" +PARAM_SALT = "it_passsalt" + + +class ItAccess(models.Model): + _name = "it.access" + _inherit = ["mail.thread"] + _description = "Credential" + + @api.onchange("equipment_id") + def onchange_equipment(self): + if self.equipment_id: + self.partner_id = self.equipment_id.partner_id + else: + self.partner_id = None + + @api.model + def get_random_string(self): + longitud = 16 + valores = ( + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ<=>@#%&+" + ) + p = "" + p = p.join([choice(valores) for i in range(longitud)]) + return p + + def get_random_password(self): + for access in self: + token = self.encrypt_string(self.get_random_string()) + access.password = token + + def get_urlsafe_key(self): + + ConfigParam = self.env["ir.config_parameter"] + salt = None + passphrase = ConfigParam.sudo().get_param(PARAM_PASS) + if not passphrase: + passphrase = base64.urlsafe_b64encode(os.urandom(64)).decode() + salt = os.urandom(16) + ConfigParam.sudo().set_param(PARAM_PASS, passphrase) + ConfigParam.sudo().set_param( + PARAM_SALT, base64.urlsafe_b64encode(salt).decode() + ) + else: + salt = base64.urlsafe_b64decode( + ConfigParam.sudo().get_param(PARAM_SALT).encode() + ) + + kdf = PBKDF2HMAC( + algorithm=hashes.SHA256, + length=32, + salt=salt, + iterations=100000, + ) + return base64.urlsafe_b64encode(kdf.derive(passphrase.encode())) + + @api.model + def encrypt_string(self, plaintext): + """Returns a URL-safe string containing the encrypted version of plaintext.""" + + key = self.get_urlsafe_key() + f = Fernet(key) + cipher = f.encrypt(plaintext.encode()) + return base64.urlsafe_b64encode(cipher) + + def decrypt_password(self): + + key = self.get_urlsafe_key() + f = Fernet(key) + + for rec in self: + token = base64.urlsafe_b64decode(rec.password) + password = f.decrypt(token).decode() + raise AccessDenied(password) + + @api.model + def _get_partner_id(self): + # Get the partner from either asset or site + # + if self.env.context.get("active_model") == "it.equipment": + equip = self.env["it.equipment"].browse(self.env.context.get("active_id")) + if equip.partner_id: + return equip.partner_id.id + elif self.env.context.get("active_model") == "it.site": + site = self.env["it.site"].browse(self.env.context.get("active_id")) + if site.partner_id: + return site.partner_id.id + return False + + @api.model + def _get_site_id(self): + if self.env.context.get("active_model") == "it.equipment": + equip = self.env["it.equipment"].browse(self.env.context.get("active_id")) + if equip.site_id: + return equip.site_id.id + return False + + company_id = fields.Many2one( + "res.company", + "Company", + default=lambda self: self.env.company, + ) + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="restrict") + site_id = fields.Many2one( + "it.site", "Site", required=True, ondelete="restrict", default=_get_site_id + ) + name = fields.Char("Username", required=True, tracking=True) + password = fields.Char() + partner_id = fields.Many2one( + "res.partner", + "Partner", + domain="[('manage_it','=',1)]", + default=_get_partner_id, + tracking=True, + ) + active = fields.Boolean(default=True, tracking=True) + ssl_csr = fields.Binary("CSR", tracking=True) + ssl_csr_filename = fields.Char("CSR Filename") + ssl_cert = fields.Binary("Cert", tracking=True) + ssl_cert_filename = fields.Char("Cert Filename") + ssl_publickey = fields.Binary("Public Key", tracking=True) + ssl_publickey_filename = fields.Char("Public Key Filename") + ssl_privatekey = fields.Binary("Private Key", tracking=True) + ssl_privatekey_filename = fields.Char("Private Key Filename") + + def write(self, vals): + + # Log a note to Site and Equipment chatter. + # Map access records to sites and equipment. + # + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + sites = {} + equips = {} + for res in self: + if res.site_id: + if res.site_id.id not in sites.keys(): + sites.update({res.site_id.id: [{"id": res.id, "name": res.name}]}) + else: + sites[res.site_id.id].append({"id": res.id, "name": res.name}) + if res.equipment_id: + if res.equipment_id.id not in equips.keys(): + equips.update( + {res.equipment_id.id: [{"id": res.id, "name": res.name}]} + ) + else: + equips[res.equipment_id.id].append({"id": res.id, "name": res.name}) + + Site = self.env["it.site"] + for k, v in sites.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • A %s's password was updated: %s
  • ", + self._description, + r["name"], + ) + note = '
      ' + msg + "
    " + Site.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + Equipment = self.env["it.equipment"] + for k, v in equips.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • A %s's password was updated: %s
  • ", + self._description, + r["name"], + ) + note = '
      ' + msg + "
    " + Equipment.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + # Encrypt the password before saving it. The unencrypted password should not be + # saved to the database even temporarily. + # + if "password" in vals.keys() and vals["password"] is not False: + vals["password"] = self.encrypt_string(vals["password"]) + + return super(ItAccess, self).write(vals) + + @api.model + def create(self, vals): + + # Encrypt the password before saving it. The unencrypted password should not be + # saved to the database even temporarily. + # + if "password" in vals.keys() and vals["password"] is not False: + vals["password"] = self.encrypt_string(vals["password"]) + + res = super(ItAccess, self).create(vals) + + # Log a note to Site and Equipment chatter. + # + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + msg = _( + '
    ', + res._description, + res.id, + res.name, + ) + if res.site_id: + res.site_id.message_post(body=msg, subtype_id=mt_note.id, author_id=author) + if res.equipment_id: + res.equipment_id.message_post( + body=msg, subtype_id=mt_note.id, author_id=author + ) + + return res + + # Log a note on deletion of credential to Site and Equipment chatter. Since + # more than one record at a time may be deleted post all deleted records + # for each site and each equipment together in one post. + # + def unlink(self): + + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + + # map access records to sites and equipment + # + sites = {} + equips = {} + for res in self: + if res.site_id: + if res.site_id.id not in sites.keys(): + sites.update({res.site_id.id: [{"id": res.id, "name": res.name}]}) + else: + sites[res.site_id.id].append({"id": res.id, "name": res.name}) + if res.equipment_id: + if res.equipment_id.id not in equips.keys(): + equips.update( + {res.equipment_id.id: [{"id": res.id, "name": res.name}]} + ) + else: + equips[res.equipment_id.id].append({"id": res.id, "name": res.name}) + + Site = self.env["it.site"] + for k, v in sites.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • %s was deleted: %s
  • ", self._description, r["name"] + ) + note = '
      ' + msg + "
    " + Site.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + Equipment = self.env["it.equipment"] + for k, v in equips.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • %s record was deleted: %s
  • ", self._description, r["name"] + ) + note = '
      ' + msg + "
    " + Equipment.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + return super(ItAccess, self).unlink() diff --git a/itm/models/application.py b/itm/models/application.py new file mode 100644 index 0000000..01fe512 --- /dev/null +++ b/itm/models/application.py @@ -0,0 +1,60 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItApplication(models.Model): + _name = "it.application" + _description = "Application" + + name = fields.Char(required=True) + is_webapp = fields.Boolean("Web Application") + company_id = fields.Many2one( + "res.company", + "Company", + default=lambda self: self.env.company, + ) + active = fields.Boolean("Active", default=True) + developer = fields.Char("Developer") + link_download = fields.Char("Download Link") + link_page = fields.Char("Link") + license_id = fields.Many2one("it.application.license", "License") + license_type = fields.Selection( + [("opensource", "OPEN SOURCE"), ("closedsource", "COMMERCIAL")], + required=True, + default="opensource", + ) + documentation = fields.Binary() + documentation_filename = fields.Char() + note = fields.Text() + equipment_ids = fields.Many2many( + "it.equipment", + "equipment_application_rel", + "application_id", + "equipment_id", + "Assets", + ) + db_ids = fields.One2many("it.equipment.db", "application_id", "Databases") + # Closed Source + key = fields.Char() + keygen = fields.Binary() + crack = fields.Binary() diff --git a/itm/models/application_license.py b/itm/models/application_license.py new file mode 100644 index 0000000..5fb69aa --- /dev/null +++ b/itm/models/application_license.py @@ -0,0 +1,30 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItApplicationLicense(models.Model): + _name = "it.application.license" + _description = "License" + + name = fields.Char(required=True) + copy = fields.Text() diff --git a/itm/models/backup.py b/itm/models/backup.py new file mode 100644 index 0000000..fb72009 --- /dev/null +++ b/itm/models/backup.py @@ -0,0 +1,68 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItBackup(models.Model): + _name = "it.backup" + _description = "Backup" + + equipment_id = fields.Many2one( + comodel_name="it.equipment", + string="Asset", + domain="[('is_backup','=',1)]", + ondelete="restrict", + required=True, + ) + partner_id = fields.Many2one( + comodel_name="res.partner", + related="equipment_id.partner_id", + readonly=True, + string="Partner", + store=True, + ) + name = fields.Char(required=True) + type = fields.Selection( + [ + ("diff", "DIFF"), + ("full", "FULL"), + ("inc", "INCREMENTAL"), + ("other", "OTHER"), + ], + "Backup Type", + required=True, + default="full", + ) + destination = fields.Char() + source = fields.Char() + script = fields.Binary("Script") + script_filename = fields.Char() + script_location = fields.Char() + frequency = fields.Char() + time_schedule = fields.Float() + note = fields.Text() + company_id = fields.Many2one( + "res.company", + "Company", + default=lambda self: self.env.company, + ) + active = fields.Boolean(default=True) diff --git a/itm/models/equipment.py b/itm/models/equipment.py new file mode 100644 index 0000000..416dbbd --- /dev/null +++ b/itm/models/equipment.py @@ -0,0 +1,325 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +import base64 + +from odoo import _, api, fields, models +from odoo.modules.module import get_module_resource + + +class ItEquipmentBrand(models.Model): + _name = "it.equipment.brand" + _description = "IT Asset Brand Name" + + name = fields.Char(required=True) + is_computer = fields.Boolean("Computing Devices") + is_network = fields.Boolean("Network Devices") + is_accessories = fields.Boolean("Computing Accessories") + + +class ItEquipment(models.Model): + _name = "it.equipment" + _inherit = ["mail.activity.mixin", "mail.thread"] + _description = "IT Asset" + + @api.depends("virtual_ids") + def _compute_virtual_count(self): + for equipment in self: + equipment.virtual_count = len(equipment.virtual_ids) + + @api.depends("access_ids") + def _compute_access_count(self): + for equipment in self: + equipment.access_count = len(equipment.access_ids) + + @api.depends("backup_ids") + def _compute_backup_count(self): + for equipment in self: + equipment.backup_count = len(equipment.backup_ids) + + @api.model + def _get_default_image(self): + image_path = get_module_resource( + "it", "static/src/img", "default_image_equipment.png" + ) + return base64.b64encode(open(image_path, "rb").read()) + + @api.model + def _get_partner_id(self): + # Get the partner from either asset or site + # + if self.env.context.get("active_model") == "it.equipment": + equip = self.env["it.equipment"].browse(self.env.context.get("active_id")) + if equip.partner_id: + return equip.partner_id.id + elif self.env.context.get("active_model") == "it.site": + site = self.env["it.site"].browse(self.env.context.get("active_id")) + if site.partner_id: + return site.partner_id.id + return False + + @api.model + def _get_site_id(self): + if self.env.context.get("active_model") == "it.equipment": + equip = self.env["it.equipment"].browse(self.env.context.get("active_id")) + if equip.site_id: + return equip.site_id.id + return False + + # For openerp structure + company_id = fields.Many2one( + "res.company", + "Company", + default=lambda self: self.env.company, + ) + site_id = fields.Many2one( + "it.site", "Site", required=True, tracking=True, default=_get_site_id + ) + active = fields.Boolean(default=True, tracking=True) + # Counts + access_count = fields.Integer( + compute="_compute_access_count", string="Credentials Count", store=False + ) + access_ids = fields.One2many("it.access", "equipment_id", string="Credentials") + backup_count = fields.Integer(compute="_compute_backup_count") + backup_ids = fields.One2many("it.backup", "equipment_id", "Backups") + virtual_count = fields.Integer( + compute="_compute_virtual_count", string="Guests", store=False + ) + virtual_ids = fields.One2many("it.equipment", "virtual_parent_id", "Guest(s)") + # General Info + identification = fields.Char( + compute="_compute_identification", string="Complete Name", store=True + ) + name = fields.Char("Name", required=True, tracking=True) + brand_id = fields.Many2one("it.equipment.brand", "Brand") + model = fields.Char() + partner_id = fields.Many2one( + "res.partner", + "Partner", + required=True, + domain="[('manage_it','=',1)]", + tracking=True, + default=_get_partner_id, + ) + function_ids = fields.Many2many( + "it.equipment.function", + "equipment_function_rel", + "equipment_id", + "function_id", + "Functions", + ) + description = fields.Char("Description", required=False) + image = fields.Binary( + "Photo", + default=_get_default_image, + help="Equipment Photo, limited to 1024x1024px.", + ) + # Applications Page + application_ids = fields.Many2many( + "it.application", + "equipment_application_rel", + "equipment_id", + "application_id", + "Applications", + ) + + @api.model + def _get_type(self): + if self.env.context.get("search_default_equipment_type"): + return self.env.context.get("search_default_equipment_type") + return "bundle" + + # Config Page + equipment_type = fields.Selection( + [ + ("bundle", "PHYSICAL"), + ("virtual", "VIRTUAL"), + ("product", "PRODUCT"), + ("other", "OTHER"), + ], + "Equipment Type", + required=True, + default=_get_type, + ) + is_contracted = fields.Boolean("Contracted Service") + is_partitioned = fields.Boolean("Partitions") + is_backup = fields.Boolean("Backup") + is_os = fields.Boolean("Operating System") + is_application = fields.Boolean("Application") + is_config_file = fields.Boolean("Store Config Files") + # Config Page - Functions + function_fileserver = fields.Boolean("File Server") + function_host = fields.Boolean("Host") + function_router = fields.Boolean("Router") + function_database = fields.Boolean("Database Server") + # Worklogs Page + worklog_ids = fields.One2many( + "it.equipment.worklog", + "equipment_id", + "Worklogs on this equipment", + tracking=True, + ) + # Contract Page + contract_partner_id = fields.Many2one("res.partner", "Contractor") + contract_client_number = fields.Char("Client Nummber") + contract_owner = fields.Char("Titular") + contract_nif = fields.Char("NIF") + contract_direction = fields.Char("Invoice Direction") + # Virtual Machine Page + virtual_parent_id = fields.Many2one( + "it.equipment", "Virtual Machine", domain="[('function_host','=',1)]" + ) + virtual_memory_amount = fields.Char("Memory") + virtual_disk_amount = fields.Char("Disk Size") + virtual_processor_amount = fields.Char("Number of Processor") + virtual_network_amount = fields.Char("Number of Network") + # Partition Page + partitions_ids = fields.One2many( + "it.equipment.partition", "equipment_id", "Partitions on this equipment" + ) + # Router Page + router_dmz = fields.Char("DMZ") + router_forward_ids = fields.One2many( + "it.equipment.forward", "equipment_id", "Forward Rules", tracking=True + ) + router_rules_ids = fields.One2many( + "it.equipment.rule", + "equipment_id", + "Firewall Rules", + tracking=True, + ) + # Network Configuration + equipment_network_ids = fields.One2many( + "it.equipment.network", + "equipment_id", + "Network on this equipment", + tracking=True, + ) + # Product Page + product_id = fields.Many2one("product.product", "Product") + product_serial_number = fields.Char("Serial Number") + product_warranty = fields.Char("Warranty") + product_buydate = fields.Date("Buy Date") + product_note = fields.Text("Product Note") + # Fileserver Page + equipment_mapping_ids = fields.One2many( + "it.equipment.mapping", + "equipment_id", + "Network Shares", + tracking=True, + ) + # OS Page + os_name = fields.Char("OS Name") + # Services + ad_service_id = fields.Many2one("it.service.ad", "Active Directory") + dhcp_service_id = fields.Many2one("it.service.dhcp4", "DHCP") + wireless_service_id = fields.Many2one("it.service.wireless", "Wireless Service") + proxy_service_id = fields.Many2one("it.service.proxy", "Proxy Service") + vpn_service_id = fields.Many2one("it.service.vpn", "VPN Service") + # Database Page + db_ids = fields.One2many("it.equipment.db", "equipment_id", "Databases") + use_proxy = fields.Boolean("Use Proxy") + proxy_client_config_id = fields.Many2one( + "it.equipment.network.proxy", "Proxy Configuration" + ) + # Store Config File Page + configuration_file_ids = fields.One2many( + "it.equipment.configuration", "equipment_id", "Configuration Files" + ) + + # Log a note on creation of equipment to Site and Equipment chatter. + # + @api.model + def create(self, vals): + res = super(ItEquipment, self).create(vals) + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + msg = _( + '
    ', + res._description, + res.id, + res.name, + ) + if res.site_id: + res.site_id.message_post(body=msg, subtype_id=mt_note.id, author_id=author) + if res.virtual_parent_id: + res.virtual_parent_id.message_post( + body=msg, subtype_id=mt_note.id, author_id=author + ) + return res + + # Log a note on deletion of credential to Site and Equipment chatter. Since + # more than one record at a time may be deleted post all deleted records + # for each site and each equipment together in one post. + # + def unlink(self): + + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + + # map access records to sites and equipment + # + sites = {} + equips = {} + for res in self: + if res.site_id: + if res.site_id.id not in sites.keys(): + sites.update({res.site_id.id: [{"id": res.id, "name": res.name}]}) + else: + sites[res.site_id.id].append({"id": res.id, "name": res.name}) + if res.virtual_parent_id: + if res.virtual_parent_id.id not in equips.keys(): + equips.update( + {res.virtual_parent_id.id: [{"id": res.id, "name": res.name}]} + ) + else: + equips[res.virtual_parent_id.id].append( + {"id": res.id, "name": res.name} + ) + + Site = self.env["it.site"] + for k, v in sites.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • %s record was deleted: %s
  • ", self._description, r["name"] + ) + note = '
      ' + msg + "
    " + Site.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + Equipment = self.env["it.equipment"] + for k, v in equips.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • %s record was deleted: %s
  • ", self._description, r["name"] + ) + note = '
      ' + msg + "
    " + Equipment.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + return super(ItEquipment, self).unlink() diff --git a/itm/models/equipment_configuration.py b/itm/models/equipment_configuration.py new file mode 100644 index 0000000..a6d9852 --- /dev/null +++ b/itm/models/equipment_configuration.py @@ -0,0 +1,35 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentConfiguration(models.Model): + _name = "it.equipment.configuration" + _description = "Equipment Configuration" + + _order = "date desc" + + name = fields.Char("Description", required=True) + date = fields.Datetime(default=fields.Datetime.now()) + config_file = fields.Binary("Configuration File") + config_file_filename = fields.Char("Configuration File Filename") + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="restrict") diff --git a/itm/models/equipment_db.py b/itm/models/equipment_db.py new file mode 100644 index 0000000..a5f1ab5 --- /dev/null +++ b/itm/models/equipment_db.py @@ -0,0 +1,42 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentDb(models.Model): + _name = "it.equipment.db" + _description = "Database" + + name = fields.Char(required=True) + codification = fields.Char() + description = fields.Text() + setting_ids = fields.One2many("it.equipment.dbsetting", "db_id", "Settings") + engine_id = fields.Many2one("it.equipment.db.engine", "Database Engine") + application_id = fields.Many2one("it.application", "Application") + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="restrict") + + +class ItEquipmentDbEngine(models.Model): + _name = "it.equipment.db.engine" + _description = "Database Engine" + + name = fields.Char(required=True) diff --git a/itm/models/equipment_dbsetting.py b/itm/models/equipment_dbsetting.py new file mode 100644 index 0000000..f772d4b --- /dev/null +++ b/itm/models/equipment_dbsetting.py @@ -0,0 +1,32 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentDbsetting(models.Model): + _name = "it.equipment.dbsetting" + _description = "Database Setting" + + name = fields.Char("Parameter", required=True) + value = fields.Char(required=True) + description = fields.Text() + db_id = fields.Many2one("it.equipment.dbsetting", "Database", ondelete="cascade") diff --git a/itm/models/equipment_forward.py b/itm/models/equipment_forward.py new file mode 100644 index 0000000..72e7f3a --- /dev/null +++ b/itm/models/equipment_forward.py @@ -0,0 +1,39 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentForward(models.Model): + _name = "it.equipment.forward" + _description = "Router Forwarding Rule" + + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + name = fields.Char(required=True) + source_port = fields.Char() + destination_port = fields.Char() + source_address = fields.Char() + destination_address = fields.Char() + type = fields.Selection( + [("tcp", "TCP"), ("udp", "UDP"), ("both", "BOTH")], + "Type", + default="both", + ) diff --git a/itm/models/equipment_function.py b/itm/models/equipment_function.py new file mode 100644 index 0000000..fad1859 --- /dev/null +++ b/itm/models/equipment_function.py @@ -0,0 +1,28 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from odoo import fields, models + + +class ItEquipmentFunction(models.Model): + _name = "it.equipment.function" + _description = "IT Function" + + name = fields.Char(required=True) diff --git a/itm/models/equipment_ipreservation.py b/itm/models/equipment_ipreservation.py new file mode 100644 index 0000000..9224987 --- /dev/null +++ b/itm/models/equipment_ipreservation.py @@ -0,0 +1,32 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentIpreservation(models.Model): + _name = "it.equipment.ipreservation" + _description = "IP Reservation" + + name = fields.Char(required=True, string="Description") + mac_address = fields.Char(required=True) + ip_address = fields.Many2one("it.site.network.ip4", "IP address", required=True) + dhcp_id = fields.Many2one("it.service.dhcp4", "DHCP Service", ondelete="cascade") diff --git a/itm/models/equipment_mapping.py b/itm/models/equipment_mapping.py new file mode 100644 index 0000000..cc9506e --- /dev/null +++ b/itm/models/equipment_mapping.py @@ -0,0 +1,60 @@ +# Copyright (C) 2021 TREVI Software +# Copyright (C) 2014 Leandro Ezequiel Baldi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import _, fields, models + + +class ItEquipmentMapping(models.Model): + _name = "it.equipment.mapping" + _description = "Network Share Mapping" + + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + name = fields.Char("Share Name", required=True) + path = fields.Char("Filesystem Path", required=True) + line_ids = fields.One2many( + "it.equipment.mapping.line", "map_id", "Permission lines" + ) + + +class ItEquipmentMappingLine(models.Model): + _name = "it.equipment.mapping.line" + _description = "Network Share Mapping Line" + + def _compute_name(self): + for rec in self: + _name = _("Unknown") + if rec.adobj_id: + _name = rec.adobj_id.name + rec.name = _name + + map_id = fields.Many2one("it.equipment.mapping", "Mapping") + name = fields.Char(string="Name", compute="_compute_name", store=True) + adobj_id = fields.Many2one( + comodel_name="it.service.ad.object", string="AD object name" + ) + type = fields.Selection( + [ + ("simple", _("Simple Sharing")), + ("advanced", _("Advanced Sharing")), + ] + ) + perm_simple = fields.Selection( + [ + ("read", _("Read")), + ("write", _("Read/Write")), + ], + string="Simple permissions", + ) + perm_advanced = fields.One2many( + "it.equipment.mapping.permission.advanced", "line_id", "Advanced permissions" + ) + + +class ItMappingAdvancedPermissions(models.Model): + _name = "it.equipment.mapping.permission.advanced" + _description = "Advanced Share Mapping Permission" + + name = fields.Char() + line_id = fields.Many2one("it.equipment.mapping.line", "Share mapping") diff --git a/itm/models/equipment_network.py b/itm/models/equipment_network.py new file mode 100644 index 0000000..0af06e2 --- /dev/null +++ b/itm/models/equipment_network.py @@ -0,0 +1,42 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentNetwork(models.Model): + _name = "it.equipment.network" + _description = "Network Interface" + + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + name = fields.Char("Interface Name", required=True) + mac = fields.Char("MAC Address", required=True) + network_id = fields.Many2one("it.site.network", "Network") + static_ipv4_id = fields.Many2one("it.site.network.ip4", "Static IPv4 Address") + use_dhcp4 = fields.Boolean("Use IPv4 DHCP", default=True) + note = fields.Text() + + +class ItEquipmentNetworkProxy(models.Model): + _name = "it.equipment.network.proxy" + _description = "Network Proxy Configuration" + + name = fields.Char("Proxy Hostname", required=True) diff --git a/itm/models/equipment_partition.py b/itm/models/equipment_partition.py new file mode 100644 index 0000000..2a3d836 --- /dev/null +++ b/itm/models/equipment_partition.py @@ -0,0 +1,47 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentPartition(models.Model): + _name = "it.equipment.partition" + _description = "Partition" + + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + name = fields.Char("Identificator", required=True) + disks = fields.Char(help="Disks splitted by , ") + type = fields.Char() + format = fields.Char() + mount_ids = fields.One2many( + "it.equipment.partition.mount", "partition_id", "Mount on this partition" + ) + + +class ItEquipmentPartitionMount(models.Model): + _name = "it.equipment.partition.mount" + _description = "Partition Mounts" + + partition_id = fields.Many2one( + "it.equipment.partition", "Partition", ondelete="cascade" + ) + name = fields.Char(required=True) + size = fields.Char() diff --git a/itm/models/equipment_rule.py b/itm/models/equipment_rule.py new file mode 100644 index 0000000..b173a8f --- /dev/null +++ b/itm/models/equipment_rule.py @@ -0,0 +1,39 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentRule(models.Model): + _name = "it.equipment.rule" + _description = "Router Rule" + + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + name = fields.Char(required=True) + source_port = fields.Char() + destination_port = fields.Char() + source_address = fields.Char() + destination_address = fields.Char() + permission = fields.Selection( + [("allow", "ALLOW"), ("deny", "DENY")], + "Permission", + default="allow", + ) diff --git a/itm/models/equipment_worklog.py b/itm/models/equipment_worklog.py new file mode 100644 index 0000000..16b3858 --- /dev/null +++ b/itm/models/equipment_worklog.py @@ -0,0 +1,38 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItEquipmentWorklog(models.Model): + _name = "it.equipment.worklog" + _description = "Asset Worklog" + + _order = "date desc" + + name = fields.Char("Short Description", required=True) + description = fields.Text("Long Description") + date = fields.Datetime(default=fields.Datetime.now()) + spent_time = fields.Float() + equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + user_id = fields.Many2one( + "res.users", "User", required=True, default=lambda self: self.env.user_id.id + ) diff --git a/itm/models/partner.py b/itm/models/partner.py new file mode 100644 index 0000000..4726323 --- /dev/null +++ b/itm/models/partner.py @@ -0,0 +1,49 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import api, fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + @api.depends("equipment_ids") + def _equipment_count(self): + for partner in self: + partner.equipment_count = len(partner.equipment_ids) + + @api.depends("access_ids") + def _access_count(self): + for partner in self: + partner.access_count = len(partner.access_ids) + + @api.depends("backup_ids") + def _backup_count(self): + for partner in self: + partner.backup_count = len(partner.backup_ids) + + manage_it = fields.Boolean("Manage IT") + equipment_ids = fields.One2many("it.equipment", "partner_id", "Assets") + equipment_count = fields.Integer(compute=_equipment_count) + access_ids = fields.One2many("it.access", "partner_id", "Credentials") + access_count = fields.Integer(compute=_access_count) + backup_ids = fields.One2many("it.backup", "partner_id", "Backups") + backup_count = fields.Integer(compute=_backup_count) diff --git a/itm/models/service_ad.py b/itm/models/service_ad.py new file mode 100644 index 0000000..9d4dd59 --- /dev/null +++ b/itm/models/service_ad.py @@ -0,0 +1,311 @@ +# Copyright (C) 2021 TREVI Software +# Copyright (C) 2014 Leandro Ezequiel Baldi +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ItServiceAD(models.Model): + _name = "it.service.ad" + _inherit = ["mail.thread"] + _description = "Active Directory" + + active = fields.Boolean(default=True) + name = fields.Char("Domain", required=True) + name_pre2000 = fields.Char("Domain (Pre-Windows 2000)", required=True) + type = fields.Selection( + [("primary", "PRIMARY"), ("secundary", "SECONDARY"), ("slave", "SLAVE")], + "AD Type", + ) + obj_ids = fields.One2many( + "it.service.ad.object", "ad_id", "Active Directory Objects" + ) + site_id = fields.Many2one("it.site", "Site", ondelete="restrict") + equipment_id = fields.Many2one("it.equipment", "Asset") + partner_id = fields.Many2one( + "res.partner", + "Partner", + compute="_compute_partner_id", + store=True, + ) + + # Both site_id and equipment_id have partner fields. But, theoreticaly + # the asset that the AD lives on could be owned by someone other than + # the AD owner. We can be pretty sure that the owner of the site is + # the owner of the AD. + # + @api.depends("site_id.partner_id") + def _compute_partner_id(self): + for ad in self: + if ad.site_id and ad.site_id.partner_id: + ad.partner_id = ad.site_id.partner_id + + @api.model + def create(self, vals): + + res = super(ItServiceAD, self).create(vals) + + # Log a note to Site and Equipment chatter. + # + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + msg = _( + '
    ', + res._description, + res.id, + res.name, + ) + if res.site_id: + res.site_id.message_post(body=msg, subtype_id=mt_note.id, author_id=author) + if res.equipment_id: + res.equipment_id.message_post( + body=msg, subtype_id=mt_note.id, author_id=author + ) + + return res + + # Log a note on deletion of AD to Site and Equipment chatter. Since + # more than one record at a time may be deleted post all deleted records + # for each site and each equipment together in one post. + # + def unlink(self): + + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + + # map AD records to sites and equipment + # + sites = {} + equips = {} + for res in self: + if res.site_id: + if res.site_id.id not in sites.keys(): + sites.update({res.site_id.id: [{"id": res.id, "name": res.name}]}) + else: + sites[res.site_id.id].append({"id": res.id, "name": res.name}) + if res.equipment_id: + if res.equipment_id.id not in equips.keys(): + equips.update( + {res.equipment_id.id: [{"id": res.id, "name": res.name}]} + ) + else: + equips[res.equipment_id.id].append({"id": res.id, "name": res.name}) + + Site = self.env["it.site"] + for k, v in sites.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • %s was deleted: %s
  • ", self._description, r["name"] + ) + note = '
      ' + msg + "
    " + Site.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + Equipment = self.env["it.equipment"] + for k, v in equips.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • %s record was deleted: %s
  • ", self._description, r["name"] + ) + note = '
      ' + msg + "
    " + Equipment.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + return super(ItServiceAD, self).unlink() + + +class ItServiceAdObject(models.Model): + + _name = "it.service.ad.object" + _description = "Active Directory Object" + _rec_name = "complete_name" + _order = "complete_name" + + @api.model + def default_get(self, fields): + if "ad_id" not in fields: + fields.append("ad_id") + res = super(ItServiceAdObject, self).default_get(fields) + return res + + def _get_default_ad(self): + if self.env.context.get("default_ad_id"): + return self.env.context.get("default_ad_id") + return False + + parent_id = fields.Many2one( + "it.service.ad.object", + "AD Folder", + domain="[('type', '=', 'folder'), ('ad_id', '=', ad_id)]", + ) + ad_id = fields.Many2one( + "it.service.ad", + "Active Directory", + ondelete="cascade", + default=_get_default_ad, + ) + access_id = fields.Many2one("it.access", "Related Credential") + complete_name = fields.Char(compute="_compute_complete_name", store=True) + description = fields.Text() + active = fields.Boolean(default=True) + type = fields.Selection( + [("folder", _("Folder")), ("group", _("Group")), ("user", _("User"))], + string="Object Type", + default="folder", + ) + + # Folder related fields + folder_name = fields.Char() + + # Group related fields + group_name = fields.Char() + + # User related fields + logon_name = fields.Char(string="User logon name") + complete_logon = fields.Char(compute="_compute_complete_logon") + first_name = fields.Char() + last_name = fields.Char() + full_name = fields.Char(compute="_compute_full_name", store=True) + + @api.constrains("parent_id") + def _check_parent_id(self): + if not self._check_recursion(): + raise ValidationError( + _("You cannot create recursive Active Directory objects.") + ) + + @api.depends("logon_name", "ad_id.name") + def _compute_complete_logon(self): + for rec in self: + if rec.logon_name and rec.ad_id and rec.ad_id.name: + rec.complete_logon = "{}@{}".format(rec.logon_name, rec.ad_id.name) + else: + rec.complete_logon = False + + @api.depends("first_name", "last_name") + def _compute_full_name(self): + for rec in self: + rec.full_name = "{} {}".format( + rec.first_name or "", rec.last_name or "" + ).strip() + + @api.depends("folder_name", "group_name", "logon_name", "parent_id.complete_name") + def _compute_complete_name(self): + for obj in self: + name = False + if obj.type == "folder": + name = obj.folder_name + elif obj.type == "group": + name = obj.group_name + elif obj.type == "user": + name = obj.logon_name + + if obj.parent_id: + obj.complete_name = r"%s \ %s" % (obj.parent_id.complete_name, name) + else: + obj.complete_name = name + + @api.model + def create(self, vals): + + res = super(ItServiceAdObject, self).create(vals) + + # Log a note to Site and Equipment chatter. + # + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + msg = _( + '
    ', + res._description, + res.id, + res.complete_name, + ) + if res.ad_id and res.ad_id.site_id: + res.ad_id.site_id.message_post( + body=msg, subtype_id=mt_note.id, author_id=author + ) + if res.ad_id and res.ad_id.equipment_id: + res.ad_id.equipment_id.message_post( + body=msg, subtype_id=mt_note.id, author_id=author + ) + + return res + + # Log a note on deletion of AD object to Site and Equipment chatter. Since + # more than one record at a time may be deleted post all deleted records + # for each site and each equipment together in one post. + # + def unlink(self): + + mt_note = self.env.ref("mail.mt_note") + author = self.env.user.partner_id and self.env.user.partner_id.id or False + + # map AD records to sites and equipment + # + sites = {} + equips = {} + for obj in self: + if obj.ad_id.site_id: + if obj.ad_id.site_id.id not in sites.keys(): + sites.update( + { + obj.ad_id.site_id.id: [ + {"id": obj.id, "name": obj.complete_name} + ] + } + ) + else: + sites[obj.ad_id.site_id.id].append( + {"id": obj.id, "name": obj.complete_name} + ) + if obj.ad_id.equipment_id: + if obj.ad_id.equipment_id.id not in equips.keys(): + equips.update( + { + obj.ad_id.equipment_id.id: [ + {"id": obj.id, "name": obj.complete_name} + ] + } + ) + else: + equips[obj.ad_id.equipment_id.id].append( + {"id": obj.id, "name": obj.complete_name} + ) + + Site = self.env["it.site"] + for k, v in sites.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • %s was deleted: %s
  • ", self._description, r["name"] + ) + note = '
      ' + msg + "
    " + Site.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + Equipment = self.env["it.equipment"] + for k, v in equips.items(): + msg = "" + for r in v: + msg = msg + _( + "
  • %s record was deleted: %s
  • ", self._description, r["name"] + ) + note = '
      ' + msg + "
    " + Equipment.browse(k).message_post( + body=note, subtype_id=mt_note.id, author_id=author + ) + + return super(ItServiceAdObject, self).unlink() diff --git a/itm/models/service_dhcp.py b/itm/models/service_dhcp.py new file mode 100644 index 0000000..8199bc9 --- /dev/null +++ b/itm/models/service_dhcp.py @@ -0,0 +1,22 @@ +# Copyright (C) 2021 TREVI Software +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class ItServiceDhcp4(models.Model): + _name = "it.service.dhcp4" + _description = "DHCP Service" + + name = fields.Char(required=True) + equipment_id = fields.Many2one("it.equipment", "Asset", required=False) + network_id = fields.Many2one("it.site.network", "Network", required=False) + subnet = fields.Char() + subnet_mask = fields.Char() + start_address = fields.Many2one("it.site.network.ip4") + end_address = fields.Many2one("it.site.network.ip4") + lease_time = fields.Integer(help="Default lease time in seconds") + reservation_ids = fields.One2many( + "it.equipment.ipreservation", "dhcp_id", "IPv4 reservations" + ) diff --git a/itm/models/service_proxy.py b/itm/models/service_proxy.py new file mode 100644 index 0000000..4121f8b --- /dev/null +++ b/itm/models/service_proxy.py @@ -0,0 +1,34 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItServiceProxy(models.Model): + _name = "it.service.proxy" + _description = "Network Proxy Service" + + name = fields.Char(required=True) + transparent = fields.Boolean("Transparent Proxy") + enable_ssk = fields.Boolean("Proxy Enable Single Sign-On (Kerberos)") + adblocking = fields.Boolean("Proxy Ad Blocking") + port = fields.Char("Proxy Port") + cache_size = fields.Char("Proxy Cache File Size") diff --git a/itm/models/service_vpn.py b/itm/models/service_vpn.py new file mode 100644 index 0000000..741d9fa --- /dev/null +++ b/itm/models/service_vpn.py @@ -0,0 +1,39 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItServiceVpn(models.Model): + _name = "it.service.vpn" + _description = "VPN Service" + + name = fields.Char(required=True) + protocol = fields.Selection([("tcp", "TCP"), ("udp", "UDP")], "VPN Protocol") + address = fields.Char("VPN Address") + server_cert = fields.Binary("VPN Server Certificate") + cacn = fields.Boolean("Client Authorization by common name") + tun = fields.Boolean("VPN Tun Interface") + nat = fields.Boolean("VPN Network Address Traslation") + c2c = fields.Boolean("VPN Allow Client to Client connections") + gateway = fields.Boolean("Redirect Gateway") + search_domain = fields.Char("VPN Search Domain") + wins_server = fields.Char("VPN WINS Server") diff --git a/itm/models/service_wireless.py b/itm/models/service_wireless.py new file mode 100644 index 0000000..83dc6ca --- /dev/null +++ b/itm/models/service_wireless.py @@ -0,0 +1,56 @@ +############################################################################## +# +# Copyright (C) 2014 Leandro Ezequiel Baldi +# +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from odoo import fields, models + + +class ItServiceWireless(models.Model): + _name = "it.service.wireless" + _description = "Wireless Service" + + name = fields.Char("SSID", required=True) + type = fields.Selection( + [ + ("ap", "Access Point"), + ("bridge", "Bridge"), + ("extender", "Extender"), + ("router_wireless", "Wireless Router"), + ("router_wired", "Wired Router"), + ], + ) + auth_type = fields.Selection( + [ + ("none", "NONE"), + ("wep64", "WEP-64bits"), + ("wep128", "WEP-128bits"), + ("wpa_tkip", "WPA-TKIP"), + ("wpa_aes", "WPA-AES"), + ("wpa2_aes", "WPA2-AES"), + ("wpa2_tkip", "WPA2-TKIP"), + ("other", "OTHER"), + ], + "Authentication Type", + ) + password = fields.Char("Key") + guest = fields.Boolean("Enable Guest Access") + guest_ssid = fields.Char("Guest SSID") + guest_password = fields.Char("Guest Key") + access_id = fields.Many2one("it.access", "Access Credentials") diff --git a/itm/models/site.py b/itm/models/site.py new file mode 100644 index 0000000..145da6c --- /dev/null +++ b/itm/models/site.py @@ -0,0 +1,71 @@ +# Copyright (C) 2021 TREVI Software +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ItSite(models.Model): + _name = "it.site" + _inherit = ["mail.activity.mixin", "mail.thread"] + _description = "IT Site" + + @api.depends("equipment_ids") + def _compute_equipment_count(self): + for site in self: + site.equipment_count = len(site.equipment_ids) + + @api.depends("access_ids") + def _compute_access_count(self): + for site in self: + site.access_count = len(site.access_ids) + + company_id = fields.Many2one( + "res.company", + "Company", + default=lambda self: self.env.company, + ) + name = fields.Char(required=True) + partner_id = fields.Many2one("res.partner", "Partner", tracking=True) + equipment_count = fields.Integer( + compute="_compute_equipment_count", + string="Assets", + store=True, + ) + equipment_ids = fields.One2many("it.equipment", "site_id", "Asset{s)") + access_count = fields.Integer( + compute="_compute_access_count", string="Credentials", store=False + ) + active = fields.Boolean(default=True, tracking=True) + access_ids = fields.One2many("it.access", "site_id", "Credential(s)") + ad_ids = fields.One2many("it.service.ad", "site_id", "Active Directory") + network_ids = fields.One2many("it.site.network", "site_id", string="Networks") + + +class ItSiteNetwork(models.Model): + _name = "it.site.network" + _description = "Network" + + site_id = fields.Many2one("it.site", "Site") + name = fields.Char(string="Domain", required=True) + subnet = fields.Char(required=True) + netmask = fields.Char(required=True) + default_gw = fields.Many2one("it.site.network.ip4", "Default Gateway") + dns_ids = fields.Many2many(comodel_name="it.site.network.ip4", string="DNS Servers") + dhcp4_ids = fields.One2many("it.service.dhcp4", "network_id", "DHCP") + + +class ItSiteNetworkIp4(models.Model): + _name = "it.site.network.ip4" + _description = "Network IPv4 Address" + + name = fields.Char(required=True) + + @api.constrains("name") + def check_name(self): + IpAddr = self.env["it.site.network.ip4"] + for rec in self: + duplicates = IpAddr.search([("name", "=", rec.name), ("id", "!=", rec.id)]) + if duplicates: + raise ValidationError(_("IP address '%s' already exists.", rec.name)) diff --git a/itm/readme/CREDITS.rst b/itm/readme/CREDITS.rst new file mode 100644 index 0000000..1ec96af --- /dev/null +++ b/itm/readme/CREDITS.rst @@ -0,0 +1 @@ +* Leandro Ezequiel Baldi diff --git a/itm/readme/DESCRIPTION.rst b/itm/readme/DESCRIPTION.rst new file mode 100644 index 0000000..7e2224a --- /dev/null +++ b/itm/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module is used to record information about a site's IT infrastructure. You can record information about equipment, software, backups, networks and access credentials. diff --git a/itm/security/ir.model.access.csv b/itm/security/ir.model.access.csv new file mode 100644 index 0000000..ab6eee6 --- /dev/null +++ b/itm/security/ir.model.access.csv @@ -0,0 +1,96 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +it_rule_equipment_manager,it_equipment,model_it_equipment,group_it_manager,1,1,1,1 +it_rule_equipment_mod,it_equipment,model_it_equipment,group_it_mod,1,1,1,0 +it_rule_equipment_user,it_equipment,model_it_equipment,group_it_user,1,0,0,0 +it_rule_equipment_brand_manager,it_equipment_brand,model_it_equipment_brand,group_it_manager,1,1,1,1 +it_rule_equipment_brand_mod,it_equipment_brand,model_it_equipment_brand,group_it_mod,1,1,1,0 +it_rule_equipment_brand_user,it_equipment_brand,model_it_equipment_brand,group_it_user,1,0,0,0 +it_rule_equipment_worklog_manager,it_equipment_worklog,model_it_equipment_worklog,group_it_manager,1,1,1,1 +it_rule_equipment_worklog_mod,it_equipment_worklog,model_it_equipment_worklog,group_it_mod,1,1,1,0 +it_rule_equipment_worklog_user,it_equipment_worklog,model_it_equipment_worklog,group_it_user,1,0,0,0 +it_rule_equipment_function_manager,it_equipment_function,model_it_equipment_function,group_it_manager,1,1,1,1 +it_rule_equipment_function_mod,it_equipment_function,model_it_equipment_function,group_it_mod,1,1,1,0 +it_rule_equipment_function_user,it_equipment_function,model_it_equipment_function,group_it_user,1,0,0,0 +it_rule_equipment_network_manager,it_equipment_network,model_it_equipment_network,group_it_manager,1,1,1,1 +it_rule_equipment_network_mod,it_equipment_network,model_it_equipment_network,group_it_mod,1,1,1,0 +it_rule_equipment_network_user,it_equipment_network,model_it_equipment_network,group_it_user,1,0,0,0 +it_rule_equipment_network_proxy_manager,it_equipment_network_proxy,model_it_equipment_network_proxy,group_it_manager,1,1,1,1 +it_rule_equipment_network_proxy_mod,it_equipment_network_proxy,model_it_equipment_network_proxy,group_it_mod,1,1,1,0 +it_rule_equipment_network_proxy_user,it_equipment_network_proxy,model_it_equipment_network_proxy,group_it_user,1,0,0,0 +it_rule_equipment_partition_manager,it_equipment_partition,model_it_equipment_partition,group_it_manager,1,1,1,1 +it_rule_equipment_partition_mod,it_equipment_partition,model_it_equipment_partition,group_it_mod,1,1,1,0 +it_rule_equipment_partition_user,it_equipment_partition,model_it_equipment_partition,group_it_user,1,0,0,0 +it_rule_equipment_partition_mount_manager,it_equipment_partition_mount,model_it_equipment_partition_mount,group_it_manager,1,1,1,1 +it_rule_equipment_partition_mount_mod,it_equipment_partition_mount,model_it_equipment_partition_mount,group_it_mod,1,1,1,0 +it_rule_equipment_partition_mount_user,it_equipment_partition_mount,model_it_equipment_partition_mount,group_it_user,1,0,0,0 +it_rule_equipment_rule_manager,it_equipment_rule,model_it_equipment_rule,group_it_manager,1,1,1,1 +it_rule_equipment_rule_mod,it_equipment_rule,model_it_equipment_rule,group_it_mod,1,1,1,0 +it_rule_equipment_rule_user,it_equipment_rule,model_it_equipment_rule,group_it_user,1,0,0,0 +it_rule_equipment_forward_manager,it_equipment_forward,model_it_equipment_forward,group_it_manager,1,1,1,1 +it_rule_equipment_forward_mod,it_equipment_forward,model_it_equipment_forward,group_it_mod,1,1,1,0 +it_rule_equipment_forward_user,it_equipment_forward,model_it_equipment_forward,group_it_user,1,0,0,0 +it_rule_equipment_mapping_manager,it_equipment_mapping,model_it_equipment_mapping,group_it_manager,1,1,1,1 +it_rule_equipment_mapping_mod,it_equipment_mapping,model_it_equipment_mapping,group_it_mod,1,1,1,0 +it_rule_equipment_mapping_user,it_equipment_mapping,model_it_equipment_mapping,group_it_user,1,0,0,0 +it_rule_equipment_mapping_line_manager,it_equipment_mapping_line,model_it_equipment_mapping_line,group_it_manager,1,1,1,1 +it_rule_equipment_mapping_line_mod,it_equipment_mapping_line,model_it_equipment_mapping_line,group_it_mod,1,1,1,0 +it_rule_equipment_mapping_line_user,it_equipment_mapping_line,model_it_equipment_mapping_line,group_it_user,1,0,0,0 +it_rule_mapping_perm_advanced_manager,it_equipment_mapping_permission_advanced,model_it_equipment_mapping_permission_advanced,group_it_manager,1,1,1,1 +it_rule_mapping_perm_advanced_mod,it_equipment_mapping_permission_advanced,model_it_equipment_mapping_permission_advanced,group_it_mod,1,1,1,0 +it_rule_mapping_perm_advanced_user,it_equipment_mapping_permission_advanced,model_it_equipment_mapping_permission_advanced,group_it_user,1,0,0,0 +it_rule_equipment_db_manager,it_equipment_db,model_it_equipment_db,group_it_manager,1,1,1,1 +it_rule_equipment_db_mod,it_equipment_db,model_it_equipment_db,group_it_mod,1,1,1,0 +it_rule_equipment_db_user,it_equipment_db,model_it_equipment_db,group_it_user,1,0,0,0 +it_rule_equipment_db_engine_manager,it_equipment_db_engine,model_it_equipment_db_engine,group_it_user,1,1,1,1 +it_rule_equipment_db_engine_mod,it_equipment_db_engine,model_it_equipment_db_engine,group_it_mod,1,1,1,0 +it_rule_equipment_db_engine_user,it_equipment_db_engine,model_it_equipment_db_engine,group_it_user,1,0,0,0 +it_rule_equipment_dbsetting_manager,it_equipment_dbsetting,model_it_equipment_dbsetting,group_it_manager,1,1,1,1 +it_rule_equipment_dbsetting_mod,it_equipment_dbsetting,model_it_equipment_dbsetting,group_it_mod,1,1,1,0 +it_rule_equipment_dbsetting_user,it_equipment_dbsetting,model_it_equipment_dbsetting,group_it_user,1,0,0,0 +it_rule_equipment_ipreservation_manager,it_equipment_ipreservation,model_it_equipment_ipreservation,group_it_manager,1,1,1,1 +it_rule_equipment_ipreservation_mod,it_equipment_ipreservation,model_it_equipment_ipreservation,group_it_mod,1,1,1,0 +it_rule_equipment_ipreservation_user,it_equipment_ipreservation,model_it_equipment_ipreservation,group_it_user,1,0,0,0 +it_rule_equipment_dcgroup_manager,it_equipment_dcobject,model_it_service_ad_object,group_it_manager,1,1,1,1 +it_rule_equipment_dcgroup_mod,it_equipment_dcobject,model_it_service_ad_object,group_it_mod,1,1,1,0 +it_rule_equipment_dcgroup_user,it_equipment_dcobject,model_it_service_ad_object,group_it_user,1,0,0,0 +it_rule_service_ad_manager,it_service_ad,model_it_service_ad,group_it_manager,1,1,1,1 +it_rule_service_ad_mod,it_service_ad,model_it_service_ad,group_it_mod,1,1,1,0 +it_rule_service_ad_user,it_service_ad,model_it_service_ad,group_it_user,1,0,0,0 +it_rule_service_dhcp_manager,it_service_dhcp,model_it_service_dhcp4,group_it_manager,1,1,1,1 +it_rule_service_dhcp_mod,it_service_dhcp,model_it_service_dhcp4,group_it_mod,1,1,1,0 +it_rule_service_dhcp_user,it_service_dhcp,model_it_service_dhcp4,group_it_user,1,0,0,0 +it_rule_service_proxy_manager,it_service_proxy,model_it_service_proxy,group_it_manager,1,1,1,1 +it_rule_service_proxy_mod,it_service_proxy,model_it_service_proxy,group_it_mod,1,1,1,0 +it_rule_service_proxy_user,it_service_proxy,model_it_service_proxy,group_it_user,1,0,0,0 +it_rule_service_vpn_manager,it_service_vpn,model_it_service_vpn,group_it_manager,1,1,1,1 +it_rule_service_vpn_mod,it_service_vpn,model_it_service_vpn,group_it_mod,1,1,1,0 +it_rule_service_vpn_user,it_service_vpn,model_it_service_vpn,group_it_user,1,0,0,0 +it_rule_service_wireless_manager,it_service_wireless,model_it_service_wireless,group_it_manager,1,1,1,1 +it_rule_service_wireless_mode,it_service_wireless,model_it_service_wireless,group_it_mod,1,1,1,0 +it_rule_service_wireless_user,it_service_wireless,model_it_service_wireless,group_it_user,1,0,0,0 +it_rule_site_manager,it_site,model_it_site,group_it_manager,1,1,1,1 +it_rule_site_mod,it_site,model_it_site,group_it_mod,1,1,0,0 +it_rule_site_user,it_site,model_it_site,group_it_user,1,0,0,0 +it_rule_site_network_manager,it_site_network,model_it_site_network,group_it_manager,1,1,1,1 +it_rule_site_network_mod,it_site_network,model_it_site_network,group_it_mod,1,1,0,0 +it_rule_site_network_user,it_site_network,model_it_site_network,group_it_user,1,0,0,0 +it_rule_site_network_ip4_manager,it_site_network_ip4,model_it_site_network_ip4,group_it_manager,1,1,1,1 +it_rule_site_network_ip4_mod,it_site_network_ip4,model_it_site_network_ip4,group_it_mod,1,1,1,0 +it_rule_site_network_ip4_user,it_site_network_ip4,model_it_site_network_ip4,group_it_user,1,1,1,1 +it_rule_equipment_configuration_manager,it_equipment_configuration,model_it_equipment_configuration,group_it_manager,1,1,1,1 +it_rule_equipment_configuration_mod,it_equipment_configuration,model_it_equipment_configuration,group_it_mod,1,1,1,0 +it_rule_equipment_configuration_user,it_equipment_configuration,model_it_equipment_configuration,group_it_user,1,0,0,0 +it_rule_access_manager,it_access,model_it_access,group_it_manager,1,1,1,1 +it_rule_access_mod,it_access,model_it_access,group_it_mod,1,1,1,0 +it_rule_access_user,it_access,model_it_access,group_it_user,1,0,0,0 +it_rule_backup_manager,it_backup,model_it_backup,group_it_manager,1,1,1,1 +it_rule_backup_mod,it_backup,model_it_backup,group_it_mod,1,1,1,0 +it_rule_backup_user,it_backup,model_it_backup,group_it_user,1,0,0,0 +it_rule_application_manager,it_application,model_it_application,group_it_manager,1,1,1,1 +it_rule_application_mod,it_application,model_it_application,group_it_mod,1,1,1,0 +it_rule_application_user,it_application,model_it_application,group_it_user,1,0,0,0 +it_rule_application_license_manager,it_application_license,model_it_application_license,group_it_manager,1,1,1,1 +it_rule_application_license_mod,it_application_license,model_it_application_license,group_it_mod,1,1,1,0 +it_rule_application_license_user,it_application_license,model_it_application_license,group_it_user,1,0,0,0 +it_wizard_credential_manager,it_wizard_credential,model_it_wizard_credential,group_it_manager,1,1,1,1 +it_wizard_credential_mod,it_wizard_credential,model_it_wizard_credential,group_it_mod,1,1,1,0 diff --git a/itm/security/it_security.xml b/itm/security/it_security.xml new file mode 100644 index 0000000..0923d32 --- /dev/null +++ b/itm/security/it_security.xml @@ -0,0 +1,123 @@ + + + + + + + + Infrastructure + Helps you manage your infrastructure equipment, access and backups. + + + + User + + + + + Moderator + + + + + + Portal + + + + + + Manager + + + + + + + + + + + + IT Assets: multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + IT Credentials: multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + IT Backup: multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + IT Application: multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + + IT Portal - Equipment + + + + [('partner_id','=',user.partner_id.id)] + + + + IT Portal - Access + + + + [('partner_id','=',user.partner_id.id)] + + + + IT Portal - Backup + + + + [('partner_id','=',user.partner_id.id)] + + + + + + diff --git a/itm/static/description/icon.jpg b/itm/static/description/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83ff801b79d78094ddb9b51462c1858b1a147b66 GIT binary patch literal 16599 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 literal 0 HcmV?d00001 diff --git a/itm/static/description/icon.png b/itm/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..06ea315f134e5d0193ffa3fb29540169d9b581d4 GIT binary patch literal 56194 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�YX!>5pk8>oTA{=CyQpX}6D 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 literal 0 HcmV?d00001 diff --git a/itm/static/description/index.html b/itm/static/description/index.html new file mode 100644 index 0000000..4a08346 --- /dev/null +++ b/itm/static/description/index.html @@ -0,0 +1,78 @@ +
    +
    +

    ODOO INFRASTRUCTURE MODULE

    +

    IT Assets, Credentials, Backups, and more..

    +
    +
    +
    +

    + This module is used for infrastructure management. You can record assets, credentials and network and service specific details. +

    +
    +
    +
    + +
    +
    +

    Partners

    +
    +
    + +
    +
    +
    +

    + Access your partner's infrastructure directly from the partner's screen. +

    +
    +
    +
    + +
    +
    +

    IT Assets

    +
    +

    + Register all your IT equipment. Machines, switches, routers, notebooks, storages, keybords, everything!. Discover all the settings provided by the module for recording information about your equipment. +

    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +

    Access Credentials

    +
    +
    + +
    +
    +
    +

    + Dont lose access to your infrastructure! Credentials are stored in the database in encrypted form. +

    +
    +
    +
    + +
    +
    +

    Technical Support

    +

    + For technical support for this or any of our other modules you can email our help desk for free email based support. We welcome any and all feedback you may have about this modules and any new features you want to see added to it. Join us on github if you would like to collaborate on development of this module! +

    +
    + +
    diff --git a/itm/static/src/img/asset.png b/itm/static/src/img/asset.png new file mode 100644 index 0000000000000000000000000000000000000000..67c0c9d1a9da9821e13a9699b21a6feb582ea53a GIT binary patch literal 190361 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⪚zaT`FnPfMIFVt_wrN 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 literal 0 HcmV?d00001 diff --git a/itm/static/src/img/credential.png b/itm/static/src/img/credential.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5b665a6e4fd78da1768928d1bae9b227940dee GIT binary patch literal 53657 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 + + + + + + + it.access.tree + it.access + + + + + + + + + + + + it.access.form + it.access + +
    + + + +
    +
    +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    + + + it.access.search + it.access + + + + + + + + + + + + + + + + + + + + + + Credentials + it.access + tree,form + + + + +
    + +
    diff --git a/itm/views/application_license_view.xml b/itm/views/application_license_view.xml new file mode 100644 index 0000000..de9e600 --- /dev/null +++ b/itm/views/application_license_view.xml @@ -0,0 +1,65 @@ + + + + + + + + + it.application.license.form + it.application.license + +
    + + + + + + +
    +
    +
    + + + + it.application.license.tree + it.application.license + + + + + + + + + Licenses + it.application.license + tree,form + + + + +
    + +
    diff --git a/itm/views/application_view.xml b/itm/views/application_view.xml new file mode 100644 index 0000000..5157865 --- /dev/null +++ b/itm/views/application_view.xml @@ -0,0 +1,190 @@ + + + + + + + + + it.application.tree + it.application + + + + + + + + + + + + it.application.form + it.application + +
    + +
    +
    +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + it.application.search + it.application + + + + + + + + + + + + + + + + + + + + Applications + it.application + tree,form + + + + +
    + +
    diff --git a/itm/views/backup_view.xml b/itm/views/backup_view.xml new file mode 100644 index 0000000..e843942 --- /dev/null +++ b/itm/views/backup_view.xml @@ -0,0 +1,170 @@ + + + + + + + + it.backup.tree + it.backup + + + + + + + + + + + + + + + + it.backup.form + it.backup + +
    + +
    +
    +
    +

    + +

    +
    +
    +

    + +

    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + it.backup.search + it.backup + + + + + + + + + + + + + + + + + + + + + + + Backups + it.backup + tree,form + + + + +
    +
    diff --git a/itm/views/brand_view.xml b/itm/views/brand_view.xml new file mode 100644 index 0000000..1c14361 --- /dev/null +++ b/itm/views/brand_view.xml @@ -0,0 +1,51 @@ + + + + + + + it.equipment.brand.tree + it.equipment.brand + + + + + + + + + + + + + it.equipment.brand.form + it.equipment.brand + +
    + + + + + + + + +
    +
    +
    + + + Brands + it.equipment.brand + tree,form + + + + +
    +
    diff --git a/itm/views/component_view.xml b/itm/views/component_view.xml new file mode 100644 index 0000000..fe45cf7 --- /dev/null +++ b/itm/views/component_view.xml @@ -0,0 +1,38 @@ + + + + + + + + Components + product.product + tree,form + + + + + + + diff --git a/itm/views/equipment_function_view.xml b/itm/views/equipment_function_view.xml new file mode 100644 index 0000000..cfd28d2 --- /dev/null +++ b/itm/views/equipment_function_view.xml @@ -0,0 +1,69 @@ + + + + + + + + + it.equipment.function.form + it.equipment.function + +
    + +
    +
    +
    +

    + +

    +
    +
    +
    +
    +
    + + + + it.equipment.function.tree + it.equipment.function + + + + + + + + + Functions + it.equipment.function + tree,form + + + + +
    + +
    diff --git a/itm/views/equipment_mapping_view.xml b/itm/views/equipment_mapping_view.xml new file mode 100644 index 0000000..3265957 --- /dev/null +++ b/itm/views/equipment_mapping_view.xml @@ -0,0 +1,74 @@ + + + + + + + + + it.equipment.mapping.form + it.equipment.mapping + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + it.equipment.mapping.tree + it.equipment.mapping + + + + + + + + + + + diff --git a/itm/views/equipment_network_view.xml b/itm/views/equipment_network_view.xml new file mode 100644 index 0000000..79a7a55 --- /dev/null +++ b/itm/views/equipment_network_view.xml @@ -0,0 +1,64 @@ + + + + + + + + + it.equipment.network.form + it.equipment.network + +
    + + + + + + + + + + +
    +
    + + + + it.equipment.network.tree + it.equipment.network + + + + + + + + + + + + +
    +
    diff --git a/itm/views/equipment_partition_view.xml b/itm/views/equipment_partition_view.xml new file mode 100644 index 0000000..92ff2ff --- /dev/null +++ b/itm/views/equipment_partition_view.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + it.equipment.partition.form + it.equipment.partition + +
    + + + + + + + + + + + + +
    +
    +
    + + + + it.equipment.partition.tree + it.equipment.partition + + + + + + + + + + + +
    + +
    diff --git a/itm/views/equipment_view.xml b/itm/views/equipment_view.xml new file mode 100644 index 0000000..0ec4150 --- /dev/null +++ b/itm/views/equipment_view.xml @@ -0,0 +1,524 @@ + + + + + + + + + it.access + Credentials + tree,form + {'search_default_equipment_id': active_id } + + + + it.equipment + Guests + tree,form + + { + 'search_default_virtual_parent_id': active_id, + 'search_default_equipment_type': 'virtual' + } + + + + + it.backup + Backups + tree,form + {'search_default_equipment_id': active_id } + + + + + it.equipment.tree + it.equipment + + + + + + + + + + + + + + it.equipment.form + it.equipment + +
    + +
    + + + +
    + + + +
    +
    +
    +

    + +

    +
    +
    +

    + +

    +
    +
    +

    + +

    +
    +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    +
    +
    +
    + + + it.equipment.search + it.equipment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IT Assets + it.equipment + tree,form + + + + +
    + +
    diff --git a/itm/views/equipment_worklog_view.xml b/itm/views/equipment_worklog_view.xml new file mode 100644 index 0000000..3702118 --- /dev/null +++ b/itm/views/equipment_worklog_view.xml @@ -0,0 +1,57 @@ + + + + + + + + + it.equipment.worklog.form + it.equipment.worklog + +
    + + + + + + + + + + +
    + + + + it.equipment.worklog.tree + it.equipment.worklog + + + + + + + + + + +
    + +
    diff --git a/itm/views/it_menu_view.xml b/itm/views/it_menu_view.xml new file mode 100644 index 0000000..c67a998 --- /dev/null +++ b/itm/views/it_menu_view.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/itm/views/partner_view.xml b/itm/views/partner_view.xml new file mode 100644 index 0000000..169dfa8 --- /dev/null +++ b/itm/views/partner_view.xml @@ -0,0 +1,133 @@ + + + + + + + + + Customers + res.partner + tree,form + {"search_default_manage_it":1, "default_manage_it":1} + + + + + + + it.equipment + Assets + tree,form + {'search_default_partner_id': active_id } + + + + it.access + Credentials + tree,form + {'search_default_partner_id': active_id } + + + + it.backup + Backup + tree,form + {'search_default_partner_id': active_id } + + + + it.partner.view + res.partner + + + + + + + + + + it.partner.view + res.partner + + + + + + + + + + + + + + it.partner.filter + res.partner + + + + + + + + + + + diff --git a/itm/views/service_ad_view.xml b/itm/views/service_ad_view.xml new file mode 100644 index 0000000..330dc98 --- /dev/null +++ b/itm/views/service_ad_view.xml @@ -0,0 +1,257 @@ + + + + + + it.service.ad.search + it.service.ad + + + + + + + + + + + + + + + + + + + it.service.ad.tree + it.service.ad + + + + + + + + + + + + + + it.service.ad.form + it.service.ad + +
    + + + +
    +
    +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    + + + + Create Credential + it.wizard.credential + form + + new + + { + 'default_equipment_id': ad_id.equipment_id.id, + 'default_site_id': ad_id.site_id.id, + 'default_partner_id': ad_id.site_id.partner_id.id, + 'default_name': logon_name, + } + + + + + it.service.ad.object.form + it.service.ad.object + +
    + + + +
    + +
    +
    +
    +
    +

    + + + +

    +
    + + + + + + + + + + + +
    +
    +
    +
    + + + Active Directory + it.service.ad + tree,form + + + + Active Directory Objects + it.service.ad.object + tree,form + + + + + + +
    +
    diff --git a/itm/views/service_dhcp_view.xml b/itm/views/service_dhcp_view.xml new file mode 100644 index 0000000..5e61366 --- /dev/null +++ b/itm/views/service_dhcp_view.xml @@ -0,0 +1,80 @@ + + + + + + it.service.dhcp4.tree + it.service.dhcp4 + + + + + + + + + + + + + + + + it.service.dhcp4.form + it.service.dhcp4 + +
    + +
    +
    +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + DHCP + it.service.dhcp4 + tree,form + + + + +
    +
    diff --git a/itm/views/site_view.xml b/itm/views/site_view.xml new file mode 100644 index 0000000..9dfe38f --- /dev/null +++ b/itm/views/site_view.xml @@ -0,0 +1,219 @@ + + + + + + + + it.equipment + Assets + tree,form + {'search_default_site_id': active_id } + + + it.access + Credentials + tree,form + {'search_default_site_id': active_id } + + + + it.site.search + it.site + + + + + + + + + + + it.site.tree + it.site + + + + + + + + + + + + it.site.form + it.site + +
    + +
    + + +
    + + +
    +
    +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    +
    +
    +
    + + + Sites + it.site + tree,form + + + + it.site.network.tree + it.site.network + + + + + + + + + + + + + + it.site.network.form + it.site.network + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + Networks + it.site.network + tree,form + + + + + + + + +
    +
    diff --git a/itm/wizard/__init__.py b/itm/wizard/__init__.py new file mode 100644 index 0000000..1b9b221 --- /dev/null +++ b/itm/wizard/__init__.py @@ -0,0 +1,5 @@ +# Copyright (C) 2021 TREVI Software +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +# flake8: noqa +from . import create_credential diff --git a/itm/wizard/create_credential.py b/itm/wizard/create_credential.py new file mode 100644 index 0000000..6bbd0fa --- /dev/null +++ b/itm/wizard/create_credential.py @@ -0,0 +1,80 @@ +# Copyright (C) 2021 TREVI Software +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import api, fields, models + + +class NewCredential(models.TransientModel): + _name = "it.wizard.credential" + _description = "Create New Credential Wizard" + + @api.model + def _get_aduser(self): + import logging + + _l = logging.getLogger(__name__) + _l.warning("_get_aduser: %s", self.env.context.get("active_id")) + active_id = self.env.context.get("active_id") + if active_id: + ad = self.env["it.service.ad.object"].browse(active_id) + return ad.id + return False + + name = fields.Char(required=True) + password = fields.Char(required=True) + aduser_id = fields.Many2one("it.service.ad.object", "AD User", default=_get_aduser) + equipment_id = fields.Many2one("it.equipment", "Asset") + ad_id = fields.Many2one("it.service.ad", "Active Directory") + site_id = fields.Many2one("it.site", "Site") + partner_id = fields.Many2one("res.partner", "Partner") + use_random = fields.Boolean("Random password") + + @api.onchange("aduser_id") + def onchange_aduser(self): + self.ad_id = False + self.site_id = False + self.partner_id = False + self.equipment_id = False + if self.aduser_id: + if self.aduser_id.ad_id: + self.ad_id = self.aduser_id.ad_id + if self.aduser_id.ad_id.site_id: + self.site_id = self.aduser_id.ad_id.site_id + if self.aduser_id.ad_id.partner_id: + self.partner_id = self.aduser_id.ad_id.partner_id + if self.aduser_id.ad_id.equipment_id: + self.equipment_id = self.aduser_id.ad_id.equipment_id + + @api.onchange("use_random") + def onchange_use_random(self): + ItAccess = self.env["it.access"] + if self.use_random: + self.password = ItAccess.get_random_string() + + def create_cred(self): + + # Remove the password so it doesn't get accidentaly written to the database. + # + plaintext = self.password + self.password = "" + + cred_vals = { + "name": self.name, + "password": plaintext, + "site_id": self.site_id.id, + "partner_id": self.partner_id.id, + "equipment_id": self.equipment_id.id, + } + cred = self.env["it.access"].create(cred_vals) + self.aduser_id.access_id = cred + + @api.model + def create(self, vals): + + # Remove the password from the dictionary so it doesn't + # get accidentaly written to the database. + # + vals.update({"password": ""}) + + return super(NewCredential, self).create(vals) diff --git a/itm/wizard/create_credential_view.xml b/itm/wizard/create_credential_view.xml new file mode 100644 index 0000000..185d79c --- /dev/null +++ b/itm/wizard/create_credential_view.xml @@ -0,0 +1,59 @@ + + + + + it.wizard.credential.form + it.wizard.credential + +
    +
    +
    +
    +

    + +

    +
    + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + Create New Credential + it.wizard.credential + form + new + + +
    From a9e2e13292498b3f07b339ae2aa1a90d7cceb6f6 Mon Sep 17 00:00:00 2001 From: Michael Telahun Date: Fri, 13 Aug 2021 17:56:26 +0300 Subject: [PATCH 02/58] itm: Fix identifiers, etc in module rename --- itm/data/application_license_data.xml | 102 ++++++------- itm/data/equipment_brand_data.xml | 12 +- itm/data/equipment_db_engine_data.xml | 28 ++-- itm/data/equipment_function.xml | 38 ++--- itm/data/equipment_mapping_data.xml | 6 +- itm/models/access.py | 32 ++--- itm/models/application.py | 8 +- itm/models/application_license.py | 2 +- itm/models/backup.py | 4 +- itm/models/equipment.py | 68 ++++----- itm/models/equipment_configuration.py | 4 +- itm/models/equipment_db.py | 12 +- itm/models/equipment_dbsetting.py | 4 +- itm/models/equipment_forward.py | 4 +- itm/models/equipment_function.py | 2 +- itm/models/equipment_ipreservation.py | 6 +- itm/models/equipment_mapping.py | 18 +-- itm/models/equipment_network.py | 10 +- itm/models/equipment_partition.py | 10 +- itm/models/equipment_rule.py | 4 +- itm/models/equipment_worklog.py | 4 +- itm/models/partner.py | 6 +- itm/models/service_ad.py | 28 ++-- itm/models/service_dhcp.py | 12 +- itm/models/service_proxy.py | 2 +- itm/models/service_vpn.py | 2 +- itm/models/service_wireless.py | 4 +- itm/models/site.py | 26 ++-- itm/security/ir.model.access.csv | 190 ++++++++++++------------- itm/security/it_security.xml | 48 +++---- itm/tests/test_access.py | 4 +- itm/views/access_view.xml | 34 ++--- itm/views/application_license_view.xml | 22 +-- itm/views/application_view.xml | 32 ++--- itm/views/backup_view.xml | 32 ++--- itm/views/brand_view.xml | 22 +-- itm/views/component_view.xml | 8 +- itm/views/equipment_function_view.xml | 22 +-- itm/views/equipment_mapping_view.xml | 12 +- itm/views/equipment_network_view.xml | 12 +- itm/views/equipment_partition_view.xml | 12 +- itm/views/equipment_view.xml | 38 ++--- itm/views/equipment_worklog_view.xml | 12 +- itm/views/it_menu_view.xml | 16 +-- itm/views/partner_view.xml | 32 ++--- itm/views/service_ad_view.xml | 50 +++---- itm/views/service_dhcp_view.xml | 22 +-- itm/views/site_view.xml | 62 ++++---- itm/wizard/create_credential.py | 16 +-- itm/wizard/create_credential_view.xml | 8 +- 50 files changed, 583 insertions(+), 581 deletions(-) diff --git a/itm/data/application_license_data.xml b/itm/data/application_license_data.xml index be3e576..40a34d2 100644 --- a/itm/data/application_license_data.xml +++ b/itm/data/application_license_data.xml @@ -20,215 +20,215 @@ - + Academic Free License (AFL) - + AGPLv1 / Affero General Public License (version 1) - + AGPLv2 / Affero General Public License (version 2) - + Apache License - + Apple Public Source License (APSL) - + Artistic License 2.0 - + Berkeley Database License - + Boost Software License - + BDL / BSD Documentation License - + BSD license (original version) - + BSD 2-clause license - + CeCILL - + Common Public License - + Common Development and Distribution License (CDDL) - + Cryptix General License - + Eclipse Distribution License - + Eclipse Public License (EPL) - + EUPL - European Union Public License - + Free Solaris Binary License - + Free For non commercial Use - + AGPLv3 / GNU Affero General Public License (version 3) - + GPL / GNU General Public License - + GPLv3 / GNU General Public License v3 - + GNU LGPL / GNU Lesser General Public License - + IBM Public License - + Intel Open Source License - + ISC license - + LaTeX Project Public License (LPPL) - + License of Python - + MIT license - + Microsoft Reference License - + Microsoft Public License - + Microsoft Reciprocal License - + Microsoft's Shared Source - + Microsoft Windows' EULA - + Mozilla Public License (MPL) Version 1.1 - + Mozilla Public License (MPL) version 2.0 - + Netscape Public License (NPL) - + Open Software License - + OpenSSL license - + PHP License - + Public Domain - + Q Public License (QPL) - + Sun Industry Standards Source License (SISSL) - + Sun Public License - + W3C Software Notice and License - + WTFPL - + X11 license - + XFree86 1.1 License - + zlib/libpng license - + Zope Public License diff --git a/itm/data/equipment_brand_data.xml b/itm/data/equipment_brand_data.xml index 3d92917..bcba58b 100644 --- a/itm/data/equipment_brand_data.xml +++ b/itm/data/equipment_brand_data.xml @@ -2,34 +2,34 @@ - + Dell - + HP - + Cisco - + D-Link - + TP-Link - + Ubiquiti diff --git a/itm/data/equipment_db_engine_data.xml b/itm/data/equipment_db_engine_data.xml index 611f0c1..2d9dbd5 100644 --- a/itm/data/equipment_db_engine_data.xml +++ b/itm/data/equipment_db_engine_data.xml @@ -2,59 +2,59 @@ - + Cassandra - + Elasticsearch - + FileMaker - + IBM Db2 - + MariaDB - + Microsoft Access - + MS SQL Server - + MongoDB - + MySQL - + Oracle - + PostgreSQL - + Redis - + SAP HANA - + SQLite diff --git a/itm/data/equipment_function.xml b/itm/data/equipment_function.xml index 4ea6942..f76bf21 100644 --- a/itm/data/equipment_function.xml +++ b/itm/data/equipment_function.xml @@ -1,79 +1,79 @@ - + Active Directory - + Domain Controller - + Domain Name Server - + File Server - + Database Server - + Firewall - + VPN Server - + DHCP Server - + FTP Server - + VPS - + VM Host - + VM Guest - + Switch - + Router - + Web Server - + Wireless AP - + Wireless Bridge - + Wireless Extender - + Wireless Client diff --git a/itm/data/equipment_mapping_data.xml b/itm/data/equipment_mapping_data.xml index 2511201..2e1b845 100644 --- a/itm/data/equipment_mapping_data.xml +++ b/itm/data/equipment_mapping_data.xml @@ -2,15 +2,15 @@ - + Full Control - + Change - + Read diff --git a/itm/models/access.py b/itm/models/access.py index c4f9347..3fc90b3 100644 --- a/itm/models/access.py +++ b/itm/models/access.py @@ -14,12 +14,12 @@ from odoo import _, api, fields, models from odoo.exceptions import AccessDenied -PARAM_PASS = "it_passkey" -PARAM_SALT = "it_passsalt" +PARAM_PASS = "itm_passkey" +PARAM_SALT = "itm_salt" class ItAccess(models.Model): - _name = "it.access" + _name = "itm.access" _inherit = ["mail.thread"] _description = "Credential" @@ -93,20 +93,20 @@ def decrypt_password(self): def _get_partner_id(self): # Get the partner from either asset or site # - if self.env.context.get("active_model") == "it.equipment": - equip = self.env["it.equipment"].browse(self.env.context.get("active_id")) + if self.env.context.get("active_model") == "itm.equipment": + equip = self.env["itm.equipment"].browse(self.env.context.get("active_id")) if equip.partner_id: return equip.partner_id.id - elif self.env.context.get("active_model") == "it.site": - site = self.env["it.site"].browse(self.env.context.get("active_id")) + elif self.env.context.get("active_model") == "itm.site": + site = self.env["itm.site"].browse(self.env.context.get("active_id")) if site.partner_id: return site.partner_id.id return False @api.model def _get_site_id(self): - if self.env.context.get("active_model") == "it.equipment": - equip = self.env["it.equipment"].browse(self.env.context.get("active_id")) + if self.env.context.get("active_model") == "itm.equipment": + equip = self.env["itm.equipment"].browse(self.env.context.get("active_id")) if equip.site_id: return equip.site_id.id return False @@ -116,9 +116,9 @@ def _get_site_id(self): "Company", default=lambda self: self.env.company, ) - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="restrict") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="restrict") site_id = fields.Many2one( - "it.site", "Site", required=True, ondelete="restrict", default=_get_site_id + "itm.site", "Site", required=True, ondelete="restrict", default=_get_site_id ) name = fields.Char("Username", required=True, tracking=True) password = fields.Char() @@ -162,7 +162,7 @@ def write(self, vals): else: equips[res.equipment_id.id].append({"id": res.id, "name": res.name}) - Site = self.env["it.site"] + Site = self.env["itm.site"] for k, v in sites.items(): msg = "" for r in v: @@ -176,7 +176,7 @@ def write(self, vals): body=note, subtype_id=mt_note.id, author_id=author ) - Equipment = self.env["it.equipment"] + Equipment = self.env["itm.equipment"] for k, v in equips.items(): msg = "" for r in v: @@ -215,7 +215,7 @@ def create(self, vals): author = self.env.user.partner_id and self.env.user.partner_id.id or False msg = _( '
    ', res._description, res.id, @@ -257,7 +257,7 @@ def unlink(self): else: equips[res.equipment_id.id].append({"id": res.id, "name": res.name}) - Site = self.env["it.site"] + Site = self.env["itm.site"] for k, v in sites.items(): msg = "" for r in v: @@ -269,7 +269,7 @@ def unlink(self): body=note, subtype_id=mt_note.id, author_id=author ) - Equipment = self.env["it.equipment"] + Equipment = self.env["itm.equipment"] for k, v in equips.items(): msg = "" for r in v: diff --git a/itm/models/application.py b/itm/models/application.py index 01fe512..ad58134 100644 --- a/itm/models/application.py +++ b/itm/models/application.py @@ -23,7 +23,7 @@ class ItApplication(models.Model): - _name = "it.application" + _name = "itm.application" _description = "Application" name = fields.Char(required=True) @@ -37,7 +37,7 @@ class ItApplication(models.Model): developer = fields.Char("Developer") link_download = fields.Char("Download Link") link_page = fields.Char("Link") - license_id = fields.Many2one("it.application.license", "License") + license_id = fields.Many2one("itm.application.license", "License") license_type = fields.Selection( [("opensource", "OPEN SOURCE"), ("closedsource", "COMMERCIAL")], required=True, @@ -47,13 +47,13 @@ class ItApplication(models.Model): documentation_filename = fields.Char() note = fields.Text() equipment_ids = fields.Many2many( - "it.equipment", + "itm.equipment", "equipment_application_rel", "application_id", "equipment_id", "Assets", ) - db_ids = fields.One2many("it.equipment.db", "application_id", "Databases") + db_ids = fields.One2many("itm.equipment.db", "application_id", "Databases") # Closed Source key = fields.Char() keygen = fields.Binary() diff --git a/itm/models/application_license.py b/itm/models/application_license.py index 5fb69aa..7f16369 100644 --- a/itm/models/application_license.py +++ b/itm/models/application_license.py @@ -23,7 +23,7 @@ class ItApplicationLicense(models.Model): - _name = "it.application.license" + _name = "itm.application.license" _description = "License" name = fields.Char(required=True) diff --git a/itm/models/backup.py b/itm/models/backup.py index fb72009..e467a76 100644 --- a/itm/models/backup.py +++ b/itm/models/backup.py @@ -23,11 +23,11 @@ class ItBackup(models.Model): - _name = "it.backup" + _name = "itm.backup" _description = "Backup" equipment_id = fields.Many2one( - comodel_name="it.equipment", + comodel_name="itm.equipment", string="Asset", domain="[('is_backup','=',1)]", ondelete="restrict", diff --git a/itm/models/equipment.py b/itm/models/equipment.py index 416dbbd..6be7192 100644 --- a/itm/models/equipment.py +++ b/itm/models/equipment.py @@ -26,7 +26,7 @@ class ItEquipmentBrand(models.Model): - _name = "it.equipment.brand" + _name = "itm.equipment.brand" _description = "IT Asset Brand Name" name = fields.Char(required=True) @@ -36,7 +36,7 @@ class ItEquipmentBrand(models.Model): class ItEquipment(models.Model): - _name = "it.equipment" + _name = "itm.equipment" _inherit = ["mail.activity.mixin", "mail.thread"] _description = "IT Asset" @@ -58,7 +58,7 @@ def _compute_backup_count(self): @api.model def _get_default_image(self): image_path = get_module_resource( - "it", "static/src/img", "default_image_equipment.png" + "itm", "static/src/img", "default_image_equipment.png" ) return base64.b64encode(open(image_path, "rb").read()) @@ -66,20 +66,20 @@ def _get_default_image(self): def _get_partner_id(self): # Get the partner from either asset or site # - if self.env.context.get("active_model") == "it.equipment": - equip = self.env["it.equipment"].browse(self.env.context.get("active_id")) + if self.env.context.get("active_model") == "itm.equipment": + equip = self.env["itm.equipment"].browse(self.env.context.get("active_id")) if equip.partner_id: return equip.partner_id.id - elif self.env.context.get("active_model") == "it.site": - site = self.env["it.site"].browse(self.env.context.get("active_id")) + elif self.env.context.get("active_model") == "itm.site": + site = self.env["itm.site"].browse(self.env.context.get("active_id")) if site.partner_id: return site.partner_id.id return False @api.model def _get_site_id(self): - if self.env.context.get("active_model") == "it.equipment": - equip = self.env["it.equipment"].browse(self.env.context.get("active_id")) + if self.env.context.get("active_model") == "itm.equipment": + equip = self.env["itm.equipment"].browse(self.env.context.get("active_id")) if equip.site_id: return equip.site_id.id return False @@ -91,26 +91,26 @@ def _get_site_id(self): default=lambda self: self.env.company, ) site_id = fields.Many2one( - "it.site", "Site", required=True, tracking=True, default=_get_site_id + "itm.site", "Site", required=True, tracking=True, default=_get_site_id ) active = fields.Boolean(default=True, tracking=True) # Counts access_count = fields.Integer( compute="_compute_access_count", string="Credentials Count", store=False ) - access_ids = fields.One2many("it.access", "equipment_id", string="Credentials") + access_ids = fields.One2many("itm.access", "equipment_id", string="Credentials") backup_count = fields.Integer(compute="_compute_backup_count") - backup_ids = fields.One2many("it.backup", "equipment_id", "Backups") + backup_ids = fields.One2many("itm.backup", "equipment_id", "Backups") virtual_count = fields.Integer( compute="_compute_virtual_count", string="Guests", store=False ) - virtual_ids = fields.One2many("it.equipment", "virtual_parent_id", "Guest(s)") + virtual_ids = fields.One2many("itm.equipment", "virtual_parent_id", "Guest(s)") # General Info identification = fields.Char( compute="_compute_identification", string="Complete Name", store=True ) name = fields.Char("Name", required=True, tracking=True) - brand_id = fields.Many2one("it.equipment.brand", "Brand") + brand_id = fields.Many2one("itm.equipment.brand", "Brand") model = fields.Char() partner_id = fields.Many2one( "res.partner", @@ -121,7 +121,7 @@ def _get_site_id(self): default=_get_partner_id, ) function_ids = fields.Many2many( - "it.equipment.function", + "itm.equipment.function", "equipment_function_rel", "equipment_id", "function_id", @@ -135,7 +135,7 @@ def _get_site_id(self): ) # Applications Page application_ids = fields.Many2many( - "it.application", + "itm.application", "equipment_application_rel", "equipment_id", "application_id", @@ -173,7 +173,7 @@ def _get_type(self): function_database = fields.Boolean("Database Server") # Worklogs Page worklog_ids = fields.One2many( - "it.equipment.worklog", + "itm.equipment.worklog", "equipment_id", "Worklogs on this equipment", tracking=True, @@ -186,7 +186,7 @@ def _get_type(self): contract_direction = fields.Char("Invoice Direction") # Virtual Machine Page virtual_parent_id = fields.Many2one( - "it.equipment", "Virtual Machine", domain="[('function_host','=',1)]" + "itm.equipment", "Virtual Machine", domain="[('function_host','=',1)]" ) virtual_memory_amount = fields.Char("Memory") virtual_disk_amount = fields.Char("Disk Size") @@ -194,22 +194,22 @@ def _get_type(self): virtual_network_amount = fields.Char("Number of Network") # Partition Page partitions_ids = fields.One2many( - "it.equipment.partition", "equipment_id", "Partitions on this equipment" + "itm.equipment.partition", "equipment_id", "Partitions on this equipment" ) # Router Page router_dmz = fields.Char("DMZ") router_forward_ids = fields.One2many( - "it.equipment.forward", "equipment_id", "Forward Rules", tracking=True + "itm.equipment.forward", "equipment_id", "Forward Rules", tracking=True ) router_rules_ids = fields.One2many( - "it.equipment.rule", + "itm.equipment.rule", "equipment_id", "Firewall Rules", tracking=True, ) # Network Configuration equipment_network_ids = fields.One2many( - "it.equipment.network", + "itm.equipment.network", "equipment_id", "Network on this equipment", tracking=True, @@ -222,7 +222,7 @@ def _get_type(self): product_note = fields.Text("Product Note") # Fileserver Page equipment_mapping_ids = fields.One2many( - "it.equipment.mapping", + "itm.equipment.mapping", "equipment_id", "Network Shares", tracking=True, @@ -230,20 +230,20 @@ def _get_type(self): # OS Page os_name = fields.Char("OS Name") # Services - ad_service_id = fields.Many2one("it.service.ad", "Active Directory") - dhcp_service_id = fields.Many2one("it.service.dhcp4", "DHCP") - wireless_service_id = fields.Many2one("it.service.wireless", "Wireless Service") - proxy_service_id = fields.Many2one("it.service.proxy", "Proxy Service") - vpn_service_id = fields.Many2one("it.service.vpn", "VPN Service") + ad_service_id = fields.Many2one("itm.service.ad", "Active Directory") + dhcp_service_id = fields.Many2one("itm.service.dhcp4", "DHCP") + wireless_service_id = fields.Many2one("itm.service.wireless", "Wireless Service") + proxy_service_id = fields.Many2one("itm.service.proxy", "Proxy Service") + vpn_service_id = fields.Many2one("itm.service.vpn", "VPN Service") # Database Page - db_ids = fields.One2many("it.equipment.db", "equipment_id", "Databases") + db_ids = fields.One2many("itm.equipment.db", "equipment_id", "Databases") use_proxy = fields.Boolean("Use Proxy") proxy_client_config_id = fields.Many2one( - "it.equipment.network.proxy", "Proxy Configuration" + "itm.equipment.network.proxy", "Proxy Configuration" ) # Store Config File Page configuration_file_ids = fields.One2many( - "it.equipment.configuration", "equipment_id", "Configuration Files" + "itm.equipment.configuration", "equipment_id", "Configuration Files" ) # Log a note on creation of equipment to Site and Equipment chatter. @@ -255,7 +255,7 @@ def create(self, vals): author = self.env.user.partner_id and self.env.user.partner_id.id or False msg = _( '
    ', res._description, res.id, @@ -298,7 +298,7 @@ def unlink(self): {"id": res.id, "name": res.name} ) - Site = self.env["it.site"] + Site = self.env["itm.site"] for k, v in sites.items(): msg = "" for r in v: @@ -310,7 +310,7 @@ def unlink(self): body=note, subtype_id=mt_note.id, author_id=author ) - Equipment = self.env["it.equipment"] + Equipment = self.env["itm.equipment"] for k, v in equips.items(): msg = "" for r in v: diff --git a/itm/models/equipment_configuration.py b/itm/models/equipment_configuration.py index a6d9852..ae686f7 100644 --- a/itm/models/equipment_configuration.py +++ b/itm/models/equipment_configuration.py @@ -23,7 +23,7 @@ class ItEquipmentConfiguration(models.Model): - _name = "it.equipment.configuration" + _name = "itm.equipment.configuration" _description = "Equipment Configuration" _order = "date desc" @@ -32,4 +32,4 @@ class ItEquipmentConfiguration(models.Model): date = fields.Datetime(default=fields.Datetime.now()) config_file = fields.Binary("Configuration File") config_file_filename = fields.Char("Configuration File Filename") - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="restrict") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="restrict") diff --git a/itm/models/equipment_db.py b/itm/models/equipment_db.py index a5f1ab5..006dbbc 100644 --- a/itm/models/equipment_db.py +++ b/itm/models/equipment_db.py @@ -23,20 +23,20 @@ class ItEquipmentDb(models.Model): - _name = "it.equipment.db" + _name = "itm.equipment.db" _description = "Database" name = fields.Char(required=True) codification = fields.Char() description = fields.Text() - setting_ids = fields.One2many("it.equipment.dbsetting", "db_id", "Settings") - engine_id = fields.Many2one("it.equipment.db.engine", "Database Engine") - application_id = fields.Many2one("it.application", "Application") - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="restrict") + setting_ids = fields.One2many("itm.equipment.dbsetting", "db_id", "Settings") + engine_id = fields.Many2one("itm.equipment.db.engine", "Database Engine") + application_id = fields.Many2one("itm.application", "Application") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="restrict") class ItEquipmentDbEngine(models.Model): - _name = "it.equipment.db.engine" + _name = "itm.equipment.db.engine" _description = "Database Engine" name = fields.Char(required=True) diff --git a/itm/models/equipment_dbsetting.py b/itm/models/equipment_dbsetting.py index f772d4b..dfba39e 100644 --- a/itm/models/equipment_dbsetting.py +++ b/itm/models/equipment_dbsetting.py @@ -23,10 +23,10 @@ class ItEquipmentDbsetting(models.Model): - _name = "it.equipment.dbsetting" + _name = "itm.equipment.dbsetting" _description = "Database Setting" name = fields.Char("Parameter", required=True) value = fields.Char(required=True) description = fields.Text() - db_id = fields.Many2one("it.equipment.dbsetting", "Database", ondelete="cascade") + db_id = fields.Many2one("itm.equipment.dbsetting", "Database", ondelete="cascade") diff --git a/itm/models/equipment_forward.py b/itm/models/equipment_forward.py index 72e7f3a..e7b4358 100644 --- a/itm/models/equipment_forward.py +++ b/itm/models/equipment_forward.py @@ -23,10 +23,10 @@ class ItEquipmentForward(models.Model): - _name = "it.equipment.forward" + _name = "itm.equipment.forward" _description = "Router Forwarding Rule" - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="cascade") name = fields.Char(required=True) source_port = fields.Char() destination_port = fields.Char() diff --git a/itm/models/equipment_function.py b/itm/models/equipment_function.py index fad1859..ec2d50a 100644 --- a/itm/models/equipment_function.py +++ b/itm/models/equipment_function.py @@ -22,7 +22,7 @@ class ItEquipmentFunction(models.Model): - _name = "it.equipment.function" + _name = "itm.equipment.function" _description = "IT Function" name = fields.Char(required=True) diff --git a/itm/models/equipment_ipreservation.py b/itm/models/equipment_ipreservation.py index 9224987..12f7b2f 100644 --- a/itm/models/equipment_ipreservation.py +++ b/itm/models/equipment_ipreservation.py @@ -23,10 +23,10 @@ class ItEquipmentIpreservation(models.Model): - _name = "it.equipment.ipreservation" + _name = "itm.equipment.ipreservation" _description = "IP Reservation" name = fields.Char(required=True, string="Description") mac_address = fields.Char(required=True) - ip_address = fields.Many2one("it.site.network.ip4", "IP address", required=True) - dhcp_id = fields.Many2one("it.service.dhcp4", "DHCP Service", ondelete="cascade") + ip_address = fields.Many2one("itm.site.network.ip4", "IP address", required=True) + dhcp_id = fields.Many2one("itm.service.dhcp4", "DHCP Service", ondelete="cascade") diff --git a/itm/models/equipment_mapping.py b/itm/models/equipment_mapping.py index cc9506e..c6f0434 100644 --- a/itm/models/equipment_mapping.py +++ b/itm/models/equipment_mapping.py @@ -7,19 +7,19 @@ class ItEquipmentMapping(models.Model): - _name = "it.equipment.mapping" + _name = "itm.equipment.mapping" _description = "Network Share Mapping" - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="cascade") name = fields.Char("Share Name", required=True) path = fields.Char("Filesystem Path", required=True) line_ids = fields.One2many( - "it.equipment.mapping.line", "map_id", "Permission lines" + "itm.equipment.mapping.line", "map_id", "Permission lines" ) class ItEquipmentMappingLine(models.Model): - _name = "it.equipment.mapping.line" + _name = "itm.equipment.mapping.line" _description = "Network Share Mapping Line" def _compute_name(self): @@ -29,10 +29,10 @@ def _compute_name(self): _name = rec.adobj_id.name rec.name = _name - map_id = fields.Many2one("it.equipment.mapping", "Mapping") + map_id = fields.Many2one("itm.equipment.mapping", "Mapping") name = fields.Char(string="Name", compute="_compute_name", store=True) adobj_id = fields.Many2one( - comodel_name="it.service.ad.object", string="AD object name" + comodel_name="itm.service.ad.object", string="AD object name" ) type = fields.Selection( [ @@ -48,13 +48,13 @@ def _compute_name(self): string="Simple permissions", ) perm_advanced = fields.One2many( - "it.equipment.mapping.permission.advanced", "line_id", "Advanced permissions" + "itm.equipment.mapping.permission.advanced", "line_id", "Advanced permissions" ) class ItMappingAdvancedPermissions(models.Model): - _name = "it.equipment.mapping.permission.advanced" + _name = "itm.equipment.mapping.permission.advanced" _description = "Advanced Share Mapping Permission" name = fields.Char() - line_id = fields.Many2one("it.equipment.mapping.line", "Share mapping") + line_id = fields.Many2one("itm.equipment.mapping.line", "Share mapping") diff --git a/itm/models/equipment_network.py b/itm/models/equipment_network.py index 0af06e2..f2fd29f 100644 --- a/itm/models/equipment_network.py +++ b/itm/models/equipment_network.py @@ -23,20 +23,20 @@ class ItEquipmentNetwork(models.Model): - _name = "it.equipment.network" + _name = "itm.equipment.network" _description = "Network Interface" - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="cascade") name = fields.Char("Interface Name", required=True) mac = fields.Char("MAC Address", required=True) - network_id = fields.Many2one("it.site.network", "Network") - static_ipv4_id = fields.Many2one("it.site.network.ip4", "Static IPv4 Address") + network_id = fields.Many2one("itm.site.network", "Network") + static_ipv4_id = fields.Many2one("itm.site.network.ip4", "Static IPv4 Address") use_dhcp4 = fields.Boolean("Use IPv4 DHCP", default=True) note = fields.Text() class ItEquipmentNetworkProxy(models.Model): - _name = "it.equipment.network.proxy" + _name = "itm.equipment.network.proxy" _description = "Network Proxy Configuration" name = fields.Char("Proxy Hostname", required=True) diff --git a/itm/models/equipment_partition.py b/itm/models/equipment_partition.py index 2a3d836..a2c094b 100644 --- a/itm/models/equipment_partition.py +++ b/itm/models/equipment_partition.py @@ -23,25 +23,25 @@ class ItEquipmentPartition(models.Model): - _name = "it.equipment.partition" + _name = "itm.equipment.partition" _description = "Partition" - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="cascade") name = fields.Char("Identificator", required=True) disks = fields.Char(help="Disks splitted by , ") type = fields.Char() format = fields.Char() mount_ids = fields.One2many( - "it.equipment.partition.mount", "partition_id", "Mount on this partition" + "itm.equipment.partition.mount", "partition_id", "Mount on this partition" ) class ItEquipmentPartitionMount(models.Model): - _name = "it.equipment.partition.mount" + _name = "itm.equipment.partition.mount" _description = "Partition Mounts" partition_id = fields.Many2one( - "it.equipment.partition", "Partition", ondelete="cascade" + "itm.equipment.partition", "Partition", ondelete="cascade" ) name = fields.Char(required=True) size = fields.Char() diff --git a/itm/models/equipment_rule.py b/itm/models/equipment_rule.py index b173a8f..c75021b 100644 --- a/itm/models/equipment_rule.py +++ b/itm/models/equipment_rule.py @@ -23,10 +23,10 @@ class ItEquipmentRule(models.Model): - _name = "it.equipment.rule" + _name = "itm.equipment.rule" _description = "Router Rule" - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="cascade") name = fields.Char(required=True) source_port = fields.Char() destination_port = fields.Char() diff --git a/itm/models/equipment_worklog.py b/itm/models/equipment_worklog.py index 16b3858..1dda3dd 100644 --- a/itm/models/equipment_worklog.py +++ b/itm/models/equipment_worklog.py @@ -23,7 +23,7 @@ class ItEquipmentWorklog(models.Model): - _name = "it.equipment.worklog" + _name = "itm.equipment.worklog" _description = "Asset Worklog" _order = "date desc" @@ -32,7 +32,7 @@ class ItEquipmentWorklog(models.Model): description = fields.Text("Long Description") date = fields.Datetime(default=fields.Datetime.now()) spent_time = fields.Float() - equipment_id = fields.Many2one("it.equipment", "Asset", ondelete="cascade") + equipment_id = fields.Many2one("itm.equipment", "Asset", ondelete="cascade") user_id = fields.Many2one( "res.users", "User", required=True, default=lambda self: self.env.user_id.id ) diff --git a/itm/models/partner.py b/itm/models/partner.py index 4726323..5d453ec 100644 --- a/itm/models/partner.py +++ b/itm/models/partner.py @@ -41,9 +41,9 @@ def _backup_count(self): partner.backup_count = len(partner.backup_ids) manage_it = fields.Boolean("Manage IT") - equipment_ids = fields.One2many("it.equipment", "partner_id", "Assets") + equipment_ids = fields.One2many("itm.equipment", "partner_id", "Assets") equipment_count = fields.Integer(compute=_equipment_count) - access_ids = fields.One2many("it.access", "partner_id", "Credentials") + access_ids = fields.One2many("itm.access", "partner_id", "Credentials") access_count = fields.Integer(compute=_access_count) - backup_ids = fields.One2many("it.backup", "partner_id", "Backups") + backup_ids = fields.One2many("itm.backup", "partner_id", "Backups") backup_count = fields.Integer(compute=_backup_count) diff --git a/itm/models/service_ad.py b/itm/models/service_ad.py index 9d4dd59..45057b1 100644 --- a/itm/models/service_ad.py +++ b/itm/models/service_ad.py @@ -8,7 +8,7 @@ class ItServiceAD(models.Model): - _name = "it.service.ad" + _name = "itm.service.ad" _inherit = ["mail.thread"] _description = "Active Directory" @@ -20,10 +20,10 @@ class ItServiceAD(models.Model): "AD Type", ) obj_ids = fields.One2many( - "it.service.ad.object", "ad_id", "Active Directory Objects" + "itm.service.ad.object", "ad_id", "Active Directory Objects" ) - site_id = fields.Many2one("it.site", "Site", ondelete="restrict") - equipment_id = fields.Many2one("it.equipment", "Asset") + site_id = fields.Many2one("itm.site", "Site", ondelete="restrict") + equipment_id = fields.Many2one("itm.equipment", "Asset") partner_id = fields.Many2one( "res.partner", "Partner", @@ -53,7 +53,7 @@ def create(self, vals): author = self.env.user.partner_id and self.env.user.partner_id.id or False msg = _( '
    ', res._description, res.id, @@ -95,7 +95,7 @@ def unlink(self): else: equips[res.equipment_id.id].append({"id": res.id, "name": res.name}) - Site = self.env["it.site"] + Site = self.env["itm.site"] for k, v in sites.items(): msg = "" for r in v: @@ -107,7 +107,7 @@ def unlink(self): body=note, subtype_id=mt_note.id, author_id=author ) - Equipment = self.env["it.equipment"] + Equipment = self.env["itm.equipment"] for k, v in equips.items(): msg = "" for r in v: @@ -124,7 +124,7 @@ def unlink(self): class ItServiceAdObject(models.Model): - _name = "it.service.ad.object" + _name = "itm.service.ad.object" _description = "Active Directory Object" _rec_name = "complete_name" _order = "complete_name" @@ -142,17 +142,17 @@ def _get_default_ad(self): return False parent_id = fields.Many2one( - "it.service.ad.object", + "itm.service.ad.object", "AD Folder", domain="[('type', '=', 'folder'), ('ad_id', '=', ad_id)]", ) ad_id = fields.Many2one( - "it.service.ad", + "itm.service.ad", "Active Directory", ondelete="cascade", default=_get_default_ad, ) - access_id = fields.Many2one("it.access", "Related Credential") + access_id = fields.Many2one("itm.access", "Related Credential") complete_name = fields.Char(compute="_compute_complete_name", store=True) description = fields.Text() active = fields.Boolean(default=True) @@ -226,7 +226,7 @@ def create(self, vals): '', res._description, res.id, @@ -284,7 +284,7 @@ def unlink(self): {"id": obj.id, "name": obj.complete_name} ) - Site = self.env["it.site"] + Site = self.env["itm.site"] for k, v in sites.items(): msg = "" for r in v: @@ -296,7 +296,7 @@ def unlink(self): body=note, subtype_id=mt_note.id, author_id=author ) - Equipment = self.env["it.equipment"] + Equipment = self.env["itm.equipment"] for k, v in equips.items(): msg = "" for r in v: diff --git a/itm/models/service_dhcp.py b/itm/models/service_dhcp.py index 8199bc9..374e389 100644 --- a/itm/models/service_dhcp.py +++ b/itm/models/service_dhcp.py @@ -6,17 +6,17 @@ class ItServiceDhcp4(models.Model): - _name = "it.service.dhcp4" + _name = "itm.service.dhcp4" _description = "DHCP Service" name = fields.Char(required=True) - equipment_id = fields.Many2one("it.equipment", "Asset", required=False) - network_id = fields.Many2one("it.site.network", "Network", required=False) + equipment_id = fields.Many2one("itm.equipment", "Asset", required=False) + network_id = fields.Many2one("itm.site.network", "Network", required=False) subnet = fields.Char() subnet_mask = fields.Char() - start_address = fields.Many2one("it.site.network.ip4") - end_address = fields.Many2one("it.site.network.ip4") + start_address = fields.Many2one("itm.site.network.ip4") + end_address = fields.Many2one("itm.site.network.ip4") lease_time = fields.Integer(help="Default lease time in seconds") reservation_ids = fields.One2many( - "it.equipment.ipreservation", "dhcp_id", "IPv4 reservations" + "itm.equipment.ipreservation", "dhcp_id", "IPv4 reservations" ) diff --git a/itm/models/service_proxy.py b/itm/models/service_proxy.py index 4121f8b..b7c4d5c 100644 --- a/itm/models/service_proxy.py +++ b/itm/models/service_proxy.py @@ -23,7 +23,7 @@ class ItServiceProxy(models.Model): - _name = "it.service.proxy" + _name = "itm.service.proxy" _description = "Network Proxy Service" name = fields.Char(required=True) diff --git a/itm/models/service_vpn.py b/itm/models/service_vpn.py index 741d9fa..8da8129 100644 --- a/itm/models/service_vpn.py +++ b/itm/models/service_vpn.py @@ -23,7 +23,7 @@ class ItServiceVpn(models.Model): - _name = "it.service.vpn" + _name = "itm.service.vpn" _description = "VPN Service" name = fields.Char(required=True) diff --git a/itm/models/service_wireless.py b/itm/models/service_wireless.py index 83dc6ca..1af09b5 100644 --- a/itm/models/service_wireless.py +++ b/itm/models/service_wireless.py @@ -23,7 +23,7 @@ class ItServiceWireless(models.Model): - _name = "it.service.wireless" + _name = "itm.service.wireless" _description = "Wireless Service" name = fields.Char("SSID", required=True) @@ -53,4 +53,4 @@ class ItServiceWireless(models.Model): guest = fields.Boolean("Enable Guest Access") guest_ssid = fields.Char("Guest SSID") guest_password = fields.Char("Guest Key") - access_id = fields.Many2one("it.access", "Access Credentials") + access_id = fields.Many2one("itm.access", "Access Credentials") diff --git a/itm/models/site.py b/itm/models/site.py index 145da6c..b3e1b71 100644 --- a/itm/models/site.py +++ b/itm/models/site.py @@ -7,7 +7,7 @@ class ItSite(models.Model): - _name = "it.site" + _name = "itm.site" _inherit = ["mail.activity.mixin", "mail.thread"] _description = "IT Site" @@ -33,38 +33,40 @@ def _compute_access_count(self): string="Assets", store=True, ) - equipment_ids = fields.One2many("it.equipment", "site_id", "Asset{s)") + equipment_ids = fields.One2many("itm.equipment", "site_id", "Asset{s)") access_count = fields.Integer( compute="_compute_access_count", string="Credentials", store=False ) active = fields.Boolean(default=True, tracking=True) - access_ids = fields.One2many("it.access", "site_id", "Credential(s)") - ad_ids = fields.One2many("it.service.ad", "site_id", "Active Directory") - network_ids = fields.One2many("it.site.network", "site_id", string="Networks") + access_ids = fields.One2many("itm.access", "site_id", "Credential(s)") + ad_ids = fields.One2many("itm.service.ad", "site_id", "Active Directory") + network_ids = fields.One2many("itm.site.network", "site_id", string="Networks") class ItSiteNetwork(models.Model): - _name = "it.site.network" + _name = "itm.site.network" _description = "Network" - site_id = fields.Many2one("it.site", "Site") + site_id = fields.Many2one("itm.site", "Site") name = fields.Char(string="Domain", required=True) subnet = fields.Char(required=True) netmask = fields.Char(required=True) - default_gw = fields.Many2one("it.site.network.ip4", "Default Gateway") - dns_ids = fields.Many2many(comodel_name="it.site.network.ip4", string="DNS Servers") - dhcp4_ids = fields.One2many("it.service.dhcp4", "network_id", "DHCP") + default_gw = fields.Many2one("itm.site.network.ip4", "Default Gateway") + dns_ids = fields.Many2many( + comodel_name="itm.site.network.ip4", string="DNS Servers" + ) + dhcp4_ids = fields.One2many("itm.service.dhcp4", "network_id", "DHCP") class ItSiteNetworkIp4(models.Model): - _name = "it.site.network.ip4" + _name = "itm.site.network.ip4" _description = "Network IPv4 Address" name = fields.Char(required=True) @api.constrains("name") def check_name(self): - IpAddr = self.env["it.site.network.ip4"] + IpAddr = self.env["itm.site.network.ip4"] for rec in self: duplicates = IpAddr.search([("name", "=", rec.name), ("id", "!=", rec.id)]) if duplicates: diff --git a/itm/security/ir.model.access.csv b/itm/security/ir.model.access.csv index ab6eee6..95a2585 100644 --- a/itm/security/ir.model.access.csv +++ b/itm/security/ir.model.access.csv @@ -1,96 +1,96 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -it_rule_equipment_manager,it_equipment,model_it_equipment,group_it_manager,1,1,1,1 -it_rule_equipment_mod,it_equipment,model_it_equipment,group_it_mod,1,1,1,0 -it_rule_equipment_user,it_equipment,model_it_equipment,group_it_user,1,0,0,0 -it_rule_equipment_brand_manager,it_equipment_brand,model_it_equipment_brand,group_it_manager,1,1,1,1 -it_rule_equipment_brand_mod,it_equipment_brand,model_it_equipment_brand,group_it_mod,1,1,1,0 -it_rule_equipment_brand_user,it_equipment_brand,model_it_equipment_brand,group_it_user,1,0,0,0 -it_rule_equipment_worklog_manager,it_equipment_worklog,model_it_equipment_worklog,group_it_manager,1,1,1,1 -it_rule_equipment_worklog_mod,it_equipment_worklog,model_it_equipment_worklog,group_it_mod,1,1,1,0 -it_rule_equipment_worklog_user,it_equipment_worklog,model_it_equipment_worklog,group_it_user,1,0,0,0 -it_rule_equipment_function_manager,it_equipment_function,model_it_equipment_function,group_it_manager,1,1,1,1 -it_rule_equipment_function_mod,it_equipment_function,model_it_equipment_function,group_it_mod,1,1,1,0 -it_rule_equipment_function_user,it_equipment_function,model_it_equipment_function,group_it_user,1,0,0,0 -it_rule_equipment_network_manager,it_equipment_network,model_it_equipment_network,group_it_manager,1,1,1,1 -it_rule_equipment_network_mod,it_equipment_network,model_it_equipment_network,group_it_mod,1,1,1,0 -it_rule_equipment_network_user,it_equipment_network,model_it_equipment_network,group_it_user,1,0,0,0 -it_rule_equipment_network_proxy_manager,it_equipment_network_proxy,model_it_equipment_network_proxy,group_it_manager,1,1,1,1 -it_rule_equipment_network_proxy_mod,it_equipment_network_proxy,model_it_equipment_network_proxy,group_it_mod,1,1,1,0 -it_rule_equipment_network_proxy_user,it_equipment_network_proxy,model_it_equipment_network_proxy,group_it_user,1,0,0,0 -it_rule_equipment_partition_manager,it_equipment_partition,model_it_equipment_partition,group_it_manager,1,1,1,1 -it_rule_equipment_partition_mod,it_equipment_partition,model_it_equipment_partition,group_it_mod,1,1,1,0 -it_rule_equipment_partition_user,it_equipment_partition,model_it_equipment_partition,group_it_user,1,0,0,0 -it_rule_equipment_partition_mount_manager,it_equipment_partition_mount,model_it_equipment_partition_mount,group_it_manager,1,1,1,1 -it_rule_equipment_partition_mount_mod,it_equipment_partition_mount,model_it_equipment_partition_mount,group_it_mod,1,1,1,0 -it_rule_equipment_partition_mount_user,it_equipment_partition_mount,model_it_equipment_partition_mount,group_it_user,1,0,0,0 -it_rule_equipment_rule_manager,it_equipment_rule,model_it_equipment_rule,group_it_manager,1,1,1,1 -it_rule_equipment_rule_mod,it_equipment_rule,model_it_equipment_rule,group_it_mod,1,1,1,0 -it_rule_equipment_rule_user,it_equipment_rule,model_it_equipment_rule,group_it_user,1,0,0,0 -it_rule_equipment_forward_manager,it_equipment_forward,model_it_equipment_forward,group_it_manager,1,1,1,1 -it_rule_equipment_forward_mod,it_equipment_forward,model_it_equipment_forward,group_it_mod,1,1,1,0 -it_rule_equipment_forward_user,it_equipment_forward,model_it_equipment_forward,group_it_user,1,0,0,0 -it_rule_equipment_mapping_manager,it_equipment_mapping,model_it_equipment_mapping,group_it_manager,1,1,1,1 -it_rule_equipment_mapping_mod,it_equipment_mapping,model_it_equipment_mapping,group_it_mod,1,1,1,0 -it_rule_equipment_mapping_user,it_equipment_mapping,model_it_equipment_mapping,group_it_user,1,0,0,0 -it_rule_equipment_mapping_line_manager,it_equipment_mapping_line,model_it_equipment_mapping_line,group_it_manager,1,1,1,1 -it_rule_equipment_mapping_line_mod,it_equipment_mapping_line,model_it_equipment_mapping_line,group_it_mod,1,1,1,0 -it_rule_equipment_mapping_line_user,it_equipment_mapping_line,model_it_equipment_mapping_line,group_it_user,1,0,0,0 -it_rule_mapping_perm_advanced_manager,it_equipment_mapping_permission_advanced,model_it_equipment_mapping_permission_advanced,group_it_manager,1,1,1,1 -it_rule_mapping_perm_advanced_mod,it_equipment_mapping_permission_advanced,model_it_equipment_mapping_permission_advanced,group_it_mod,1,1,1,0 -it_rule_mapping_perm_advanced_user,it_equipment_mapping_permission_advanced,model_it_equipment_mapping_permission_advanced,group_it_user,1,0,0,0 -it_rule_equipment_db_manager,it_equipment_db,model_it_equipment_db,group_it_manager,1,1,1,1 -it_rule_equipment_db_mod,it_equipment_db,model_it_equipment_db,group_it_mod,1,1,1,0 -it_rule_equipment_db_user,it_equipment_db,model_it_equipment_db,group_it_user,1,0,0,0 -it_rule_equipment_db_engine_manager,it_equipment_db_engine,model_it_equipment_db_engine,group_it_user,1,1,1,1 -it_rule_equipment_db_engine_mod,it_equipment_db_engine,model_it_equipment_db_engine,group_it_mod,1,1,1,0 -it_rule_equipment_db_engine_user,it_equipment_db_engine,model_it_equipment_db_engine,group_it_user,1,0,0,0 -it_rule_equipment_dbsetting_manager,it_equipment_dbsetting,model_it_equipment_dbsetting,group_it_manager,1,1,1,1 -it_rule_equipment_dbsetting_mod,it_equipment_dbsetting,model_it_equipment_dbsetting,group_it_mod,1,1,1,0 -it_rule_equipment_dbsetting_user,it_equipment_dbsetting,model_it_equipment_dbsetting,group_it_user,1,0,0,0 -it_rule_equipment_ipreservation_manager,it_equipment_ipreservation,model_it_equipment_ipreservation,group_it_manager,1,1,1,1 -it_rule_equipment_ipreservation_mod,it_equipment_ipreservation,model_it_equipment_ipreservation,group_it_mod,1,1,1,0 -it_rule_equipment_ipreservation_user,it_equipment_ipreservation,model_it_equipment_ipreservation,group_it_user,1,0,0,0 -it_rule_equipment_dcgroup_manager,it_equipment_dcobject,model_it_service_ad_object,group_it_manager,1,1,1,1 -it_rule_equipment_dcgroup_mod,it_equipment_dcobject,model_it_service_ad_object,group_it_mod,1,1,1,0 -it_rule_equipment_dcgroup_user,it_equipment_dcobject,model_it_service_ad_object,group_it_user,1,0,0,0 -it_rule_service_ad_manager,it_service_ad,model_it_service_ad,group_it_manager,1,1,1,1 -it_rule_service_ad_mod,it_service_ad,model_it_service_ad,group_it_mod,1,1,1,0 -it_rule_service_ad_user,it_service_ad,model_it_service_ad,group_it_user,1,0,0,0 -it_rule_service_dhcp_manager,it_service_dhcp,model_it_service_dhcp4,group_it_manager,1,1,1,1 -it_rule_service_dhcp_mod,it_service_dhcp,model_it_service_dhcp4,group_it_mod,1,1,1,0 -it_rule_service_dhcp_user,it_service_dhcp,model_it_service_dhcp4,group_it_user,1,0,0,0 -it_rule_service_proxy_manager,it_service_proxy,model_it_service_proxy,group_it_manager,1,1,1,1 -it_rule_service_proxy_mod,it_service_proxy,model_it_service_proxy,group_it_mod,1,1,1,0 -it_rule_service_proxy_user,it_service_proxy,model_it_service_proxy,group_it_user,1,0,0,0 -it_rule_service_vpn_manager,it_service_vpn,model_it_service_vpn,group_it_manager,1,1,1,1 -it_rule_service_vpn_mod,it_service_vpn,model_it_service_vpn,group_it_mod,1,1,1,0 -it_rule_service_vpn_user,it_service_vpn,model_it_service_vpn,group_it_user,1,0,0,0 -it_rule_service_wireless_manager,it_service_wireless,model_it_service_wireless,group_it_manager,1,1,1,1 -it_rule_service_wireless_mode,it_service_wireless,model_it_service_wireless,group_it_mod,1,1,1,0 -it_rule_service_wireless_user,it_service_wireless,model_it_service_wireless,group_it_user,1,0,0,0 -it_rule_site_manager,it_site,model_it_site,group_it_manager,1,1,1,1 -it_rule_site_mod,it_site,model_it_site,group_it_mod,1,1,0,0 -it_rule_site_user,it_site,model_it_site,group_it_user,1,0,0,0 -it_rule_site_network_manager,it_site_network,model_it_site_network,group_it_manager,1,1,1,1 -it_rule_site_network_mod,it_site_network,model_it_site_network,group_it_mod,1,1,0,0 -it_rule_site_network_user,it_site_network,model_it_site_network,group_it_user,1,0,0,0 -it_rule_site_network_ip4_manager,it_site_network_ip4,model_it_site_network_ip4,group_it_manager,1,1,1,1 -it_rule_site_network_ip4_mod,it_site_network_ip4,model_it_site_network_ip4,group_it_mod,1,1,1,0 -it_rule_site_network_ip4_user,it_site_network_ip4,model_it_site_network_ip4,group_it_user,1,1,1,1 -it_rule_equipment_configuration_manager,it_equipment_configuration,model_it_equipment_configuration,group_it_manager,1,1,1,1 -it_rule_equipment_configuration_mod,it_equipment_configuration,model_it_equipment_configuration,group_it_mod,1,1,1,0 -it_rule_equipment_configuration_user,it_equipment_configuration,model_it_equipment_configuration,group_it_user,1,0,0,0 -it_rule_access_manager,it_access,model_it_access,group_it_manager,1,1,1,1 -it_rule_access_mod,it_access,model_it_access,group_it_mod,1,1,1,0 -it_rule_access_user,it_access,model_it_access,group_it_user,1,0,0,0 -it_rule_backup_manager,it_backup,model_it_backup,group_it_manager,1,1,1,1 -it_rule_backup_mod,it_backup,model_it_backup,group_it_mod,1,1,1,0 -it_rule_backup_user,it_backup,model_it_backup,group_it_user,1,0,0,0 -it_rule_application_manager,it_application,model_it_application,group_it_manager,1,1,1,1 -it_rule_application_mod,it_application,model_it_application,group_it_mod,1,1,1,0 -it_rule_application_user,it_application,model_it_application,group_it_user,1,0,0,0 -it_rule_application_license_manager,it_application_license,model_it_application_license,group_it_manager,1,1,1,1 -it_rule_application_license_mod,it_application_license,model_it_application_license,group_it_mod,1,1,1,0 -it_rule_application_license_user,it_application_license,model_it_application_license,group_it_user,1,0,0,0 -it_wizard_credential_manager,it_wizard_credential,model_it_wizard_credential,group_it_manager,1,1,1,1 -it_wizard_credential_mod,it_wizard_credential,model_it_wizard_credential,group_it_mod,1,1,1,0 +itm_rule_equipment_manager,itm_equipment,model_itm_equipment,group_itm_manager,1,1,1,1 +itm_rule_equipment_mod,itm_equipment,model_itm_equipment,group_itm_mod,1,1,1,0 +itm_rule_equipment_user,itm_equipment,model_itm_equipment,group_itm_user,1,0,0,0 +itm_rule_equipment_brand_manager,itm_equipment_brand,model_itm_equipment_brand,group_itm_manager,1,1,1,1 +itm_rule_equipment_brand_mod,itm_equipment_brand,model_itm_equipment_brand,group_itm_mod,1,1,1,0 +itm_rule_equipment_brand_user,itm_equipment_brand,model_itm_equipment_brand,group_itm_user,1,0,0,0 +itm_rule_equipment_worklog_manager,itm_equipment_worklog,model_itm_equipment_worklog,group_itm_manager,1,1,1,1 +itm_rule_equipment_worklog_mod,itm_equipment_worklog,model_itm_equipment_worklog,group_itm_mod,1,1,1,0 +itm_rule_equipment_worklog_user,itm_equipment_worklog,model_itm_equipment_worklog,group_itm_user,1,0,0,0 +itm_rule_equipment_function_manager,itm_equipment_function,model_itm_equipment_function,group_itm_manager,1,1,1,1 +itm_rule_equipment_function_mod,itm_equipment_function,model_itm_equipment_function,group_itm_mod,1,1,1,0 +itm_rule_equipment_function_user,itm_equipment_function,model_itm_equipment_function,group_itm_user,1,0,0,0 +itm_rule_equipment_network_manager,itm_equipment_network,model_itm_equipment_network,group_itm_manager,1,1,1,1 +itm_rule_equipment_network_mod,itm_equipment_network,model_itm_equipment_network,group_itm_mod,1,1,1,0 +itm_rule_equipment_network_user,itm_equipment_network,model_itm_equipment_network,group_itm_user,1,0,0,0 +itm_rule_equipment_network_proxy_manager,itm_equipment_network_proxy,model_itm_equipment_network_proxy,group_itm_manager,1,1,1,1 +itm_rule_equipment_network_proxy_mod,itm_equipment_network_proxy,model_itm_equipment_network_proxy,group_itm_mod,1,1,1,0 +itm_rule_equipment_network_proxy_user,itm_equipment_network_proxy,model_itm_equipment_network_proxy,group_itm_user,1,0,0,0 +itm_rule_equipment_partition_manager,itm_equipment_partition,model_itm_equipment_partition,group_itm_manager,1,1,1,1 +itm_rule_equipment_partition_mod,itm_equipment_partition,model_itm_equipment_partition,group_itm_mod,1,1,1,0 +itm_rule_equipment_partition_user,itm_equipment_partition,model_itm_equipment_partition,group_itm_user,1,0,0,0 +itm_rule_equipment_partition_mount_manager,itm_equipment_partition_mount,model_itm_equipment_partition_mount,group_itm_manager,1,1,1,1 +itm_rule_equipment_partition_mount_mod,itm_equipment_partition_mount,model_itm_equipment_partition_mount,group_itm_mod,1,1,1,0 +itm_rule_equipment_partition_mount_user,itm_equipment_partition_mount,model_itm_equipment_partition_mount,group_itm_user,1,0,0,0 +itm_rule_equipment_rule_manager,itm_equipment_rule,model_itm_equipment_rule,group_itm_manager,1,1,1,1 +itm_rule_equipment_rule_mod,itm_equipment_rule,model_itm_equipment_rule,group_itm_mod,1,1,1,0 +itm_rule_equipment_rule_user,itm_equipment_rule,model_itm_equipment_rule,group_itm_user,1,0,0,0 +itm_rule_equipment_forward_manager,itm_equipment_forward,model_itm_equipment_forward,group_itm_manager,1,1,1,1 +itm_rule_equipment_forward_mod,itm_equipment_forward,model_itm_equipment_forward,group_itm_mod,1,1,1,0 +itm_rule_equipment_forward_user,itm_equipment_forward,model_itm_equipment_forward,group_itm_user,1,0,0,0 +itm_rule_equipment_mapping_manager,itm_equipment_mapping,model_itm_equipment_mapping,group_itm_manager,1,1,1,1 +itm_rule_equipment_mapping_mod,itm_equipment_mapping,model_itm_equipment_mapping,group_itm_mod,1,1,1,0 +itm_rule_equipment_mapping_user,itm_equipment_mapping,model_itm_equipment_mapping,group_itm_user,1,0,0,0 +itm_rule_equipment_mapping_line_manager,itm_equipment_mapping_line,model_itm_equipment_mapping_line,group_itm_manager,1,1,1,1 +itm_rule_equipment_mapping_line_mod,itm_equipment_mapping_line,model_itm_equipment_mapping_line,group_itm_mod,1,1,1,0 +itm_rule_equipment_mapping_line_user,itm_equipment_mapping_line,model_itm_equipment_mapping_line,group_itm_user,1,0,0,0 +itm_rule_mapping_perm_advanced_manager,itm_equipment_mapping_permission_advanced,model_itm_equipment_mapping_permission_advanced,group_itm_manager,1,1,1,1 +itm_rule_mapping_perm_advanced_mod,itm_equipment_mapping_permission_advanced,model_itm_equipment_mapping_permission_advanced,group_itm_mod,1,1,1,0 +itm_rule_mapping_perm_advanced_user,itm_equipment_mapping_permission_advanced,model_itm_equipment_mapping_permission_advanced,group_itm_user,1,0,0,0 +itm_rule_equipment_db_manager,itm_equipment_db,model_itm_equipment_db,group_itm_manager,1,1,1,1 +itm_rule_equipment_db_mod,itm_equipment_db,model_itm_equipment_db,group_itm_mod,1,1,1,0 +itm_rule_equipment_db_user,itm_equipment_db,model_itm_equipment_db,group_itm_user,1,0,0,0 +itm_rule_equipment_db_engine_manager,itm_equipment_db_engine,model_itm_equipment_db_engine,group_itm_user,1,1,1,1 +itm_rule_equipment_db_engine_mod,itm_equipment_db_engine,model_itm_equipment_db_engine,group_itm_mod,1,1,1,0 +itm_rule_equipment_db_engine_user,itm_equipment_db_engine,model_itm_equipment_db_engine,group_itm_user,1,0,0,0 +itm_rule_equipment_dbsetting_manager,itm_equipment_dbsetting,model_itm_equipment_dbsetting,group_itm_manager,1,1,1,1 +itm_rule_equipment_dbsetting_mod,itm_equipment_dbsetting,model_itm_equipment_dbsetting,group_itm_mod,1,1,1,0 +itm_rule_equipment_dbsetting_user,itm_equipment_dbsetting,model_itm_equipment_dbsetting,group_itm_user,1,0,0,0 +itm_rule_equipment_ipreservation_manager,itm_equipment_ipreservation,model_itm_equipment_ipreservation,group_itm_manager,1,1,1,1 +itm_rule_equipment_ipreservation_mod,itm_equipment_ipreservation,model_itm_equipment_ipreservation,group_itm_mod,1,1,1,0 +itm_rule_equipment_ipreservation_user,itm_equipment_ipreservation,model_itm_equipment_ipreservation,group_itm_user,1,0,0,0 +itm_rule_equipment_dcgroup_manager,itm_equipment_dcobject,model_itm_service_ad_object,group_itm_manager,1,1,1,1 +itm_rule_equipment_dcgroup_mod,itm_equipment_dcobject,model_itm_service_ad_object,group_itm_mod,1,1,1,0 +itm_rule_equipment_dcgroup_user,itm_equipment_dcobject,model_itm_service_ad_object,group_itm_user,1,0,0,0 +itm_rule_service_ad_manager,itm_service_ad,model_itm_service_ad,group_itm_manager,1,1,1,1 +itm_rule_service_ad_mod,itm_service_ad,model_itm_service_ad,group_itm_mod,1,1,1,0 +itm_rule_service_ad_user,itm_service_ad,model_itm_service_ad,group_itm_user,1,0,0,0 +itm_rule_service_dhcp_manager,itm_service_dhcp,model_itm_service_dhcp4,group_itm_manager,1,1,1,1 +itm_rule_service_dhcp_mod,itm_service_dhcp,model_itm_service_dhcp4,group_itm_mod,1,1,1,0 +itm_rule_service_dhcp_user,itm_service_dhcp,model_itm_service_dhcp4,group_itm_user,1,0,0,0 +itm_rule_service_proxy_manager,itm_service_proxy,model_itm_service_proxy,group_itm_manager,1,1,1,1 +itm_rule_service_proxy_mod,itm_service_proxy,model_itm_service_proxy,group_itm_mod,1,1,1,0 +itm_rule_service_proxy_user,itm_service_proxy,model_itm_service_proxy,group_itm_user,1,0,0,0 +itm_rule_service_vpn_manager,itm_service_vpn,model_itm_service_vpn,group_itm_manager,1,1,1,1 +itm_rule_service_vpn_mod,itm_service_vpn,model_itm_service_vpn,group_itm_mod,1,1,1,0 +itm_rule_service_vpn_user,itm_service_vpn,model_itm_service_vpn,group_itm_user,1,0,0,0 +itm_rule_service_wireless_manager,itm_service_wireless,model_itm_service_wireless,group_itm_manager,1,1,1,1 +itm_rule_service_wireless_mode,itm_service_wireless,model_itm_service_wireless,group_itm_mod,1,1,1,0 +itm_rule_service_wireless_user,itm_service_wireless,model_itm_service_wireless,group_itm_user,1,0,0,0 +itm_rule_site_manager,itm_site,model_itm_site,group_itm_manager,1,1,1,1 +itm_rule_site_mod,itm_site,model_itm_site,group_itm_mod,1,1,0,0 +itm_rule_site_user,itm_site,model_itm_site,group_itm_user,1,0,0,0 +itm_rule_site_network_manager,itm_site_network,model_itm_site_network,group_itm_manager,1,1,1,1 +itm_rule_site_network_mod,itm_site_network,model_itm_site_network,group_itm_mod,1,1,0,0 +itm_rule_site_network_user,itm_site_network,model_itm_site_network,group_itm_user,1,0,0,0 +itm_rule_site_network_ip4_manager,itm_site_network_ip4,model_itm_site_network_ip4,group_itm_manager,1,1,1,1 +itm_rule_site_network_ip4_mod,itm_site_network_ip4,model_itm_site_network_ip4,group_itm_mod,1,1,1,0 +itm_rule_site_network_ip4_user,itm_site_network_ip4,model_itm_site_network_ip4,group_itm_user,1,1,1,1 +itm_rule_equipment_configuration_manager,itm_equipment_configuration,model_itm_equipment_configuration,group_itm_manager,1,1,1,1 +itm_rule_equipment_configuration_mod,itm_equipment_configuration,model_itm_equipment_configuration,group_itm_mod,1,1,1,0 +itm_rule_equipment_configuration_user,itm_equipment_configuration,model_itm_equipment_configuration,group_itm_user,1,0,0,0 +itm_rule_access_manager,itm_access,model_itm_access,group_itm_manager,1,1,1,1 +itm_rule_access_mod,itm_access,model_itm_access,group_itm_mod,1,1,1,0 +itm_rule_access_user,itm_access,model_itm_access,group_itm_user,1,0,0,0 +itm_rule_backup_manager,itm_backup,model_itm_backup,group_itm_manager,1,1,1,1 +itm_rule_backup_mod,itm_backup,model_itm_backup,group_itm_mod,1,1,1,0 +itm_rule_backup_user,itm_backup,model_itm_backup,group_itm_user,1,0,0,0 +itm_rule_application_manager,itm_application,model_itm_application,group_itm_manager,1,1,1,1 +itm_rule_application_mod,itm_application,model_itm_application,group_itm_mod,1,1,1,0 +itm_rule_application_user,itm_application,model_itm_application,group_itm_user,1,0,0,0 +itm_rule_application_license_manager,itm_application_license,model_itm_application_license,group_itm_manager,1,1,1,1 +itm_rule_application_license_mod,itm_application_license,model_itm_application_license,group_itm_mod,1,1,1,0 +itm_rule_application_license_user,itm_application_license,model_itm_application_license,group_itm_user,1,0,0,0 +itm_wizard_credential_manager,itm_wizard_credential,model_itm_wizard_credential,group_itm_manager,1,1,1,1 +itm_wizard_credential_mod,itm_wizard_credential,model_itm_wizard_credential,group_itm_mod,1,1,1,0 diff --git a/itm/security/it_security.xml b/itm/security/it_security.xml index 0923d32..09f9a6f 100644 --- a/itm/security/it_security.xml +++ b/itm/security/it_security.xml @@ -27,27 +27,27 @@ >Helps you manage your infrastructure equipment, access and backups. - + User - + Moderator - + - + Portal - + - + Manager - + @@ -56,36 +56,36 @@ - + IT Assets: multi-company - + ['|',('company_id','=',False),('company_id','in',company_ids)] - + IT Credentials: multi-company - + ['|',('company_id','=',False),('company_id','in',company_ids)] - + IT Backup: multi-company - + ['|',('company_id','=',False),('company_id','in',company_ids)] - + IT Application: multi-company - + - + IT Portal - Equipment - + - + [('partner_id','=',user.partner_id.id)] - + IT Portal - Access - + - + [('partner_id','=',user.partner_id.id)] - + IT Portal - Backup - + - + [('partner_id','=',user.partner_id.id)] diff --git a/itm/tests/test_access.py b/itm/tests/test_access.py index b3c4e02..d5f65c0 100644 --- a/itm/tests/test_access.py +++ b/itm/tests/test_access.py @@ -13,8 +13,8 @@ class TestAccess(TransactionCase): def setUp(self): super().setUp() - self.ItAccess = self.env["it.access"] - self.ItSite = self.env["it.site"] + self.ItAccess = self.env["itm.access"] + self.ItSite = self.env["itm.site"] self.defaultSite = self.ItSite.create({"name": "site"}) # Prime salt and decryption password creation diff --git a/itm/views/access_view.xml b/itm/views/access_view.xml index 2607446..38c5088 100644 --- a/itm/views/access_view.xml +++ b/itm/views/access_view.xml @@ -21,9 +21,9 @@ - - it.access.tree - it.access + + itm.access.tree + itm.access @@ -34,9 +34,9 @@ - - it.access.form - it.access + + itm.access.form + itm.access
    @@ -72,7 +72,7 @@ name="get_random_password" string="Generate" type="object" - groups="it_infrastructure.group_it_mod" + groups="itm.group_itm_mod" confirm="Are you sure?" icon="fa-random" /> @@ -118,7 +118,7 @@ /> - + @@ -126,7 +126,7 @@ - + - - it.access.search - it.access + + itm.access.search + itm.access @@ -196,17 +196,17 @@ - + Credentials - it.access + itm.access tree,form diff --git a/itm/views/application_license_view.xml b/itm/views/application_license_view.xml index de9e600..6893f57 100644 --- a/itm/views/application_license_view.xml +++ b/itm/views/application_license_view.xml @@ -21,9 +21,9 @@ - - it.application.license.form - it.application.license + + itm.application.license.form + itm.application.license @@ -37,9 +37,9 @@ - - it.application.license.tree - it.application.license + + itm.application.license.tree + itm.application.license @@ -47,17 +47,17 @@ - + Licenses - it.application.license + itm.application.license tree,form diff --git a/itm/views/application_view.xml b/itm/views/application_view.xml index 5157865..0aa9428 100644 --- a/itm/views/application_view.xml +++ b/itm/views/application_view.xml @@ -21,9 +21,9 @@ - - it.application.tree - it.application + + itm.application.tree + itm.application @@ -34,9 +34,9 @@ - - it.application.form - it.application + + itm.application.form + itm.application @@ -93,7 +93,7 @@ /> - + @@ -105,7 +105,7 @@ - + @@ -123,9 +123,9 @@ - - it.application.search - it.application + + itm.application.search + itm.application @@ -172,17 +172,17 @@ - + Applications - it.application + itm.application tree,form diff --git a/itm/views/backup_view.xml b/itm/views/backup_view.xml index e843942..1aaec40 100644 --- a/itm/views/backup_view.xml +++ b/itm/views/backup_view.xml @@ -20,9 +20,9 @@ - - it.backup.tree - it.backup + + itm.backup.tree + itm.backup @@ -37,9 +37,9 @@ - - it.backup.form - it.backup + + itm.backup.form + itm.backup @@ -77,7 +77,7 @@ - + @@ -89,7 +89,7 @@ - + @@ -107,9 +107,9 @@ - - it.backup.search - it.backup + + itm.backup.search + itm.backup @@ -153,17 +153,17 @@ - + Backups - it.backup + itm.backup tree,form diff --git a/itm/views/brand_view.xml b/itm/views/brand_view.xml index 1c14361..5cd087b 100644 --- a/itm/views/brand_view.xml +++ b/itm/views/brand_view.xml @@ -3,9 +3,9 @@ - - it.equipment.brand.tree - it.equipment.brand + + itm.equipment.brand.tree + itm.equipment.brand @@ -17,9 +17,9 @@ - - it.equipment.brand.form - it.equipment.brand + + itm.equipment.brand.form + itm.equipment.brand @@ -34,17 +34,17 @@ - + Brands - it.equipment.brand + itm.equipment.brand tree,form diff --git a/itm/views/component_view.xml b/itm/views/component_view.xml index fe45cf7..54dd46b 100644 --- a/itm/views/component_view.xml +++ b/itm/views/component_view.xml @@ -20,17 +20,17 @@ - + Components product.product tree,form diff --git a/itm/views/equipment_function_view.xml b/itm/views/equipment_function_view.xml index cfd28d2..6e7b516 100644 --- a/itm/views/equipment_function_view.xml +++ b/itm/views/equipment_function_view.xml @@ -21,9 +21,9 @@ - - it.equipment.function.form - it.equipment.function + + itm.equipment.function.form + itm.equipment.function @@ -41,9 +41,9 @@ - - it.equipment.function.tree - it.equipment.function + + itm.equipment.function.tree + itm.equipment.function @@ -51,17 +51,17 @@ - + Functions - it.equipment.function + itm.equipment.function tree,form diff --git a/itm/views/equipment_mapping_view.xml b/itm/views/equipment_mapping_view.xml index 3265957..76c331c 100644 --- a/itm/views/equipment_mapping_view.xml +++ b/itm/views/equipment_mapping_view.xml @@ -21,9 +21,9 @@ - - it.equipment.mapping.form - it.equipment.mapping + + itm.equipment.mapping.form + itm.equipment.mapping @@ -58,9 +58,9 @@ - - it.equipment.mapping.tree - it.equipment.mapping + + itm.equipment.mapping.tree + itm.equipment.mapping diff --git a/itm/views/equipment_network_view.xml b/itm/views/equipment_network_view.xml index 79a7a55..8785514 100644 --- a/itm/views/equipment_network_view.xml +++ b/itm/views/equipment_network_view.xml @@ -21,9 +21,9 @@ - - it.equipment.network.form - it.equipment.network + + itm.equipment.network.form + itm.equipment.network @@ -45,9 +45,9 @@ - - it.equipment.network.tree - it.equipment.network + + itm.equipment.network.tree + itm.equipment.network diff --git a/itm/views/equipment_partition_view.xml b/itm/views/equipment_partition_view.xml index 92ff2ff..81d8bde 100644 --- a/itm/views/equipment_partition_view.xml +++ b/itm/views/equipment_partition_view.xml @@ -23,9 +23,9 @@ - - it.equipment.partition.form - it.equipment.partition + + itm.equipment.partition.form + itm.equipment.partition @@ -45,9 +45,9 @@ - - it.equipment.partition.tree - it.equipment.partition + + itm.equipment.partition.tree + itm.equipment.partition diff --git a/itm/views/equipment_view.xml b/itm/views/equipment_view.xml index 0ec4150..6640d6d 100644 --- a/itm/views/equipment_view.xml +++ b/itm/views/equipment_view.xml @@ -22,14 +22,14 @@ - it.access + itm.access Credentials tree,form {'search_default_equipment_id': active_id } - it.equipment + itm.equipment Guests tree,form @@ -41,16 +41,16 @@ - it.backup + itm.backup Backups tree,form {'search_default_equipment_id': active_id } - - it.equipment.tree - it.equipment + + itm.equipment.tree + itm.equipment @@ -63,9 +63,9 @@ - - it.equipment.form - it.equipment + + itm.equipment.form + itm.equipment @@ -144,7 +144,7 @@ - + @@ -351,7 +351,7 @@ - + @@ -374,9 +374,9 @@ - - it.equipment.search - it.equipment + + itm.equipment.search + itm.equipment @@ -506,17 +506,17 @@ - + IT Assets - it.equipment + itm.equipment tree,form diff --git a/itm/views/equipment_worklog_view.xml b/itm/views/equipment_worklog_view.xml index 3702118..1a887b8 100644 --- a/itm/views/equipment_worklog_view.xml +++ b/itm/views/equipment_worklog_view.xml @@ -21,9 +21,9 @@ - - it.equipment.worklog.form - it.equipment.worklog + + itm.equipment.worklog.form + itm.equipment.worklog @@ -39,9 +39,9 @@ - - it.equipment.worklog.tree - it.equipment.worklog + + itm.equipment.worklog.tree + itm.equipment.worklog diff --git a/itm/views/it_menu_view.xml b/itm/views/it_menu_view.xml index c67a998..863f26c 100644 --- a/itm/views/it_menu_view.xml +++ b/itm/views/it_menu_view.xml @@ -23,35 +23,35 @@ diff --git a/itm/views/partner_view.xml b/itm/views/partner_view.xml index 169dfa8..92d5c3f 100644 --- a/itm/views/partner_view.xml +++ b/itm/views/partner_view.xml @@ -21,7 +21,7 @@ - + Customers res.partner tree,form @@ -31,48 +31,48 @@ - it.equipment + itm.equipment Assets tree,form {'search_default_partner_id': active_id } - it.access + itm.access Credentials tree,form {'search_default_partner_id': active_id } - it.backup + itm.backup Backup tree,form {'search_default_partner_id': active_id } - - it.partner.view + + itm.partner.view res.partner - + - - it.partner.view + + itm.partner.view res.partner @@ -83,7 +83,7 @@ class="oe_inline oe_stat_button" icon="fa-th-large" type="action" - groups="it_infrastructure.group_it_user" + groups="itm.group_itm_user" attrs="{'invisible':[('manage_it','=', False )]}" > @@ -93,7 +93,7 @@ class="oe_inline oe_stat_button" icon="fa-key" type="action" - groups="it_infrastructure.group_it_user" + groups="itm.group_itm_user" attrs="{'invisible':[('manage_it','=', False )]}" > @@ -103,7 +103,7 @@ class="oe_inline oe_stat_button" icon="fa-floppy-o" type="action" - groups="it_infrastructure.group_it_user" + groups="itm.group_itm_user" attrs="{'invisible':[('manage_it','=', False )]}" > @@ -113,8 +113,8 @@ - - it.partner.filter + + itm.partner.filter res.partner diff --git a/itm/views/service_ad_view.xml b/itm/views/service_ad_view.xml index 330dc98..5718682 100644 --- a/itm/views/service_ad_view.xml +++ b/itm/views/service_ad_view.xml @@ -2,9 +2,9 @@ - - it.service.ad.search - it.service.ad + + itm.service.ad.search + itm.service.ad @@ -38,9 +38,9 @@ - - it.service.ad.tree - it.service.ad + + itm.service.ad.tree + itm.service.ad @@ -53,9 +53,9 @@ - - it.service.ad.form - it.service.ad + + itm.service.ad.form + itm.service.ad @@ -113,9 +113,9 @@ Create Credential - it.wizard.credential + itm.wizard.credential form - + new { @@ -127,9 +127,9 @@ - - it.service.ad.object.form - it.service.ad.object + + itm.service.ad.object.form + itm.service.ad.object @@ -195,7 +195,7 @@ string="Create" icon="fa-key" type="action" - groups="it_infrastructure.group_it_mod" + groups="itm.group_itm_mod" context="{'default_name': logon_name}" attrs="{'invisible': [('access_id','!=',False)]}" /> @@ -227,30 +227,30 @@ - + Active Directory - it.service.ad + itm.service.ad tree,form - + Active Directory Objects - it.service.ad.object + itm.service.ad.object tree,form diff --git a/itm/views/service_dhcp_view.xml b/itm/views/service_dhcp_view.xml index 5e61366..6151097 100644 --- a/itm/views/service_dhcp_view.xml +++ b/itm/views/service_dhcp_view.xml @@ -2,9 +2,9 @@ - - it.service.dhcp4.tree - it.service.dhcp4 + + itm.service.dhcp4.tree + itm.service.dhcp4 @@ -19,9 +19,9 @@ - - it.service.dhcp4.form - it.service.dhcp4 + + itm.service.dhcp4.form + itm.service.dhcp4 @@ -63,17 +63,17 @@ - + DHCP - it.service.dhcp4 + itm.service.dhcp4 tree,form diff --git a/itm/views/site_view.xml b/itm/views/site_view.xml index 9dfe38f..2583018 100644 --- a/itm/views/site_view.xml +++ b/itm/views/site_view.xml @@ -5,21 +5,21 @@ - it.equipment + itm.equipment Assets tree,form {'search_default_site_id': active_id } - it.access + itm.access Credentials tree,form {'search_default_site_id': active_id } - - it.site.search - it.site + + itm.site.search + itm.site @@ -33,9 +33,9 @@ - - it.site.tree - it.site + + itm.site.tree + itm.site @@ -46,9 +46,9 @@ - - it.site.form - it.site + + itm.site.form + itm.site @@ -58,7 +58,7 @@ class="oe_stat_button" icon="fa-th-large" type="action" - groups="it_infrastructure.group_it_user" + groups="itm.group_itm_user" > @@ -124,15 +124,15 @@ - + Sites - it.site + itm.site tree,form - - it.site.network.tree - it.site.network + + itm.site.network.tree + itm.site.network @@ -145,9 +145,9 @@ - - it.site.network.form - it.site.network + + itm.site.network.form + itm.site.network @@ -187,32 +187,32 @@ - + Networks - it.site.network + itm.site.network tree,form diff --git a/itm/wizard/create_credential.py b/itm/wizard/create_credential.py index 6bbd0fa..ddbbcfb 100644 --- a/itm/wizard/create_credential.py +++ b/itm/wizard/create_credential.py @@ -6,7 +6,7 @@ class NewCredential(models.TransientModel): - _name = "it.wizard.credential" + _name = "itm.wizard.credential" _description = "Create New Credential Wizard" @api.model @@ -17,16 +17,16 @@ def _get_aduser(self): _l.warning("_get_aduser: %s", self.env.context.get("active_id")) active_id = self.env.context.get("active_id") if active_id: - ad = self.env["it.service.ad.object"].browse(active_id) + ad = self.env["itm.service.ad.object"].browse(active_id) return ad.id return False name = fields.Char(required=True) password = fields.Char(required=True) - aduser_id = fields.Many2one("it.service.ad.object", "AD User", default=_get_aduser) - equipment_id = fields.Many2one("it.equipment", "Asset") - ad_id = fields.Many2one("it.service.ad", "Active Directory") - site_id = fields.Many2one("it.site", "Site") + aduser_id = fields.Many2one("itm.service.ad.object", "AD User", default=_get_aduser) + equipment_id = fields.Many2one("itm.equipment", "Asset") + ad_id = fields.Many2one("itm.service.ad", "Active Directory") + site_id = fields.Many2one("itm.site", "Site") partner_id = fields.Many2one("res.partner", "Partner") use_random = fields.Boolean("Random password") @@ -48,7 +48,7 @@ def onchange_aduser(self): @api.onchange("use_random") def onchange_use_random(self): - ItAccess = self.env["it.access"] + ItAccess = self.env["itm.access"] if self.use_random: self.password = ItAccess.get_random_string() @@ -66,7 +66,7 @@ def create_cred(self): "partner_id": self.partner_id.id, "equipment_id": self.equipment_id.id, } - cred = self.env["it.access"].create(cred_vals) + cred = self.env["itm.access"].create(cred_vals) self.aduser_id.access_id = cred @api.model diff --git a/itm/wizard/create_credential_view.xml b/itm/wizard/create_credential_view.xml index 185d79c..0b3b308 100644 --- a/itm/wizard/create_credential_view.xml +++ b/itm/wizard/create_credential_view.xml @@ -1,9 +1,9 @@ - - it.wizard.credential.form - it.wizard.credential + + itm.wizard.credential.form + itm.wizard.credential
    @@ -51,7 +51,7 @@ Create New Credential - it.wizard.credential + itm.wizard.credential form new From 4a83a56b02f24c918442fa9c65fe494c78cb6d1b Mon Sep 17 00:00:00 2001 From: Michael Telahun Date: Fri, 13 Aug 2021 18:05:11 +0300 Subject: [PATCH 03/58] [FIX] it: more fallout from module rename --- itm/__manifest__.py | 4 ++-- itm/security/it_security.xml | 2 +- itm/static/description/index.html | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/itm/__manifest__.py b/itm/__manifest__.py index 4e450a5..a4ab3ee 100644 --- a/itm/__manifest__.py +++ b/itm/__manifest__.py @@ -3,10 +3,10 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - "name": "Infrastructure", + "name": "IT Infrastructure Management", "version": "14.0.1.0.0", "license": "AGPL-3", - "category": "IT Infrastructure", + "category": "IT Infrastructure Management", "summary": """IT Assets, Credentials, Backups, Applications.""", "author": """TREVI Software, Leandro Ezequiel Baldi""", diff --git a/itm/security/it_security.xml b/itm/security/it_security.xml index 09f9a6f..a9e33cc 100644 --- a/itm/security/it_security.xml +++ b/itm/security/it_security.xml @@ -21,7 +21,7 @@ - Infrastructure + IT Infrastructure Management Helps you manage your infrastructure equipment, access and backups. diff --git a/itm/static/description/index.html b/itm/static/description/index.html index 4a08346..32b0315 100644 --- a/itm/static/description/index.html +++ b/itm/static/description/index.html @@ -1,6 +1,6 @@
    -

    ODOO INFRASTRUCTURE MODULE

    +

    ODOO IT INFRASTRUCTURE MANAGEMENT MODULE

    IT Assets, Credentials, Backups, and more..

    @@ -17,7 +17,7 @@

    IT Assets, Credentials, Backups, and more..

    Partners

    - +
    @@ -38,7 +38,7 @@

    IT Assets

    - +
    @@ -49,7 +49,7 @@

    IT Assets

    Access Credentials

    - +
    @@ -64,7 +64,7 @@

    Access Credentials

    Technical Support

    - For technical support for this or any of our other modules you can email our help desk for free email based support. We welcome any and all feedback you may have about this modules and any new features you want to see added to it. Join us on github if you would like to collaborate on development of this module! + For technical support for this, or any of our other modules, you can email our help desk for free email based support. We welcome any and all feedback you may have about this module and any new features you would like to see added to it. Join us on github if you would like to collaborate on development of this module!

    From dd004864e1c1eeb603754c40b42fcd0b8e4e9004 Mon Sep 17 00:00:00 2001 From: Michael Telahun Date: Fri, 13 Aug 2021 18:15:29 +0300 Subject: [PATCH 04/58] [FIX] itm: move images used in index.html to description/ (App Store) --- itm/static/{src/img => description}/asset.png | Bin itm/static/{src/img => description}/credential.png | Bin itm/static/description/index.html | 6 +++--- itm/static/{src/img => description}/partner.png | Bin 4 files changed, 3 insertions(+), 3 deletions(-) rename itm/static/{src/img => description}/asset.png (100%) rename itm/static/{src/img => description}/credential.png (100%) rename itm/static/{src/img => description}/partner.png (100%) diff --git a/itm/static/src/img/asset.png b/itm/static/description/asset.png similarity index 100% rename from itm/static/src/img/asset.png rename to itm/static/description/asset.png diff --git a/itm/static/src/img/credential.png b/itm/static/description/credential.png similarity index 100% rename from itm/static/src/img/credential.png rename to itm/static/description/credential.png diff --git a/itm/static/description/index.html b/itm/static/description/index.html index 32b0315..4f9d5a2 100644 --- a/itm/static/description/index.html +++ b/itm/static/description/index.html @@ -17,7 +17,7 @@

    IT Assets, Credentials, Backups, and more..

    Partners

    - +
    @@ -38,7 +38,7 @@

    IT Assets

    - +
    @@ -49,7 +49,7 @@

    IT Assets

    Access Credentials

    - +
    diff --git a/itm/static/src/img/partner.png b/itm/static/description/partner.png similarity index 100% rename from itm/static/src/img/partner.png rename to itm/static/description/partner.png From 2880f53006d5b4ec6358bed1c2b2f107dc138d7a Mon Sep 17 00:00:00 2001 From: Michael Telahun Date: Mon, 16 Aug 2021 10:10:43 +0300 Subject: [PATCH 05/58] itm: Add known issue section about password encryption --- itm/README.rst | 24 ++++++++++++++++-------- itm/readme/ROADMAP.rst | 1 + 2 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 itm/readme/ROADMAP.rst diff --git a/itm/README.rst b/itm/README.rst index 5413982..0ffd764 100644 --- a/itm/README.rst +++ b/itm/README.rst @@ -1,6 +1,6 @@ -============== -Infrastructure -============== +============================ +IT Infrastructure Management +============================ .. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! @@ -10,11 +10,14 @@ Infrastructure .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/github-trevi-software%2Ftrevi--misc-lightgray.png?logo=github - :target: https://github.com/trevi-software/trevi-misc/tree/14.0/it +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-trevi-software%2Ftrevi--misc-lightgray.png?logo=github + :target: https://github.com/trevi-software/trevi-misc/tree/14.0/itm :alt: trevi-software/trevi-misc -|badge1| |badge2| +|badge1| |badge2| |badge3| This module is used to record information about a site's IT infrastructure. You can record information about equipment, software, backups, networks and access credentials. @@ -23,13 +26,18 @@ This module is used to record information about a site's IT infrastructure. You .. contents:: :local: +Known issues / Roadmap +====================== + +* The password for encrypting and decrypting credentials is stored in Odoo as a system parameter. An attacker who has the 'Administration/Settings' priviledge or has access to the Odoo database itself can easily decrypt a credential's password field. + Bug Tracker =========== Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -50,6 +58,6 @@ Other credits Maintainers ~~~~~~~~~~~ -This module is part of the `trevi-software/trevi-misc `_ project on GitHub. +This module is part of the `trevi-software/trevi-misc `_ project on GitHub. You are welcome to contribute. diff --git a/itm/readme/ROADMAP.rst b/itm/readme/ROADMAP.rst new file mode 100644 index 0000000..3d96aff --- /dev/null +++ b/itm/readme/ROADMAP.rst @@ -0,0 +1 @@ +* The password for encrypting and decrypting credentials is stored in Odoo as a system parameter. An attacker who has the 'Administration/Settings' priviledge or has access to the Odoo database itself can easily decrypt a credential's password field. From 2cce684570eeb98dba6c3b58a239eb504657d2a3 Mon Sep 17 00:00:00 2001 From: Michael Telahun Date: Fri, 20 Aug 2021 16:17:43 +0300 Subject: [PATCH 06/58] itm: move functionality of web_clipboard_password into this module --- itm/__manifest__.py | 5 +-- itm/models/access.py | 15 +++++---- itm/static/src/js/itm.js | 56 ++++++++++++++++++++++++++++++++ itm/static/src/xml/clipboard.xml | 8 +++++ itm/views/access_view.xml | 12 +++---- itm/views/assets.xml | 8 +++++ 6 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 itm/static/src/js/itm.js create mode 100644 itm/static/src/xml/clipboard.xml create mode 100644 itm/views/assets.xml diff --git a/itm/__manifest__.py b/itm/__manifest__.py index a4ab3ee..2c0773b 100644 --- a/itm/__manifest__.py +++ b/itm/__manifest__.py @@ -4,7 +4,7 @@ { "name": "IT Infrastructure Management", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "license": "AGPL-3", "category": "IT Infrastructure Management", "summary": """IT Assets, Credentials, Backups, Applications.""", @@ -15,7 +15,7 @@ "static/src/img/main_screenshot.png", "static/src/img/default_image_equipment.png", ], - "depends": ["mail", "product"], + "depends": ["mail", "product", "web"], "data": [ "security/it_security.xml", "security/ir.model.access.csv", @@ -42,6 +42,7 @@ "views/site_view.xml", "views/service_ad_view.xml", "views/service_dhcp_view.xml", + "views/assets.xml", ], "demo": [], "test": [], diff --git a/itm/models/access.py b/itm/models/access.py index 3fc90b3..378419e 100644 --- a/itm/models/access.py +++ b/itm/models/access.py @@ -12,7 +12,6 @@ from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC from odoo import _, api, fields, models -from odoo.exceptions import AccessDenied PARAM_PASS = "itm_passkey" PARAM_SALT = "itm_salt" @@ -79,15 +78,19 @@ def encrypt_string(self, plaintext): cipher = f.encrypt(plaintext.encode()) return base64.urlsafe_b64encode(cipher) - def decrypt_password(self): + @api.model + def decrypt_password_as_string(self, obj_id): + """Returns a string representing the plaintext password in record with + database ID obj_id.""" key = self.get_urlsafe_key() f = Fernet(key) - for rec in self: - token = base64.urlsafe_b64decode(rec.password) - password = f.decrypt(token).decode() - raise AccessDenied(password) + plaintext = False + rec = self.browse(obj_id) + token = base64.urlsafe_b64decode(rec.password) + plaintext = f.decrypt(token).decode() + return plaintext @api.model def _get_partner_id(self): diff --git a/itm/static/src/js/itm.js b/itm/static/src/js/itm.js new file mode 100644 index 0000000..9509619 --- /dev/null +++ b/itm/static/src/js/itm.js @@ -0,0 +1,56 @@ +/** + * Copyright 2021 TREVI Software + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + * + */ + +odoo.define("itm", function (require) { + "use strict"; + + const widgetRegistry = require("web.widget_registry"); + const core = require("web.core"); + const rpc = require("web.rpc"); + const Widget = require("web.Widget"); + const _t = core._t; + + var CopyToClipboard = Widget.extend({ + template: "Copy_to_Clipboard", + xmlDependencies: ["/itm/static/src/xml/clipboard.xml"], + events: { + click: "_onClick", + }, + + init: function (parent, record, nodeInfo) { + this._super.apply(this, arguments); + this.res_id = record.res_id; + this.res_model = record.model; + this.node = nodeInfo; + }, + + _onClick(event) { + event.preventDefault(); + event.stopPropagation(); + var do_notify = this.do_notify; + var $clipboardBtn = this.$el.find(".o_clipboard_button"); + + rpc.query({ + model: this.res_model, + method: "decrypt_password_as_string", + args: [this.res_id], + }).then(function (plaintext) { + var clipboard = new ClipboardJS($clipboardBtn[0], { + text: function () { + return plaintext; + }, + }); + clipboard.onClick(event); + clipboard.destroy(); + do_notify(_t("Copied password to clipboard")); + }); + }, + }); + + widgetRegistry.add("copy_to_clipboard", CopyToClipboard); + + return CopyToClipboard; +}); diff --git a/itm/static/src/xml/clipboard.xml b/itm/static/src/xml/clipboard.xml new file mode 100644 index 0000000..3d3eaee --- /dev/null +++ b/itm/static/src/xml/clipboard.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/itm/views/access_view.xml b/itm/views/access_view.xml index 38c5088..7340620 100644 --- a/itm/views/access_view.xml +++ b/itm/views/access_view.xml @@ -65,9 +65,13 @@ name="password" password="True" nolabel="1" - style="max-width:300px" + style="max-width:250px" class="oe_inline text-truncate" /> +
    diff --git a/itm/views/assets.xml b/itm/views/assets.xml new file mode 100644 index 0000000..e76298e --- /dev/null +++ b/itm/views/assets.xml @@ -0,0 +1,8 @@ + + +