1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-06-04 04:50:25 +00:00
seahub/views.py

575 lines
18 KiB
Python
Raw Normal View History

from django.http import HttpResponse, HttpResponseRedirect, Http404
2012-04-20 05:34:52 +00:00
from django.shortcuts import render_to_response, redirect
2011-03-19 05:15:02 +00:00
from django.core.urlresolvers import reverse
from django.template import RequestContext
from auth.decorators import login_required
2011-09-10 12:07:46 +00:00
from django.db import IntegrityError
from auth.models import User
from django.views.decorators.csrf import csrf_protect
from auth.forms import AuthenticationForm, PasswordResetForm, SetPasswordForm, PasswordChangeForm
2012-04-20 05:34:52 +00:00
from auth.tokens import default_token_generator
2011-03-19 05:15:02 +00:00
2011-08-16 13:05:42 +00:00
from seaserv import cclient, ccnet_rpc, get_groups, get_users, get_repos, \
get_repo, get_commits, get_branches, \
2012-03-29 07:36:15 +00:00
seafserv_threaded_rpc, seafserv_rpc, get_binding_userids, get_ccnetuser
2011-09-10 12:07:46 +00:00
2012-02-11 03:12:54 +00:00
from seahub.share.models import GroupShare, UserShare
from seahub.share.forms import GroupAddRepoForm
from seahub.base.accounts import CcnetUser
from forms import AddUserForm
from urllib import quote
2011-09-07 02:57:47 +00:00
2012-03-29 07:36:15 +00:00
import stat
import time
import settings
2012-04-20 05:34:52 +00:00
def get_httpserver_root():
# Get seafile http server address and port from settings.py,
# and cut out last '/'
if settings.HTTP_SERVER_ROOT[-1] == '/':
http_server_root = settings.HTTP_SERVER_ROOT[:-1]
else:
http_server_root = settings.HTTP_SERVER_ROOT
return http_server_root
def get_ccnetapplet_root():
# Get ccnet applet address and port from settings.py,
# and cut out last '/'
if settings.CCNET_APPLET_ROOT[-1] == '/':
ccnet_applet_root = settings.CCNET_APPLET_ROOT[:-1]
else:
ccnet_applet_root = settings.CCNET_APPLET_ROOT
return ccnet_applet_root
2012-04-20 05:34:52 +00:00
def gen_token():
# Generate short token used for owner to access repo file
from django.utils.hashcompat import sha_constructor
token = sha_constructor(settings.SECRET_KEY + unicode(time.time())).hexdigest()[::8]
return token
2012-01-31 16:07:10 +00:00
@login_required
2011-03-19 05:15:02 +00:00
def root(request):
2012-01-31 16:07:10 +00:00
return HttpResponseRedirect(reverse(myhome))
2011-03-19 14:06:58 +00:00
def peers(request):
peer_type = request.REQUEST.get('type', 'all')
peer_ids = ccnet_rpc.list_peers()
peers = []
for peer_id in peer_ids.split("\n"):
# too handle the ending '\n'
if peer_id == '':
continue
peer = ccnet_rpc.get_peer(peer_id)
if peer_type == 'all':
peers.append(peer)
if peer_type == 'mypeer':
if peer.props.role_list.find('MyPeer') != -1:
peers.append(peer)
2011-04-11 15:06:05 +00:00
users = get_users()
2011-03-19 14:06:58 +00:00
return render_to_response('peers.html', {
'peers': peers,
2011-04-11 15:06:05 +00:00
'users': users,
2011-03-19 14:06:58 +00:00
}, context_instance=RequestContext(request))
2011-03-20 13:47:28 +00:00
def groups(request):
groups = get_groups()
return render_to_response('groups.html', {
'groups': groups,
}, context_instance=RequestContext(request))
2011-05-08 07:19:58 +00:00
2011-09-10 12:07:46 +00:00
def group(request, group_id):
"""Show a group.
Login is not required, but permission check based on token should
be added later.
"""
group = get_group(group_id)
2012-02-11 03:12:54 +00:00
shared_repos = GroupShare.objects.filter(group_id=group_id)
2011-09-10 12:07:46 +00:00
return render_to_response('group.html', {
'group': group, 'shared_repos': shared_repos,
}, context_instance=RequestContext(request))
def group_add_repo(request, group_id):
"""Add a repo to a group"""
group = get_group(group_id)
if not group:
raise Http404
if request.method == 'POST':
form = GroupAddRepoForm(request.POST)
if form.is_valid():
2012-02-11 03:12:54 +00:00
group_repo = GroupShare()
2011-09-10 12:07:46 +00:00
group_repo.group_id = group_id
group_repo.repo_id = form.cleaned_data['repo_id']
try:
group_repo.save()
except IntegrityError:
# catch the case repo added to group before
pass
return HttpResponseRedirect(reverse('view_group', args=[group_id]))
else:
form = GroupAddRepoForm()
return render_to_response("group_add_repo.html", {
'form': form, 'group': group
}, context_instance=RequestContext(request))
def validate_owner(request, repo_id):
# check whether user in the request own the repo
is_owner = False
cid_list = request.user.userid_list
for cid in cid_list:
if seafserv_threaded_rpc.is_repo_owner(cid, repo_id):
is_owner = True
2011-09-10 12:07:46 +00:00
return is_owner
2011-10-18 07:41:48 +00:00
def validate_emailuser(email):
# check whether emailuser is in the database
if ccnet_rpc.get_emailuser(email) != None:
return True
return False
@login_required
2011-09-07 02:57:47 +00:00
def repo(request, repo_id):
# TODO: if user is not staff and not owner and not fetch this repo
# and not shared this repo, then goto 404 page..
# if not validate_owner(request, repo_id):
# raise Http404
2011-09-07 02:57:47 +00:00
repo = get_repo(repo_id)
2012-04-24 08:15:29 +00:00
recent_commits = get_commits(repo_id, 0, 3)
token = ""
is_owner = False
repo_ap = ""
if request.user.is_authenticated():
if validate_owner(request, repo_id):
is_owner = True
token = seafserv_threaded_rpc.get_repo_token(repo_id)
repo_ap = seafserv_threaded_rpc.repo_query_access_property(repo_id)
return render_to_response('repo.html', {
"repo": repo,
"recent_commits": recent_commits,
"is_owner": is_owner,
"repo_ap": repo_ap,
"token": token,
}, context_instance=RequestContext(request))
def repo_history(request, repo_id):
# TODO: check permission
repo = get_repo(repo_id)
2012-03-30 05:49:32 +00:00
try:
current_page = int(request.GET.get('page', '1'))
per_page= int(request.GET.get('per_page', '25'))
except ValueError:
2012-04-09 08:48:14 +00:00
current_page = 1
2012-03-30 05:49:32 +00:00
per_page = 25
commits_all = get_commits(repo_id, per_page * (current_page -1), per_page + 1)
commits = commits_all[:per_page]
if len(commits_all) == per_page + 1:
page_next = True
else:
page_next = False
2012-04-24 08:15:29 +00:00
return render_to_response('repo_history.html', {
2011-09-07 02:57:47 +00:00
"repo": repo,
"commits": commits,
2012-03-30 05:49:32 +00:00
'current_page': current_page,
'prev_page': current_page-1,
'next_page': current_page+1,
'per_page': per_page,
'page_next': page_next,
2011-09-07 02:57:47 +00:00
}, context_instance=RequestContext(request))
2011-09-07 02:57:47 +00:00
@login_required
def repo_share(request, repo_id):
return render_to_response('repo_share.html', {
"repo": repo,
"commits": commits,
"branches": branches,
}, context_instance=RequestContext(request))
2011-10-18 07:41:48 +00:00
@login_required
def modify_token(request, repo_id):
if not validate_owner(request, repo_id):
2011-10-18 07:41:48 +00:00
return HttpResponseRedirect(reverse(repo, args=[repo_id]))
token = request.POST.get('token', '')
if token:
2012-02-27 07:24:27 +00:00
seafserv_threaded_rpc.set_repo_token(repo_id, token)
2011-10-18 07:41:48 +00:00
return HttpResponseRedirect(reverse(repo, args=[repo_id]))
@login_required
def remove_repo(request, repo_id):
if not validate_owner(request, repo_id) and not request.user.is_staff:
2012-01-29 06:02:30 +00:00
return render_to_response('permission_error.html', {
}, context_instance=RequestContext(request))
2012-02-27 07:24:27 +00:00
seafserv_threaded_rpc.remove_repo(repo_id)
2012-01-29 06:02:30 +00:00
return HttpResponseRedirect(request.META['HTTP_REFERER'])
2011-09-07 02:57:47 +00:00
@login_required
2012-04-17 03:41:38 +00:00
def remove_fetched_repo(request, user_id, repo_id):
if user_id and repo_id:
seafserv_threaded_rpc.remove_fetched_repo (user_id, repo_id)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
2011-09-07 02:57:47 +00:00
@login_required
def myhome(request):
2011-10-12 16:17:48 +00:00
owned_repos = []
2012-03-11 13:35:44 +00:00
fetched_repos = []
quota_usage = 0
userid_list = get_binding_userids(request.user.username)
for user_id in userid_list:
try:
owned_repos.extend(seafserv_threaded_rpc.list_owned_repos(user_id))
quota_usage = quota_usage + seafserv_threaded_rpc.get_user_quota_usage(user_id)
2012-04-17 03:41:38 +00:00
frepos = seafserv_threaded_rpc.list_fetched_repos(user_id)
for repo in frepos:
repo.userid = user_id # associate a fetched repo with the user id
fetched_repos.extend(frepos)
except:
pass
2011-09-07 02:57:47 +00:00
return render_to_response('myhome.html', {
2011-10-12 16:17:48 +00:00
"owned_repos": owned_repos,
"quota_usage": quota_usage,
2012-03-11 13:35:44 +00:00
"fetched_repos": fetched_repos,
2011-09-07 02:57:47 +00:00
}, context_instance=RequestContext(request))
@login_required
def ownerhome(request, owner_name):
owned_repos = []
fetched_repos = []
quota_usage = 0
ownerid_list = get_binding_userids(owner_name)
for owner_id in ownerid_list:
if owner_id:
try:
owned_repos.extend(seafserv_threaded_rpc.list_owned_repos(owner_id))
quota_usage = quota_usage + seafserv_threaded_rpc.get_user_quota_usage(owner_id)
fetched_repos.extend(seafserv_threaded_rpc.list_fetched_repos(owner_id))
except:
pass
return render_to_response('ownerhome.html', {
"owned_repos": owned_repos,
"quota_usage": quota_usage,
"fetched_repos": fetched_repos,
"owner": owner_name,
}, context_instance=RequestContext(request))
2012-03-29 07:36:15 +00:00
@login_required
def repo_set_public(request, repo_id):
if repo_id:
seafserv_threaded_rpc.repo_set_public(repo_id)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
@login_required
def repo_unset_public(request, repo_id):
if repo_id:
seafserv_threaded_rpc.repo_unset_public(repo_id)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
2011-09-07 02:57:47 +00:00
2012-04-20 05:34:52 +00:00
@login_required
2012-04-20 08:39:51 +00:00
def repo_set_access_property(request, repo_id, ap):
if repo_id and ap:
seafserv_threaded_rpc.repo_set_access_property(repo_id, ap)
2012-04-20 05:34:52 +00:00
return HttpResponseRedirect(request.META['HTTP_REFERER'])
@login_required
2012-03-29 07:36:15 +00:00
def repo_list_dir(request, repo_id):
if repo_id:
2012-04-20 05:34:52 +00:00
# any person visit private repo, go to 404 page
2012-04-20 08:39:51 +00:00
repo_ap = seafserv_threaded_rpc.repo_query_access_property(repo_id)
if repo_ap == 'private':
2012-03-29 07:36:15 +00:00
raise Http404
2012-04-20 05:34:52 +00:00
# people who is not owner visits own repo, go to 404 page
if not validate_owner(request, repo_id):
2012-04-20 08:39:51 +00:00
if repo_ap == 'own':
2012-04-20 05:34:52 +00:00
raise Http404
2012-03-29 07:36:15 +00:00
repo = seafserv_threaded_rpc.get_repo(repo_id)
if not request.GET.get('root_id'): # No root id..?
# ..use HEAD commit's root id
2012-03-29 08:06:36 +00:00
commit = seafserv_rpc.get_commit(repo.props.head_cmmt_id)
2012-03-29 07:36:15 +00:00
root_id = commit.props.root_id
else:
root_id = request.GET.get('root_id')
2012-03-29 08:06:36 +00:00
dirs = seafserv_rpc.list_dir(root_id)
2012-03-29 07:36:15 +00:00
for dirent in dirs:
if stat.S_ISDIR(dirent.props.mode):
dirent.is_dir = True
else:
dirent.is_dir = False
return render_to_response('repo_dir.html', {
"repo_id": repo_id,
"dirs": dirs,
},
context_instance=RequestContext(request))
2012-04-20 05:34:52 +00:00
@login_required
def repo_operation_file(request, op, repo_id, obj_id, file_name):
if repo_id:
# any person visit private repo, go to 404 page
2012-04-20 08:39:51 +00:00
repo_ap = seafserv_threaded_rpc.repo_query_access_property(repo_id)
if repo_ap == 'private':
2012-04-20 05:34:52 +00:00
raise Http404
token = ''
2012-04-20 08:39:51 +00:00
if repo_ap == 'own':
2012-04-20 05:34:52 +00:00
# people who is not owner visits own repo, go to 404 page
if not validate_owner(request, repo_id):
raise Http404
else:
# owner should get a token to visit repo
token = gen_token()
# put token into memory in seaf-server
2012-04-20 08:39:51 +00:00
seafserv_rpc.web_save_access_token(token, obj_id)
2012-04-20 05:34:52 +00:00
http_server_root = get_httpserver_root()
2012-03-29 07:36:15 +00:00
2012-04-20 05:34:52 +00:00
return HttpResponseRedirect('%s/%s?id=%s&filename=%s&op=%s&t=%s' %
(http_server_root,
repo_id, obj_id,
file_name, op, token))
2012-04-24 06:21:52 +00:00
@login_required
def repo_add_share(request):
if request.method == 'POST':
from_email = request.user.username
repo_id = request.POST.get('share_repo_id', '')
to_emails = request.POST.get('to_email', '')
to_email_list = to_emails.split(';')
for to_email in to_email_list:
if validate_emailuser(to_email.strip()) and validate_owner(request, repo_id):
seafserv_threaded_rpc.add_share(repo_id, from_email, to_email.strip(), 'rw')
2012-04-24 06:21:52 +00:00
return HttpResponseRedirect(request.META['HTTP_REFERER'])
@login_required
def repo_list_share(request):
username = request.user.username
out_repos = seafserv_threaded_rpc.list_share_repos(username, 'from_email', -1, -1)
in_repos = seafserv_threaded_rpc.list_share_repos(username, 'to_email', -1, -1)
2012-04-20 05:34:52 +00:00
2012-04-24 06:21:52 +00:00
return render_to_response('share_repos.html', {
"out_repos": out_repos,
"in_repos": in_repos,
}, context_instance=RequestContext(request))
2012-04-24 14:31:24 +00:00
@login_required
def repo_download(request, repo_id):
relay_id = cclient.props.id
2012-04-25 06:34:42 +00:00
repo_name = request.GET.get('repo_name')
quote_repo_name = quote(repo_name)
2012-04-25 06:34:42 +00:00
encrypted = request.GET.get('enc')
enc = '1'
if cmp(encrypted,'False') == 0:
enc = ''
2012-04-25 11:56:53 +00:00
ccnet_applet_root = get_ccnetapplet_root()
2012-04-25 06:34:42 +00:00
redirect_url = "%s/repo/download/?repo_id=%s&relay_id=%s&repo_name=%s&encrypted=%s" % (
ccnet_applet_root, repo_id, relay_id, quote_repo_name, enc)
2012-04-24 14:31:24 +00:00
return HttpResponseRedirect(redirect_url)
2012-04-24 06:21:52 +00:00
@login_required
def repo_remove_share(request, repo_id, to_email):
if not validate_owner(request, repo_id):
raise Http404
from_email = request.user.username
seafserv_threaded_rpc.remove_share(repo_id, from_email, to_email)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
2011-09-07 02:57:47 +00:00
@login_required
def mypeers(request):
cid = get_user_cid(request.user)
@login_required
def seafadmin(request):
if not request.user.is_staff:
raise Http404
2012-03-20 03:35:56 +00:00
# Make sure page request is an int. If not, deliver first page.
try:
current_page = int(request.GET.get('page', '1'))
per_page= int(request.GET.get('per_page', '25'))
except ValueError:
2012-04-09 08:48:14 +00:00
current_page = 1
2012-03-20 03:35:56 +00:00
per_page = 25
repos_all = seafserv_threaded_rpc.get_repo_list(per_page * (current_page -1), per_page + 1)
repos = repos_all[:per_page]
if len(repos_all) == per_page + 1:
page_next = True
else:
page_next = False
for repo in repos:
try:
owner_id = seafserv_threaded_rpc.get_repo_owner(repo.props.id)
repo.owner = ccnet_rpc.get_binding_email(owner_id)
repo.owner_id = owner_id
except:
repo.owner = None
return render_to_response(
'repos.html', {
'repos': repos,
2012-03-20 03:35:56 +00:00
'current_page': current_page,
'prev_page': current_page-1,
'next_page': current_page+1,
'per_page': per_page,
'page_next': page_next,
},
context_instance=RequestContext(request))
@login_required
def useradmin(request):
if not request.user.is_staff:
raise Http404
users = ccnet_rpc.get_emailusers(-1,-1)
for user in users:
if user.props.id == request.user.id:
user.is_self = True
return render_to_response(
'useradmin.html', {
'users': users,
},
context_instance=RequestContext(request))
2012-04-13 05:21:48 +00:00
@login_required
def user_info(request, email):
if not request.user.is_staff:
raise Http404
user_dict = {}
userid_list = get_binding_userids(email)
for userid in userid_list:
try:
peernames = ccnet_rpc.get_peernames_by_userid(userid)
2012-04-15 15:33:22 +00:00
for peername in peernames.split('\n'):
if not peername:
continue
2012-04-15 15:33:22 +00:00
roles = ccnet_rpc.get_user(userid).props.role_list
user_dict[peername] = roles
except:
2012-04-15 15:33:22 +00:00
pass
2012-04-13 05:21:48 +00:00
return render_to_response(
'userinfo.html', {
'user_dict': user_dict,
2012-04-15 15:33:22 +00:00
'email': email
2012-04-13 05:21:48 +00:00
},
context_instance=RequestContext(request))
@login_required
def role_add(request, user_id):
if not request.user.is_staff:
raise Http404
if request.method == 'POST':
role = request.POST.get('role', '')
if role and len(role) <= 16:
ccnet_rpc.add_role(user_id, role)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
@login_required
def role_remove(request, user_id):
if not request.user.is_staff:
raise Http404
role = request.REQUEST.get('role', '')
if role and len(role) <= 16:
ccnet_rpc.remove_role(user_id, role)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
2012-03-17 06:05:21 +00:00
@login_required
def user_remove(request, user_id):
if not request.user.is_staff:
raise Http404
ccnetuser = get_ccnetuser(userid=int(user_id))
ccnetuser.delete()
2012-03-17 06:05:21 +00:00
return HttpResponseRedirect(request.META['HTTP_REFERER'])
@login_required
def activate_user(request, user_id):
"""The user id is emailuser id."""
if not request.user.is_staff:
raise Http404
ccnetuser = get_ccnetuser(userid=int(user_id))
ccnetuser.is_active = True
ccnetuser.save()
return HttpResponseRedirect(request.META['HTTP_REFERER'])
@login_required
def user_add(request):
"""Add a user"""
if not request.user.is_staff:
raise Http404
if request.method == 'POST':
form = AddUserForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
password = form.cleaned_data['password1']
ccnetuser = CcnetUser(username=email, raw_password=password)
ccnetuser.is_active = True
ccnetuser.save()
return HttpResponseRedirect(reverse('useradmin', args=[]))
else:
form = AddUserForm()
return render_to_response("add_user_form.html", {
'form': form,
}, context_instance=RequestContext(request))