1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-26 07:22:34 +00:00

notice group member when share library to group

This commit is contained in:
lian
2016-04-29 11:07:48 +08:00
parent 5a52ad7168
commit db81d636b8
9 changed files with 194 additions and 90 deletions

View File

@@ -17,7 +17,8 @@ from seahub.api2.throttling import UserRateThrottle
from seahub.api2.utils import api_error
from seahub.base.templatetags.seahub_tags import email2nickname
from seahub.base.accounts import User
from seahub.share.signals import share_repo_to_user_successful
from seahub.share.signals import share_repo_to_user_successful, \
share_repo_to_group_successful
from seahub.utils import (is_org_context, is_valid_username,
send_perm_audit_msg)
@@ -345,6 +346,9 @@ class DirSharedItemsEndpoint(APIView):
seafile_api.set_group_repo(shared_repo.repo_id, gid,
username, permission)
share_repo_to_group_successful.send(sender=None,
from_user=username, group_id=gid, repo=shared_repo)
result['success'].append({
"share_type": "group",
"group_info": {

View File

@@ -22,7 +22,7 @@ from django.contrib.auth.hashers import check_password
from django.contrib.sites.models import RequestSite
from django.db import IntegrityError
from django.db.models import F, Q
from django.http import HttpResponse, Http404
from django.http import HttpResponse
from django.template import RequestContext
from django.template.loader import render_to_string
from django.template.defaultfilters import filesizeformat
@@ -40,31 +40,24 @@ from .utils import get_diff_details, \
api_repo_user_folder_perm_check, api_repo_setting_permission_check, \
api_repo_group_folder_perm_check
from seahub.avatar.settings import AVATAR_DEFAULT_SIZE
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, avatar
from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
grp_avatar
from seahub.base.accounts import User
from seahub.base.models import FileDiscuss, UserStarredFiles, DeviceToken
from seahub.base.models import UserStarredFiles, DeviceToken
from seahub.base.templatetags.seahub_tags import email2nickname, \
translate_commit_desc, translate_seahub_time, translate_commit_desc_escape
from seahub.group.models import GroupMessage, MessageReply, MessageAttachment
from seahub.group.signals import grpmsg_added
from seahub.group.views import group_check, remove_group_common, \
translate_seahub_time, translate_commit_desc_escape
from seahub.group.views import remove_group_common, \
rename_group_with_new_name, is_group_staff
from seahub.group.utils import BadGroupNameError, ConflictGroupNameError, \
validate_group_name
from seahub.thumbnail.utils import generate_thumbnail
from seahub.message.models import UserMessage
from seahub.notifications.models import UserNotification
from seahub.options.models import UserOptions
from seahub.contacts.models import Contact
from seahub.profile.models import Profile, DetailedProfile
from seahub.shortcuts import get_first_object_or_none
from seahub.signals import (repo_created, repo_deleted)
from seahub.share.models import FileShare, OrgFileShare, UploadLinkShare
from seahub.share.signals import share_repo_to_user_successful
from seahub.share.views import list_shared_repos
from seahub.utils import gen_file_get_url, gen_token, gen_file_upload_url, \
check_filename_with_rename, is_valid_username, EVENTS_ENABLED, \
get_user_events, EMPTY_SHA1, get_ccnet_server_addr_port, is_pro_version, \
@@ -75,11 +68,11 @@ from seahub.utils import gen_file_get_url, gen_token, gen_file_upload_url, \
from seahub.utils.devices import get_user_devices, do_unlink_device
from seahub.utils.repo import get_sub_repo_abbrev_origin_path
from seahub.utils.star import star_file, unstar_file
from seahub.utils.file_types import IMAGE, DOCUMENT
from seahub.utils.file_types import DOCUMENT
from seahub.utils.file_size import get_file_size_unit
from seahub.utils.timeutils import utc_to_local, datetime_to_isoformat_timestr
from seahub.views import validate_owner, is_registered_user, check_file_lock, \
group_events_data, get_diff, create_default_library, get_owned_repo_list, \
from seahub.views import is_registered_user, check_file_lock, \
group_events_data, get_diff, create_default_library, \
list_inner_pub_repos, get_virtual_repos_by_owner, \
check_folder_permission
from seahub.views.ajax import get_share_in_repo_list, get_groups_by_user, \
@@ -93,7 +86,7 @@ if HAS_OFFICE_CONVERTER:
import seahub.settings as settings
from seahub.settings import THUMBNAIL_EXTENSION, THUMBNAIL_ROOT, \
ENABLE_GLOBAL_ADDRESSBOOK, FILE_LOCK_EXPIRATION_DAYS, \
ENABLE_THUMBNAIL, ENABLE_SUB_LIBRARY, ENABLE_FOLDER_PERM
ENABLE_THUMBNAIL, ENABLE_FOLDER_PERM
try:
from seahub.settings import CLOUD_MODE
except ImportError:
@@ -119,15 +112,14 @@ except ImportError:
from pysearpc import SearpcError, SearpcObjEncoder
import seaserv
from seaserv import seafserv_rpc, seafserv_threaded_rpc, \
from seaserv import seafserv_threaded_rpc, \
get_personal_groups_by_user, get_session_info, is_personal_repo, \
get_repo, check_permission, get_commits, is_passwd_set,\
list_personal_repos_by_owner, check_quota, \
list_share_repos, get_group_repos_by_owner, get_group_repoids, \
check_quota, list_share_repos, get_group_repos_by_owner, get_group_repoids, \
list_inner_pub_repos_by_owner, is_group_user, \
remove_share, unshare_group_repo, unset_inner_pub_repo, get_group, \
remove_share, unset_inner_pub_repo, get_group, \
get_commit, get_file_id_by_path, MAX_DOWNLOAD_DIR_SIZE, edit_repo, \
ccnet_threaded_rpc, get_personal_groups, seafile_api, check_group_staff, \
ccnet_threaded_rpc, get_personal_groups, seafile_api, \
create_org, ccnet_api
from constance import config

View File

@@ -13,7 +13,7 @@ from django.utils import translation
from django.utils.translation import ugettext as _
import seaserv
from seaserv import seafile_api
from seaserv import seafile_api, ccnet_api
from seahub.base.models import CommandsLastCheck
from seahub.notifications.models import UserNotification
from seahub.utils import send_html_email, get_service_url, \
@@ -83,9 +83,7 @@ class Command(BaseCommand):
d = notice.group_message_detail_to_dict()
group_id = d['group_id']
message = d['message']
group = seaserv.get_group(int(group_id))
if group is None:
notice.delete()
group = ccnet_api.get_group(int(group_id))
notice.group_url = reverse('group_discuss', args=[group.id])
notice.notice_from = escape(email2nickname(d['msg_from']))
@@ -96,16 +94,31 @@ class Command(BaseCommand):
def format_repo_share_msg(self, notice):
d = json.loads(notice.detail)
repo_id = d['repo_id']
repo = seafile_api.get_repo(repo_id)
if repo is None:
notice.delete()
notice.repo_url = reverse("view_common_lib_dir", args=[repo_id, ''])
notice.notice_from = escape(email2nickname(d['share_from']))
notice.repo_name = repo.name
notice.avatar_src = self.get_avatar_src(d['share_from'])
return notice
def format_repo_share_to_group_msg(self, notice):
d = json.loads(notice.detail)
repo_id = d['repo_id']
repo = seafile_api.get_repo(repo_id)
group_id = d['group_id']
group = ccnet_api.get_group(group_id)
notice.repo_url = reverse("view_common_lib_dir", args=[repo_id, ''])
notice.notice_from = escape(email2nickname(d['share_from']))
notice.repo_name = repo.name
notice.avatar_src = self.get_avatar_src(d['share_from'])
notice.group_url = reverse("group_info", args=[group.id])
notice.group_name = group.group_name
return notice
def format_file_uploaded_msg(self, notice):
@@ -132,9 +145,7 @@ class Command(BaseCommand):
group_id = d['group_id']
join_request_msg = d['join_request_msg']
group = seaserv.get_group(group_id)
if group is None:
notice.delete()
group = ccnet_api.get_group(group_id)
notice.grpjoin_user_profile_url = reverse('user_profile',
args=[username])
@@ -150,9 +161,7 @@ class Command(BaseCommand):
group_staff = d['group_staff']
group_id = d['group_id']
group = seaserv.get_group(group_id)
if group is None:
notice.delete()
group = ccnet_api.get_group(group_id)
notice.notice_from = group_staff
notice.avatar_src = self.get_avatar_src(group_staff)
@@ -208,6 +217,22 @@ class Command(BaseCommand):
for notice in unseen_notices:
logger.info('Processing unseen notice: [%s]' % (notice))
d = json.loads(notice.detail)
repo_id = d.get('repo_id', None)
group_id = d.get('group_id', None)
try:
if repo_id and not seafile_api.get_repo(repo_id):
notice.delete()
continue
if group_id and not ccnet_api.get_group(group_id):
notice.delete()
continue
except Exception as e:
logger.error(e)
continue
if notice.to_user != to_user:
continue
@@ -220,6 +245,9 @@ class Command(BaseCommand):
elif notice.is_repo_share_msg():
notice = self.format_repo_share_msg(notice)
elif notice.is_repo_share_to_group_msg():
notice = self.format_repo_share_to_group_msg(notice)
elif notice.is_file_uploaded_msg():
notice = self.format_file_uploaded_msg(notice)

View File

@@ -5,14 +5,12 @@ import json
import logging
from django.db import models
from django.db.models.signals import post_save
from django.forms import ModelForm, Textarea
from django.utils.http import urlquote
from django.utils.html import escape
from django.utils.translation import ugettext as _
import seaserv
from seaserv import seafile_api
from seaserv import seafile_api, ccnet_api
from seahub.base.fields import LowerCaseCharField
from seahub.base.templatetags.seahub_tags import email2nickname
@@ -42,6 +40,7 @@ MSG_TYPE_GROUP_JOIN_REQUEST = 'group_join_request'
MSG_TYPE_ADD_USER_TO_GROUP = 'add_user_to_group'
MSG_TYPE_FILE_UPLOADED = 'file_uploaded'
MSG_TYPE_REPO_SHARE = 'repo_share'
MSG_TYPE_REPO_SHARE_TO_GROUP = 'repo_share_to_group'
MSG_TYPE_USER_MESSAGE = 'user_message'
def file_uploaded_msg_to_json(file_name, repo_id, uploaded_to):
@@ -53,6 +52,9 @@ def file_uploaded_msg_to_json(file_name, repo_id, uploaded_to):
def repo_share_msg_to_json(share_from, repo_id):
return json.dumps({'share_from': share_from, 'repo_id': repo_id})
def repo_share_to_group_msg_to_json(share_from, repo_id, group_id):
return json.dumps({'share_from': share_from, 'repo_id': repo_id, 'group_id': group_id})
def group_msg_to_json(group_id, msg_from, message):
return json.dumps({'group_id': group_id, 'msg_from': msg_from,
'message': message})
@@ -226,6 +228,17 @@ class UserNotificationManager(models.Manager):
return self._add_user_notification(to_user,
MSG_TYPE_REPO_SHARE, detail)
def add_repo_share_to_group_msg(self, to_user, detail):
"""Notify ``to_user`` that others shared a repo to group.
Arguments:
- `self`:
- `to_user`:
- `detail`:
"""
return self._add_user_notification(to_user,
MSG_TYPE_REPO_SHARE_TO_GROUP, detail)
def add_user_message(self, to_user, detail):
"""Notify ``to_user`` that others sent a message to him/her.
@@ -293,6 +306,14 @@ class UserNotification(models.Model):
"""
return self.msg_type == MSG_TYPE_REPO_SHARE
def is_repo_share_to_group_msg(self):
"""
Arguments:
- `self`:
"""
return self.msg_type == MSG_TYPE_REPO_SHARE_TO_GROUP
def is_user_message(self):
"""
@@ -439,6 +460,44 @@ class UserNotification(models.Model):
'href': reverse('view_common_lib_dir', args=[repo.id, '']),
'repo_name': escape(repo.name),
}
return msg
def format_repo_share_to_group_msg(self):
"""
Arguments:
- `self`:
"""
try:
d = json.loads(self.detail)
except Exception as e:
logger.error(e)
return _(u"Internal error")
share_from = email2nickname(d['share_from'])
repo_id = d['repo_id']
group_id = d['group_id']
try:
repo = seafile_api.get_repo(repo_id)
group = ccnet_api.get_group(group_id)
except Exception as e:
logger.error(e)
return None
if not repo or not group:
self.delete()
return None
msg = _(u"%(user)s has shared a library named <a href='%(repo_href)s'>%(repo_name)s</a> to group <a href='%(group_href)s'>%(group_name)s</a>.") % {
'user': escape(share_from),
'repo_href': reverse('view_common_lib_dir', args=[repo.id, '']),
'repo_name': escape(repo.name),
'group_href': reverse('group_info', args=[group.id]),
'group_name': escape(group.group_name),
}
return msg
def format_user_message_title(self):
@@ -450,6 +509,7 @@ class UserNotification(models.Model):
try:
d = self.user_message_detail_to_dict()
except self.InvalidDetailError as e:
logger.error(e)
return _(u"Internal error")
msg_from = d.get('msg_from')
@@ -470,6 +530,7 @@ class UserNotification(models.Model):
try:
d = self.user_message_detail_to_dict()
except self.InvalidDetailError as e:
logger.error(e)
return _(u"Internal error")
message = d.get('message')
@@ -487,10 +548,11 @@ class UserNotification(models.Model):
try:
d = self.group_message_detail_to_dict()
except self.InvalidDetailError as e:
logger.error(e)
return _(u"Internal error")
group_id = d.get('group_id')
group = seaserv.get_group(group_id)
group = ccnet_api.get_group(group_id)
if group is None:
self.delete()
return None
@@ -517,6 +579,7 @@ class UserNotification(models.Model):
try:
d = self.group_message_detail_to_dict()
except self.InvalidDetailError as e:
logger.error(e)
return _(u"Internal error")
message = d.get('message')
@@ -541,7 +604,7 @@ class UserNotification(models.Model):
group_id = d['group_id']
join_request_msg = d['join_request_msg']
group = seaserv.get_group(group_id)
group = ccnet_api.get_group(group_id)
if group is None:
self.delete()
return None
@@ -570,7 +633,7 @@ class UserNotification(models.Model):
group_staff = d['group_staff']
group_id = d['group_id']
group = seaserv.get_group(group_id)
group = ccnet_api.get_group(group_id)
if group is None:
self.delete()
return None
@@ -588,10 +651,9 @@ from django.core.urlresolvers import reverse
from django.dispatch import receiver
from seahub.signals import upload_file_successful
from seahub.group.models import GroupMessage, MessageReply
from seahub.group.signals import grpmsg_added, group_join_request, add_user_to_group
from seahub.share.signals import share_repo_to_user_successful
from seahub.message.models import UserMessage
from seahub.share.signals import share_repo_to_user_successful, \
share_repo_to_group_successful
from seahub.message.signals import user_message_sent
@receiver(upload_file_successful)
@@ -606,24 +668,6 @@ def add_upload_file_msg_cb(sender, **kwargs):
filename = os.path.basename(file_path)
folder_path = os.path.dirname(file_path)
folder_name = os.path.basename(folder_path)
detail = file_uploaded_msg_to_json(filename, repo_id, folder_path)
UserNotification.objects.add_file_uploaded_msg(owner, detail)
@receiver(upload_file_successful)
def add_upload_file_msg_cb(sender, **kwargs):
"""Notify repo owner when others upload files to his/her folder from shared link.
"""
repo_id = kwargs.get('repo_id', None)
file_path = kwargs.get('file_path', None)
owner = kwargs.get('owner', None)
assert repo_id and file_path and owner is not None, 'Arguments error'
filename = os.path.basename(file_path)
folder_path = os.path.dirname(file_path)
folder_name = os.path.basename(folder_path)
detail = file_uploaded_msg_to_json(filename, repo_id, folder_path)
UserNotification.objects.add_file_uploaded_msg(owner, detail)
@@ -641,6 +685,24 @@ def add_share_repo_msg_cb(sender, **kwargs):
detail = repo_share_msg_to_json(from_user, repo.id)
UserNotification.objects.add_repo_share_msg(to_user, detail)
@receiver(share_repo_to_group_successful)
def add_share_repo_to_group_msg_cb(sender, **kwargs):
"""Notify group member when others share repos to group.
"""
from_user = kwargs.get('from_user', None)
group_id = kwargs.get('group_id', None)
repo = kwargs.get('repo', None)
assert from_user and group_id and repo is not None, 'Arguments error'
members = ccnet_api.get_group_members(int(group_id))
for member in members:
to_user = member.user_name
if to_user == from_user:
continue
detail = repo_share_to_group_msg_to_json(from_user, repo.id, group_id)
UserNotification.objects.add_repo_share_to_group_msg(to_user, detail)
@receiver(user_message_sent)
def add_user_message_cb(sender, **kwargs):
"""Notify user when he/she got a new mesaage.

View File

@@ -32,6 +32,9 @@ You've got {{num}} new notices on {{ site_name }}:
{% elif notice.is_repo_share_msg %}
<p style="line-height:1.5; margin:.2em 10px .2em 0;">{% blocktrans with user=notice.notice_from lib_url=notice.repo_url lib_name=notice.repo_name%}{{user}} has shared a library named <a href="{{url_base}}{{lib_url}}">{{lib_name}}</a> to you.{% endblocktrans %}</p>
{% elif notice.is_repo_share_to_group_msg %}
<p style="line-height:1.5; margin:.2em 10px .2em 0;">{% blocktrans with user=notice.notice_from lib_url=notice.repo_url lib_name=notice.repo_name group_url=notice.group_url group_name=notice.group_name %}{{user}} has shared a library named <a href="{{url_base}}{{lib_url}}">{{lib_name}}</a> to <a href="{{url_base}}{{group_url}}">{{group_name}}</a>.{% endblocktrans %}</p>
{% elif notice.is_user_message %}
<p style="line-height:1.5; margin:.2em 10px .2em 0;">{% blocktrans with msg_url=notice.user_msg_url user=notice.notice_from %}You have received a <a href="{{ url_base }}{{msg_url}}">new message</a> from {{user}}.{% endblocktrans %}</p>
{% if notice.user_msg %}

View File

@@ -32,6 +32,9 @@
{% elif notice.is_repo_share_msg %}
<p class="brief">{{ notice.format_repo_share_msg|safe }}</p>
{% elif notice.is_repo_share_to_group_msg %}
<p class="brief">{{ notice.format_repo_share_to_group_msg|safe }}</p>
{% elif notice.is_group_join_request %}
<p class="brief">{{ notice.format_group_join_request|safe }}</p>
{% endif %}

View File

@@ -163,6 +163,14 @@ def add_notice_from_info(notices):
logger.error(e)
notice.default_avatar_url = default_avatar_url
elif notice.is_repo_share_to_group_msg():
try:
d = json.loads(notice.detail)
notice.msg_from = d['share_from']
except Exception as e:
logger.error(e)
notice.default_avatar_url = default_avatar_url
elif notice.is_group_join_request():
try:
d = json.loads(notice.detail)

View File

@@ -1,3 +1,4 @@
import django.dispatch
share_repo_to_user_successful = django.dispatch.Signal(providing_args=["from_user", "to_user", "repo"])
share_repo_to_group_successful = django.dispatch.Signal(providing_args=["from_user", "group_id", "repo"])

View File

@@ -30,6 +30,9 @@
{% elif notice.is_repo_share_msg %}
<p class="brief">{{ notice.format_repo_share_msg|safe }}</p>
{% elif notice.is_repo_share_to_group_msg %}
<p class="brief">{{ notice.format_repo_share_to_group_msg|safe }}</p>
{% elif notice.is_group_join_request %}
<p class="brief">{{ notice.format_group_join_request|safe }}</p>