1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-17 15:53:28 +00:00

Merge branch 'swpd-master'

This commit is contained in:
zhengxie
2013-09-10 11:27:40 +08:00
4 changed files with 5078 additions and 5050 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -23,3 +23,19 @@ class AuthTokenSerializer(serializers.Serializer):
else: else:
raise serializers.ValidationError('Must include "username" and "password"') raise serializers.ValidationError('Must include "username" and "password"')
class AccountSerializer(serializers.Serializer):
email = serializers.EmailField()
password = serializers.CharField()
is_staff = serializers.BooleanField()
is_active = serializers.BooleanField()
def validate(self, attrs):
email = attrs.get('email')
password = attrs.get('password')
attrs['is_staff'] = attrs.get('is_staff', False)
attrs['is_active'] = attrs.get('is_active', True)
if not password:
raise serializers.ValidationError('Password is required')
return attrs

View File

@@ -9,7 +9,9 @@ urlpatterns = patterns('',
url(r'^auth-token/', ObtainAuthToken.as_view()), url(r'^auth-token/', ObtainAuthToken.as_view()),
# RESTful API # RESTful API
url(r'^account/info/$', Account.as_view()), url(r'^accounts/$', Accounts.as_view(), name="accounts"),
url(r'^accounts/(?P<email>\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/$', Account.as_view(), name="api2-account"),
url(r'^account/info/$', AccountInfo.as_view()),
url(r'^repos/$', Repos.as_view(), name="api2-repos"), url(r'^repos/$', Repos.as_view(), name="api2-repos"),
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/$', Repo.as_view(), name="api2-repo"), url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/$', Repo.as_view(), name="api2-repo"),
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/download-info/$', DownloadRepo.as_view()), url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/download-info/$', DownloadRepo.as_view()),

View File

@@ -9,7 +9,7 @@ import seahub.settings as settings
from rest_framework import parsers from rest_framework import parsers
from rest_framework import status from rest_framework import status
from rest_framework import renderers from rest_framework import renderers
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated, IsAdminUser
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.throttling import AnonRateThrottle, UserRateThrottle from rest_framework.throttling import AnonRateThrottle, UserRateThrottle
@@ -19,7 +19,7 @@ from django.http import HttpResponse
from models import Token from models import Token
from authentication import TokenAuthentication from authentication import TokenAuthentication
from serializers import AuthTokenSerializer from serializers import AuthTokenSerializer, AccountSerializer
from utils import is_repo_writable, is_repo_accessible from utils import is_repo_writable, is_repo_accessible
from seahub.base.accounts import User from seahub.base.accounts import User
from seahub.base.models import FileDiscuss, UserStarredFiles from seahub.base.models import FileDiscuss, UserStarredFiles
@@ -121,9 +121,87 @@ def api_error(code, msg):
err_resp = {'error_msg': msg} err_resp = {'error_msg': msg}
return Response(err_resp, status=code) return Response(err_resp, status=code)
class Account(APIView): class Accounts(APIView):
"""List all accounts.
Administator permission is required.
""" """
Show account info. authentication_classes = (TokenAuthentication, )
permission_classes = (IsAdminUser, )
throttle_classes = (UserRateThrottle, )
def get(self, request, format=None):
# list accounts
start = int(request.GET.get('start', '0'))
limit = int(request.GET.get('limit', '100'))
accounts = get_emailusers(start, limit)
accounts_json = []
for account in accounts:
accounts_json.append({'email': account.email})
return Response(accounts_json)
class Account(APIView):
"""Query/Add/Delete a specific account.
Administator permission is required.
"""
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAdminUser, )
throttle_classes = (UserRateThrottle, )
def get(self, request, email, format=None):
# query account info
try:
user = User.objects.get(email=email)
except User.DoesNotExist:
return api_error(status.HTTP_404_NOT_FOUND, 'User not found.')
info = {}
info['email'] = user.email
info['id'] = user.id
info['is_staff'] = user.is_staff
info['is_active'] = user.is_active
info['create_time'] = user.ctime
info['total'] = get_user_quota(email)
if CALC_SHARE_USAGE:
my_usage = get_user_quota_usage(email)
share_usage = get_user_share_usage(email)
info['usage'] = my_usage + share_usage
else:
info['usage'] = get_user_quota_usage(email)
return Response(info)
def put(self, request, email, format=None):
# create or update account
copy = request.DATA.copy()
copy.update({'email': email})
serializer = AccountSerializer(data=copy)
if serializer.is_valid():
user = User.objects.create_user(serializer.object['email'],
serializer.object['password'],
serializer.object['is_staff'],
serializer.object['is_active'])
resp = Response('success', status=status.HTTP_201_CREATED)
resp['Location'] = reverse('api2-account', args=[email])
return resp
else:
return api_error(status.HTTP_400_BAD_REQUEST, serializer.errors)
def delete(self, request, email, format=None):
# delete account
try:
user = User.objects.get(email=email)
user.delete()
return Response("success")
except User.DoesNotExist:
return api_error(status.HTTP_404_NOT_FOUND,
'Failed to delete: account does not exist.')
class AccountInfo(APIView):
""" Show account info.
""" """
authentication_classes = (TokenAuthentication, ) authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)
@@ -278,10 +356,10 @@ class Repos(APIView):
repo_id = seafserv_threaded_rpc.create_repo(repo_name, repo_desc, repo_id = seafserv_threaded_rpc.create_repo(repo_name, repo_desc,
username, passwd) username, passwd)
except: except:
return api_error(status.HTTP_520_OPERATION_FAILED, \ return api_error(HTTP_520_OPERATION_FAILED, \
'Failed to create library.') 'Failed to create library.')
if not repo_id: if not repo_id:
return api_error(status.HTTP_520_OPERATION_FAILED, \ return api_error(HTTP_520_OPERATION_FAILED, \
'Failed to create library.') 'Failed to create library.')
else: else:
repo_created.send(sender=None, repo_created.send(sender=None,
@@ -553,7 +631,7 @@ def get_repo_file(request, repo_id, file_id, file_name, op):
try: try:
blks = seafile_api.list_file_by_file_id(file_id) blks = seafile_api.list_file_by_file_id(file_id)
except SearpcError, e: except SearpcError, e:
return api_error(status.HTTP_520_OPERATION_FAILED, return api_error(HTTP_520_OPERATION_FAILED,
'Failed to get file block list') 'Failed to get file block list')
blklist = blks.split('\n') blklist = blks.split('\n')
blklist = [i for i in blklist if len(i) == 40] blklist = [i for i in blklist if len(i) == 40]