[MERGE] from chm

bzr revid: fva@openerp.com-20121029135202-jjq6v9u2sm06aum0
This commit is contained in:
Frédéric van der Essen 2012-10-29 14:52:02 +01:00
commit cdbafaa06f
7 changed files with 66 additions and 67 deletions

View File

@ -1151,7 +1151,7 @@ rule or repeating pattern of time to exclude from the recurring rule."),
context = {}
result = []
for data in super(calendar_event, self).read(cr, uid, select, context=context):
for data in super(calendar_event, self).read(cr, uid, select, ['rrule', 'exdate', 'exrule', 'date'], context=context):
if not data['rrule']:
result.append(data['id'])
continue

View File

@ -89,7 +89,6 @@ Main Features
'static/lib/jquery.expander/jquery.expander.js',
'static/src/js/mail.js',
'static/src/js/mail_followers.js',
'static/src/js/mail_uploader.js',
],
'qweb': [
'static/src/xml/mail.xml',

View File

@ -84,10 +84,16 @@ class mail_notification(osv.Model):
return False
def set_message_read(self, cr, uid, msg_ids, read=None, context=None):
""" TDE note: add a comment, verify method calls, because js seems obfuscated. """
# TDE note: child_of to set unread ?
""" Set a message and its child messages as (un)read for uid.
:param bool read: read / unread
"""
# TDE note: use child_of or front-end send correct values ?
user_pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0]
notif_ids = self.search(cr, uid, [('partner_id', '=', user_pid), ('message_id', 'in', msg_ids)], context=context)
notif_ids = self.search(cr, uid, [
('partner_id', '=', user_pid),
('message_id', 'in', msg_ids)
], context=context)
# all message have notifications: already set them as (un)read
if len(notif_ids) == len(msg_ids):

View File

@ -65,6 +65,7 @@ class mail_message(osv.Model):
def _get_record_name(self, cr, uid, ids, name, arg, context=None):
""" Return the related document name, using name_get. It is done using
SUPERUSER_ID, to be sure to have the record name correctly stored. """
# TDE note: regroup by model/ids, to have less queries to perform
result = dict.fromkeys(ids, False)
for message in self.read(cr, uid, ids, ['model', 'res_id'], context=context):
if not message.get('model') or not message.get('res_id'):
@ -79,10 +80,11 @@ class mail_message(osv.Model):
notif_obj = self.pool.get('mail.notification')
notif_ids = notif_obj.search(cr, uid, [
('partner_id', 'in', [partner_id]),
('message_id', 'in', ids)
('message_id', 'in', ids),
('read', '=', False),
], context=context)
for notif in notif_obj.browse(cr, uid, notif_ids, context=context):
res[notif.message_id.id] = not notif.read
res[notif.message_id.id] = True
return res
def _search_to_read(self, cr, uid, obj, name, domain, context=None):
@ -117,9 +119,9 @@ class mail_message(osv.Model):
help="Message type: email for email message, notification for system "\
"message, comment for other messages such as user replies"),
'email_from': fields.char('From',
help="Email address of the sender, to use if it does not match any partner."),
help="Email address of the sender. This field is set when no matching partner is found for incoming emails."),
'author_id': fields.many2one('res.partner', 'Author',
help="Partner that did write the message. If not set, try to use the From field instead."),
help="Author of the message. If not set, email_from may hold an email address that did not match any partner."),
'partner_ids': fields.many2many('res.partner', string='Recipients'),
'notified_partner_ids': fields.many2many('res.partner', 'mail_notification',
'message_id', 'partner_id', 'Recipients'),
@ -204,6 +206,7 @@ class mail_message(osv.Model):
:param dict message: read result of a mail.message
"""
# TDE note: this method should be optimized, to lessen the number of queries, will be done ASAP
is_author = False
if message['author_id']:
is_author = message['author_id'][0] == self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=None)['partner_id'][0]
@ -321,7 +324,6 @@ class mail_message(osv.Model):
], context=context, limit=self._message_read_more_limit)
if not not_loaded_ids:
continue
# print 'not_loaded_ids', not_loaded_ids
# all_not_loaded_ids += not_loaded_ids
# group childs not read
@ -386,6 +388,7 @@ class mail_message(osv.Model):
ancestors and expandables
:return list: list of message structure for the Chatter widget
"""
# print 'message_read', ids, domain, message_unload_ids, thread_level, context, parent_id, limit
assert thread_level in [0, 1], 'message_read() thread_level should be 0 (flat) or 1 (1 level of thread); given %s.' % thread_level
domain = domain if domain is not None else []
message_unload_ids = message_unload_ids if message_unload_ids is not None else []
@ -458,9 +461,10 @@ class mail_message(osv.Model):
- otherwise: remove the id
"""
# Rules do not apply to administrator
# print '_search', uid, args
if uid == SUPERUSER_ID:
return super(mail_message, self)._search(cr, uid, args, offset=offset, limit=limit, order=order,
context=context, count=count, access_rights_uid=access_rights_uid)
context=context, count=count, access_rights_uid=access_rights_uid)
# Perform a super with count as False, to have the ids, not a counter
ids = super(mail_message, self)._search(cr, uid, args, offset=offset, limit=limit, order=order,
context=context, count=False, access_rights_uid=access_rights_uid)
@ -630,6 +634,8 @@ class mail_message(osv.Model):
# Messaging API
#------------------------------------------------------
# TDE note: this code is not used currently, will be improved in a future merge, when quoted context
# will be added to email send for notifications. Currently only WIP.
MAIL_TEMPLATE = """<div>
% if message:
${display_message(message)}

View File

@ -7,7 +7,7 @@ openerp.mail = function (session) {
openerp_mail_followers(session, mail); // import mail_followers.js
/**
* ------------------------------------------------------------
* ------------------------------------------------------------
* FormView
* ------------------------------------------------------------
*
@ -17,16 +17,15 @@ openerp.mail = function (session) {
session.web.FormView = session.web.FormView.extend({
do_action: function (action) {
console.log(action);
if (action.res_model == 'mail.compose.message') {
/* hack for stop context propagation of wrong value
* delete this hack when a global method to clean context is create
*/
var context_keys = ['default_template_id', 'default_composition_mode',
'default_use_template', 'default_partner_ids', 'default_model',
'default_res_id', 'default_content_subtype', 'active_id', 'lang',
'bin_raw', 'tz', 'active_model', 'edi_web_url_view', 'active_ids', 'default_subject']
'default_res_id', 'default_content_subtype', , 'default_subject',
'default_body', 'active_id', 'lang', 'bin_raw', 'tz',
'active_model', 'edi_web_url_view', 'active_ids']
for (var key in action.context) {
if (_.indexOf(context_keys, key) == -1) {
action.context[key] = null;
@ -40,7 +39,7 @@ openerp.mail = function (session) {
/**
* ------------------------------------------------------------
* ------------------------------------------------------------
* ChatterUtils
* ------------------------------------------------------------
*
@ -53,20 +52,18 @@ openerp.mail = function (session) {
mail.ChatterUtils = {
/**
*Get an image in /web/binary/image?... */
/* Get an image in /web/binary/image?... */
get_image: function (session, model, field, id) {
return session.prefix + '/web/binary/image?session_id=' + session.session_id + '&model=' + model + '&field=' + field + '&id=' + (id || '');
},
/**
*Get the url of an attachment {'id': id} */
/* Get the url of an attachment {'id': id} */
get_attachment_url: function (session, attachment) {
return session.origin + '/web/binary/saveas?session_id=' + session.session_id + '&model=ir.attachment&field=datas&filename_field=datas_fname&id=' + attachment['id'];
},
/**
*Replaces some expressions
* Replaces some expressions
* - :name - shortcut to an image
*/
do_replace_expressions: function (string) {
@ -83,23 +80,23 @@ openerp.mail = function (session) {
return string;
},
/* replace textarea text into html text
* (add <p>, <a>)
* TDE note : should not be here, but server-side I think ...
*/
/**
* Replaces textarea text into html text (add <p>, <a>)
* TDE note : should be done server-side, in Python -> use mail.compose.message ?
*/
get_text2html: function (text) {
return text
.replace(/[\n\r]/g,'<br/>')
.replace(/((?:https?|ftp):\/\/[\S]+)/g,'<a href="$1">$1</a> ')
},
/**
* return the complete domain with "&"
/* Returns the complete domain with "&"
* TDE note: please add some comments to explain how/why
*/
expend_domain: function (domain) {
expand_domain: function (domain) {
var new_domain = [];
var nb_and = -1;
// TDE note: smarted code maybe ?
for ( var k = domain.length-1; k >= 0 ; k-- ) {
if ( typeof domain[k] != 'array' && typeof domain[k] != 'object' ) {
nb_and -= 2;
@ -118,16 +115,15 @@ openerp.mail = function (session) {
/**
* ------------------------------------------------------------
* ------------------------------------------------------------
* ComposeMessage widget
* ------------------------------------------------------------
*
* This widget handles the display of a form to compose a new message.
* This form is a mail.compose.message form_view.
* On first time : display a compact textarea but is not the compose form.
* When the user focus this box, the compose message is intantiate and
* with focus on the textarea.
*/
* On first time : display a compact textarea that is not the compose form.
* When the user focuses the textarea, the compose message is instantiated.
*/
mail.ThreadComposeMessage = session.web.Widget.extend({
template: 'mail.compose_message',
@ -284,7 +280,7 @@ openerp.mail = function (session) {
on_compose_fullmail: function (default_composition_mode) {
if (default_composition_mode == 'reply') {
var context = {
'default_composition_mode': 'reply',
'default_composition_mode': default_composition_mode,
'default_parent_id': this.id,
'default_body': mail.ChatterUtils.get_text2html(this.$el ? (this.$el.find('textarea:not(.oe_compact)').val() || '') : ''),
'default_attachment_ids': this.attachment_ids,
@ -292,10 +288,9 @@ openerp.mail = function (session) {
} else {
var context = {
'default_model': this.context.default_model,
'default_res_model': this.context.default_model,
'default_res_id': this.context.default_res_id,
'default_content_subtype': 'html',
'default_composition_mode': 'comment',
'default_composition_mode': default_composition_mode,
'default_parent_id': this.id,
'default_body': mail.ChatterUtils.get_text2html(this.$el ? (this.$el.find('textarea:not(.oe_compact)').val() || '') : ''),
'default_attachment_ids': this.attachment_ids,
@ -411,7 +406,7 @@ openerp.mail = function (session) {
});
/**
* ------------------------------------------------------------
* ------------------------------------------------------------
* Thread Message Expandable Widget
* ------------------------------------------------------------
*
@ -501,7 +496,7 @@ openerp.mail = function (session) {
});
/**
* ------------------------------------------------------------
* ------------------------------------------------------------
* Thread Message Widget
* ------------------------------------------------------------
* This widget handles the display of a messages in a thread.
@ -588,9 +583,7 @@ openerp.mail = function (session) {
this.ds_follow = new session.web.DataSetSearch(this, 'mail.followers');
},
/**
*Convert date, timerelative and avatar in displayable data.
*/
/* Convert date, timerelative and avatar in displayable data. */
formating_data: function () {
//formating and add some fields for render
@ -618,7 +611,9 @@ openerp.mail = function (session) {
this.$el.hide().fadeIn(750, function () {$(this).css('display', '');});
this.resize_img();
this.bind_events();
this.create_thread();
if(this.thread_level < this.options.display_indented_thread) {
this.create_thread();
}
this.$('.oe_msg_attachments, .oe_msg_images').addClass("oe_hidden");
},
@ -665,11 +660,10 @@ openerp.mail = function (session) {
this.$el.on('click', '.oe_star', this.on_star);
},
/**
* call the on_compose_message on the thread of this message.
*/
/* Call the on_compose_message on the thread of this message. */
on_message_reply:function (event) {
event.stopPropagation();
this.create_thread();
this.thread.on_compose_message();
return false;
},
@ -686,7 +680,7 @@ openerp.mail = function (session) {
},
/**
* instantiate the thread object of this message.
* Instantiate the thread object of this message.
* Each message have only one thread.
*/
create_thread: function () {
@ -924,11 +918,6 @@ openerp.mail = function (session) {
start: function () {
this._super.apply(this, arguments);
if (this.show_compose_message) {
this.instantiate_compose_message();
}
this.bind_events();
},
@ -1117,9 +1106,9 @@ openerp.mail = function (session) {
var message_loaded_ids = this.id ? [this.id].concat( self.get_child_ids() ) : self.get_child_ids();
// CHM note : option for sending in flat mode by server
var nb_indented_thread = this.options.display_indented_thread > this.thread_level ? this.options.display_indented_thread - this.thread_level : 0;
var thread_level = this.options.display_indented_thread > this.thread_level ? this.options.display_indented_thread - this.thread_level : 0;
return this.ds_message.call('message_read', [ids, fetch_domain, message_loaded_ids, nb_indented_thread, fetch_context, this.context.default_parent_id || undefined])
return this.ds_message.call('message_read', [ids, fetch_domain, message_loaded_ids, thread_level, fetch_context, this.context.default_parent_id || undefined])
.then(callback ? _.bind(callback, this, arguments) : this.proxy('switch_new_message'));
},
@ -1204,11 +1193,10 @@ openerp.mail = function (session) {
var sort = (!!self.thread_level || message.id<0);
if (sort) {
if (message_older) {
message.insertAfter(message_older.thread.compose_message ? message_older.thread.compose_message.$el : message_older.thread.$el);
message.insertAfter(message_older.thread ? (message_older.thread.compose_message ? message_older.thread.compose_message.$el : message_older.thread.$el) : message_older.$el);
} else if (message_newer) {
@ -1229,7 +1217,7 @@ openerp.mail = function (session) {
} else if (message_newer) {
message.insertAfter(message_newer.thread.compose_message ? message_newer.thread.compose_message.$el : message_newer.thread.$el);
message.insertAfter(message_newer.thread ? (message_newer.thread.compose_message ? message_newer.thread.compose_message.$el : message_newer.thread.$el) : message_newer.$el );
} else if (message.id < 0) {
@ -1294,8 +1282,8 @@ openerp.mail = function (session) {
if ( msg_up && msg_up.type == "expandable" && msg_down && msg_down.type == "expandable") {
// concat two expandable message and add this message to this dom
msg_up.domain = mail.ChatterUtils.expend_domain( msg_up.domain );
msg_down.domain = mail.ChatterUtils.expend_domain( msg_down.domain );
msg_up.domain = mail.ChatterUtils.expand_domain( msg_up.domain );
msg_down.domain = mail.ChatterUtils.expand_domain( msg_down.domain );
msg_down.domain = ['|','|'].concat( msg_up.domain ).concat( message_dom ).concat( msg_down.domain );
@ -1310,7 +1298,7 @@ openerp.mail = function (session) {
} else if ( msg_up && msg_up.type == "expandable") {
// concat preview expandable message and this message to this dom
msg_up.domain = mail.ChatterUtils.expend_domain( msg_up.domain );
msg_up.domain = mail.ChatterUtils.expand_domain( msg_up.domain );
msg_up.domain = ['|'].concat( msg_up.domain ).concat( message_dom );
msg_up.nb_messages++;
@ -1319,7 +1307,7 @@ openerp.mail = function (session) {
} else if ( msg_down && msg_down.type == "expandable") {
// concat next expandable message and this message to this dom
msg_down.domain = mail.ChatterUtils.expend_domain( msg_down.domain );
msg_down.domain = mail.ChatterUtils.expand_domain( msg_down.domain );
msg_down.domain = ['|'].concat( msg_down.domain ).concat( message_dom );
// it's maybe a message expandable for the max limit read message

View File

@ -115,8 +115,8 @@ openerp_mail_followers = function(session, mail) {
}).pipe(self.proxy('display_generic'));
},
_format_followers: function(count){
console.log('FORMAT FOLLWERS :',count);
function _t(str){return str;}
// TDE note: why redefining _t ?
function _t(str) { return str; }
var str = '';
if(count <= 0){
str = _t('No followers');
@ -125,7 +125,6 @@ openerp_mail_followers = function(session, mail) {
}else{
str = ''+count+' '+_t('followers');
}
console.log('URGH:',str);
return str;
},
/* Display generic info about follower, for people not having access to res_partner */
@ -149,7 +148,8 @@ openerp_mail_followers = function(session, mail) {
record.avatar_url = mail.ChatterUtils.get_image(self.session, 'res.partner', 'image_small', record.id);
$(session.web.qweb.render('mail.followers.partner', {'record': record})).appendTo(node_user_list);
});
if (truncated.length < records.length) { //FIXME USE A TEMPLATE !
// FVA note: be sure it is correctly translated
if (truncated.length < records.length) {
$('<div class="oe_partner">And ' + (records.length - truncated.length) + ' more.</div>').appendTo(node_user_list);
}
},

View File

@ -40,7 +40,7 @@
<div t-if="widget.show_compact_message and !widget.show_composer" t-attf-class="oe_msg oe_msg_composer_compact #{widget.thread_level and widget.options.display_indented_thread > -1 ? 'oe_msg_indented' : ''}">
<textarea class="field_text oe_compact" placeholder="Write a reply..."/>
</div>
<span t-if="!widget.show_compact_message and !widget.show_composer" class="oe_placeholder_self"></span>
<span t-if="!(widget.show_compact_message and !widget.show_composer) and !widget.show_composer" class="oe_placeholder_compose"></span>
</t>
<!--