From fb057ada9a8fb9302dc6b37f3d12db8f88bbc45a Mon Sep 17 00:00:00 2001 From: xtremxpert Date: Mon, 9 Dec 2024 09:35:56 -0500 Subject: [PATCH] more on that --- odoo_unifi_manager.zip | Bin 0 -> 45970 bytes odoo_unifi_manager/__manifest__.py | 7 +- odoo_unifi_manager/models/__init__.py | 4 + odoo_unifi_manager/models/ctrl.py | 57 ++++++++++++++ odoo_unifi_manager/models/firewall_rule.py | 7 ++ .../models/firewall_rule_template.py | 9 ++- odoo_unifi_manager/models/network.py | 37 +++++++++ odoo_unifi_manager/models/unifi_client.py | 73 ++++++++++++++++++ odoo_unifi_manager/models/wifi.py | 35 +++++++++ .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 1086 bytes odoo_unifi_manager/views/controller_views.xml | 46 +++++++++++ .../views/firewall_rule_action.xml | 12 +++ .../views/firewall_rule_template_views.xml | 33 +++++++- odoo_unifi_manager/views/network_views.xml | 46 +++++++++++ odoo_unifi_manager/views/unify_menu.xml | 62 ++++++++++++++- odoo_unifi_manager/views/wifi_views.xml | 45 +++++++++++ .../firewall_rule_wizard_action.xml | 0 18 files changed, 466 insertions(+), 10 deletions(-) create mode 100644 odoo_unifi_manager.zip create mode 100644 odoo_unifi_manager/models/ctrl.py create mode 100644 odoo_unifi_manager/models/network.py create mode 100644 odoo_unifi_manager/models/unifi_client.py create mode 100644 odoo_unifi_manager/models/wifi.py create mode 100644 odoo_unifi_manager/static/description/icon.png create mode 100644 odoo_unifi_manager/views/controller_views.xml create mode 100644 odoo_unifi_manager/views/firewall_rule_action.xml create mode 100644 odoo_unifi_manager/views/network_views.xml create mode 100644 odoo_unifi_manager/views/wifi_views.xml rename odoo_unifi_manager/{views => wizard}/firewall_rule_wizard_action.xml (100%) diff --git a/odoo_unifi_manager.zip b/odoo_unifi_manager.zip new file mode 100644 index 0000000000000000000000000000000000000000..2b46e9bf1f702db11f4ba3744c13cf598cfb2aff GIT binary patch literal 45970 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 literal 0 HcmV?d00001 diff --git a/odoo_unifi_manager/views/controller_views.xml b/odoo_unifi_manager/views/controller_views.xml new file mode 100644 index 0000000..1ee6722 --- /dev/null +++ b/odoo_unifi_manager/views/controller_views.xml @@ -0,0 +1,46 @@ + + + + Controllers + unifi.ctrl + tree,form + +

+ Manage your Unifi Controllers here. +

+
+
+ + + + unifi.ctrl.tree + unifi.ctrl + + + + + + + + + + + + unifi.ctrl.form + unifi.ctrl + +
+ + + + + + + +