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 %} +
    {% csrf_token %} +

    {% trans "Transfer Group To"%}

    + +

    {% trans "Tip: the email should be already registered."%}

    +

    + +
    {% 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,