Skip to content

Commit c5751a6

Browse files
Merge pull request #226 from GlodoUK/T16564
glodo_cloud changes
2 parents 0335ee1 + 2433556 commit c5751a6

11 files changed

Lines changed: 216 additions & 43 deletions

glodo_server/__manifest__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"security/ir.model.access.csv",
1212
"wizards/glodo_instance_info_wizard_views.xml",
1313
"views/glodo_instance_views.xml",
14+
"views/glodo_instance_tag_views.xml",
1415
"views/glodo_instance_database_views.xml",
1516
"views/glodo_remote_user_views.xml",
1617
"views/glodo_action_log_views.xml",

glodo_server/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from . import glodo_action_log
22
from . import glodo_instance
33
from . import glodo_instance_database
4+
from . import glodo_instance_tag
45
from . import glodo_remote_user

glodo_server/models/glodo_instance.py

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import json
1010
import logging
1111
import secrets
12+
from collections import defaultdict
1213

1314
import requests
1415

@@ -54,6 +55,14 @@ class GlodoInstance(models.Model):
5455
help="AES-256 shared secret for encrypted communication",
5556
)
5657

58+
partner_id = fields.Many2one(
59+
"res.partner",
60+
)
61+
62+
tag_ids = fields.Many2many(
63+
"glodo.instance.tag",
64+
)
65+
5766
database_ids = fields.One2many(
5867
"glodo.instance.database",
5968
"instance_id",
@@ -74,10 +83,16 @@ class GlodoInstance(models.Model):
7483
readonly=True,
7584
)
7685

77-
remote_user_count = fields.Integer(
86+
active_remote_user_count = fields.Integer(
87+
"Active Users",
88+
compute="_compute_remote_user_count",
89+
store=True,
90+
)
91+
92+
inactive_remote_user_count = fields.Integer(
93+
"Inactive Users",
7894
compute="_compute_remote_user_count",
7995
store=True,
80-
readonly=True,
8196
)
8297

8398
last_sync_date = fields.Datetime(
@@ -96,12 +111,29 @@ def _compute_database_count(self):
96111
for instance in self:
97112
instance.database_count = len(instance.database_ids)
98113

99-
@api.depends("database_ids.remote_user_ids")
114+
@api.depends(
115+
"database_ids.remote_user_ids", "database_ids.remote_user_ids.is_archived"
116+
)
100117
def _compute_remote_user_count(self):
118+
if not self.ids:
119+
self.active_remote_user_count = self.inactive_remote_user_count = 0
120+
return
121+
122+
count_data = defaultdict(lambda: {"active": 0, "inactive": 0})
123+
124+
remote_user_data = self.env["glodo.remote.user"]._read_group(
125+
[("instance_id", "in", self.ids)],
126+
["instance_id", "is_archived"],
127+
["__count"],
128+
)
129+
130+
for instance, is_archived, count in remote_user_data:
131+
key = "inactive" if is_archived else "active"
132+
count_data[instance.id][key] = count
133+
101134
for instance in self:
102-
instance.remote_user_count = sum(
103-
len(db.remote_user_ids) for db in instance.database_ids
104-
)
135+
instance.active_remote_user_count = count_data[instance.id]["active"]
136+
instance.inactive_remote_user_count = count_data[instance.id]["inactive"]
105137

106138
@api.model_create_multi
107139
def create(self, vals_list):
@@ -352,6 +384,20 @@ def action_view_databases(self):
352384
"context": {"default_instance_id": self.id},
353385
}
354386

387+
def action_view_remote_users(self):
388+
self.ensure_one()
389+
390+
return {
391+
"type": "ir.actions.act_window",
392+
"name": self.env._("Users - %(name)s", name=self.name),
393+
"res_model": "glodo.remote.user",
394+
"view_mode": "list,form",
395+
"domain": [("instance_id", "=", self.id)],
396+
"context": {
397+
"search_default_filter_active": 1,
398+
},
399+
}
400+
355401
def action_view_action_logs(self):
356402
"""View action logs for this instance."""
357403
self.ensure_one()

glodo_server/models/glodo_instance_database.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import json
99
import logging
10+
from collections import defaultdict
1011

1112
from odoo import api, fields, models
1213
from odoo.exceptions import UserError
@@ -57,14 +58,19 @@ class GlodoInstanceDatabase(models.Model):
5758
remote_user_ids = fields.One2many(
5859
"glodo.remote.user",
5960
"database_id",
60-
string="Remote Users",
6161
readonly=True,
6262
)
6363

64-
remote_user_count = fields.Integer(
64+
active_remote_user_count = fields.Integer(
65+
"Active Users",
66+
compute="_compute_remote_user_count",
67+
store=True,
68+
)
69+
70+
inactive_remote_user_count = fields.Integer(
71+
"Inactive Users",
6572
compute="_compute_remote_user_count",
6673
store=True,
67-
readonly=True,
6874
)
6975

7076
user_count = fields.Integer(
@@ -99,10 +105,27 @@ class GlodoInstanceDatabase(models.Model):
99105
"UNIQUE(instance_id, name)", "Database name must be unique per instance."
100106
)
101107

102-
@api.depends("remote_user_ids")
108+
@api.depends("remote_user_ids", "remote_user_ids.is_archived")
103109
def _compute_remote_user_count(self):
110+
if not self.ids:
111+
self.active_remote_user_count = self.inactive_remote_user_count = 0
112+
return
113+
114+
count_data = defaultdict(lambda: {"active": 0, "inactive": 0})
115+
116+
remote_user_data = self.env["glodo.remote.user"]._read_group(
117+
[("database_id", "in", self.ids)],
118+
["database_id", "is_archived"],
119+
["__count"],
120+
)
121+
122+
for database, is_archived, count in remote_user_data:
123+
key = "inactive" if is_archived else "active"
124+
count_data[database.id][key] = count
125+
104126
for db in self:
105-
db.remote_user_count = len(db.remote_user_ids)
127+
db.active_remote_user_count = count_data[db.id]["active"]
128+
db.inactive_remote_user_count = count_data[db.id]["inactive"]
106129

107130
@api.depends("installed_modules_json")
108131
def _compute_installed_modules_html(self):
@@ -228,7 +251,6 @@ def action_sync_users(self):
228251
}
229252

230253
def action_view_remote_users(self):
231-
"""View remote users for this database."""
232254
self.ensure_one()
233255

234256
return {
@@ -237,5 +259,8 @@ def action_view_remote_users(self):
237259
"res_model": "glodo.remote.user",
238260
"view_mode": "list,form",
239261
"domain": [("database_id", "=", self.id)],
240-
"context": {"default_database_id": self.id},
262+
"context": {
263+
"default_database_id": self.id,
264+
"search_default_filter_active": 1,
265+
},
241266
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from random import randint
2+
3+
from odoo import api, fields, models
4+
5+
6+
class GlodoInstanceTag(models.Model):
7+
_name = "glodo.instance.tag"
8+
_description = "Instance Tags"
9+
_order = "name, id"
10+
11+
@api.model
12+
def _get_default_color(self):
13+
return randint(1, 11)
14+
15+
active = fields.Boolean(
16+
default=True,
17+
)
18+
19+
name = fields.Char(
20+
required=True,
21+
)
22+
23+
color = fields.Integer(
24+
aggregator=False,
25+
default=lambda self: self._get_default_color(),
26+
)

glodo_server/security/ir.model.access.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
22
access_glodo_instance_user,glodo.instance.user,model_glodo_instance,group_glodo_cloud_user,1,0,0,0
33
access_glodo_instance_manager,glodo.instance.manager,model_glodo_instance,group_glodo_cloud_manager,1,1,0,0
44
access_glodo_instance_admin,glodo.instance.admin,model_glodo_instance,group_glodo_cloud_admin,1,1,1,1
5+
access_glodo_instance_tag_user,glodo.instance.tag.user,model_glodo_instance_tag,group_glodo_cloud_user,1,0,0,0
6+
access_glodo_instance_tag_manager,glodo.instance.tag.manager,model_glodo_instance_tag,group_glodo_cloud_manager,1,1,1,1
7+
access_glodo_instance_tag_admin,glodo.instance.tag.admin,model_glodo_instance_tag,group_glodo_cloud_admin,1,1,1,1
58
access_glodo_instance_database_user,glodo.instance.database.user,model_glodo_instance_database,group_glodo_cloud_user,1,0,0,0
69
access_glodo_instance_database_manager,glodo.instance.database.manager,model_glodo_instance_database,group_glodo_cloud_manager,1,1,1,1
710
access_glodo_instance_database_admin,glodo.instance.database.admin,model_glodo_instance_database,group_glodo_cloud_admin,1,1,1,1

glodo_server/views/glodo_instance_database_views.xml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<?xml version='1.0' encoding='utf-8' ?>
22
<odoo>
3-
<!-- Database Form View -->
43
<record id="glodo_instance_database_view_form" model="ir.ui.view">
54
<field name="name">glodo.instance.database.view.form</field>
65
<field name="model">glodo.instance.database</field>
@@ -25,9 +24,9 @@
2524
icon="fa-users"
2625
>
2726
<field
28-
name="remote_user_count"
27+
name="active_remote_user_count"
2928
widget="statinfo"
30-
string="Users"
29+
string="Active Users"
3130
/>
3231
</button>
3332
</div>
@@ -109,27 +108,29 @@
109108
</field>
110109
</record>
111110

112-
<!-- Database List View -->
113111
<record id="glodo_instance_database_view_list" model="ir.ui.view">
114112
<field name="name">glodo.instance.database.view.list</field>
115113
<field name="model">glodo.instance.database</field>
116114
<field name="arch" type="xml">
117-
<list string="Instance Databases">
115+
<list>
118116
<field name="name" />
119117
<field name="instance_name" />
120-
<field name="user_count" string="Internal Users" />
121-
<field name="remote_user_count" string="Synced Users" />
118+
<field name="active_remote_user_count" sum="Active Users" />
119+
<field
120+
name="inactive_remote_user_count"
121+
optional="hide"
122+
sum="Inactive Users"
123+
/>
122124
<field name="last_user_sync" />
123125
</list>
124126
</field>
125127
</record>
126128

127-
<!-- Database Search View -->
128129
<record id="glodo_instance_database_view_search" model="ir.ui.view">
129130
<field name="name">glodo.instance.database.view.search</field>
130131
<field name="model">glodo.instance.database</field>
131132
<field name="arch" type="xml">
132-
<search string="Search Databases">
133+
<search>
133134
<field name="name" />
134135
<field name="instance_id" />
135136
<filter
@@ -151,7 +152,6 @@
151152
</field>
152153
</record>
153154

154-
<!-- Database Action -->
155155
<record id="glodo_instance_database_action" model="ir.actions.act_window">
156156
<field name="name">Instance Databases</field>
157157
<field name="res_model">glodo.instance.database</field>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?xml version='1.0' encoding='utf-8' ?>
2+
<odoo>
3+
<record id="glodo_instance_tag_view_list" model="ir.ui.view">
4+
<field name="name">glodo.instance.tag.view.list</field>
5+
<field name="model">glodo.instance.tag</field>
6+
<field name="arch" type="xml">
7+
<list editable="bottom">
8+
<field name="name" />
9+
<field name="color" widget="color_picker" />
10+
</list>
11+
</field>
12+
</record>
13+
14+
<record id="glodo_instance_tag_view_search" model="ir.ui.view">
15+
<field name="name">glodo.instance.tag.view.search</field>
16+
<field name="model">glodo.instance.tag</field>
17+
<field name="arch" type="xml">
18+
<search>
19+
<field name="name" />
20+
<filter
21+
string="Active"
22+
name="filter_active"
23+
domain="[('active', '=', True)]"
24+
/>
25+
<filter
26+
string="Archived"
27+
name="filter_archived"
28+
domain="[('active', '=', False)]"
29+
/>
30+
</search>
31+
</field>
32+
</record>
33+
34+
<record id="glodo_instance_tag_action" model="ir.actions.act_window">
35+
<field name="name">Instance Tags</field>
36+
<field name="res_model">glodo.instance.tag</field>
37+
<field name="view_mode">list</field>
38+
<field name="context">{'search_default_filter_active': 1}</field>
39+
</record>
40+
</odoo>

0 commit comments

Comments
 (0)