1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-04-27 19:05:16 +00:00

Add message reply notification

This commit is contained in:
xiez 2012-08-08 20:16:00 +08:00
parent 0477081eb4
commit 0305c3245f
5 changed files with 82 additions and 12 deletions

View File

@ -1,7 +1,15 @@
import datetime
import os
import re
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from seaserv import get_group_members
from shortcuts import get_first_object_or_none
from notifications.models import UserNotification
from profile.models import Profile
class GroupMessage(models.Model):
group_id = models.IntegerField(db_index=True)
@ -14,3 +22,45 @@ class MessageReply(models.Model):
from_email = models.EmailField()
message = models.CharField(max_length=150)
timestamp = models.DateTimeField(default=datetime.datetime.now)
@receiver(post_save, sender=MessageReply)
def msgreply_save_handler(sender, instance, **kwargs):
"""
Handl sending notification to '@<user>' when reply messages.
"""
from_email = instance.from_email
reply_msg = instance.message
group_msg = instance.reply_to
to_user = ''
at_pattern = re.compile(r'(\s|^)(@\w+)', flags=re.U)
m = re.match(at_pattern, reply_msg)
if m:
nickname_or_emailprefix = m.group()[1:]
p = get_first_object_or_none(\
Profile.objects.filter(nickname=nickname_or_emailprefix))
if p:
to_user = p.user
else:
# Match email prefix in group members.
group_members = get_group_members(group_msg.group_id)
for m in group_members:
if m.user_name.startswith(nickname_or_emailprefix):
to_user = m.user_name
break
if to_user and to_user != from_email:
# Send notification to the user if user replies someone else'
# message.
try:
UserNotification.objects.get(to_user=to_user,
msg_type='grpmsg_reply',
detail=group_msg.id)
except UserNotification.DoesNotExist:
n = UserNotification(to_user=to_user,
msg_type='grpmsg_reply',
detail=group_msg.id)
n.save()

View File

@ -1,14 +1,15 @@
# encoding: utf-8
import simplejson as json
from django.core.urlresolvers import reverse
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.http import HttpResponse, HttpResponseRedirect, Http404, \
HttpResponseBadRequest
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from auth.decorators import login_required
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, get_repo, \
get_group_repoids, check_group_staff, get_commits, get_personal_groups, \
get_group
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \
get_repo, get_group_repoids, check_group_staff, get_commits, \
get_personal_groups, get_group, get_group_members
from pysearpc import SearpcError
from models import GroupMessage, MessageReply
@ -153,7 +154,7 @@ def render_group_info(request, group_id, form):
else:
is_staff = False
members = ccnet_threaded_rpc.get_group_members(group_id_int)
members = get_group_members(group_id_int)
managers = []
common_members = []
for member in members:
@ -228,6 +229,8 @@ def render_group_info(request, group_id, form):
@login_required
def msg_reply(request, msg_id):
"""Show group message replies, and process message reply in ajax"""
content_type = 'application/json; charset=utf-8'
if request.is_ajax():
if request.method == 'POST':
form = MessageReplyForm(request.POST)
@ -238,7 +241,7 @@ def msg_reply(request, msg_id):
try:
group_msg = GroupMessage.objects.get(id=msg_id)
except GroupMessage.DoesNotExist:
return HttpResponse(status=400)
return HttpResponseBadRequest(content_type=content_type)
msg_reply = MessageReply()
msg_reply.reply_to = group_msg
@ -251,10 +254,6 @@ def msg_reply(request, msg_id):
grpmsg_reply_added.send(sender=MessageReply,
msg_id=msg_id,
from_email=request.user.username)
content_type = 'application/json; charset=utf-8'
try:
msg = GroupMessage.objects.get(id=msg_id)
except GroupMessage.DoesNotExist:

12
shortcuts.py Normal file
View File

@ -0,0 +1,12 @@
#!/usr/bin/env python
# encoding: utf-8
def get_first_object_or_none(queryset):
"""
A shortcut to obtain the first object of a queryset if it exists or None
otherwise.
"""
try:
return queryset[:1][0]
except IndexError:
return None

View File

@ -5,7 +5,8 @@ from service import ccnet_rpc, monitor_rpc, seafserv_rpc, \
from service import send_command
from service import get_emailusers
from service import get_org_groups, get_personal_groups, get_group_repoids, \
check_group_staff, remove_group_user, get_group, get_org_id_by_group
check_group_staff, remove_group_user, get_group, get_org_id_by_group, \
get_group_members
from service import get_repos, get_repo, get_commits, get_branches, \
get_org_repos, is_repo_owner, create_org_repo
from service import get_binding_peerids, is_valid_filename

View File

@ -139,6 +139,14 @@ def get_personal_groups(email):
return personal_groups
def get_group_members(group_id):
group_id_int = int(group_id)
try:
members = ccnet_threaded_rpc.get_group_members(group_id_int)
except SearpcError:
members = []
return members
def get_org_id_by_group(group_id):
try:
org_id = ccnet_threaded_rpc.get_org_id_by_group(group_id)