1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-09 10:50:24 +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:
xiez
2012-07-31 14:58:47 +08:00
parent 1779ecfa3d
commit 7a850c7953
15 changed files with 127 additions and 112 deletions

View File

@@ -48,10 +48,10 @@ urlpatterns = patterns('',
{ 'template': 'registration/registration_closed.html' }, { 'template': 'registration/registration_closed.html' },
name='registration_disallowed'), name='registration_disallowed'),
url(r'^business/register/$', # url(r'^business/register/$',
register, # register,
org_reg_dict, # org_reg_dict,
name='registration_register'), # name='registration_register'),
(r'', include('registration.auth_urls')), (r'', include('registration.auth_urls')),
) )

View File

@@ -0,0 +1,4 @@
from signals import *
from handlers import *
mail_sended.connect(mail_sended_cb, sender=None)

18
contacts/handlers.py Normal file
View 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()

View File

@@ -8,8 +8,9 @@ class Contact(models.Model):
user_email = models.CharField(max_length=255) user_email = models.CharField(max_length=255)
contact_email = models.CharField(max_length=255) contact_email = models.CharField(max_length=255)
contact_name = models.CharField(max_length=255, blank=True, null=True) contact_name = models.CharField(max_length=255, blank=True, null=True, \
note = models.CharField(max_length=255, blank=True, null=True) default='')
note = models.CharField(max_length=255, blank=True, null=True, default='')
class Meta: class Meta:
unique_together = ("user_email", "contact_email") unique_together = ("user_email", "contact_email")

3
contacts/signals.py Normal file
View File

@@ -0,0 +1,3 @@
import django.dispatch
mail_sended = django.dispatch.Signal(providing_args=["user", "email"])

View File

@@ -14,9 +14,11 @@ from models import GroupMessage, MessageReply
from forms import MessageForm, MessageReplyForm from forms import MessageForm, MessageReplyForm
from signals import grpmsg_added, grpmsg_reply_added from signals import grpmsg_added, grpmsg_reply_added
from seahub.contacts.models import Contact from seahub.contacts.models import Contact
from seahub.contacts.signals import mail_sended
from seahub.notifications.models import UserNotification from seahub.notifications.models import UserNotification
from seahub.profile.models import Profile 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 from seahub.views import validate_emailuser
@login_required @login_required
@@ -337,21 +339,14 @@ def group_members(request, group_id):
Add group members. Add group members.
""" """
member_name_str = request.POST.get('user_name', '') 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_list = emails2list(member_name_str)
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
if request.user.org: 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, if not ccnet_threaded_rpc.org_user_exists(request.user.org.org_id,
member_name): member_name):
err_msg = u'当前企业不存在 %s 用户' % member_name err_msg = u'当前企业不存在 %s 用户' % member_name
@@ -364,7 +359,11 @@ def group_members(request, group_id):
except SearpcError, e: except SearpcError, e:
return render_error(request, e.msg) return render_error(request, e.msg)
else: 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): if not validate_emailuser(member_name):
err_msg = u'用户 %s 不存在' % member_name err_msg = u'用户 %s 不存在' % member_name
return render_error(request, err_msg) return render_error(request, err_msg)

View File

@@ -50,7 +50,7 @@
{% endif %} {% endif %}
<td> <td>
<img src="{{ MEDIA_URL }}img/sync-20.png" data="{{ repo.props.id }}" class="download-btn vh" title="同步到本地" alt="同步" /> <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="删除" /> <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> </td>
</tr> </tr>

View File

@@ -0,0 +1,11 @@
{% autoescape off %}
亲爱的 {{ to_email }}
{{ user }} 在SeaCloud上共享了一个同步目录给你。注册帐号后请点击以下链接查看
{{ protocol }}://{{ domain }}{% url myhome %}
感谢使用我们的网站!
Seafile团队
{% endautoescape %}

View File

@@ -32,34 +32,6 @@
<p>暂无</p> <p>暂无</p>
{% endif %} {% 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> <h3>我管理的文件外链</h3>
{% if fileshares %} {% if fileshares %}
<table class="sharelink-list"> <table class="sharelink-list">
@@ -84,7 +56,7 @@
<p>暂无</p> <p>暂无</p>
{% endif %} {% endif %}
<div id="view-link" name="view-link" class="hide"> <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> </div>
{% endblock %} {% 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() { $(".view-file-link").click(function() {
var t = $(this).attr('data'); var t = $(this).attr('data');

View File

@@ -3,7 +3,7 @@ from django.conf.urls.defaults import *
from views import * from views import *
urlpatterns = patterns('', 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('^remove/(?P<token>.+)/$', remove_anonymous_share, name='remove_anonymous_share'),
url('^(?P<token>.+)/$', anonymous_share_confirm, name='anonymous_share_confirm'), url('^(?P<token>.+)/$', anonymous_share_confirm, name='anonymous_share_confirm'),
) )

View File

@@ -10,16 +10,17 @@ from auth.decorators import login_required
from django.contrib import messages from django.contrib import messages
from django.contrib.sites.models import Site, RequestSite from django.contrib.sites.models import Site, RequestSite
from pysearpc import SearpcError 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 forms import RepoShareForm
from models import AnonymousShare 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 settings import ANONYMOUS_SHARE_COOKIE_TIMEOUT
from tokens import anon_share_token_generator 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 @login_required
def share_repo(request): def share_repo(request):
@@ -42,21 +43,12 @@ def share_repo(request):
if not validate_owner(request, repo_id): if not validate_owner(request, repo_id):
return render_permission_error(request, u'只有目录拥有者有权共享目录') return render_permission_error(request, u'只有目录拥有者有权共享目录')
# Handle the diffent separator to_email_list = emails2list(email_or_group)
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(',')
for to_email in to_email_list: 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 user name, the format is: 'example@mail.com';
# if to_email is group, the format is 'group_name <creator@mail.com>' # if to_email is group, the format is 'group_name <creator@mail.com>'
if (to_email.split(' ')[0].find('@') == -1): 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 # TODO: if we know group id, then we can simplly call group_share_repo
if len(to_email.split(' ')) < 2: if len(to_email.split(' ')) < 2:
messages.add_message(request, messages.ERROR, to_email) messages.add_message(request, messages.ERROR, to_email)
@@ -81,34 +73,54 @@ def share_repo(request):
if not find: if not find:
messages.add_message(request, messages.ERROR, group_name) messages.add_message(request, messages.ERROR, group_name)
else: else:
if validate_emailuser(to_email): ''' Share repo to user '''
# share repo to registered user # Add email to contacts.
mail_sended.send(sender=None, user=request.user.username,
email=to_email)
# Record share info to db.
try: try:
seafserv_threaded_rpc.add_share(repo_id, from_email, seafserv_threaded_rpc.add_share(repo_id, from_email, to_email,
to_email, 'rw') 'rw')
messages.add_message(request, messages.INFO, to_email)
except SearpcError, e: except SearpcError, e:
messages.add_message(request, messages.ERROR, to_email) messages.add_message(request, messages.ERROR, to_email)
else: continue
# share repo to anonymous user
kwargs = {'repo_id': repo_id, # Send mail if user has not registered.
'repo_owner': from_email, if not validate_emailuser(to_email):
'anon_email': 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')) return HttpResponseRedirect(reverse('myhome'))
@login_required @login_required
def share_admin(request): 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. file shared links I generated.
""" """
username = request.user.username username = request.user.username
# repos that are share to user # 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 # repos that are share to groups
group_repos = seafserv_threaded_rpc.get_group_my_share_repos(request.user.username) 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) out_repos.append(repo)
# Repo anonymous share links # Repo anonymous share links
out_links = AnonymousShare.objects.filter(repo_owner=request.user.username) # out_links = AnonymousShare.objects.filter(repo_owner=request.user.username)
for link in out_links: # for link in out_links:
repo = get_repo(link.repo_id) # repo = get_repo(link.repo_id)
link.repo_name = repo.name # link.repo_name = repo.name
link.remain_time = anon_share_token_generator.get_remain_time(link.token) # link.remain_time = anon_share_token_generator.get_remain_time(link.token)
# File shared links # File shared links
fileshares = FileShare.objects.filter(username=request.user.username) fileshares = FileShare.objects.filter(username=request.user.username)
@@ -143,7 +155,7 @@ def share_admin(request):
return render_to_response('repo/share_admin.html', { return render_to_response('repo/share_admin.html', {
"out_repos": out_repos, "out_repos": out_repos,
"out_links": out_links, # "out_links": out_links,
"fileshares": fileshares, "fileshares": fileshares,
"protocol": request.is_secure() and 'https' or 'http', "protocol": request.is_secure() and 'https' or 'http',
"domain": RequestSite(request).domain, "domain": RequestSite(request).domain,

View File

@@ -18,8 +18,7 @@ $(function() {
//check before post //check before post
$('#share-submit-btn').click(function() { $('#share-submit-btn').click(function() {
if (!$.trim($('#email_or_group').attr('value'))) { if (!$.trim($('#email_or_group').attr('value'))) {
$('#repo-share-form .error').removeClass('hide'); apply_form_error('repo-share-form', '输入不能为空。');
$('#simplemodal-container').css('height', $('#repo-share-form').height());
return false; return false;
} }
}); });

View File

@@ -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 /> <label>邮箱或小组:</label><br />
<textarea id="email_or_group" name="email_or_group"></textarea> <textarea id="email_or_group" name="email_or_group"></textarea>
<input id="repo_id" type="hidden" name="repo_id" value="" /> <input id="repo_id" type="hidden" name="repo_id" value="" />
<p class="tip">可以是非网站注册用户,我们会以邮件通知对方。</p> <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" /> <input type="submit" value="提交" id="share-submit-btn" />
</form> </form>

View File

@@ -287,8 +287,15 @@ def get_ccnet_server_addr_port():
def emails2list(emails): 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', ',') 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 ]

View File

@@ -37,6 +37,7 @@ from pysearpc import SearpcError
from seahub.base.accounts import CcnetUser from seahub.base.accounts import CcnetUser
from seahub.base.models import UuidObjidMap from seahub.base.models import UuidObjidMap
from seahub.contacts.models import Contact from seahub.contacts.models import Contact
from seahub.contacts.signals import mail_sended
from seahub.notifications.models import UserNotification from seahub.notifications.models import UserNotification
from seahub.organizations.utils import clear_org_ctx, access_org_repo from seahub.organizations.utils import clear_org_ctx, access_org_repo
from forms import AddUserForm, FileLinkShareForm, RepoCreateForm from forms import AddUserForm, FileLinkShareForm, RepoCreateForm
@@ -1841,14 +1842,12 @@ def send_shared_link(request):
email = form.cleaned_data['email'] email = form.cleaned_data['email']
file_shared_link = form.cleaned_data['file_shared_link'] file_shared_link = form.cleaned_data['file_shared_link']
to_email_list = emails2list(email)
t = loader.get_template('shared_link_email.html') t = loader.get_template('shared_link_email.html')
to_email_list = emails2list(email)
for to_email in to_email_list: for to_email in to_email_list:
if not to_email: # Add email to contacts
continue mail_sended.send(sender=None, user=request.user.username,
to_email = to_email.strip(' ') email=to_email)
c = { c = {
'email': request.user.username, 'email': request.user.username,