+ {% if request.user.is_staff or msg.from_email == request.user.username %}
+
{% trans "Delete" %}
+ {% endif %}
{{ msg.from_email|email2nickname }}
{{ msg.timestamp|translate_seahub_time }}
@@ -160,6 +163,60 @@ $('#personal-message-form').submit(function() {
});
return false;
});
+
+
+$('.msg-del').click(function() {
+ var msg = $(this).parents('.msg');
+ var cfm;
+ if (msg.find('.msg-del-confirm').length > 0) {
+ cfm = msg.find('.msg-del-confirm');
+ } else {
+ cfm = '
{% trans "Really want to delete this discussion?" %}
';
+ var msg_main = msg.find('.msg-main');
+ var msg_hd = msg.find('.msg-hd');
+ cfm = msg_main.append(cfm).children(':last');
+ cfm.css({'right':msg_main.css('padding-right'), 'top':msg_hd.position().top + msg_hd.height()});
+ }
+ cfm.removeClass('hide');
+ cfm.children('.yes').click(function() {
+ cfm.addClass('hide');
+ $.ajax({
+ url: '{{SITE_ROOT}}user/' + msg.attr('data-id') + '/msgdel/',
+ dataType:'json',
+ success: function(data) {
+ if (data['success']) {
+ msg.remove();
+ feedback('{% trans "Successfully deleted" %}', 'success');
+ } else {
+ feedback('{% trans "Failed to delete: " %}' + data['err_msg'], 'error');
+ }
+ },
+ error: function() {
+ feedback('{% trans "Failed." %}', 'error');
+ }
+ });
+ });
+ cfm.children('.no').click(function() {
+ cfm.addClass('hide');
+ });
+});
+
+$('.msg-main').hover(
+ function(){
+ $(this).find('.op').removeClass('vh');
+ },
+ function(){
+ $(this).find('.op').addClass('vh');
+ }
+);
+$('.msg .op').hover(
+ function() {
+ $(this).css({'text-decoration':'underline'});
+ },
+ function() {
+ $(this).css({'text-decoration':'none'});
+ }
+);
{% include 'snippets/add_to_contacts_js.html' %}
diff --git a/seahub/message/views.py b/seahub/message/views.py
index e63b096d1f..bb5df193e1 100755
--- a/seahub/message/views.py
+++ b/seahub/message/views.py
@@ -14,8 +14,10 @@ from django.utils.translation import ugettext as _
from django.views.decorators.http import require_POST
from models import UserMessage, UserMsgAttachment
-from message import msg_info_list
-from seaserv import get_repo
+from seahub.group.models import GroupMessage, MessageAttachment
+from seahub.group.signals import grpmsg_added
+from message import user_msg_info_list, group_msg_info_list
+from seaserv import get_repo, get_group, is_group_user, get_personal_groups_by_user
from seahub.auth.decorators import login_required
from seahub.base.accounts import User
from seahub.views import is_registered_user
@@ -32,13 +34,16 @@ def message_list(request):
"""
username = request.user.username
- messages = UserMessage.objects.get_messages_related_to_user(username)
- msgs = msg_info_list(messages, username)
-
+ related_user_msgs = UserMessage.objects.get_messages_related_to_user(username)
+ user_msgs = user_msg_info_list(related_user_msgs, username)
total_unread = 0
- for msg in msgs:
+ for msg in user_msgs.items():
total_unread += msg[1]['not_read']
+ joined_groups = get_personal_groups_by_user(username)
+ group_msgs = group_msg_info_list(joined_groups, username)
+
+ msgs = sorted(user_msgs.items() + group_msgs.items(), key=lambda x: x[1]['last_time'], reverse=True)
return render_to_response('message/all_msg_list.html', {
'msgs': msgs,
'total_unread': total_unread,
@@ -108,10 +113,29 @@ def user_msg_list(request, id_or_email):
"to_email": to_email,
}, context_instance=RequestContext(request))
+@login_required
+def user_msg_remove(request, msg_id):
+ """Remove message related to a certain person.
+ """
+ try:
+ msg = UserMessage.objects.get(message_id=msg_id)
+ except UserMessage.DoesNotExist:
+ return HttpResponse(json.dumps({'success': False, 'err_msg':_(u"The message doesn't exist")}),
+ content_type='application/json; charset=utf-8')
+ else:
+ # Test whether user is admin or message owner.
+ if request.user.is_staff or msg.from_email == request.user.username:
+ msg.delete()
+ return HttpResponse(json.dumps({'success': True}),
+ content_type='application/json; charset=utf-8')
+ else:
+ return HttpResponse(json.dumps({'success': False, 'err_msg': _(u"You don't have the permission.")}),
+ content_type='application/json; charset=utf-8')
+
@login_required
@require_POST
def message_send(request):
- """Handle POST request to send message to user(s).
+ """Handle POST request to send message to user(s)/group(s).
"""
if not request.is_ajax() or request.method != 'POST':
@@ -129,12 +153,13 @@ def message_send(request):
mass_msg = request.POST.get('mass_msg')
mass_emails = request.POST.getlist('mass_email') # e.g: [u'1@1.com, u'2@1.com']
+ mass_group_ids = [int(x) for x in request.POST.getlist('mass_group')]
if not mass_msg:
result['error'] = [_(u'message is required')]
return HttpResponse(json.dumps(result), content_type=content_type)
- if not mass_emails:
- result['error'] = [_(u'contact is required')]
+ if not mass_emails and not mass_group_ids:
+ result['error'] = [_(u'contact/group is required')]
return HttpResponse(json.dumps(result), content_type=content_type)
# attachment
@@ -150,9 +175,11 @@ def message_send(request):
att['path'] = item[36:]
attached_items.append(att)
- email_sended = []
+ email_sent = []
+ group_sent = []
errors = []
- msgs = []
+ user_msgs = []
+ group_msgs = []
for to_email in mass_emails:
to_email = to_email.strip()
if not to_email or not is_valid_username(to_email):
@@ -166,26 +193,54 @@ def message_send(request):
errors.append(_(u'Failed to send message to %s, user not found.') % to_email)
continue
- usermsg = UserMessage.objects.add_unread_message(username, to_email, mass_msg)
- msgs.append(usermsg)
+ user_msg = UserMessage.objects.add_unread_message(username, to_email, mass_msg)
+ user_msgs.append(user_msg)
if len(attached_items) > 0:
for att_item in attached_items:
repo_id = att_item['repo_id']
path = att_item['path']
pfds = PrivateFileDirShare.objects.add_read_only_priv_file_share(
username, to_email, repo_id, path)
- UserMsgAttachment.objects.add_user_msg_attachment(usermsg, pfds)
+ UserMsgAttachment.objects.add_user_msg_attachment(user_msg, pfds)
- email_sended.append(to_email)
+ email_sent.append(to_email)
+
+ joined_groups = []
+ for group_id in mass_group_ids:
+ group = get_group(group_id)
+ if not group:
+ continue
+ joined_groups.append(group)
+
+ if not is_group_user(group_id, username):
+ errors.append(_(u'You can not send message to group %s, you didn\'t join in.') % group.name)
+ continue
+
+ group_msg = GroupMessage(group_id=group_id, from_email=username, message=mass_msg)
+ group_msg.save()
+ grpmsg_added.send(sender=GroupMessage, group_id=group_id, from_email=username)
+ group_msgs.append(group_msg)
+ if len(attached_items) > 0:
+ for att_item in attached_items:
+ repo_id = att_item['repo_id']
+ path = att_item['path']
+ ma = MessageAttachment(group_message=group_msg, repo_id=repo_id,
+ attach_type='file', path=path,
+ src='recommend')
+ ma.save()
+
+ group_sent.append(group_id)
html = ''
- if email_sended:
+ if email_sent or group_sent:
ctx = {}
if fr == 'all': # from 'all_msg_list' page
- ctx['msgs'] = msg_info_list(msgs, username)
- html = render_to_string('message/all_msg.html', ctx)
+ user_msgs = user_msg_info_list(user_msgs, username)
+ group_msgs = group_msg_info_list(joined_groups, username)
+ ctx['msgs'] = sorted(user_msgs.items() + group_msgs.items(), key=lambda x: x[1]['last_time'], reverse=True)
+ html = render_to_string('message/all_msg.html', ctx, context_instance=RequestContext(request))
else:
- ctx['msg'] = msgs[0]
+ ctx['msg'] = user_msgs[0]
html = render_to_string('message/user_msg.html', ctx)
return HttpResponse(json.dumps({"html": html, "error": errors}), content_type=content_type)
else:
diff --git a/seahub/urls.py b/seahub/urls.py
index bae6ab9a12..75ca8ca65e 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -10,7 +10,7 @@ from seahub.views.file import view_file, view_history_file, view_trash_file,\
from seahub.views.repo import repo, repo_history_view
from notifications.views import notification_list
from group.views import group_list
-from message.views import user_msg_list
+from message.views import user_msg_list, user_msg_remove
from share.views import user_share_list, gen_private_file_share, \
rm_private_file_share, save_private_file_share
from seahub.views.wiki import personal_wiki, personal_wiki_pages, \
@@ -109,6 +109,7 @@ urlpatterns = patterns('',
(r'^seafile_access_check/$', seafile_access_check),
url(r'^convert_cmmt_desc_link/$', convert_cmmt_desc_link, name='convert_cmmt_desc_link'),
url(r'^user/(?P
[^/]+)/msgs/$', user_msg_list, name='user_msg_list'),
+ url(r'^user/(?P\d+)/msgdel/$', user_msg_remove, name='user_msg_remove'),
url(r'^user/(?P[^/]+)/shares/$', user_share_list, name='user_share_list'),
url(r'^modules/toggle/$', toggle_modules, name="toggle_modules"),
url(r'^download_client_program/$', TemplateView.as_view(template_name="download.html"), name="download_client"),
@@ -145,7 +146,7 @@ urlpatterns = patterns('',
url(r'^ajax/my-unenc-repos/$', get_my_unenc_repos, name='get_my_unenc_repos'),
url(r'^ajax/unenc-rw-repos/$', unenc_rw_repos, name='unenc_rw_repos'),
- url(r'^ajax/contacts/$', get_contacts, name='get_contacts'),
+ url(r'^ajax/contacts_and_groups/$', get_contacts_and_groups, name='get_contacts_and_groups'),
url(r'^ajax/upload-file-done/$', upload_file_done, name='upload_file_done'),
url(r'^ajax/unseen-notices-count/$', unseen_notices_count, name='unseen_notices_count'),
url(r'^ajax/space_and_traffic/$', space_and_traffic, name='space_and_traffic'),
diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py
index dcdc64779f..7b4261418c 100644
--- a/seahub/views/ajax.py
+++ b/seahub/views/ajax.py
@@ -15,7 +15,7 @@ import seaserv
from seaserv import seafile_api, seafserv_rpc, \
get_related_users_by_repo, get_related_users_by_org_repo, \
is_org_repo_owner, CALC_SHARE_USAGE, seafserv_threaded_rpc, \
- get_user_quota_usage, get_user_share_usage
+ get_user_quota_usage, get_user_share_usage, get_personal_groups_by_user
from pysearpc import SearpcError
from seahub.auth.decorators import login_required
@@ -900,7 +900,7 @@ def repo_unstar_file(request, repo_id):
########## contacts related
@login_required
-def get_contacts(request):
+def get_contacts_and_groups(request):
if not request.is_ajax():
raise Http404
@@ -913,7 +913,12 @@ def get_contacts(request):
for c in contacts:
contact_list.append({"email": c.contact_email, "avatar": avatar(c.contact_email, 16)})
- return HttpResponse(json.dumps({"contacts":contact_list}), content_type=content_type)
+ joined_groups = get_personal_groups_by_user(username)
+ group_list = []
+ from seahub.avatar.templatetags.group_avatar_tags import grp_avatar
+ for g in joined_groups:
+ group_list.append({"id": g.id, "name": g.group_name, "avatar": grp_avatar(g.id, 16)})
+ return HttpResponse(json.dumps({"contacts":contact_list, "groups":group_list}), content_type=content_type)
@login_required
def get_current_commit(request, repo_id):