diff --git a/seahub/forms.py b/seahub/forms.py
index 6d53eca2f3..076ea6620b 100644
--- a/seahub/forms.py
+++ b/seahub/forms.py
@@ -188,3 +188,13 @@ class RepoSettingForm(forms.Form):
repo_desc = forms.CharField(error_messages={'required': _('Library description is required')})
days = forms.IntegerField(required=False,
error_messages={'invalid': _('Please enter a number')})
+ repo_owner = forms.CharField(required=False)
+
+ def clean_repo_owner(self):
+ repo_owner = self.cleaned_data['repo_owner']
+ try:
+ User.objects.get(email=repo_owner)
+ return repo_owner
+ except User.DoesNotExist:
+ raise forms.ValidationError(_('User %s is not found.') % repo_owner)
+
diff --git a/seahub/group/templates/group/group_manage.html b/seahub/group/templates/group/group_manage.html
index ba6612853e..6ff65c4983 100644
--- a/seahub/group/templates/group/group_manage.html
+++ b/seahub/group/templates/group/group_manage.html
@@ -44,6 +44,7 @@
{% else %}
{% trans "Make Public" %}
{% endif %}
+ {% trans "Transfer" %}
{% endblock %}
@@ -97,6 +98,13 @@
{% endif %}
+
{% include 'group/grpmember_add_form.html' %}
{% endblock %}
@@ -128,5 +136,21 @@ contact_list.push({value:contact_email, label:contact_email});
{% with post_url=admin_add_url %}
{% include 'group/grpadmin_add_js.html' %}
{% endwith %}
+
+$('#group-transfer').click(function() {
+ $('#group-transfer-form').modal({appendTo: "#main", focus:false});
+ return false;
+});
+$('#group-transfer-submit').click(function() {
+ var email = $('#group-transfer-form input[name="email"]').val();
+
+ if (!email) {
+ apply_form_error('group-transfer-form', '{% trans "Email can not be blank."%}');
+ return false;
+ }
+
+ $('#group-transfer-form').submit();
+ return false;
+});
{% endblock %}
diff --git a/seahub/group/urls.py b/seahub/group/urls.py
index 932c002a76..e76e02a294 100644
--- a/seahub/group/urls.py
+++ b/seahub/group/urls.py
@@ -6,7 +6,7 @@ from views import group_info, group_members, group_member_operations, group_add_
group_remove_admin, group_discuss, group_wiki, group_wiki_create, \
group_wiki_page_new, group_wiki_page_edit, group_wiki_pages, \
group_wiki_page_delete, group_remove, group_dismiss, group_quit, \
- group_make_public, group_revoke_public
+ group_make_public, group_revoke_public, group_transfer
urlpatterns = patterns('',
url(r'^(?P\d+)/$', group_info, name='group_info'),
@@ -23,6 +23,7 @@ urlpatterns = patterns('',
url(r'^(?P\d+)/manage/$', group_manage, name='group_manage'),
url(r'^(?P\d+)/remove/$', group_remove, name='group_remove'),
url(r'^(?P\d+)/dismiss/$', group_dismiss, name='group_dismiss'),
+ url(r'^(?P\d+)/transfer/$', group_transfer, name='group_transfer'),
url(r'^(?P\d+)/make_pub/$', group_make_public, name='group_make_pub'),
url(r'^(?P\d+)/revoke_pub/$', group_revoke_public, name='group_revoke_pub'),
url(r'^(?P\d+)/quit/$', group_quit, name='group_quit'),
diff --git a/seahub/group/views.py b/seahub/group/views.py
index b3ebf83b28..de02b84bd4 100644
--- a/seahub/group/views.py
+++ b/seahub/group/views.py
@@ -233,6 +233,26 @@ def group_dismiss(request, group_id):
return HttpResponseRedirect(reverse('group_list'))
+@login_required
+@group_staff_required
+def group_transfer(request, group_id):
+ """Change group creator.
+ """
+ if request.method != 'POST':
+ raise Http404
+
+ group_id = int(group_id)
+ username = request.user.username
+ email = request.POST.get('email', '')
+ if email != username:
+ if not is_group_user(group_id, email):
+ ccnet_threaded_rpc.group_add_member(group_id, username, email)
+
+ ccnet_threaded_rpc.set_group_creator(group_id, email)
+
+ next = reverse('group_list', args=[])
+ return HttpResponseRedirect(next)
+
@login_required
def group_make_public(request, group_id):
"""
diff --git a/seahub/templates/repo.html b/seahub/templates/repo.html
index 830ef08bb9..793240819f 100644
--- a/seahub/templates/repo.html
+++ b/seahub/templates/repo.html
@@ -129,6 +129,9 @@
{% trans "Don't keep history" %}
0 %}checked="checked"{% endif %} class="vam" /> {% trans "Only keep a period of history:" %} {% trans "days" %}
{% endif %}
+
+
+
@@ -280,6 +283,7 @@ $('#repo-setting-form').submit(function() {
'repo_id': $('#repo-setting-form input[name="repo_id"]').val(),
'repo_name': $('#repo-setting-form input[name="repo_name"]').val(),
'repo_desc': $('#repo-setting-form input[name="repo_desc"]').val(),
+ 'repo_owner': $('#repo-setting-form input[name="repo_owner"]').val(),
{% if not ENABLE_SUB_LIBRARY or not repo.is_virtual %}
'days': days
{% endif %}
diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py
index aff6ded735..4316d6162a 100644
--- a/seahub/views/__init__.py
+++ b/seahub/views/__init__.py
@@ -387,6 +387,7 @@ def repo_save_settings(request):
repo_name = form.cleaned_data['repo_name']
repo_desc = form.cleaned_data['repo_desc']
days = form.cleaned_data['days']
+ repo_owner = form.cleaned_data['repo_owner']
repo = get_repo(repo_id)
if not repo:
@@ -419,6 +420,10 @@ def repo_save_settings(request):
return HttpResponse(json.dumps({'error': _(u'Failed to save settings on server')}),
status=400, content_type=content_type)
+ # set library owner
+ if repo_owner is not None and repo_owner != username:
+ seafile_api.set_repo_owner(repo_id, repo_owner)
+
messages.success(request, _(u'Settings saved.'))
return HttpResponse(json.dumps({'success': True}),
content_type=content_type)
diff --git a/seahub/views/repo.py b/seahub/views/repo.py
index f9b9b27715..b218e41c90 100644
--- a/seahub/views/repo.py
+++ b/seahub/views/repo.py
@@ -185,8 +185,9 @@ def render_repo(request, repo):
no_quota = is_no_quota(repo.id)
history_limit = seaserv.get_repo_history_limit(repo.id)
search_repo_id = None if repo.encrypted else repo.id
+ repo_owner = seafile_api.get_repo_owner(repo.id)
+ is_repo_owner = True if repo_owner == username else False
- is_repo_owner = seafile_api.is_repo_owner(username, repo.id)
more_start = None
file_list, dir_list, dirent_more = get_repo_dirents(request, repo.id, head_commit, path, offset=0, limit=100)
if dirent_more:
@@ -209,6 +210,7 @@ def render_repo(request, repo):
return render_to_response('repo.html', {
'repo': repo,
'user_perm': user_perm,
+ 'repo_owner': repo_owner,
'is_repo_owner': is_repo_owner,
'current_commit': head_commit,
'password_set': True,