From c625ca3a775fd953f3fe66f802fbf025d399e8e9 Mon Sep 17 00:00:00 2001 From: lins05 Date: Tue, 10 Jun 2014 10:13:51 +0800 Subject: [PATCH] [api] added repo_history_changes api Also include commit_id in events api --- seahub/api2/urls.py | 1 + seahub/api2/utils.py | 27 ++++++++++++++++++++++++++- seahub/api2/views.py | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/seahub/api2/urls.py b/seahub/api2/urls.py index 736daa4aba..a912e8bcb0 100644 --- a/seahub/api2/urls.py +++ b/seahub/api2/urls.py @@ -51,6 +51,7 @@ urlpatterns = patterns('', url(r'^groupandcontacts/$', GroupAndContacts.as_view()), url(r'^events/$', EventsView.as_view()), + url(r'^repo_history_changes/(?P[-0-9a-f]{36})/$', RepoHistoryChange.as_view()), url(r'^unseen_messages/$', UnseenMessagesCountView.as_view()), url(r'^group/msgs/(?P\d+)/$', GroupMsgsView.as_view()), url(r'^group/(?P\d+)/msg/(?P\d+)/$', GroupMsgView.as_view()), diff --git a/seahub/api2/utils.py b/seahub/api2/utils.py index 3ff0b8ade8..2a219dde95 100644 --- a/seahub/api2/utils.py +++ b/seahub/api2/utils.py @@ -4,11 +4,13 @@ import os import time +from collections import defaultdict + from django.core.paginator import EmptyPage, InvalidPage from rest_framework.response import Response from rest_framework import status from seaserv import seafile_api, get_commits, server_repo_size, \ - get_personal_groups_by_user, is_group_user, get_group + get_personal_groups_by_user, is_group_user, get_group, seafserv_threaded_rpc from pysearpc import SearpcError from seahub.base.accounts import User @@ -479,3 +481,26 @@ def get_client_ip(request): ip = request.META.get('REMOTE_ADDR', '') return ip + +def get_diff_details(repo_id, commit1, commit2): + result = defaultdict(list) + + diff_result = seafserv_threaded_rpc.get_diff(repo_id, commit1, commit2) + if not diff_result: + return result + + for d in diff_result: + if d.status == 'add': + result['added_files'].append(d.name) + elif d.status == 'del': + result['deleted_files'].append(d.name) + elif d.status == 'mov': + result['renamed_files'].extend((d.name, d.new_name)) + elif d.status == 'mod': + result['modified_files'].append(d.name) + elif d.status == 'newdir': + result['added_dirs'].append(d.name) + elif d.status == 'deldir': + result['deleted_dirs'].append(d.name) + + return result \ No newline at end of file diff --git a/seahub/api2/views.py b/seahub/api2/views.py index 77d9265996..6b7723fdec 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -30,7 +30,7 @@ from utils import is_repo_writable, is_repo_accessible, calculate_repo_info, \ api_error, get_file_size, prepare_starred_files, \ get_groups, get_group_and_contacts, prepare_events, \ get_person_msgs, api_group_check, get_email, get_timestamp, \ - get_group_message_json, get_group_msgs, get_group_msgs_json + get_group_message_json, get_group_msgs, get_group_msgs_json, get_diff_details from seahub.avatar.templatetags.avatar_tags import api_avatar_url from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url from seahub.base.accounts import User @@ -2393,6 +2393,7 @@ class EventsView(APIView): d['desc'] = e.commit.desc d['repo_id'] = e.repo.id d['repo_name'] = e.repo.name + d['commit_id'] = e.commit.id else: d['repo_id'] = e.repo_id d['repo_name'] = e.repo_name @@ -3121,6 +3122,39 @@ class DiscussionHtml(APIView): def post(self, request, msg_id, format=None): return html_msg_reply(request, msg_id) +class RepoHistoryChange(APIView): + authentication_classes = (TokenAuthentication, ) + permission_classes = (IsAuthenticated,) + throttle_classes = (UserRateThrottle, ) + + def get(self, request, repo_id, format=None): + if not access_to_repo(request, repo_id, ''): + return HttpResponse(json.dumps({"err": 'Permission denied'}), + status=400, + content_type=json_content_type) + + repo = get_repo(repo_id) + if not repo: + return HttpResponse(json.dumps({"err": 'Library does not exist'}), + status=400, + content_type=json_content_type) + + if repo.encrypted and not is_passwd_set(repo_id, request.user.username): + return HttpResponse(json.dumps({"err": 'Library is encrypted'}), + status=400, + content_type=json_content_type) + + commit_id = request.GET.get('commit_id', '') + if not commit_id: + return HttpResponse(json.dumps({"err": 'Invalid argument'}), + status=400, + content_type=json_content_type) + + details = get_diff_details(repo_id, '', commit_id) + + return HttpResponse(json.dumps(details), + content_type=json_content_type) + class RepoHistoryChangeHtml(APIView): authentication_classes = (TokenAuthentication, ) permission_classes = (IsAuthenticated,)