mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-22 20:08:19 +00:00
263 lines
9.2 KiB
Python
Executable File
263 lines
9.2 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
import os
|
|
import datetime
|
|
import simplejson as json
|
|
from django.http import HttpResponse, HttpResponseRedirect, Http404
|
|
from django.shortcuts import render_to_response
|
|
from django.template.loader import render_to_string
|
|
from django.core.urlresolvers import reverse
|
|
from django.template import RequestContext
|
|
from django.core.paginator import EmptyPage, InvalidPage
|
|
from django.utils.translation import ugettext as _
|
|
|
|
from models import UserMessage, UserMsgAttachment
|
|
from message import msg_info_list
|
|
from seahub.auth.decorators import login_required, login_required_ajax
|
|
from seahub.base.accounts import User
|
|
from seahub.base.decorators import user_mods_check
|
|
from seahub.views import is_registered_user
|
|
from seahub.share.models import PrivateFileDirShare
|
|
from seahub.utils import is_valid_username
|
|
from seahub.utils.paginator import Paginator
|
|
from seahub.notifications.models import UserNotification
|
|
|
|
@login_required
|
|
@user_mods_check
|
|
def message_list(request):
|
|
"""List and group messages related to the user, including he/she send to
|
|
others and others send to he/she.
|
|
"""
|
|
username = request.user.username
|
|
|
|
messages = UserMessage.objects.get_messages_related_to_user(username)
|
|
msgs = msg_info_list(messages, username)
|
|
|
|
total_unread = 0
|
|
for msg in msgs:
|
|
total_unread += msg[1]['not_read']
|
|
|
|
return render_to_response('message/all_msg_list.html', {
|
|
'msgs': msgs,
|
|
'total_unread': total_unread,
|
|
}, context_instance=RequestContext(request))
|
|
|
|
@login_required
|
|
@user_mods_check
|
|
def user_msg_list(request, id_or_email):
|
|
"""List messages related to a certain person.
|
|
"""
|
|
try:
|
|
uid = int(id_or_email)
|
|
try:
|
|
user = User.objects.get(id=uid)
|
|
except User.DoesNotExist:
|
|
user = None
|
|
if not user:
|
|
return render_to_response("user_404.html",{},
|
|
context_instance=RequestContext(request))
|
|
to_email = user.email
|
|
except ValueError:
|
|
to_email = id_or_email
|
|
|
|
username = request.user.username
|
|
if username == to_email:
|
|
return HttpResponseRedirect(reverse('edit_profile'))
|
|
|
|
msgs = UserMessage.objects.get_messages_between_users(username, to_email)
|
|
if msgs:
|
|
# update ``ifread`` field of messages
|
|
UserMessage.objects.update_unread_messages(to_email, username)
|
|
|
|
attachments = UserMsgAttachment.objects.list_attachments_by_user_msgs(msgs)
|
|
for msg in msgs:
|
|
msg.attachments = []
|
|
for att in attachments:
|
|
if att.user_msg != msg:
|
|
continue
|
|
|
|
pfds = att.priv_file_dir_share
|
|
if pfds is None: # in case that this attachment is unshared.
|
|
continue
|
|
|
|
att.repo_id = pfds.repo_id
|
|
att.path = pfds.path
|
|
att.name = os.path.basename(pfds.path.rstrip('/'))
|
|
att.token = pfds.token
|
|
msg.attachments.append(att)
|
|
|
|
'''paginate'''
|
|
paginator = Paginator(msgs, 15)
|
|
# Make sure page request is an int. If not, deliver first page.
|
|
try:
|
|
page = int(request.GET.get('page', '1'))
|
|
except ValueError:
|
|
page = 1
|
|
|
|
# If page request (9999) is out of range, deliver last page of results.
|
|
try:
|
|
person_msgs = paginator.page(page)
|
|
except (EmptyPage, InvalidPage):
|
|
person_msgs = paginator.page(paginator.num_pages)
|
|
person_msgs.page_range = paginator.get_page_range(person_msgs.number)
|
|
person_msgs.object_list = list(person_msgs.object_list)
|
|
|
|
UserNotification.objects.seen_user_msg_notices(username, to_email)
|
|
return render_to_response("message/user_msg_list.html", {
|
|
"person_msgs": person_msgs,
|
|
"to_email": to_email,
|
|
}, context_instance=RequestContext(request))
|
|
|
|
@login_required_ajax
|
|
def user_msg_remove(request, msg_id):
|
|
"""Remove sent message.
|
|
"""
|
|
json_ct = 'application/json; charset=utf-8'
|
|
|
|
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=json_ct)
|
|
else:
|
|
# Test whether user is admin or message owner.
|
|
if msg.from_email == request.user.username:
|
|
msg.sender_deleted_at = datetime.datetime.now()
|
|
msg.save()
|
|
return HttpResponse(json.dumps({'success': True}),
|
|
content_type=json_ct)
|
|
else:
|
|
return HttpResponse(json.dumps({
|
|
'success': False,
|
|
'err_msg': _(u"You don't have the permission.")
|
|
}), content_type=json_ct)
|
|
|
|
@login_required_ajax
|
|
def user_received_msg_remove(request, msg_id):
|
|
"""Remove received message.
|
|
"""
|
|
json_ct = 'application/json; charset=utf-8'
|
|
|
|
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=json_ct)
|
|
else:
|
|
# Test whether current user is the recipient of this msg.
|
|
if msg.to_email == request.user.username:
|
|
msg.recipient_deleted_at = datetime.datetime.now()
|
|
msg.save()
|
|
return HttpResponse(json.dumps({'success': True}),
|
|
content_type=json_ct)
|
|
else:
|
|
return HttpResponse(json.dumps({
|
|
'success': False,
|
|
'err_msg': _(u"You don't have the permission."),
|
|
}), content_type=json_ct)
|
|
|
|
@login_required_ajax
|
|
def message_send(request):
|
|
"""Handle POST request to send message to user(s).
|
|
"""
|
|
|
|
if request.method != 'POST':
|
|
raise Http404
|
|
|
|
content_type = 'application/json; charset=utf-8'
|
|
result = {}
|
|
|
|
username = request.user.username
|
|
|
|
fr = request.GET.get('from')
|
|
if not fr:
|
|
result['error'] = [_(u'Argument missing')]
|
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
|
|
|
mass_msg = request.POST.get('mass_msg')
|
|
mass_emails = request.POST.getlist('mass_email') # e.g: [u'1@1.com, u'2@1.com']
|
|
|
|
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')]
|
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
|
|
|
# attachment
|
|
selected = request.POST.getlist('selected') # selected files & dirs: [u'<repo_id><path>', ...]
|
|
attached_items = []
|
|
if len(selected) > 0:
|
|
for item in selected:
|
|
if item[-1] == '/': # dir is not allowed, for now
|
|
continue
|
|
|
|
att = {}
|
|
att['repo_id'] = item[0:36]
|
|
att['path'] = item[36:]
|
|
attached_items.append(att)
|
|
|
|
email_sended = []
|
|
errors = []
|
|
msgs = []
|
|
for to_email in mass_emails:
|
|
to_email = to_email.strip()
|
|
if not to_email or not is_valid_username(to_email):
|
|
continue
|
|
|
|
if to_email == username:
|
|
errors.append(_(u'You can not send message to yourself.'))
|
|
continue
|
|
|
|
if not is_registered_user(to_email):
|
|
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)
|
|
usermsg.attachments = []
|
|
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)
|
|
att = UserMsgAttachment.objects.add_user_msg_attachment(usermsg, pfds)
|
|
|
|
att.repo_id = repo_id
|
|
att.path = path
|
|
att.name = os.path.basename(path.rstrip('/'))
|
|
att.token = pfds.token
|
|
usermsg.attachments.append(att)
|
|
|
|
msgs.append(usermsg)
|
|
email_sended.append(to_email)
|
|
|
|
html = ''
|
|
if email_sended:
|
|
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)
|
|
else:
|
|
ctx['msg'] = msgs[0]
|
|
html = render_to_string('message/user_msg.html', ctx, context_instance=RequestContext(request))
|
|
return HttpResponse(json.dumps({"html": html, "error": errors}), content_type=content_type)
|
|
else:
|
|
return HttpResponse(json.dumps({"html": html, "error": errors}), status=400, content_type=content_type)
|
|
|
|
|
|
@login_required_ajax
|
|
def msg_count(request):
|
|
"""Count user's unread message.
|
|
"""
|
|
content_type = 'application/json; charset=utf-8'
|
|
username = request.user.username
|
|
|
|
count = UserMessage.objects.count_unread_messages_by_user(username)
|
|
result = {}
|
|
result['count'] = count
|
|
return HttpResponse(json.dumps(result), content_type=content_type)
|