From 85c7fef3bcc2a52ed6272123af406012ce225750 Mon Sep 17 00:00:00 2001 From: llj Date: Wed, 19 Dec 2012 19:06:38 +0800 Subject: [PATCH] added 'more' for events --- media/css/seahub.css | 14 ++++ organizations/views.py | 6 +- templates/snippets/events.html | 68 ++--------------- templates/snippets/events_.html | 58 +++++++++++++++ templates/snippets/events_js.html | 87 ++++++++++++++++------ templates/snippets/list_commit_detail.html | 1 - urls.py | 3 +- utils.py | 8 +- views.py | 25 ++++++- 9 files changed, 173 insertions(+), 97 deletions(-) create mode 100644 templates/snippets/events_.html diff --git a/media/css/seahub.css b/media/css/seahub.css index ddcb67e185..6419a83d9b 100644 --- a/media/css/seahub.css +++ b/media/css/seahub.css @@ -774,6 +774,20 @@ textarea:-moz-placeholder {/* for FF */ .event-item .avatar { border-radius:3px; } +#events-loading, +#events-more { + text-align:center; + width:610px; + margin-left:60px; +} +#events-more { + color:#777; + padding:.5em 0; +} +#events-more:hover { + color:#000; + background:#dfdfdf; +} /* avatar */ .avatar-op .avatar, .home-profile .avatar, diff --git a/organizations/views.py b/organizations/views.py index 4a11679c01..e2d3319411 100644 --- a/organizations/views.py +++ b/organizations/views.py @@ -38,7 +38,7 @@ from seahub.forms import RepoCreateForm, SharedRepoCreateForm import seahub.settings as seahub_settings from seahub.utils import render_error, render_permission_error, gen_token, \ validate_group_name, string2list, calculate_repo_last_modify, MAX_INT, \ - EVENTS_ENABLED, get_org_user_events, get_starred_files + EVENTS_ENABLED, get_starred_files from seahub.views import myhome from seahub.signals import repo_created @@ -159,9 +159,9 @@ def org_personal(request, url_prefix): # events if EVENTS_ENABLED: - events = get_org_user_events(org.org_id, user) + events = True else: - events = None + events = False quota_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org.org_id, user) starred_files = get_starred_files(user, org_id=org.org_id) diff --git a/templates/snippets/events.html b/templates/snippets/events.html index 6297b1f58e..d265d55a4b 100644 --- a/templates/snippets/events.html +++ b/templates/snippets/events.html @@ -1,67 +1,9 @@ -{% load seahub_tags avatar_tags group_avatar_tags i18n %} -{% load url from future %} +{% load i18n %}

{% trans 'Recent Events' %}

- + +
{% trans 'Loading...' %}
+ +

{% trans 'Library' %} {% trans 'is encrypted' %}

diff --git a/templates/snippets/events_.html b/templates/snippets/events_.html new file mode 100644 index 0000000000..b37138d627 --- /dev/null +++ b/templates/snippets/events_.html @@ -0,0 +1,58 @@ +{% load seahub_tags avatar_tags i18n %} +{% load url from future %} + +{% for ev in events %} +
  • + {% if ev.etype == 'repo-update' %} + {% with author=ev.commit.creator_name commit=ev.commit repo=ev.repo %} + +
    +
    + {{ commit.ctime|translate_seahub_time }} + {{ author|email2nickname }} +
    +

    {% trans 'Updated library' %} {{ repo.name }}

    +

    {{ commit.desc|translate_commit_desc }} + {% if repo.encrypted %} + {% trans 'Details' %} + {% else %} + {% trans 'Details' %} + {% endif %} +

    +
    + {% endwith %} + {% endif %} + + {% if ev.etype == 'repo-create' %} + {% with author=ev.creator repo_id=ev.repo_id repo_name=ev.repo_name %} + +
    +
    + {{ ev.timestamp|translate_seahub_time }} + {{ author|email2nickname }} +
    +

    {% trans 'Created library' %} {{ repo_name }}

    +
    + {% endwith %} + {% endif %} + + {% if ev.etype == 'repo-delete' %} + {% with author=ev.repo_owner repo_name=ev.repo_name %} + +
    +
    + {{ ev.timestamp|translate_seahub_time }} + {{ author|email2nickname }} +
    +

    {% trans 'Deleted library' %} {{ repo_name }}

    +
    + {% endwith %} + {% endif %} +
  • +{% endfor %} diff --git a/templates/snippets/events_js.html b/templates/snippets/events_js.html index ce0c7689f0..8d3b2a5efe 100644 --- a/templates/snippets/events_js.html +++ b/templates/snippets/events_js.html @@ -1,30 +1,71 @@ -{% include 'snippets/list_commit_detail.html' %} -$('.event-item').each(function(index) { - if (index > 0 && $(this).children('.pic').attr('data') == $(this).prev().children('.pic').attr('data')) { - $(this).children('.pic').addClass('hide'); - } -}); -$('#events').removeClass('hide'); +{% load i18n %} +function reqEvents(start) { + $('#events-loading').removeClass('hide'); + $.ajax({ + url:'{{SITE_ROOT}}events/?start=' + start{% if org %} + '&org_id={{ org.org_id }}'{% endif %}, + dataType: 'json', + cache: false, + success: function(data) { + $('#events').append(data['html']); -// 查看加密 repo 的详情时, 先为其设置密码 -var cur_event; -$('a.lsch-encrypted').click(function() { - if ($(this).attr('password_set') == 'true') { - list_commit_change($(this)); - } else { - cur_event = $(this); - $('#repo-set-password-form input[name="repo_id"]').val($(this).attr('repo_id')); - $('#repo-set-password-form .repo-name').html($(this).attr('repo_name')); - $('#repo-set-password-form').modal({appendTo:'#main'}); - } - return false; + $('.event-item').each(function(index) { + if (index > 0 && $(this).children('.pic').attr('data') == $(this).prev().children('.pic').attr('data')) { + $(this).children('.pic').addClass('hide'); + } + }); + if (start == 0) { + $('#events').removeClass('hide'); + } + + $('#events-loading').addClass('hide'); + + if (data['more']) { + $('#events-more').data('start', start + 10).removeClass('hide'); + } else { + $('#events-more').addClass('hide'); + } + + // 查看加密 repo 的详情时, 先为其设置密码 + $('a.lsch-encrypted').click(function() { + if ($(this).data('passwordset')) { + list_commit_change($(this)); + } else { + $('#repo-set-password-form input[name="repo_id"]').val($(this).data('repoid')); + $('#repo-set-password-form .repo-name').html($(this).data('reponame')); + $('#repo-set-password-form').data('cur_event', $(this)).modal({appendTo:'#main'}); + } + return false; + }); + $('.lsch').click(function() { + list_commit_change($(this)); + return false; + }); + }, + error: function() { + var str = '{% trans "Unknown error." %}'; + if ($('#events-more').hasClass('hide')) { + str += '{% trans "Please refresh the page later." %}'; + } else { + str += '{% trans "Please try again later." %}'; + } + $('#events-error').html(str).removeClass('hide'); + } + }); +} +reqEvents(0); +$('#events-more').click(function() { + $(this).addClass('hide'); + reqEvents($(this).data('start')); }); + +{% include 'snippets/list_commit_detail.html' %} + $('#repo-set-password-form .submit').click(function() { var input_password = $('#repo-set-password-form input[name="password"]'); var repo_id = $('#repo-set-password-form input[name="repo_id"]').val(); var password = input_password.val(); if (!password) { - apply_form_error('repo-set-password-form', "密码不能为空"); + apply_form_error('repo-set-password-form', '{% trans "Password is required." %}'); } else { apply_form_error('repo-set-password-form', ''); $.ajax({ @@ -41,15 +82,15 @@ $('#repo-set-password-form .submit').click(function() { success: function(data) { if (data['success']) { $.modal.close(); - $('a.lsch-encrypted[repo_id="' + repo_id + '"]').attr('password_set', 'true'); - list_commit_change(cur_event); + $('a.lsch-encrypted[data-repoid="' + repo_id + '"]').attr('data-passwordset', true); + list_commit_change($('#repo-set-password-form').data('cur_event')); } else { input_password.val(''); apply_form_error('repo-set-password-form', data['error']); } }, error: function(data, textStatus, jqXHR) { - apply_form_error('repo-set-password-form', '访问网站出错'); + apply_form_error('repo-set-password-form', '{% trans "Unknown error." %}'); } }); } diff --git a/templates/snippets/list_commit_detail.html b/templates/snippets/list_commit_detail.html index de3dea6b95..9d12752b84 100644 --- a/templates/snippets/list_commit_detail.html +++ b/templates/snippets/list_commit_detail.html @@ -1,4 +1,3 @@ - {% load i18n %} function get_commit_diff(url, callback) { $.ajax({ diff --git a/urls.py b/urls.py index 829a4ac9c0..81b7d7f79d 100644 --- a/urls.py +++ b/urls.py @@ -51,7 +51,7 @@ urlpatterns = patterns('', url(r'^repo/history/view/(?P[^/]+)/$', RepoHistoryView.as_view(), name='repo_history_view'), url(r'^repo/recycle/(?P[^/]+)/$', repo_recycle_view, name='repo_recycle_view'), url(r'^repo/snapshot/view/(?P[^/]+)/$', repo_view_snapshot, name='repo_view_snapshot'), - (r'^repo/history/changes/(?P[^/]+)/$', repo_history_changes), + url(r'^repo/history/changes/(?P[^/]+)/$', repo_history_changes, name='repo_history_changes'), (r'^repo/remove/(?P[^/]+)/$', repo_remove), url(r'^repo/(?P[^/]+)/files/$', repo_view_file, name="repo_view_file"), (r'^repo/(?P[^/]+)/file/edit/$', repo_file_edit), @@ -60,6 +60,7 @@ urlpatterns = patterns('', url(r'^f/(?P[^/]+)/$', view_shared_file, name='view_shared_file'), (r'^file_upload_progress_page/$', file_upload_progress_page), (r'^publicrepo/create/$', public_repo_create), + (r'^events/$', events), (r'^file_comment/$', file_comment), (r'^pdf_full_view/$', pdf_full_view), (r'^pubinfo/$', pubinfo), diff --git a/utils.py b/utils.py index 0eb07fe736..496b3fad11 100644 --- a/utils.py +++ b/utils.py @@ -451,9 +451,9 @@ if hasattr(settings, 'EVENTS_CONFIG_FILE'): EVENTS_ENABLED = True SeafEventsSession = seafevents.init_db_session_class(settings.EVENTS_CONFIG_FILE) - def get_user_events(username): + def get_user_events(username, start): ev_session = SeafEventsSession() - events = seafevents.get_user_events(ev_session, username, 0, 10) + events = seafevents.get_user_events(ev_session, username, start, start + 11) ev_session.close() for ev in events: if ev.etype == 'repo-update': @@ -468,10 +468,10 @@ if hasattr(settings, 'EVENTS_CONFIG_FILE'): return events - def get_org_user_events(org_id, username): + def get_org_user_events(org_id, username, start): ev_session = SeafEventsSession() events = seafevents.get_org_user_events(ev_session, \ - org_id, username, 0, 10) + org_id, username, start, start + 11) ev_session.close() for ev in events: if ev.etype == 'repo-update': diff --git a/views.py b/views.py index fa74e8396f..0d0a76b27d 100644 --- a/views.py +++ b/views.py @@ -70,7 +70,7 @@ from utils import render_permission_error, render_error, list_to_string, \ get_file_revision_id_size, get_ccnet_server_addr_port, \ gen_file_get_url, string2list, MAX_INT, \ gen_file_upload_url, check_and_get_org_by_repo, \ - get_file_contributors, EVENTS_ENABLED, get_user_events, \ + get_file_contributors, EVENTS_ENABLED, get_user_events, get_org_user_events, \ get_starred_files, star_file, unstar_file, is_file_starred try: from settings import DOCUMENT_CONVERTOR_ROOT @@ -915,7 +915,7 @@ def myhome(request): # events if EVENTS_ENABLED: - events = get_user_events(request.user.username) + events = True else: events = None @@ -2679,3 +2679,24 @@ def repo_download_dir(request, repo_id): url = gen_file_get_url(token, filename) return redirect(url) + +def events(request): + username = request.user.username + start = int(request.GET.get('start', 0)) + if request.cloud_mode: + org_id = request.GET.get('org_id') + events = get_org_user_events(org_id, username, start) + else: + events = get_user_events(username, start) + + events_more = False + if len(events) == 11: + events_more = True + events = events[:10] + + ctx = {} + ctx['events'] = events + html = render_to_string("snippets/events_.html", ctx) + + return HttpResponse(json.dumps({'html':html, 'more':events_more}), + content_type='application/json; charset=utf-8')