[FIX] im: multiple bugs
bzr revid: nicolas.vanhoren@openerp.com-20130826135135-93tmyi6a1fpju8vy
This commit is contained in:
commit
00d3d9a4b6
|
@ -109,7 +109,7 @@ class LongPollingController(http.Controller):
|
|||
registry = openerp.modules.registry.RegistryManager.get(db)
|
||||
with registry.cursor() as cr:
|
||||
registry.get('im.user').im_connect(cr, uid, uuid=uuid, context=request.context)
|
||||
my_id = registry.get('im.user').get_by_user_id(cr, uid, uuid or uid, request.context)["id"]
|
||||
my_id = registry.get('im.user').get_my_id(cr, uid, uuid, request.context)
|
||||
num = 0
|
||||
while True:
|
||||
with registry.cursor() as cr:
|
||||
|
@ -156,7 +156,7 @@ class im_message(osv.osv):
|
|||
|
||||
# complex stuff to determine the last message to show
|
||||
users = self.pool.get("im.user")
|
||||
my_id = users.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
|
||||
my_id = users.get_my_id(cr, uid, uuid, context=context)
|
||||
c_user = users.browse(cr, openerp.SUPERUSER_ID, my_id, context=context)
|
||||
if last:
|
||||
if c_user.im_last_received < last:
|
||||
|
@ -181,7 +181,7 @@ class im_message(osv.osv):
|
|||
|
||||
def post(self, cr, uid, message, to_user_id, uuid=None, context=None):
|
||||
assert_uuid(uuid)
|
||||
my_id = self.pool.get('im.user').get_by_user_id(cr, uid, uuid or uid)["id"]
|
||||
my_id = self.pool.get('im.user').get_my_id(cr, uid, uuid)
|
||||
self.create(cr, openerp.SUPERUSER_ID, {"message": message, 'from_id': my_id, 'to_id': to_user_id}, context=context)
|
||||
notify_channel(cr, "im_channel", {'type': 'message', 'receiver': to_user_id})
|
||||
return False
|
||||
|
@ -199,10 +199,9 @@ class im_user(osv.osv):
|
|||
res[obj["id"]] = obj["im_last_status"] and (last_update + delta) > current
|
||||
return res
|
||||
|
||||
def search_users(self, cr, uid, domain, fields, limit, context=None):
|
||||
# do not user openerp.SUPERUSER_ID, reserved to normal users
|
||||
found = self.pool.get('res.users').search(cr, uid, domain, limit=limit, context=context)
|
||||
found = self.get_by_user_ids(cr, uid, found, context=context)
|
||||
def search_users(self, cr, uid, text_search, fields, limit, context=None):
|
||||
my_id = self.get_my_id(cr, uid, None, context)
|
||||
found = self.search(cr, uid, [["name", "ilike", text_search], ["id", "<>", my_id], ["uuid", "=", False]], limit=limit, context=context)
|
||||
return self.read(cr, uid, found, fields, context=context)
|
||||
|
||||
def im_connect(self, cr, uid, uuid=None, context=None):
|
||||
|
@ -215,7 +214,7 @@ class im_user(osv.osv):
|
|||
|
||||
def _im_change_status(self, cr, uid, new_one, uuid=None, context=None):
|
||||
assert_uuid(uuid)
|
||||
id = self.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
|
||||
id = self.get_my_id(cr, uid, uuid, context=context)
|
||||
current_status = self.read(cr, openerp.SUPERUSER_ID, id, ["im_status"], context=None)["im_status"]
|
||||
self.write(cr, openerp.SUPERUSER_ID, id, {"im_last_status": new_one,
|
||||
"im_last_status_update": datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)
|
||||
|
@ -223,37 +222,20 @@ class im_user(osv.osv):
|
|||
notify_channel(cr, "im_channel", {'type': 'status', 'user': id})
|
||||
return True
|
||||
|
||||
def get_by_user_id(self, cr, uid, id, context=None):
|
||||
ids = self.get_by_user_ids(cr, uid, [id], context=context)
|
||||
return ids[0]
|
||||
|
||||
def get_by_user_ids(self, cr, uid, ids, context=None):
|
||||
user_ids = [x for x in ids if isinstance(x, int)]
|
||||
uuids = [x for x in ids if isinstance(x, (str, unicode))]
|
||||
users = self.search(cr, openerp.SUPERUSER_ID, ["|", ["user", "in", user_ids], ["uuid", "in", uuids]], context=None)
|
||||
records = self.read(cr, openerp.SUPERUSER_ID, users, ["user", "uuid"], context=None)
|
||||
inside = {}
|
||||
for i in records:
|
||||
if i["user"]:
|
||||
inside[i["user"][0]] = True
|
||||
elif ["uuid"]:
|
||||
inside[i["uuid"]] = True
|
||||
not_inside = {}
|
||||
for i in ids:
|
||||
if not (i in inside):
|
||||
not_inside[i] = True
|
||||
for to_create in not_inside.keys():
|
||||
if isinstance(to_create, int):
|
||||
created = self.create(cr, openerp.SUPERUSER_ID, {"user": to_create}, context=context)
|
||||
records.append({"id": created, "user": [to_create, ""]})
|
||||
else:
|
||||
created = self.create(cr, openerp.SUPERUSER_ID, {"uuid": to_create}, context=context)
|
||||
records.append({"id": created, "uuid": to_create})
|
||||
return records
|
||||
def get_my_id(self, cr, uid, uuid=None, context=None):
|
||||
assert_uuid(uuid)
|
||||
if uuid:
|
||||
users = self.search(cr, openerp.SUPERUSER_ID, [["uuid", "=", uuid]], context=None)
|
||||
else:
|
||||
users = self.search(cr, openerp.SUPERUSER_ID, [["user_id", "=", uid]], context=None)
|
||||
my_id = users[0] if len(users) >= 1 else False
|
||||
if not my_id:
|
||||
my_id = self.create(cr, openerp.SUPERUSER_ID, {"user_id": uid if not uuid else False, "uuid": uuid if uuid else False}, context=context)
|
||||
return my_id
|
||||
|
||||
def assign_name(self, cr, uid, uuid, name, context=None):
|
||||
assert_uuid(uuid)
|
||||
id = self.get_by_user_id(cr, uid, uuid or uid, context=context)["id"]
|
||||
id = self.get_my_id(cr, uid, uuid, context=context)
|
||||
self.write(cr, openerp.SUPERUSER_ID, id, {"assigned_name": name}, context=context)
|
||||
return True
|
||||
|
||||
|
@ -261,16 +243,16 @@ class im_user(osv.osv):
|
|||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
res[record.id] = record.assigned_name
|
||||
if record.user:
|
||||
res[record.id] = record.user.name
|
||||
if record.user_id:
|
||||
res[record.id] = record.user_id.name
|
||||
continue
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'name': fields.function(_get_name, type='char', size=200, string="Name", store=True, readonly=True),
|
||||
'assigned_name': fields.char(string="Assigned Name", size=200, required=False),
|
||||
'image': fields.related('user', 'image_small', type='binary', string="Image", readonly=True),
|
||||
'user': fields.many2one("res.users", string="User", select=True, ondelete='cascade'),
|
||||
'image': fields.related('user_id', 'image_small', type='binary', string="Image", readonly=True),
|
||||
'user_id': fields.many2one("res.users", string="User", select=True, ondelete='cascade'),
|
||||
'uuid': fields.char(string="UUID", size=50, select=True),
|
||||
'im_last_received': fields.integer(string="Instant Messaging Last Received Message"),
|
||||
'im_last_status': fields.boolean(strint="Instant Messaging Last Status"),
|
||||
|
@ -283,3 +265,8 @@ class im_user(osv.osv):
|
|||
'im_last_status': False,
|
||||
'im_last_status_update': lambda *args: datetime.datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||
}
|
||||
|
||||
_sql_constraints = [
|
||||
('user_uniq', 'unique (user_id)', 'Only one chat user per OpenERP user.'),
|
||||
('uuid_uniq', 'unique (uuid)', 'Chat identifier already used.'),
|
||||
]
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<field name="name">Can only read messages that you sent or messages sent to you</field>
|
||||
<field name="model_id" ref="model_im_message"/>
|
||||
<field name="groups" eval="[(6,0,[ref('base.group_user')])]"/>
|
||||
<field name="domain_force">["|", ('to_id.user', '=', user.id), ('from_id.user', '=', user.id)]</field>
|
||||
<field name="domain_force">["|", ('to_id.user_id', '=', user.id), ('from_id.user_id', '=', user.id)]</field>
|
||||
<field name="perm_unlink" eval="0"/>
|
||||
<field name="perm_write" eval="0"/>
|
||||
<field name="perm_read" eval="1"/>
|
||||
|
@ -16,11 +16,11 @@
|
|||
<field name="name">Can only modify your user</field>
|
||||
<field name="model_id" ref="model_im_user"/>
|
||||
<field name="groups" eval="[(6,0,[ref('base.group_user')])]"/>
|
||||
<field name="domain_force">[('user', '=', user.id)]</field>
|
||||
<field name="perm_unlink" eval="0"/>
|
||||
<field name="domain_force">[('user_id', '=', user.id)]</field>
|
||||
<field name="perm_unlink" eval="1"/>
|
||||
<field name="perm_write" eval="1"/>
|
||||
<field name="perm_read" eval="0"/>
|
||||
<field name="perm_create" eval="0"/>
|
||||
<field name="perm_create" eval="1"/>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -85,9 +85,8 @@
|
|||
search_changed: function(e) {
|
||||
var users = new instance.web.Model("im.user");
|
||||
var self = this;
|
||||
return this.user_search_dm.add(users.call("search_users",
|
||||
[[["name", "ilike", this.get("current_search")], ["id", "<>", instance.session.uid]],
|
||||
["name", "user", "uuid", "im_status"], USERS_LIMIT], {context:new instance.web.CompoundContext()})).then(function(result) {
|
||||
return this.user_search_dm.add(users.call("search_users", [this.get("current_search"), ["name", "user_id", "uuid", "im_status"],
|
||||
USERS_LIMIT], {context:new instance.web.CompoundContext()})).then(function(result) {
|
||||
self.c_manager.add_to_user_cache(result);
|
||||
self.$(".oe_im_input").val("");
|
||||
var old_users = self.users;
|
||||
|
|
|
@ -32,13 +32,8 @@ function declare($, _, openerp) {
|
|||
im_common.ImUser = openerp.Class.extend(openerp.PropertiesMixin, {
|
||||
init: function(parent, user_rec) {
|
||||
openerp.PropertiesMixin.init.call(this, parent);
|
||||
user_rec.image_url = im_common.connection.url("/im/static/src/img/avatar/avatar.jpeg");
|
||||
|
||||
// TODO : check it works correctly
|
||||
if (user_rec.user)
|
||||
user_rec.image_url = im_common.connection.url('/web/binary/image', {model:'res.users', field: 'image_small', id: user_rec.user[0]});
|
||||
/*if (user_rec.image)
|
||||
user_rec.image_url = "data:image/png;base64," + user_rec.image;*/
|
||||
|
||||
user_rec.image_url = im_common.connection.url('/web/binary/image', {model:'im.user', field: 'image', id: user_rec.id});
|
||||
|
||||
this.set(user_rec);
|
||||
this.set("watcher_count", 0);
|
||||
|
@ -97,34 +92,27 @@ function declare($, _, openerp) {
|
|||
},
|
||||
start_polling: function() {
|
||||
var self = this;
|
||||
|
||||
var auth_def = null;
|
||||
var user_id = null;
|
||||
var def = $.when();
|
||||
var uuid = false;
|
||||
|
||||
if (this.options.anonymous_mode) {
|
||||
var uuid = localStorage["oe_livesupport_uuid"];
|
||||
var def = $.when(uuid);
|
||||
uuid = localStorage["oe_livesupport_uuid"] || false;
|
||||
|
||||
if (! uuid) {
|
||||
def = im_common.connection.rpc("/longpolling/im/gen_uuid", {});
|
||||
def = im_common.connection.rpc("/longpolling/im/gen_uuid", {}).then(function(my_uuid) {
|
||||
uuid = my_uuid;
|
||||
localStorage["oe_livesupport_uuid"] = uuid;
|
||||
});
|
||||
}
|
||||
var anonymous_user_id = null;
|
||||
auth_def = def.then(function(uuid) {
|
||||
localStorage["oe_livesupport_uuid"] = uuid;
|
||||
return im_common.connection.model("im.user").call("get_by_user_id", [uuid]);
|
||||
}).then(function(my_id) {
|
||||
user_id = my_id["id"];
|
||||
def = def.then(function() {
|
||||
return im_common.connection.model("im.user").call("assign_name", [uuid, self.options.userName]);
|
||||
});
|
||||
} else {
|
||||
auth_def = im_common.connection.model("im.user").call("get_by_user_id",
|
||||
[im_common.connection.uid]).then(function(my_id) {
|
||||
user_id = my_id["id"];
|
||||
});
|
||||
}
|
||||
|
||||
return auth_def.then(function() {
|
||||
self.my_id = user_id;
|
||||
return def.then(function() {
|
||||
return im_common.connection.model("im.user").call("get_my_id", [uuid]);
|
||||
}).then(function(my_user_id) {
|
||||
self.my_id = my_user_id;
|
||||
return self.ensure_users([self.my_id]);
|
||||
}).then(function() {
|
||||
var me = self.users_cache[self.my_id];
|
||||
|
|
|
@ -161,9 +161,9 @@ class im_livechat_channel(osv.osv):
|
|||
|
||||
def get_available_user(self, cr, uid, channel_id, context=None):
|
||||
channel = self.browse(cr, openerp.SUPERUSER_ID, channel_id, context=context)
|
||||
im_user_ids = self.pool.get("im.user").search(cr, uid, [["user_id", "in", [user.id for user in channel.user_ids]]], context=context)
|
||||
users = []
|
||||
for user in channel.user_ids:
|
||||
iuid = self.pool.get("im.user").get_by_user_id(cr, uid, user.id, context=context)["id"]
|
||||
for iuid in im_user_ids:
|
||||
imuser = self.pool.get("im.user").browse(cr, uid, iuid, context=context)
|
||||
if imuser.im_status:
|
||||
users.append(imuser)
|
||||
|
@ -206,12 +206,12 @@ class im_message(osv.osv):
|
|||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
res[record.id] = False
|
||||
if record.to_id.user and record.from_id.user:
|
||||
if record.to_id.user_id and record.from_id.user_id:
|
||||
continue
|
||||
elif record.to_id.user:
|
||||
res[record.id] = record.to_id.user.id
|
||||
elif record.from_id.user:
|
||||
res[record.id] = record.from_id.user.id
|
||||
elif record.to_id.user_id:
|
||||
res[record.id] = record.to_id.user_id.id
|
||||
elif record.from_id.user_id:
|
||||
res[record.id] = record.from_id.user_id.id
|
||||
return res
|
||||
|
||||
def _customer(self, cr, uid, ids, name, arg, context=None):
|
||||
|
@ -230,11 +230,11 @@ class im_message(osv.osv):
|
|||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
res[record.id] = False
|
||||
if not not record.to_id.user and not not record.from_id.user:
|
||||
if not not record.to_id.user_id and not not record.from_id.user_id:
|
||||
continue
|
||||
elif not not record.to_id.user:
|
||||
elif not not record.to_id.user_id:
|
||||
res[record.id] = "c2s"
|
||||
elif not not record.from_id.user:
|
||||
elif not not record.from_id.user_id:
|
||||
res[record.id] = "s2c"
|
||||
return res
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@
|
|||
<field name="name">History</field>
|
||||
<field name="res_model">im.message</field>
|
||||
<field name="view_mode">list</field>
|
||||
<field name="domain">["|", ('to_id.user', '=', None), ('from_id.user', '=', None)]</field>
|
||||
<field name="domain">["|", ('to_id.user_id', '=', None), ('from_id.user_id', '=', None)]</field>
|
||||
</record>
|
||||
<menuitem name="History" parent="im_livechat" id="history" action="action_history" groups="group_im_livechat_manager"/>
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
<field name="name">Live Support Managers can read messages from live support</field>
|
||||
<field name="model_id" ref="im.model_im_message"/>
|
||||
<field name="groups" eval="[(6,0,[ref('im_livechat.group_im_livechat_manager')])]"/>
|
||||
<field name="domain_force">["|", ('to_id.user', '=', None), ('from_id.user', '=', None)]</field>
|
||||
<field name="domain_force">["|", ('to_id.user_id', '=', None), ('from_id.user_id', '=', None)]</field>
|
||||
<field name="perm_unlink" eval="0"/>
|
||||
<field name="perm_write" eval="0"/>
|
||||
<field name="perm_read" eval="1"/>
|
||||
|
|
Loading…
Reference in New Issue