diff --git a/base/middleware.py b/base/middleware.py index 78415d08cb..1e06fb7861 100644 --- a/base/middleware.py +++ b/base/middleware.py @@ -2,6 +2,7 @@ from seahub.profile.models import UserProfile class UseridMiddleware(object): + """Store ccnet user id in request.user.user_id""" def process_request(self, request): if not request.user.is_authenticated(): diff --git a/media/css/seahub.css b/media/css/seahub.css index 1dfc516c42..613520b96f 100644 --- a/media/css/seahub.css +++ b/media/css/seahub.css @@ -144,4 +144,4 @@ strong { color:#808; font-weight: normal; } div.home-page h2 { font-style: italic; } /* help pages */ .help-page { width: 550px; } -.help-page img { display: block; margin-left: auto; margin: 20px auto; } \ No newline at end of file +.help-page img { display: block; margin: 20px auto; } \ No newline at end of file diff --git a/templates/myhome_base.html b/templates/myhome_base.html index 850063c849..d8f3021c5b 100644 --- a/templates/myhome_base.html +++ b/templates/myhome_base.html @@ -4,6 +4,11 @@
  • 我的页面
  • + {% if request.user.is_staff %} +
  • + 中继管理 +
  • + {% endif %}
  • 使用帮助
  • diff --git a/templates/repo.html b/templates/repo.html index 1671948edc..67e3d6ef45 100644 --- a/templates/repo.html +++ b/templates/repo.html @@ -30,12 +30,12 @@ -

    分支

    +

    版本

    - - + + {% for branch in branches %} @@ -45,12 +45,12 @@ {% endfor %}
    分支名Head Commit版本名最新提交记录
    -

    Commits

    +

    提交记录

    - - + + {% for commit in commits %} diff --git a/templates/repos.html b/templates/repos.html index 8e83a791fa..8736c6cfc6 100644 --- a/templates/repos.html +++ b/templates/repos.html @@ -1,18 +1,21 @@ -{% extends "base.html" %} +{% extends "myhome_base.html" %} {% block right_panel %} +

    所有文件盒

    IDTimeDiscription时间描述
    - + - + + {% for repo in repos %} + {% endfor %}
    Name名字 IDDiscription描述操作
    {{ repo.props.name }} {{ repo.props.id }} {{ repo.props.desc }}删除
    diff --git a/thirdpart/seaserv/__init__.py b/thirdpart/seaserv/__init__.py index 52de684397..f9d280c9b8 100644 --- a/thirdpart/seaserv/__init__.py +++ b/thirdpart/seaserv/__init__.py @@ -1,18 +1,17 @@ import service -from service import cclient, ccnet_rpc, seamsg_rpc, seafile_rpc, monitor_rpc +from service import cclient, ccnet_rpc, monitor_rpc, seafserv_rpc from service import translate_peerid, translate_msgtime, translate_groupid, \ translate_userid, translate_msgtime2, translate_time_sec, \ - translate_time_usec, get_peer_avatar_url, get_user_avatar_url + translate_time_usec, get_peer_avatar_url, get_user_avatar_url, \ + translate_userid_simple, translate_peerid_simple from service import get_peers_by_role, get_peers_by_myrole, send_command from service import get_groups, get_group from service import get_users, get_user, get_events, count_event -from service import get_message, get_user_messages, get_group_messages, \ - get_messages, count_message, count_user_message, count_group_message from service import get_repos, get_repo, get_repo_sinfo, get_commits, \ get_branches, get_commit_tree_block_number, \ get_upload_task_list, get_download_task_list, list_share_info, open_dir, \ - checkout, get_repo_status + checkout, get_repo_status, get_diff, list_dir from service import CCNET_CONF_PATH diff --git a/thirdpart/seaserv/service.py b/thirdpart/seaserv/service.py index a54144b4e1..cb8213dac7 100644 --- a/thirdpart/seaserv/service.py +++ b/thirdpart/seaserv/service.py @@ -44,20 +44,28 @@ Repo: name: Repo Name desc: Repo description worktree: The full path of the worktree of the repo + worktree_changed: True if the worktree is changed + worktree_checktime: The last check time of whether worktree is changed head_branch: The name of the head branch + enctrypted: True if the repo is encrypted + passwd: The password + Branch: name: commit_id: repo_id: -ShareItem: - +Commit: id: + creator_name: + creator: The id of the creator + desc: + ctime: repo_id: - group_id: - user_id: - timestamp: + root_id: + parent_id: + second_parent_id: SyncInfo: @@ -74,14 +82,13 @@ import json import os import sys -from pysearpc import SearpcError import ccnet -import seamsg import seafile +from pysearpc import SearpcError -if sys.platform == 'win32': - DEFAULT_CCNET_CONF_PATH = "C:\\ccnet" -else: +if 'win' in sys.platform: + DEFAULT_CCNET_CONF_PATH = "~/ccnet" +else: DEFAULT_CCNET_CONF_PATH = "~/.ccnet" if 'CCNET_CONF_DIR' in os.environ: @@ -89,9 +96,11 @@ if 'CCNET_CONF_DIR' in os.environ: else: CCNET_CONF_PATH = DEFAULT_CCNET_CONF_PATH -CCNET_CONF_PATH = os.path.expanduser(CCNET_CONF_PATH) +print "Load config from " + CCNET_CONF_PATH +CCNET_CONF_PATH = os.path.normpath(os.path.expanduser(CCNET_CONF_PATH)) -# this is not connect daemon, used for the web to display + +# This does not connect daemon, used for the web to display # (name, id) info cclient = ccnet.Client() @@ -103,9 +112,8 @@ else: pool = ccnet.ClientPool(CCNET_CONF_PATH) ccnet_rpc = ccnet.CcnetRpcClient(pool) -seamsg_rpc = seamsg.RpcClient(pool) -seafile_rpc = seafile.RpcClient(pool) monitor_rpc = seafile.MonitorRpcClient(pool) +seafserv_rpc = seafile.ServerRpcClient(pool) user_db = {} @@ -123,6 +131,22 @@ def translate_userid(user_id): else: return user_id[:8] + +def translate_userid_simple(user_id): + try: + user = user_db[user_id] + except: + user = ccnet_rpc.get_user(user_id) + if user: + user_db[user_id] = user + else: + return user_id[:8] + if user.props.name: + return user.props.name + else: + return user_id[:8] + + peer_db = {} def translate_peerid(peer_id): @@ -135,7 +159,22 @@ def translate_peerid(peer_id): else: return peer_id[:8] if peer.props.name: - return peer.props.name + "(" + peer_id[:4] + ")" + return peer.props.name + else: + return peer_id[:8] + + +def translate_peerid_simple(peer_id): + try: + peer = peer_db[peer_id] + except: + peer = ccnet_rpc.get_peer(peer_id) + if peer: + peer_db[peer_id] = peer + else: + return peer_id[:8] + if peer.props.name: + return peer.props.name else: return peer_id[:8] @@ -303,103 +342,133 @@ def send_command(command): pool.return_client(client) return ret -######## seamsg API ##### -def get_message(msgid): - return seamsg_rpc.get_message_by_id(msgid) - - -def get_user_messages(user, offset, limit): - """Get messages sent to or received from `user`. - - For example: - - get_user_message('eb812fd276432eff33bcdde7506f896eb4769da0', 0, 10) - - fetches the lastest 10 messages from the given user. - - :param user: user ID. - :param offset: offset of the first message. - :param limit: only fetch `limit` messages. - """ - return seamsg_rpc.get_user_messages(user, offset, limit) - - -def get_group_messages(group, offset, limit): - """Get messages of `group`.""" - return seamsg_rpc.get_group_messages(group, offset, limit) - - -def get_messages(offset, limit): - """Get messages start at `offset`.""" - return seamsg_rpc.get_messages(offset, limit) - -def count_message(): - return seamsg_rpc.count_message() - -def count_user_message(user): - return seamsg_rpc.count_user_message(user) - -def count_group_message(group): - return seamsg_rpc.count_group_message(group) - - -######## seafile API #### +######## seafserv API #### def get_repos(): """ Return repository list. """ - return seafile_rpc.get_repo_list("", 100) + return seafserv_rpc.get_repo_list("", 100) def get_repo(repo_id): - return seafile_rpc.get_repo(repo_id) + return seafserv_rpc.get_repo(repo_id) def get_repo_sinfo(repo_id): - return seafile_rpc.get_repo_sinfo(repo_id) + return seafserv_rpc.get_repo_sinfo(repo_id) -def get_commits(repo_id): - return seafile_rpc.get_commit_list(repo_id, "", 100) +def get_commits(repo_id, offset, limit): + """Get commit lists.""" + return seafserv_rpc.get_commit_list(repo_id, offset, limit) def get_commit_tree_block_number(commit_id): - return seafile_rpc.get_commit_tree_block_number(commit_id); + return seafserv_rpc.get_commit_tree_block_number(commit_id); def checkout(repo_id, commit_id): - return seafile_rpc.checkout(repo_id, commit_id) + return seafile_threaded_rpc.checkout(repo_id, commit_id) def get_upload_task_list(): - return seafile_rpc.get_upload_task_list() + return seafserv_rpc.get_upload_task_list() def get_download_task_list(): - return seafile_rpc.get_download_task_list() + return seafserv_rpc.get_download_task_list() def get_branches(repo_id): """Get branches of a given repo""" - return seafile_rpc.branch_gets(repo_id) + return seafserv_rpc.branch_gets(repo_id) def list_share_info(): - return seafile_rpc.list_share_info(0, 100) + return seafserv_rpc.list_share_info(0, 100) + +def get_filename(start, ent): + i = start + 1 + lenidx = start - 1 + while i <= len(ent): + tmp = " ".join(ent[start:i]) + if len(tmp) == int(ent[lenidx]): + return (tmp, i) + i = i + 1 + return ("", 0) + +def add_to_status_list(lists, status_ent): + if status_ent[1] == 'A': + filename, index = get_filename(4, status_ent) + lists[0].append(filename) + elif status_ent[1] == 'D': + filename, index = get_filename(4, status_ent) + lists[1].append(filename) + elif status_ent[1] == 'R': + filename1, index1 = get_filename(4, status_ent) + filename2, index2 = get_filename(index1 + 1, status_ent) + lists[2].append(filename1 + " was moved to " + filename2) + elif status_ent[1] == 'M': + filename, index = get_filename(4, status_ent) + lists[3].append(filename) + elif status_ent[1] == 'U': + if int(status_ent[2]) == 3: + filename, index = get_filename(4, status_ent) + lists[4].append(filename + ": Modified by others but removed by me") + elif int(status_ent[2]) == 4: + filename, index = get_filename(4, status_ent) + lists[4].append(filename + ": Modified by me but removed by others") + elif int(status_ent[2]) == 6: + filename, index = get_filename(4, status_ent) + lists[4].append(filename + ": Others change it from directory to a "\ + "file while I modified files under that directory") + elif int(status_ent[2]) == 5: + filename, index = get_filename(4, status_ent) + lists[4].append(filename + ": I change it from file to a "\ + "directory while others modified this file") + elif int(status_ent[2]) == 2: + filename, index = get_filename(4, status_ent) + lists[4].append(filename + ": Newly added by me and others, with different content") + elif int(status_ent[2]) == 1: + filename, index = get_filename(4, status_ent) + lists[4].append(filename + ": Modified by me and others, with different content") def get_repo_status(repo_id): - status = seafile_rpc.get_repo_status(repo_id) - lists = ([], [], [], []) - cnt = 0 - i = 0; - s = status.split("\n") - print s - while cnt < 4: - if int(s[i]) != 0: - tmpcnt = int(s[i]) + i - while i < tmpcnt: - i = i + 1 - lists[cnt].append(s[i]) - i = i + 1 - cnt = cnt + 1 + # New Removed Renamed Modified Conflict + lists = ([], [], [], [], []) + + fmt_status = seafile_threaded_rpc.get_repo_status(repo_id) + if fmt_status == "": + return lists + + status_result = fmt_status[:len(fmt_status)-1] + + for status_ent in status_result.split("\n"): + tmp = status_ent.split(" ") + # Only display changes in worktree + if tmp[0] == 'W': + add_to_status_list(lists, tmp) return lists +def get_diff(repo_id, arg1, arg2): + + # New Removed Renamed Modified Conflict + # conflict is not used + lists = ([], [], [], [], []) + + diff_result = seafserv_rpc.get_diff(repo_id, arg1, arg2) + if diff_result == "": + return lists; + + diff_result = diff_result[:len(diff_result)-1] + + for d in diff_result.split("\n"): + tmp = d.split(" ") + if tmp[0] == 'C': + add_to_status_list(lists, tmp) + + return lists + +def list_dir(root_id): + dirent_list = seafserv_rpc.list_dir(root_id); + + return dirent_list ######## ccnet-applet API ##### class CcnetError(Exception): @@ -415,7 +484,7 @@ def open_dir(path): """Call remote service `opendir`.""" client = pool.get_client() req_id = client.get_request_id() - req = "applet-opendir " + path + req = "applet-opendir " + os.path.normpath(path) client.send_request(req_id, req) if client.read_response() < 0: raise NetworkError("Read response error") diff --git a/urls.py b/urls.py index c4b8139af0..39f1657e94 100644 --- a/urls.py +++ b/urls.py @@ -3,7 +3,7 @@ from django.conf import settings from django.views.generic.simple import direct_to_template from seahub.views import root, home, peers, groups, myhome, myrepos, \ - repo, group, group_add_repo, modify_token, remove_repo + repo, group, group_add_repo, modify_token, remove_repo, seafadmin # Uncomment the next two lines to enable the admin: from django.contrib import admin @@ -39,6 +39,7 @@ urlpatterns = patterns('', (r'^repo/token/modify/(?P[^/]+)/$', modify_token), (r'^repo/remove/(?P[^/]+)/$', remove_repo), + (r'^seafadmin/$', seafadmin), (r'^avatar/', include('avatar.urls')), (r'^profile/', include('seahub.profile.urls')), ) diff --git a/views.py b/views.py index ddd2d3dac4..bfdfffafd0 100644 --- a/views.py +++ b/views.py @@ -6,7 +6,8 @@ from django.contrib.auth.decorators import login_required from django.db import IntegrityError from seaserv import cclient, ccnet_rpc, get_groups, get_users, get_repos, \ - get_repo, get_commits, get_branches, seafile_rpc, get_group + get_repo, get_commits, get_branches, \ + seafserv_rpc from seahub.profile.models import UserProfile from seahub.group.models import GroupRepo @@ -107,16 +108,16 @@ def group_add_repo(request, group_id): def repo(request, repo_id): # TODO: check permission repo = get_repo(repo_id) - commits = get_commits(repo_id) + commits = get_commits(repo_id, 0, 1000) branches = get_branches(repo_id) token = "" is_owner = False if request.user.is_authenticated(): cid = get_user_cid(request.user) - if seafile_rpc.is_repo_owner(cid, repo_id): + if seafserv_rpc.is_repo_owner(cid, repo_id): is_owner = True - token = seafile_rpc.get_repo_token(repo_id) + token = seafserv_rpc.get_repo_token(repo_id) return render_to_response('repo.html', { "repo": repo, @@ -138,23 +139,23 @@ def repo_share(request, repo_id): @login_required def modify_token(request, repo_id): cid = get_user_cid(request.user) - if not seafile_rpc.is_repo_owner(cid, repo_id): + if not seafserv_rpc.is_repo_owner(cid, repo_id): return HttpResponseRedirect(reverse(repo, args=[repo_id])) token = request.POST.get('token', '') if token: - seafile_rpc.set_repo_token(repo_id, token) + seafserv_rpc.set_repo_token(repo_id, token) return HttpResponseRedirect(reverse(repo, args=[repo_id])) @login_required def remove_repo(request, repo_id): - cid = get_user_cid(request.user) - if not seafile_rpc.is_repo_owner(cid, repo_id): + cid = request.user.user_id + if not seafserv_rpc.is_repo_owner(cid, repo_id) or not request.user.is_staff: return HttpResponseRedirect(reverse(repo, args=[repo_id])) - seafile_rpc.remove_repo(repo_id) + seafserv_rpc.remove_repo(repo_id) return HttpResponseRedirect(reverse(myhome)) @@ -162,11 +163,12 @@ def remove_repo(request, repo_id): @login_required def myhome(request): owned_repos = [] - user_id = request.user.user_id quota_usage = 0 + + user_id = request.user.user_id if user_id: - owned_repos = seafile_rpc.list_owned_repos(user_id) - quota_usage = seafile_rpc.get_user_quota_usage(user_id) + owned_repos = seafserv_rpc.list_owned_repos(user_id) + quota_usage = seafserv_rpc.get_user_quota_usage(user_id) return render_to_response('myhome.html', { "owned_repos": owned_repos, @@ -183,8 +185,22 @@ def mypeers(request): @login_required def myrepos(request): cid = request.user.user_id - owned_repos = seafile_rpc.list_owned_repos(cid) + owned_repos = seafserv_rpc.list_owned_repos(cid) - return render_to_response('myrepos.html', { + return render_to_response( + 'myrepos.html', { 'owned_repos': owned_repos, - }, context_instance=RequestContext(request)) + }, + context_instance=RequestContext(request)) + +@login_required +def seafadmin(request): + if not request.user.is_staff: + raise Http404 + + repos = seafserv_rpc.get_repo_list("", 1000) + return render_to_response( + 'repos.html', { + 'repos': repos, + }, + context_instance=RequestContext(request))