diff --git a/media/css/seahub.css b/media/css/seahub.css index 69f37d8f52..29d6a1761f 100644 --- a/media/css/seahub.css +++ b/media/css/seahub.css @@ -2703,7 +2703,7 @@ textarea:-moz-placeholder {/* for FF */ padding:2px; margin-bottom:3px; } -#mass-email { +#mass-receiver { width:432px; } /* payments */ diff --git a/seahub/message/message.py b/seahub/message/message.py index 97ed3cf1b0..01fd823fc6 100644 --- a/seahub/message/message.py +++ b/seahub/message/message.py @@ -1,24 +1,27 @@ # -*- coding: utf-8 -*- +from seahub.group.models import GroupMessage +from seahub.notifications.models import UserNotification, MSG_TYPE_GROUP_MSG -def msg_info_list(msgs, user): +def user_msg_info_list(user_msgs, user): """Group message list by ``from_email`` or ``to_email`` and order by - message time. + message time. **Returns** - [ - (u'foo@foo.com', {'last_msg': u'test', 'not_read': 0, 'last_time': datetime.datetime(2013, 5, 27, 13, 26, 7, 423777)}), - (u'bar@bar.com', {'last_msg': u'hello', 'not_read': 0, 'last_time': datetime.datetime(2013, 5, 27, 13, 10, 31, 811318)}), + { + u'foo@foo.com': {'type': u'user', 'last_msg': u'test', 'not_read': 0, 'last_time': datetime.datetime(2013, 5, 27, 13, 26, 7, 423777)}, + u'bar@bar.com', {'type': u'user', 'last_msg': u'hello', 'not_read': 0, 'last_time': datetime.datetime(2013, 5, 27, 13, 10, 31, 811318)}, ... - ] + } """ message = {} - for msg in msgs: + for msg in user_msgs: if (msg.from_email == user): # message user send to others if not message.has_key(msg.to_email): message.setdefault(msg.to_email,{}) + message[msg.to_email].setdefault('type', 'user') message[msg.to_email].setdefault('not_read', 0) message[msg.to_email].setdefault('last_msg',msg.message) message[msg.to_email].setdefault('last_time',msg.timestamp) @@ -30,6 +33,7 @@ def msg_info_list(msgs, user): else: # message others send to the user if not message.has_key(msg.from_email): message.setdefault(msg.from_email,{}) + message[msg.from_email].setdefault('type', 'user') message[msg.from_email].setdefault('not_read',0) message[msg.from_email].setdefault('last_msg',msg.message) message[msg.from_email].setdefault('last_time',msg.timestamp) @@ -41,7 +45,35 @@ def msg_info_list(msgs, user): if not msg.ifread: message[msg.from_email]['not_read'] += 1 - sorted_msg = sorted(message.items(), key=lambda x: x[1]['last_time'], - reverse=True) - return sorted_msg + return message + +def group_msg_info_list(joined_groups, username): + """ + Group message of groups that user joined. + + **Returns** + { + u'test_group': {'type': u'group', 'id': 1, 'not_read': 32, 'last_msg': u'hey', 'last_time': datetime.datetime(2013, 5, 27, 13, 12, 31, 343452)}, + ... + } + """ + message = {} + user_notices = UserNotification.objects.filter(to_user=username, + msg_type=MSG_TYPE_GROUP_MSG) + for g in joined_groups: + group_msg = GroupMessage.objects.filter(group_id=g.id).order_by('-timestamp')[:1] + if len(group_msg) > 0: + message.setdefault(g.group_name,{}) + message[g.group_name].setdefault('type', 'group') + message[g.group_name].setdefault('id', g.id) + message[g.group_name].setdefault('not_read', 0) + message[g.group_name].setdefault('last_msg', group_msg[0].message) + message[g.group_name].setdefault('last_time', group_msg[0].timestamp) + for notice in user_notices: + gid = notice.group_message_detail_to_dict().get('group_id') + if gid == g.id: + if notice.seen is False: + message[g.group_name]['not_read'] += 1 + + return message diff --git a/seahub/message/templates/message/all_msg.html b/seahub/message/templates/message/all_msg.html index 81575f9735..7948c06d89 100644 --- a/seahub/message/templates/message/all_msg.html +++ b/seahub/message/templates/message/all_msg.html @@ -1,12 +1,21 @@ -{% load avatar_tags i18n seahub_tags %} +{% load avatar_tags group_avatar_tags i18n seahub_tags %} {% for key,value in msgs %} {% with not_read=value.not_read %} +{% if value.type == 'user' %} {% avatar key 20 %} {{ key|email2nickname }}{% if not_read > 0%}({{not_read}}){% endif %} {{ value.last_msg|seahub_urlize|truncatewords_html:12 }} {{ value.last_time|translate_seahub_time }} +{% else %} + + {% grp_avatar value.id 20 %} + {{ key }}{% if not_read > 0 %}({{not_read}}){% endif %} + {{ value.last_msg|seahub_urlize|truncatewords_html:12 }} + {{ value.last_time|translate_seahub_time }} + +{% endif %} {% endwith %} {% endfor %} diff --git a/seahub/message/templates/message/all_msg_list.html b/seahub/message/templates/message/all_msg_list.html index 1b26d6d207..d7e21577ed 100644 --- a/seahub/message/templates/message/all_msg_list.html +++ b/seahub/message/templates/message/all_msg_list.html @@ -1,5 +1,5 @@ {% extends "home_base.html" %} -{% load avatar_tags i18n seahub_tags %} +{% load avatar_tags group_avatar_tags i18n seahub_tags %} {% block sub_title %}{% trans "Messages" %}{% if total_unread > 0%}({{total_unread}}){%endif%} - {% endblock %} {% block extra_style %} @@ -25,12 +25,21 @@ {% if msgs %} {% for key,value in msgs %} {% with not_read=value.not_read %} + {% if value.type == 'user' %} {% avatar key 20 %} {{ key|email2nickname }}{% if not_read > 0%}({{not_read}}){% endif %} {{ value.last_msg|seahub_urlize|truncatewords_html:12 }} {{ value.last_time|translate_seahub_time }} + {% else %} + + {% grp_avatar value.id 20 %} + {{ key }}{% if not_read > 0 %}({{not_read}}){% endif %} + {{ value.last_msg|seahub_urlize|truncatewords_html:12 }} + {{ value.last_time|translate_seahub_time }} + + {% endif %} {% endwith %} {% endfor %} {% endif %} @@ -40,7 +49,7 @@
{% csrf_token %}
-
+
@@ -73,26 +82,38 @@ $('#add-msg').click(function() { } popup.removeClass('hide'); $.ajax({ - url:'{% url 'get_contacts' %}', + url:'{% url 'get_contacts_and_groups' %}', cache: false, dataType: 'json', success: function(data) { var contacts = data['contacts'], + groups = data['groups'], opts = '', - email; + email, + name; if (contacts.length > 0) { popup.find('.loading-tip').remove(); $('#send-msg-form').removeClass('hide'); - for(var i = 0, len = contacts.length; i < len; i++) { + var contact_len = contacts.length, group_len = groups.length; + for(var i = 0; i < contact_len; i++) { email = contacts[i].email; - opts += ''; + opts += ''; + } + for (var i = 0; i < group_len; i++) { + name = groups[i].name; + opts += ''; } var format = function(item) { - return contacts[$(item.element).data('index')].avatar + '' + item.text + ''; + var idx = $(item.element).data('index'); + if (idx < contact_len) { + return contacts[idx].avatar + '' + item.text + ''; + } else { + return groups[idx - contact_len].avatar + '' + item.text + ''; + } } - $('#mass-email').html(opts).select2({ - placeholder: "{% trans "send to: click to select contacts" %}", + $('#mass-receiver').html(opts).select2({ + placeholder: "{% trans "send to: click to select contacts/groups" %}", formatResult: format, formatSelection: format, escapeMarkup: function(m) { return m; } @@ -102,7 +123,7 @@ $('#add-msg').click(function() { } }, error: function() { - popup.html('

' + "{% trans "Failed to get your contacts for sending a message." %}" + '

'); + popup.html('

' + "{% trans "Failed to get your contacts/groups for sending a message." %}" + '

'); } }); }); @@ -158,14 +179,25 @@ $('#send-msg-form').submit(function() { form_id = form.attr('id'), msg_input = $('[name="mass_msg"]', form), msg = $.trim(msg_input.val()), - emails = $('[name="mass_email"]', form).val(); + receivers = $('[name="mass_receiver"] option:selected', form); + + var emails = [], + groups = []; + receivers.each(function() { + var type = $(this).data('type'); + if (type == "email") { + emails.push($(this).val()); + } else if (type == "group") { + groups.push($(this).val()); + } + }); if (!msg) { apply_form_error(form_id, "{% trans "message is required" %}"); return false; } - if (!emails) { // val is null or ['xx',...] - apply_form_error(form_id, "{% trans "contact is required" %}"); + if (!emails && !groups) { // val is null or ['xx',...] + apply_form_error(form_id, "{% trans "contact/group is required" %}"); return false; } @@ -185,7 +217,7 @@ $('#send-msg-form').submit(function() { type: 'POST', dataType: 'json', beforeSend: prepareCSRFToken, - data: { 'mass_msg': msg, 'mass_email': emails, 'selected': selected }, + data: { 'mass_msg': msg, 'mass_email': emails, 'mass_group': groups, 'selected': selected }, traditional: true, success: function(data) { msg_input.val(''); diff --git a/seahub/message/templates/message/user_msg_list.html b/seahub/message/templates/message/user_msg_list.html index dc9b009cb7..7a3c254c36 100644 --- a/seahub/message/templates/message/user_msg_list.html +++ b/seahub/message/templates/message/user_msg_list.html @@ -27,15 +27,18 @@