Skip to content

Commit 8ee25f9

Browse files
committed
Refactored to avoid user duplication problem
bzr revid: [email protected]
1 parent 7bce27c commit 8ee25f9

File tree

7 files changed

+40
-68
lines changed

7 files changed

+40
-68
lines changed

addons/im/im.py

+18-36
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def poll(self, last=None, users_watch=None, db=None, uid=None, password=None, uu
109109
registry = openerp.modules.registry.RegistryManager.get(db)
110110
with registry.cursor() as cr:
111111
registry.get('im.user').im_connect(cr, uid, uuid=uuid, context=request.context)
112-
my_id = registry.get('im.user').get_by_user_id(cr, uid, uuid or uid, request.context)["id"]
112+
my_id = registry.get('im.user').get_my_id(cr, uid, uuid, request.context)
113113
num = 0
114114
while True:
115115
with registry.cursor() as cr:
@@ -156,7 +156,7 @@ def get_messages(self, cr, uid, last=None, users_watch=None, uuid=None, context=
156156

157157
# complex stuff to determine the last message to show
158158
users = self.pool.get("im.user")
159-
my_id = users.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
159+
my_id = users.get_my_id(cr, uid, uuid, context=context)
160160
c_user = users.browse(cr, openerp.SUPERUSER_ID, my_id, context=context)
161161
if last:
162162
if c_user.im_last_received < last:
@@ -181,7 +181,7 @@ def get_messages(self, cr, uid, last=None, users_watch=None, uuid=None, context=
181181

182182
def post(self, cr, uid, message, to_user_id, uuid=None, context=None):
183183
assert_uuid(uuid)
184-
my_id = self.pool.get('im.user').get_by_user_id(cr, uid, uuid or uid)["id"]
184+
my_id = self.pool.get('im.user').get_my_id(cr, uid, uuid)
185185
self.create(cr, openerp.SUPERUSER_ID, {"message": message, 'from_id': my_id, 'to_id': to_user_id}, context=context)
186186
notify_channel(cr, "im_channel", {'type': 'message', 'receiver': to_user_id})
187187
return False
@@ -199,10 +199,9 @@ def _im_status(self, cr, uid, ids, something, something_else, context=None):
199199
res[obj["id"]] = obj["im_last_status"] and (last_update + delta) > current
200200
return res
201201

202-
def search_users(self, cr, uid, domain, fields, limit, context=None):
203-
# do not user openerp.SUPERUSER_ID, reserved to normal users
204-
found = self.pool.get('res.users').search(cr, uid, domain, limit=limit, context=context)
205-
found = self.get_by_user_ids(cr, uid, found, context=context)
202+
def search_users(self, cr, uid, text_search, fields, limit, context=None):
203+
my_id = self.get_my_id(cr, uid, None, context)
204+
found = self.search(cr, uid, [["name", "ilike", text_search], ["id", "<>", my_id]], limit=limit, context=context)
206205
return self.read(cr, uid, found, fields, context=context)
207206

208207
def im_connect(self, cr, uid, uuid=None, context=None):
@@ -215,45 +214,28 @@ def im_disconnect(self, cr, uid, uuid=None, context=None):
215214

216215
def _im_change_status(self, cr, uid, new_one, uuid=None, context=None):
217216
assert_uuid(uuid)
218-
id = self.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
217+
id = self.get_my_id(cr, uid, uuid, context=context)
219218
current_status = self.read(cr, openerp.SUPERUSER_ID, id, ["im_status"], context=None)["im_status"]
220219
self.write(cr, openerp.SUPERUSER_ID, id, {"im_last_status": new_one,
221220
"im_last_status_update": datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)
222221
if current_status != new_one:
223222
notify_channel(cr, "im_channel", {'type': 'status', 'user': id})
224223
return True
225224

226-
def get_by_user_id(self, cr, uid, id, context=None):
227-
ids = self.get_by_user_ids(cr, uid, [id], context=context)
228-
return ids[0]
229-
230-
def get_by_user_ids(self, cr, uid, ids, context=None):
231-
user_ids = [x for x in ids if isinstance(x, int)]
232-
uuids = [x for x in ids if isinstance(x, (str, unicode))]
233-
users = self.search(cr, openerp.SUPERUSER_ID, ["|", ["user_id", "in", user_ids], ["uuid", "in", uuids]], context=None)
234-
records = self.read(cr, openerp.SUPERUSER_ID, users, ["user_id", "uuid"], context=None)
235-
inside = {}
236-
for i in records:
237-
if i["user_id"]:
238-
inside[i["user_id"][0]] = True
239-
elif ["uuid"]:
240-
inside[i["uuid"]] = True
241-
not_inside = {}
242-
for i in ids:
243-
if not (i in inside):
244-
not_inside[i] = True
245-
for to_create in not_inside.keys():
246-
if isinstance(to_create, int):
247-
created = self.create(cr, openerp.SUPERUSER_ID, {"user_id": to_create}, context=context)
248-
records.append({"id": created, "user_id": [to_create, ""]})
249-
else:
250-
created = self.create(cr, openerp.SUPERUSER_ID, {"uuid": to_create}, context=context)
251-
records.append({"id": created, "uuid": to_create})
252-
return records
225+
def get_my_id(self, cr, uid, uuid=None, context=None):
226+
assert_uuid(uuid)
227+
if uuid:
228+
users = self.search(cr, openerp.SUPERUSER_ID, [["uuid", "=", uuid]], context=None)
229+
else:
230+
users = self.search(cr, openerp.SUPERUSER_ID, [["user_id", "=", uid]], context=None)
231+
my_id = users[0] if len(users) >= 1 else False
232+
if not my_id:
233+
my_id = self.create(cr, openerp.SUPERUSER_ID, {"user_id": uid if not uuid else False, "uuid": uuid if uuid else False}, context=context)
234+
return my_id
253235

254236
def assign_name(self, cr, uid, uuid, name, context=None):
255237
assert_uuid(uuid)
256-
id = self.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
238+
id = self.get_my_id(cr, uid, uuid, context=context)
257239
self.write(cr, openerp.SUPERUSER_ID, id, {"assigned_name": name}, context=context)
258240
return True
259241

addons/im/security/im_security.xml

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<field name="name">Can only read messages that you sent or messages sent to you</field>
66
<field name="model_id" ref="model_im_message"/>
77
<field name="groups" eval="[(6,0,[ref('base.group_user')])]"/>
8-
<field name="domain_force">["|", ('to_id.user', '=', user.id), ('from_id.user', '=', user.id)]</field>
8+
<field name="domain_force">["|", ('to_id.user_id', '=', user.id), ('from_id.user_id', '=', user.id)]</field>
99
<field name="perm_unlink" eval="0"/>
1010
<field name="perm_write" eval="0"/>
1111
<field name="perm_read" eval="1"/>
@@ -16,11 +16,11 @@
1616
<field name="name">Can only modify your user</field>
1717
<field name="model_id" ref="model_im_user"/>
1818
<field name="groups" eval="[(6,0,[ref('base.group_user')])]"/>
19-
<field name="domain_force">[('user', '=', user.id)]</field>
20-
<field name="perm_unlink" eval="0"/>
19+
<field name="domain_force">[('user_id', '=', user.id)]</field>
20+
<field name="perm_unlink" eval="1"/>
2121
<field name="perm_write" eval="1"/>
2222
<field name="perm_read" eval="0"/>
23-
<field name="perm_create" eval="0"/>
23+
<field name="perm_create" eval="1"/>
2424
</record>
2525
</data>
2626
</openerp>

addons/im/static/src/js/im.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,8 @@
8585
search_changed: function(e) {
8686
var users = new instance.web.Model("im.user");
8787
var self = this;
88-
return this.user_search_dm.add(users.call("search_users",
89-
[[["name", "ilike", this.get("current_search")], ["id", "<>", instance.session.uid]],
90-
["name", "user_id", "uuid", "im_status"], USERS_LIMIT], {context:new instance.web.CompoundContext()})).then(function(result) {
88+
return this.user_search_dm.add(users.call("search_users", [this.get("current_search"), ["name", "user_id", "uuid", "im_status"],
89+
USERS_LIMIT], {context:new instance.web.CompoundContext()})).then(function(result) {
9190
self.c_manager.add_to_user_cache(result);
9291
self.$(".oe_im_input").val("");
9392
var old_users = self.users;

addons/im/static/src/js/im_common.js

+12-21
Original file line numberDiff line numberDiff line change
@@ -92,34 +92,25 @@ function declare($, _, openerp) {
9292
},
9393
start_polling: function() {
9494
var self = this;
95-
96-
var auth_def = null;
97-
var user_id = null;
95+
var def = $.when();
96+
var uuid = false;
9897

9998
if (this.options.anonymous_mode) {
100-
var uuid = localStorage["oe_livesupport_uuid"];
101-
var def = $.when(uuid);
99+
uuid = localStorage["oe_livesupport_uuid"] || false;
102100

103101
if (! uuid) {
104-
def = im_common.connection.rpc("/longpolling/im/gen_uuid", {});
102+
def = im_common.connection.rpc("/longpolling/im/gen_uuid", {}).then(function(my_uuid) {
103+
uuid = my_uuid;
104+
localStorage["oe_livesupport_uuid"] = uuid;
105+
return im_common.connection.model("im.user").call("assign_name", [uuid, self.options.userName]);
106+
});
105107
}
106-
var anonymous_user_id = null;
107-
auth_def = def.then(function(uuid) {
108-
localStorage["oe_livesupport_uuid"] = uuid;
109-
return im_common.connection.model("im.user").call("get_by_user_id", [uuid]);
110-
}).then(function(my_id) {
111-
user_id = my_id["id"];
112-
return im_common.connection.model("im.user").call("assign_name", [uuid, self.options.userName]);
113-
});
114-
} else {
115-
auth_def = im_common.connection.model("im.user").call("get_by_user_id",
116-
[im_common.connection.uid]).then(function(my_id) {
117-
user_id = my_id["id"];
118-
});
119108
}
120109

121-
return auth_def.then(function() {
122-
self.my_id = user_id;
110+
return def.then(function() {
111+
return im_common.connection.model("im.user").call("get_my_id", [uuid]);
112+
}).then(function(my_user_id) {
113+
self.my_id = my_user_id;
123114
return self.ensure_users([self.my_id]);
124115
}).then(function() {
125116
var me = self.users_cache[self.my_id];

addons/im_livechat/im_livechat.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@ def _default_user_ids(self, cr, uid, context=None):
161161

162162
def get_available_user(self, cr, uid, channel_id, context=None):
163163
channel = self.browse(cr, openerp.SUPERUSER_ID, channel_id, context=context)
164+
im_user_ids = self.pool.get("im.user").search(cr, uid, [["user_id", "in", [user.id for user in channel.user_ids]]], context=context)
164165
users = []
165-
for user in channel.user_ids:
166-
iuid = self.pool.get("im.user").get_by_user_id(cr, uid, user.id, context=context)["id"]
166+
for iuid in im_user_ids:
167167
imuser = self.pool.get("im.user").browse(cr, uid, iuid, context=context)
168168
if imuser.im_status:
169169
users.append(imuser)

addons/im_livechat/im_livechat_view.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
<field name="name">History</field>
125125
<field name="res_model">im.message</field>
126126
<field name="view_mode">list</field>
127-
<field name="domain">["|", ('to_id.user', '=', None), ('from_id.user', '=', None)]</field>
127+
<field name="domain">["|", ('to_id.user_id', '=', None), ('from_id.user_id', '=', None)]</field>
128128
</record>
129129
<menuitem name="History" parent="im_livechat" id="history" action="action_history" groups="group_im_livechat_manager"/>
130130

addons/im_livechat/security/im_livechat_security.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
<field name="name">Live Support Managers can read messages from live support</field>
2626
<field name="model_id" ref="im.model_im_message"/>
2727
<field name="groups" eval="[(6,0,[ref('im_livechat.group_im_livechat_manager')])]"/>
28-
<field name="domain_force">["|", ('to_id.user', '=', None), ('from_id.user', '=', None)]</field>
28+
<field name="domain_force">["|", ('to_id.user_id', '=', None), ('from_id.user_id', '=', None)]</field>
2929
<field name="perm_unlink" eval="0"/>
3030
<field name="perm_write" eval="0"/>
3131
<field name="perm_read" eval="1"/>

0 commit comments

Comments
 (0)