From 4d9ba15cfce8540bcc85d5bb1aeec1f8afc8289a Mon Sep 17 00:00:00 2001 From: llj Date: Mon, 28 Apr 2014 17:18:41 +0800 Subject: [PATCH] [views] moved some functions from views/__init__.py to views/__ajax__.py --- seahub/templates/pubrepo.html | 2 +- seahub/templates/snippets/events_js.html | 2 +- seahub/urls.py | 9 +- seahub/views/__init__.py | 196 +--------------------- seahub/views/ajax.py | 200 ++++++++++++++++++++++- 5 files changed, 204 insertions(+), 205 deletions(-) diff --git a/seahub/templates/pubrepo.html b/seahub/templates/pubrepo.html index bbc3751655..11bfdcacd7 100644 --- a/seahub/templates/pubrepo.html +++ b/seahub/templates/pubrepo.html @@ -69,7 +69,7 @@ $(".cancel-share").click(function() { function repoCreateSuccessCallback() { location.reload(); } -{% url 'seahub.views.public_repo_create' as repo_create_url %} +{% url 'public_repo_create' as repo_create_url %} {% with post_url=repo_create_url %} {% include "snippets/repo_create_js.html" %} {% endwith %} diff --git a/seahub/templates/snippets/events_js.html b/seahub/templates/snippets/events_js.html index 7ca4fbdb4a..bc98cddc9a 100644 --- a/seahub/templates/snippets/events_js.html +++ b/seahub/templates/snippets/events_js.html @@ -4,7 +4,7 @@ function reqEvents(start) { $('#events-loading').removeClass('hide'); $.ajax({ - url:'{{SITE_ROOT}}events/?start=' + start{% if org %} + '&org_id={{ org.org_id }}'{% endif %}, + url:'{% url 'events' %}?start=' + start{% if org %} + '&org_id={{ org.org_id }}'{% endif %}, dataType: 'json', cache: false, success: function(data) { diff --git a/seahub/urls.py b/seahub/urls.py index 502c87d2a2..7666fb53ae 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -57,7 +57,6 @@ urlpatterns = patterns('', # url(r'^home/public/reply/(?P[\d]+)/$', innerpub_msg_reply, name='innerpub_msg_reply'), # url(r'^home/owner/(?P[^/]+)/$', ownerhome, name='ownerhome'), - (r'^repo/create/$', repo_create), (r'^repo/upload_check/$', validate_filename), url(r'^repo/unsetinnerpub/(?P[-0-9a-f]{36})/$', unsetinnerpub, name='unsetinnerpub'), url(r'^repo/set_password/$', repo_set_password, name="repo_set_password"), @@ -74,7 +73,6 @@ urlpatterns = patterns('', url(r'^repo/history/view/(?P[-0-9a-f]{36})/$', repo_history_view, name='repo_history_view'), url(r'^repo/recycle/(?P[-0-9a-f]{36})/$', repo_recycle_view, name='repo_recycle_view'), url(r'^repo/snapshot/view/(?P[-0-9a-f]{36})/$', repo_view_snapshot, name='repo_view_snapshot'), - url(r'^repo/history/changes/(?P[-0-9a-f]{36})/$', repo_history_changes, name='repo_history_changes'), url(r'^repo/(?P[-0-9a-f]{36})/files/$', view_file, name="repo_view_file"), url(r'^repo/(?P[-0-9a-f]{36})/history/files/$', view_history_file, name="view_history_file"), url(r'^repo/(?P[-0-9a-f]{36})/trash/files/$', view_trash_file, name="view_trash_file"), @@ -100,7 +98,6 @@ urlpatterns = patterns('', (r'^file_upload_progress_page/$', file_upload_progress_page), url(r'^activities/$', activities, name='activities'), url(r'^starred/$', starred, name='starred'), - (r'^events/$', events), # ajax (r'^pdf_full_view/$', pdf_full_view), url(r'^i18n/$', i18n, name='i18n'), (r'^download/repo/$', repo_download), @@ -113,6 +110,7 @@ urlpatterns = patterns('', url(r'^download_client_program/$', TemplateView.as_view(template_name="download.html"), name="download_client"), ### Ajax ### + url(r'^ajax/repo/create/$', repo_create, name="repo_create"), (r'^ajax/repo/(?P[-0-9a-f]{36})/remove/$', repo_remove), url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/$', get_dirents, name="get_dirents"), @@ -142,6 +140,7 @@ urlpatterns = patterns('', url(r'^ajax/repo/(?P[-0-9a-f]{36})/file/unstar/$', repo_unstar_file, name='repo_unstar_file'), url(r'^ajax/repo/(?P[-0-9a-f]{36})/current_commit/$', get_current_commit, name='get_current_commit'), + url(r'^ajax/repo/(?P[-0-9a-f]{36})/history/changes/$', repo_history_changes, name='repo_history_changes'), url(r'^ajax/repo/(?P[-0-9a-f]{36})/encrypted_file/(?P[0-9a-f]{40})/download/$', download_enc_file, name='download_enc_file'), @@ -157,6 +156,8 @@ urlpatterns = patterns('', url(r'^ajax/space_and_traffic/$', space_and_traffic, name='space_and_traffic'), url(r'^ajax/my-shared-and-group-repos/$', my_shared_and_group_repos, name='my_shared_and_group_repos'), + url(r'^ajax/events/$', events, name="events"), + ### Apps ### (r'^api2/', include('seahub.api2.urls')), (r'^avatar/', include('seahub.avatar.urls')), @@ -213,7 +214,7 @@ if getattr(settings, 'CLOUD_MODE', False): else: urlpatterns += patterns('', url(r'^pubinfo/libraries/$', pubrepo, name='pubrepo'), - (r'^publicrepo/create/$', public_repo_create), + url(r'^ajax/publicrepo/create/$', public_repo_create, name='public_repo_create'), url(r'^pubinfo/groups/$', pubgrp, name='pubgrp'), url(r'^pubinfo/users/$', pubuser, name='pubuser'), ) diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index 7400c1b766..5ef12252ab 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -72,8 +72,7 @@ from seahub.notifications.models import UserNotification from seahub.options.models import UserOptions, CryptoOptionNotSetError from seahub.profile.models import Profile from seahub.share.models import FileShare, PrivateFileDirShare, UploadLinkShare -from seahub.forms import AddUserForm, RepoCreateForm, \ - RepoPassowrdForm, SharedRepoCreateForm,\ +from seahub.forms import AddUserForm, RepoPassowrdForm, \ SetUserQuotaForm, RepoSettingForm, SharedLinkPasswordForm from seahub.signals import repo_created, repo_deleted from seahub.utils import render_permission_error, render_error, list_to_string, \ @@ -865,53 +864,6 @@ def get_diff(repo_id, arg1, arg2): return lists -@login_required -def repo_history_changes(request, repo_id): - if not request.is_ajax(): - return Http404 - - changes = {} - content_type = 'application/json; charset=utf-8' - - if not access_to_repo(request, repo_id, ''): - return HttpResponse(json.dumps(changes), content_type=content_type) - - repo = get_repo(repo_id) - if not repo: - return HttpResponse(json.dumps(changes), content_type=content_type) - - username = request.user.username - try: - server_crypto = UserOptions.objects.is_server_crypto(username) - except CryptoOptionNotSetError: - # Assume server_crypto is ``False`` if this option is not set. - server_crypto = False - - if repo.encrypted and \ - (repo.enc_version == 1 or (repo.enc_version == 2 and server_crypto)) \ - and not is_passwd_set(repo_id, username): - return HttpResponse(json.dumps(changes), content_type=content_type) - - commit_id = request.GET.get('commit_id', '') - if not commit_id: - return HttpResponse(json.dumps(changes), content_type=content_type) - - changes = get_diff(repo_id, '', commit_id) - - c = get_commit(repo.id, repo.version, commit_id) - if c.parent_id is None: - # A commit is a first commit only if it's parent id is None. - changes['cmt_desc'] = repo.desc - elif c.second_parent_id is None: - # Normal commit only has one parent. - if c.desc.startswith('Changed library'): - changes['cmt_desc'] = _('Changed library name or description') - else: - # A commit is a merge only if it has two parents. - changes['cmt_desc'] = _('No conflict in the merge.') - - return HttpResponse(json.dumps(changes), content_type=content_type) - @login_required def modify_token(request, repo_id): if not validate_owner(request, repo_id): @@ -995,7 +947,7 @@ def myhome(request): owned_repos = seafile_api.get_owned_repo_list(username) calculate_repos_last_modify(owned_repos) - repo_create_url = reverse(repo_create) + repo_create_url = reverse("repo_create") return render_to_response('myhome.html', { "owned_repos": owned_repos, @@ -1151,62 +1103,6 @@ def client_unsync(request): # return HttpResponse(serialized_data, content_type=content_type) # else: # return HttpResponseBadRequest(content_type=content_type) - -@login_required -def public_repo_create(request): - ''' - Handle ajax post to create public repo. - - ''' - if not request.is_ajax() or request.method != 'POST': - return Http404 - - result = {} - content_type = 'application/json; charset=utf-8' - - form = SharedRepoCreateForm(request.POST) - if not form.is_valid(): - result['error'] = str(form.errors.values()[0]) - return HttpResponseBadRequest(json.dumps(result), - content_type=content_type) - - repo_name = form.cleaned_data['repo_name'] - repo_desc = form.cleaned_data['repo_desc'] - permission = form.cleaned_data['permission'] - encryption = int(form.cleaned_data['encryption']) - - uuid = form.cleaned_data['uuid'] - magic_str = form.cleaned_data['magic_str'] - encrypted_file_key = form.cleaned_data['encrypted_file_key'] - - user = request.user.username - - try: - if not encryption: - repo_id = seafile_api.create_repo(repo_name, repo_desc, user, None) - else: - repo_id = seafile_api.create_enc_repo(uuid, repo_name, repo_desc, user, magic_str, encrypted_file_key, enc_version=2) - - # set this repo as inner pub - seafile_api.add_inner_pub_repo(repo_id, permission) - #seafserv_threaded_rpc.set_inner_pub_repo(repo_id, permission) - except SearpcError as e: - repo_id = None - logger.error(e) - - if not repo_id: - result['error'] = _(u'Internal Server Error') - return HttpResponse(json.dumps(result), status=500, - content_type=content_type) - else: - result['success'] = True - repo_created.send(sender=None, - org_id=-1, - creator=user, - repo_id=repo_id, - repo_name=repo_name) - return HttpResponse(json.dumps(result), content_type=content_type) - @login_required def unsetinnerpub(request, repo_id): repo = get_repo(repo_id) @@ -1441,70 +1337,6 @@ def validate_filename(request): content_type = 'application/json; charset=utf-8' return HttpResponse(json.dumps(result), content_type=content_type) -@login_required -def repo_create(request): - ''' - Handle ajax post to create a library. - - ''' - if not request.is_ajax() or request.method != 'POST': - return Http404 - - result = {} - content_type = 'application/json; charset=utf-8' - - form = RepoCreateForm(request.POST) - if not form.is_valid(): - result['error'] = str(form.errors.values()[0]) - return HttpResponseBadRequest(json.dumps(result), - content_type=content_type) - - repo_name = form.cleaned_data['repo_name'] - repo_desc = form.cleaned_data['repo_desc'] - encryption = int(form.cleaned_data['encryption']) - - uuid = form.cleaned_data['uuid'] - magic_str = form.cleaned_data['magic_str'] - encrypted_file_key = form.cleaned_data['encrypted_file_key'] - - username = request.user.username - - try: - if not encryption: - repo_id = seafile_api.create_repo(repo_name, repo_desc, username, - None) - else: - repo_id = seafile_api.create_enc_repo( - uuid, repo_name, repo_desc, username, - magic_str, encrypted_file_key, enc_version=2) - except SearpcError, e: - repo_id = None - - if not repo_id: - result['error'] = _(u"Internal Server Error") - return HttpResponse(json.dumps(result), status=500, - content_type=content_type) - else: - try: - default_lib = (int(request.GET.get('default_lib', 0)) == 1) - except ValueError: - default_lib = False - if default_lib: - UserOptions.objects.set_default_repo(username, repo_id) - - result = { - 'repo_id': repo_id, - 'repo_name': repo_name, - 'repo_desc': repo_desc, - 'repo_enc': encryption, - } - repo_created.send(sender=None, - org_id=-1, - creator=username, - repo_id=repo_id, - repo_name=repo_name) - return HttpResponse(json.dumps(result), content_type=content_type) - def render_file_revisions (request, repo_id): """List all history versions of a file.""" path = request.GET.get('p', '/') @@ -1976,30 +1808,6 @@ def activities(request): 'new_start': start, }, context_instance=RequestContext(request)) -@login_required -def events(request): - if not request.is_ajax(): - raise Http404 - - events_count = 15 - username = request.user.username - start = int(request.GET.get('start')) - - if request.cloud_mode: - org_id = request.GET.get('org_id') - events, start = get_org_user_events(org_id, username, start, events_count) - else: - events, start = get_user_events(username, start, events_count) - events_more = True if len(events) == events_count else False - - event_groups = group_events_data(events) - ctx = {'event_groups': event_groups} - html = render_to_string("snippets/events_body.html", ctx) - - return HttpResponse(json.dumps({'html':html, 'events_more':events_more, - 'new_start': start}), - content_type='application/json; charset=utf-8') - def group_events_data(events): """ Group events according to the date. diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py index f9067cd6a2..59fbd8a340 100644 --- a/seahub/views/ajax.py +++ b/seahub/views/ajax.py @@ -20,21 +20,21 @@ from pysearpc import SearpcError from seahub.auth.decorators import login_required from seahub.contacts.models import Contact -from seahub.forms import RepoNewDirentForm, RepoRenameDirentForm +from seahub.forms import RepoNewDirentForm, RepoRenameDirentForm, \ + RepoCreateForm, SharedRepoCreateForm from seahub.options.models import UserOptions, CryptoOptionNotSetError from seahub.notifications.models import UserNotification -from seahub.signals import upload_file_successful +from seahub.signals import upload_file_successful, repo_created, repo_deleted from seahub.views import get_repo_dirents, validate_owner, \ check_repo_access_permission, get_unencry_rw_repos_by_user, \ - get_system_default_repo_id + get_system_default_repo_id, access_to_repo, get_diff, group_events_data from seahub.views.repo import get_nav_path, get_fileshare, get_dir_share_link, \ get_uploadlink, get_dir_shared_upload_link import seahub.settings as settings -from seahub.signals import repo_deleted from seahub.utils import check_filename_with_rename, EMPTY_SHA1, gen_block_get_url, \ check_and_get_org_by_repo, TRAFFIC_STATS_ENABLED, get_user_traffic_stat,\ new_merge_with_no_conflict, get_commit_before_new_merge, \ - get_repo_last_modify, gen_file_upload_url + get_repo_last_modify, gen_file_upload_url, get_org_user_events, get_user_events from seahub.utils.star import star_file, unstar_file # Get an instance of a logger @@ -1464,3 +1464,193 @@ def get_file_op_url(request, repo_id): url = gen_file_upload_url(token, op_type + '-aj') return HttpResponse(json.dumps({"url": url}), content_type=content_type) + +@login_required +def repo_history_changes(request, repo_id): + if not request.is_ajax(): + return Http404 + + changes = {} + content_type = 'application/json; charset=utf-8' + + if not access_to_repo(request, repo_id, ''): + return HttpResponse(json.dumps(changes), content_type=content_type) + + repo = get_repo(repo_id) + if not repo: + return HttpResponse(json.dumps(changes), content_type=content_type) + + username = request.user.username + try: + server_crypto = UserOptions.objects.is_server_crypto(username) + except CryptoOptionNotSetError: + # Assume server_crypto is ``False`` if this option is not set. + server_crypto = False + + if repo.encrypted and \ + (repo.enc_version == 1 or (repo.enc_version == 2 and server_crypto)) \ + and not is_passwd_set(repo_id, username): + return HttpResponse(json.dumps(changes), content_type=content_type) + + commit_id = request.GET.get('commit_id', '') + if not commit_id: + return HttpResponse(json.dumps(changes), content_type=content_type) + + changes = get_diff(repo_id, '', commit_id) + + c = get_commit(repo.id, repo.version, commit_id) + if c.parent_id is None: + # A commit is a first commit only if it's parent id is None. + changes['cmt_desc'] = repo.desc + elif c.second_parent_id is None: + # Normal commit only has one parent. + if c.desc.startswith('Changed library'): + changes['cmt_desc'] = _('Changed library name or description') + else: + # A commit is a merge only if it has two parents. + changes['cmt_desc'] = _('No conflict in the merge.') + + return HttpResponse(json.dumps(changes), content_type=content_type) + +@login_required +def repo_create(request): + ''' + Handle ajax post to create a library. + + ''' + if not request.is_ajax() or request.method != 'POST': + return Http404 + + result = {} + content_type = 'application/json; charset=utf-8' + + form = RepoCreateForm(request.POST) + if not form.is_valid(): + result['error'] = str(form.errors.values()[0]) + return HttpResponseBadRequest(json.dumps(result), + content_type=content_type) + + repo_name = form.cleaned_data['repo_name'] + repo_desc = form.cleaned_data['repo_desc'] + encryption = int(form.cleaned_data['encryption']) + + uuid = form.cleaned_data['uuid'] + magic_str = form.cleaned_data['magic_str'] + encrypted_file_key = form.cleaned_data['encrypted_file_key'] + + username = request.user.username + + try: + if not encryption: + repo_id = seafile_api.create_repo(repo_name, repo_desc, username, + None) + else: + repo_id = seafile_api.create_enc_repo( + uuid, repo_name, repo_desc, username, + magic_str, encrypted_file_key, enc_version=2) + except SearpcError, e: + repo_id = None + + if not repo_id: + result['error'] = _(u"Internal Server Error") + return HttpResponse(json.dumps(result), status=500, + content_type=content_type) + try: + default_lib = (int(request.GET.get('default_lib', 0)) == 1) + except ValueError: + default_lib = False + if default_lib: + UserOptions.objects.set_default_repo(username, repo_id) + + result = { + 'repo_id': repo_id, + 'repo_name': repo_name, + 'repo_desc': repo_desc, + 'repo_enc': encryption, + } + repo_created.send(sender=None, + org_id=-1, + creator=username, + repo_id=repo_id, + repo_name=repo_name) + return HttpResponse(json.dumps(result), content_type=content_type) + +@login_required +def public_repo_create(request): + ''' + Handle ajax post to create public repo. + + ''' + if not request.is_ajax() or request.method != 'POST': + return Http404 + + result = {} + content_type = 'application/json; charset=utf-8' + + form = SharedRepoCreateForm(request.POST) + if not form.is_valid(): + result['error'] = str(form.errors.values()[0]) + return HttpResponseBadRequest(json.dumps(result), + content_type=content_type) + + repo_name = form.cleaned_data['repo_name'] + repo_desc = form.cleaned_data['repo_desc'] + permission = form.cleaned_data['permission'] + encryption = int(form.cleaned_data['encryption']) + + uuid = form.cleaned_data['uuid'] + magic_str = form.cleaned_data['magic_str'] + encrypted_file_key = form.cleaned_data['encrypted_file_key'] + + user = request.user.username + + try: + if not encryption: + repo_id = seafile_api.create_repo(repo_name, repo_desc, user, None) + else: + repo_id = seafile_api.create_enc_repo(uuid, repo_name, repo_desc, user, magic_str, encrypted_file_key, enc_version=2) + + # set this repo as inner pub + seafile_api.add_inner_pub_repo(repo_id, permission) + #seafserv_threaded_rpc.set_inner_pub_repo(repo_id, permission) + except SearpcError as e: + repo_id = None + logger.error(e) + + if not repo_id: + result['error'] = _(u'Internal Server Error') + return HttpResponse(json.dumps(result), status=500, + content_type=content_type) + + result['success'] = True + repo_created.send(sender=None, + org_id=-1, + creator=user, + repo_id=repo_id, + repo_name=repo_name) + return HttpResponse(json.dumps(result), content_type=content_type) + +@login_required +def events(request): + if not request.is_ajax(): + raise Http404 + + events_count = 15 + username = request.user.username + start = int(request.GET.get('start')) + + if request.cloud_mode: + org_id = request.GET.get('org_id') + events, start = get_org_user_events(org_id, username, start, events_count) + else: + events, start = get_user_events(username, start, events_count) + events_more = True if len(events) == events_count else False + + event_groups = group_events_data(events) + ctx = {'event_groups': event_groups} + html = render_to_string("snippets/events_body.html", ctx) + + return HttpResponse(json.dumps({'html':html, 'events_more':events_more, + 'new_start': start}), + content_type='application/json; charset=utf-8') +