mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-07 01:41:39 +00:00
Modify repo share.
* Email unregistered user when sharing repo. * Add email to contacts when share repo/file and add group user. * Remove org repo share link.
This commit is contained in:
@@ -48,10 +48,10 @@ urlpatterns = patterns('',
|
||||
{ 'template': 'registration/registration_closed.html' },
|
||||
name='registration_disallowed'),
|
||||
|
||||
url(r'^business/register/$',
|
||||
register,
|
||||
org_reg_dict,
|
||||
name='registration_register'),
|
||||
# url(r'^business/register/$',
|
||||
# register,
|
||||
# org_reg_dict,
|
||||
# name='registration_register'),
|
||||
|
||||
(r'', include('registration.auth_urls')),
|
||||
)
|
||||
|
@@ -0,0 +1,4 @@
|
||||
from signals import *
|
||||
from handlers import *
|
||||
|
||||
mail_sended.connect(mail_sended_cb, sender=None)
|
||||
|
18
contacts/handlers.py
Normal file
18
contacts/handlers.py
Normal file
@@ -0,0 +1,18 @@
|
||||
from signals import mail_sended
|
||||
|
||||
from models import Contact
|
||||
def mail_sended_cb(sender, **kwargs):
|
||||
"""
|
||||
Callback function to add email to contacts.
|
||||
"""
|
||||
|
||||
user = kwargs['user']
|
||||
email = kwargs['email']
|
||||
|
||||
try:
|
||||
Contact.objects.get(user_email=user, contact_email=email)
|
||||
# Already in contacts list, pass.
|
||||
except Contact.DoesNotExist:
|
||||
# Add new contact
|
||||
c = Contact(user_email=user, contact_email=email)
|
||||
c.save()
|
@@ -8,8 +8,9 @@ class Contact(models.Model):
|
||||
|
||||
user_email = models.CharField(max_length=255)
|
||||
contact_email = models.CharField(max_length=255)
|
||||
contact_name = models.CharField(max_length=255, blank=True, null=True)
|
||||
note = models.CharField(max_length=255, blank=True, null=True)
|
||||
contact_name = models.CharField(max_length=255, blank=True, null=True, \
|
||||
default='')
|
||||
note = models.CharField(max_length=255, blank=True, null=True, default='')
|
||||
|
||||
class Meta:
|
||||
unique_together = ("user_email", "contact_email")
|
||||
|
3
contacts/signals.py
Normal file
3
contacts/signals.py
Normal file
@@ -0,0 +1,3 @@
|
||||
import django.dispatch
|
||||
|
||||
mail_sended = django.dispatch.Signal(providing_args=["user", "email"])
|
@@ -14,9 +14,11 @@ from models import GroupMessage, MessageReply
|
||||
from forms import MessageForm, MessageReplyForm
|
||||
from signals import grpmsg_added, grpmsg_reply_added
|
||||
from seahub.contacts.models import Contact
|
||||
from seahub.contacts.signals import mail_sended
|
||||
from seahub.notifications.models import UserNotification
|
||||
from seahub.profile.models import Profile
|
||||
from seahub.utils import render_error, render_permission_error, validate_group_name
|
||||
from seahub.utils import render_error, render_permission_error, \
|
||||
validate_group_name, emails2list
|
||||
from seahub.views import validate_emailuser
|
||||
|
||||
@login_required
|
||||
@@ -337,21 +339,14 @@ def group_members(request, group_id):
|
||||
Add group members.
|
||||
"""
|
||||
member_name_str = request.POST.get('user_name', '')
|
||||
# Handle the diffent separator
|
||||
member_name_str = member_name_str.replace('\n',',')
|
||||
member_name_str = member_name_str.replace('\r',',')
|
||||
member_name_list = member_name_str.split(',')
|
||||
|
||||
# Remove same member name
|
||||
member_name_dict = {}
|
||||
for member_name in member_name_list:
|
||||
member_name = member_name.strip(' ')
|
||||
if not member_name:
|
||||
continue
|
||||
member_name_dict[member_name] = member_name
|
||||
member_list = emails2list(member_name_str)
|
||||
|
||||
if request.user.org:
|
||||
for member_name in member_name_dict.keys():
|
||||
for member_name in member_list:
|
||||
# Add email to contacts
|
||||
mail_sended.send(sender=None, user=request.user.username,
|
||||
email=member_name)
|
||||
if not ccnet_threaded_rpc.org_user_exists(request.user.org.org_id,
|
||||
member_name):
|
||||
err_msg = u'当前企业不存在 %s 用户' % member_name
|
||||
@@ -364,7 +359,11 @@ def group_members(request, group_id):
|
||||
except SearpcError, e:
|
||||
return render_error(request, e.msg)
|
||||
else:
|
||||
for member_name in member_name_dict.keys():
|
||||
for member_name in member_list:
|
||||
# Add email to contacts
|
||||
mail_sended.send(sender=None, user=request.user.username,
|
||||
email=member_name)
|
||||
|
||||
if not validate_emailuser(member_name):
|
||||
err_msg = u'用户 %s 不存在' % member_name
|
||||
return render_error(request, err_msg)
|
||||
|
@@ -50,7 +50,7 @@
|
||||
{% endif %}
|
||||
<td>
|
||||
<img src="{{ MEDIA_URL }}img/sync-20.png" data="{{ repo.props.id }}" class="download-btn vh" title="同步到本地" alt="同步" />
|
||||
<img src="{{ MEDIA_URL }}img/share-20.png" data="{{ repo.props.id }}" class="repo-share-btn vh" title="共享" alt="共享" />
|
||||
<!-- <img src="{{ MEDIA_URL }}img/share-20.png" data="{{ repo.props.id }}" class="repo-share-btn vh" title="共享" alt="共享" /> -->
|
||||
<img src="{{ MEDIA_URL }}img/delete-20.png" data="{{ SITE_ROOT }}repo/remove/{{ repo.props.id }}/?next={{ request.path }}" class="repo-delete-btn vh" title="删除" alt="删除" />
|
||||
</td>
|
||||
</tr>
|
||||
|
11
share/templates/repo/repo_share_mail.html
Normal file
11
share/templates/repo/repo_share_mail.html
Normal file
@@ -0,0 +1,11 @@
|
||||
{% autoescape off %}
|
||||
亲爱的 {{ to_email }}:
|
||||
|
||||
{{ user }} 在SeaCloud上共享了一个同步目录给你。注册帐号后请点击以下链接查看:
|
||||
|
||||
{{ protocol }}://{{ domain }}{% url myhome %}
|
||||
|
||||
感谢使用我们的网站!
|
||||
|
||||
Seafile团队
|
||||
{% endautoescape %}
|
@@ -32,34 +32,6 @@
|
||||
<p>暂无</p>
|
||||
{% endif %}
|
||||
|
||||
<h3>我管理的共享链接</h3>
|
||||
{% if out_links %}
|
||||
<table class="link-list">
|
||||
<tr>
|
||||
<th width="25%">目录名</th>
|
||||
<th width="35%">共享给</th>
|
||||
<th width="20%">有效期</th>
|
||||
<th width="20%">操作</th>
|
||||
</tr>
|
||||
{% for link in out_links %}
|
||||
<tr>
|
||||
<td><a href="{{ SITE_ROOT }}repo/{{ link.repo_id }}/">{{ link.repo_name }}</a></td>
|
||||
<td>{{ link.anonymous_email }}</td>
|
||||
{% if link.remain_time %}
|
||||
<td>{{ link.remain_time|translate_remain_time }}</td>
|
||||
{% else %}
|
||||
<td>已过期</td>
|
||||
{% endif %}
|
||||
<td><a href="#" class="op view-link" data="{{ link.token }}">查看链接</a>
|
||||
<a class="op" href="{{ SITE_ROOT }}share/remove/{{ link.token }}/">删除</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
</table>
|
||||
{% else %}
|
||||
<p>暂无</p>
|
||||
{% endif %}
|
||||
|
||||
<h3>我管理的文件外链</h3>
|
||||
{% if fileshares %}
|
||||
<table class="sharelink-list">
|
||||
@@ -84,7 +56,7 @@
|
||||
<p>暂无</p>
|
||||
{% endif %}
|
||||
<div id="view-link" name="view-link" class="hide">
|
||||
<span class="view-link-alert" style="float:left; margin-left: 120px; "></span>
|
||||
<span class="view-link-alert" style="float:left; "></span>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -104,15 +76,6 @@ $("table tr:gt(0)").hover(
|
||||
}
|
||||
);
|
||||
|
||||
$(".view-link").click(function() {
|
||||
|
||||
var t = $(this).attr('data');
|
||||
var l = '{{ protocol }}://' + '{{ domain }}{{ SITE_ROOT }}share/' + t + '/';
|
||||
$('.view-link-alert').html("共享链接为:<p>" + l + "</p>");
|
||||
$("#view-link").modal({appendTo: "#main", containerCss:{padding:18}});
|
||||
return false;
|
||||
});
|
||||
|
||||
$(".view-file-link").click(function() {
|
||||
|
||||
var t = $(this).attr('data');
|
||||
|
@@ -3,7 +3,7 @@ from django.conf.urls.defaults import *
|
||||
from views import *
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^add/$', share_repo),
|
||||
url(r'^add/$', share_repo, name='share_repo'),
|
||||
url('^remove/(?P<token>.+)/$', remove_anonymous_share, name='remove_anonymous_share'),
|
||||
url('^(?P<token>.+)/$', anonymous_share_confirm, name='anonymous_share_confirm'),
|
||||
)
|
||||
|
@@ -10,16 +10,17 @@ from auth.decorators import login_required
|
||||
from django.contrib import messages
|
||||
from django.contrib.sites.models import Site, RequestSite
|
||||
from pysearpc import SearpcError
|
||||
from seaserv import seafserv_threaded_rpc, get_repo, ccnet_rpc, ccnet_threaded_rpc
|
||||
from seaserv import seafserv_threaded_rpc, get_repo, ccnet_rpc, \
|
||||
ccnet_threaded_rpc
|
||||
|
||||
from forms import RepoShareForm
|
||||
from models import AnonymousShare
|
||||
#from seahub.contacts.models import Contact
|
||||
from seahub.share.models import FileShare
|
||||
from seahub.views import validate_owner, validate_emailuser
|
||||
from seahub.utils import render_permission_error
|
||||
from settings import ANONYMOUS_SHARE_COOKIE_TIMEOUT
|
||||
from tokens import anon_share_token_generator
|
||||
from seahub.contacts.signals import mail_sended
|
||||
from seahub.share.models import FileShare
|
||||
from seahub.views import validate_owner, validate_emailuser
|
||||
from seahub.utils import render_permission_error, emails2list
|
||||
|
||||
@login_required
|
||||
def share_repo(request):
|
||||
@@ -42,21 +43,12 @@ def share_repo(request):
|
||||
if not validate_owner(request, repo_id):
|
||||
return render_permission_error(request, u'只有目录拥有者有权共享目录')
|
||||
|
||||
# Handle the diffent separator
|
||||
to_email_str = email_or_group.replace(';',',')
|
||||
to_email_str = to_email_str.replace('\n',',')
|
||||
to_email_str = to_email_str.replace('\r',',')
|
||||
to_email_list = to_email_str.split(',')
|
||||
|
||||
to_email_list = emails2list(email_or_group)
|
||||
for to_email in to_email_list:
|
||||
to_email = to_email.strip(' ')
|
||||
if not to_email:
|
||||
continue
|
||||
|
||||
# if to_email is user name, the format is: 'example@mail.com';
|
||||
# if to_email is group, the format is 'group_name <creator@mail.com>'
|
||||
if (to_email.split(' ')[0].find('@') == -1):
|
||||
# share repo to group
|
||||
''' Share repo to group '''
|
||||
# TODO: if we know group id, then we can simplly call group_share_repo
|
||||
if len(to_email.split(' ')) < 2:
|
||||
messages.add_message(request, messages.ERROR, to_email)
|
||||
@@ -81,34 +73,54 @@ def share_repo(request):
|
||||
if not find:
|
||||
messages.add_message(request, messages.ERROR, group_name)
|
||||
else:
|
||||
if validate_emailuser(to_email):
|
||||
# share repo to registered user
|
||||
''' Share repo to user '''
|
||||
# Add email to contacts.
|
||||
mail_sended.send(sender=None, user=request.user.username,
|
||||
email=to_email)
|
||||
|
||||
# Record share info to db.
|
||||
try:
|
||||
seafserv_threaded_rpc.add_share(repo_id, from_email,
|
||||
to_email, 'rw')
|
||||
messages.add_message(request, messages.INFO, to_email)
|
||||
seafserv_threaded_rpc.add_share(repo_id, from_email, to_email,
|
||||
'rw')
|
||||
except SearpcError, e:
|
||||
messages.add_message(request, messages.ERROR, to_email)
|
||||
else:
|
||||
# share repo to anonymous user
|
||||
kwargs = {'repo_id': repo_id,
|
||||
'repo_owner': from_email,
|
||||
'anon_email': to_email
|
||||
continue
|
||||
|
||||
# Send mail if user has not registered.
|
||||
if not validate_emailuser(to_email):
|
||||
use_https = request.is_secure()
|
||||
site_name = domain = RequestSite(request).domain
|
||||
|
||||
t = loader.get_template('repo/repo_share_mail.html')
|
||||
c = {
|
||||
'user': request.user.username,
|
||||
'to_email': to_email,
|
||||
'domain': domain,
|
||||
'site_name': site_name,
|
||||
'protocol': use_https and 'https' or 'http',
|
||||
}
|
||||
anonymous_share(request, **kwargs)
|
||||
try:
|
||||
send_mail(u'您在SeaCloud上收到一个同步目录',
|
||||
t.render(Context(c)), None,
|
||||
[to_email], fail_silently=False)
|
||||
except:
|
||||
messages.add_message(request, messages.ERROR, to_email)
|
||||
continue
|
||||
messages.add_message(request, messages.INFO, to_email)
|
||||
|
||||
return HttpResponseRedirect(reverse('myhome'))
|
||||
|
||||
@login_required
|
||||
def share_admin(request):
|
||||
"""
|
||||
List repos I share to others, include groups and emails. And also list
|
||||
List repos I share to others, include groups and users. And also list
|
||||
file shared links I generated.
|
||||
"""
|
||||
username = request.user.username
|
||||
|
||||
# repos that are share to user
|
||||
out_repos = seafserv_threaded_rpc.list_share_repos(username, 'from_email', -1, -1)
|
||||
out_repos = seafserv_threaded_rpc.list_share_repos(username, 'from_email',
|
||||
-1, -1)
|
||||
|
||||
# repos that are share to groups
|
||||
group_repos = seafserv_threaded_rpc.get_group_my_share_repos(request.user.username)
|
||||
@@ -129,11 +141,11 @@ def share_admin(request):
|
||||
out_repos.append(repo)
|
||||
|
||||
# Repo anonymous share links
|
||||
out_links = AnonymousShare.objects.filter(repo_owner=request.user.username)
|
||||
for link in out_links:
|
||||
repo = get_repo(link.repo_id)
|
||||
link.repo_name = repo.name
|
||||
link.remain_time = anon_share_token_generator.get_remain_time(link.token)
|
||||
# out_links = AnonymousShare.objects.filter(repo_owner=request.user.username)
|
||||
# for link in out_links:
|
||||
# repo = get_repo(link.repo_id)
|
||||
# link.repo_name = repo.name
|
||||
# link.remain_time = anon_share_token_generator.get_remain_time(link.token)
|
||||
|
||||
# File shared links
|
||||
fileshares = FileShare.objects.filter(username=request.user.username)
|
||||
@@ -143,7 +155,7 @@ def share_admin(request):
|
||||
|
||||
return render_to_response('repo/share_admin.html', {
|
||||
"out_repos": out_repos,
|
||||
"out_links": out_links,
|
||||
# "out_links": out_links,
|
||||
"fileshares": fileshares,
|
||||
"protocol": request.is_secure() and 'https' or 'http',
|
||||
"domain": RequestSite(request).domain,
|
||||
|
@@ -18,8 +18,7 @@ $(function() {
|
||||
//check before post
|
||||
$('#share-submit-btn').click(function() {
|
||||
if (!$.trim($('#email_or_group').attr('value'))) {
|
||||
$('#repo-share-form .error').removeClass('hide');
|
||||
$('#simplemodal-container').css('height', $('#repo-share-form').height());
|
||||
apply_form_error('repo-share-form', '输入不能为空。');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
@@ -1,9 +1,8 @@
|
||||
<form id="repo-share-form" action="{{ SITE_ROOT }}share/add/" method="post" name="repo-share-form" class="hide">
|
||||
<form id="repo-share-form" action="{% url share.views.share_repo %}" method="post" name="repo-share-form" class="hide">
|
||||
<label>邮箱或小组:</label><br />
|
||||
<textarea id="email_or_group" name="email_or_group"></textarea>
|
||||
<input id="repo_id" type="hidden" name="repo_id" value="" />
|
||||
<p class="tip">可以是非网站注册用户,我们会以邮件通知对方。</p>
|
||||
<p class="tip">(如未收到,请检查垃圾邮件)</p>
|
||||
<p class="error hide">输入不能为空。</p>
|
||||
<p class="error hide"></p>
|
||||
<input type="submit" value="提交" id="share-submit-btn" />
|
||||
</form>
|
||||
|
11
utils.py
11
utils.py
@@ -287,8 +287,15 @@ def get_ccnet_server_addr_port():
|
||||
|
||||
def emails2list(emails):
|
||||
"""
|
||||
Split email string contacted with diffent separator.
|
||||
Split email strings contacted with diffent separator.
|
||||
"""
|
||||
email_str = emails.replace(';', ',').replace('\n', ',').replace('\r', ',')
|
||||
return email_str.split(',')
|
||||
# Remove empty strings and duplicate emails
|
||||
s = set()
|
||||
for e in email_str.split(','):
|
||||
e = e.strip(' ')
|
||||
if not e:
|
||||
continue
|
||||
s.add(e)
|
||||
return [ x for x in s ]
|
||||
|
||||
|
11
views.py
11
views.py
@@ -37,6 +37,7 @@ from pysearpc import SearpcError
|
||||
from seahub.base.accounts import CcnetUser
|
||||
from seahub.base.models import UuidObjidMap
|
||||
from seahub.contacts.models import Contact
|
||||
from seahub.contacts.signals import mail_sended
|
||||
from seahub.notifications.models import UserNotification
|
||||
from seahub.organizations.utils import clear_org_ctx, access_org_repo
|
||||
from forms import AddUserForm, FileLinkShareForm, RepoCreateForm
|
||||
@@ -1841,14 +1842,12 @@ def send_shared_link(request):
|
||||
email = form.cleaned_data['email']
|
||||
file_shared_link = form.cleaned_data['file_shared_link']
|
||||
|
||||
to_email_list = emails2list(email)
|
||||
|
||||
t = loader.get_template('shared_link_email.html')
|
||||
|
||||
to_email_list = emails2list(email)
|
||||
for to_email in to_email_list:
|
||||
if not to_email:
|
||||
continue
|
||||
to_email = to_email.strip(' ')
|
||||
# Add email to contacts
|
||||
mail_sended.send(sender=None, user=request.user.username,
|
||||
email=to_email)
|
||||
|
||||
c = {
|
||||
'email': request.user.username,
|
||||
|
Reference in New Issue
Block a user