diff --git a/group/models.py b/group/models.py index b97a5812e3..afa8c966de 100644 --- a/group/models.py +++ b/group/models.py @@ -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 '@' 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() + + + diff --git a/group/views.py b/group/views.py index a5f870bfac..4e3f77fd11 100644 --- a/group/views.py +++ b/group/views.py @@ -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: diff --git a/shortcuts.py b/shortcuts.py new file mode 100644 index 0000000000..942f5f91ba --- /dev/null +++ b/shortcuts.py @@ -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 diff --git a/thirdpart/seaserv/__init__.py b/thirdpart/seaserv/__init__.py index 6407bbe1e1..922c3aaccf 100644 --- a/thirdpart/seaserv/__init__.py +++ b/thirdpart/seaserv/__init__.py @@ -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 diff --git a/thirdpart/seaserv/service.py b/thirdpart/seaserv/service.py index 9e132e733a..d603d41163 100644 --- a/thirdpart/seaserv/service.py +++ b/thirdpart/seaserv/service.py @@ -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)