1
0
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:
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' },
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')),
)

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)
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
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 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)

View File

@@ -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>

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>
{% 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');

View File

@@ -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'),
)

View File

@@ -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,

View File

@@ -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;
}
});

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 />
<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>

View File

@@ -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 ]

View File

@@ -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,