mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-08 18:30:53 +00:00
add test case
This commit is contained in:
@@ -185,9 +185,9 @@ class MainSideNav extends React.Component {
|
|||||||
<h3 className="sf-heading">{gettext('Database')}</h3>
|
<h3 className="sf-heading">{gettext('Database')}</h3>
|
||||||
<ul className="nav nav-pills flex-column nav-container">
|
<ul className="nav nav-pills flex-column nav-container">
|
||||||
<li className="nav-item">
|
<li className="nav-item">
|
||||||
<Link className={`nav-link ellipsis ${this.getActiveClass('dtable')}`} to={siteRoot + 'dtable/'} title={gettext('DTable')} onClick={() => this.tabItemClick('dtable')}>
|
<Link className={`nav-link ellipsis ${this.getActiveClass('dtable')}`} to={siteRoot + 'dtable/'} title='DTable' onClick={() => this.tabItemClick('dtable')}>
|
||||||
<span className="sf2-icon-star" aria-hidden="true"></span>
|
<span className="sf2-icon-star" aria-hidden="true"></span>
|
||||||
<span className="nav-text">{gettext('DTable')}</span>
|
<span className="nav-text">DTable</span>
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -420,7 +420,7 @@ class DTable extends Component {
|
|||||||
<div className="main-panel-center">
|
<div className="main-panel-center">
|
||||||
<div className="cur-view-container" id="starred">
|
<div className="cur-view-container" id="starred">
|
||||||
<div className="cur-view-path">
|
<div className="cur-view-path">
|
||||||
<h3 className="sf-heading">{gettext('DTable')}</h3>
|
<h3 className="sf-heading">DTable</h3>
|
||||||
</div>
|
</div>
|
||||||
<div className="cur-view-content">
|
<div className="cur-view-content">
|
||||||
{this.state.loading && <Loading />}
|
{this.state.loading && <Loading />}
|
||||||
|
@@ -7,7 +7,7 @@ from rest_framework.authentication import SessionAuthentication
|
|||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from django.http import HttpResponse, Http404
|
from django.http import Http404
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
@@ -18,11 +18,12 @@ from seahub.api2.authentication import TokenAuthentication
|
|||||||
from seahub.api2.throttling import UserRateThrottle
|
from seahub.api2.throttling import UserRateThrottle
|
||||||
from seahub.api2.utils import api_error
|
from seahub.api2.utils import api_error
|
||||||
from seahub.api2.views import get_repo_file, HTTP_443_ABOVE_QUOTA
|
from seahub.api2.views import get_repo_file, HTTP_443_ABOVE_QUOTA
|
||||||
from seahub.dtable.models import WorkSpaces
|
from seahub.dtable.models import Workspaces
|
||||||
from seahub.base.templatetags.seahub_tags import email2nickname
|
from seahub.base.templatetags.seahub_tags import email2nickname
|
||||||
from seahub.utils.timeutils import timestamp_to_isoformat_timestr
|
from seahub.utils.timeutils import timestamp_to_isoformat_timestr
|
||||||
from seahub.utils import is_valid_dirent_name, is_org_context, normalize_file_path, \
|
from seahub.utils import is_valid_dirent_name, is_org_context, normalize_file_path, \
|
||||||
check_filename_with_rename, render_error, render_permission_error, gen_file_upload_url, CTABLE
|
check_filename_with_rename, render_error, render_permission_error, gen_file_upload_url, \
|
||||||
|
get_file_type_and_ext, CTABLE
|
||||||
from seahub.views.file import send_file_access_msg
|
from seahub.views.file import send_file_access_msg
|
||||||
from seahub.auth.decorators import login_required
|
from seahub.auth.decorators import login_required
|
||||||
from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, SHARE_LINK_EXPIRE_DAYS_MIN, \
|
from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, SHARE_LINK_EXPIRE_DAYS_MIN, \
|
||||||
@@ -32,7 +33,7 @@ from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, SHARE_LINK_EXPIRE_DAYS_MIN
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class WorkSpacesView(APIView):
|
class WorkspacesView(APIView):
|
||||||
|
|
||||||
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||||
permission_classes = (IsAuthenticated, )
|
permission_classes = (IsAuthenticated, )
|
||||||
@@ -43,7 +44,7 @@ class WorkSpacesView(APIView):
|
|||||||
"""
|
"""
|
||||||
owner = request.user.username
|
owner = request.user.username
|
||||||
try:
|
try:
|
||||||
workspaces = WorkSpaces.objects.get_workspaces_by_owner(owner)
|
workspaces = Workspaces.objects.get_workspaces_by_owner(owner)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
error_msg = 'Internal Server Error.'
|
error_msg = 'Internal Server Error.'
|
||||||
@@ -107,7 +108,7 @@ class WorkSpacesView(APIView):
|
|||||||
|
|
||||||
owner = request.user.username
|
owner = request.user.username
|
||||||
try:
|
try:
|
||||||
workspace = WorkSpaces.objects.create_workspace(name, owner, repo_id)
|
workspace = Workspaces.objects.create_workspace(name, owner, repo_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
error_msg = 'Internal Server Error.'
|
error_msg = 'Internal Server Error.'
|
||||||
@@ -120,7 +121,7 @@ class WorkSpacesView(APIView):
|
|||||||
return Response({"workspace": res}, status=status.HTTP_201_CREATED)
|
return Response({"workspace": res}, status=status.HTTP_201_CREATED)
|
||||||
|
|
||||||
|
|
||||||
class WorkSpaceView(APIView):
|
class WorkspaceView(APIView):
|
||||||
|
|
||||||
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||||
permission_classes = (IsAuthenticated, )
|
permission_classes = (IsAuthenticated, )
|
||||||
@@ -135,10 +136,14 @@ class WorkSpaceView(APIView):
|
|||||||
error_msg = 'name invalid.'
|
error_msg = 'name invalid.'
|
||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
if not is_valid_dirent_name(workspace_name):
|
||||||
|
error_msg = 'name invalid.'
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
# resource check
|
# resource check
|
||||||
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id)
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
if not workspace:
|
if not workspace:
|
||||||
error_msg = 'WorkSpace %s not found.' % workspace_id
|
error_msg = 'Workspace %s not found.' % workspace_id
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
repo_id = workspace.repo_id
|
repo_id = workspace.repo_id
|
||||||
@@ -194,16 +199,14 @@ class WorkSpaceView(APIView):
|
|||||||
"""delete a workspace
|
"""delete a workspace
|
||||||
"""
|
"""
|
||||||
# resource check
|
# resource check
|
||||||
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id)
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
if not workspace:
|
if not workspace:
|
||||||
error_msg = 'WorkSpace %s not found.' % workspace_id
|
return Response({'success': True}, status=status.HTTP_200_OK)
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
|
||||||
|
|
||||||
repo_id = workspace.repo_id
|
repo_id = workspace.repo_id
|
||||||
repo = seafile_api.get_repo(repo_id)
|
repo = seafile_api.get_repo(repo_id)
|
||||||
if not repo:
|
if not repo:
|
||||||
error_msg = 'Library %s not found.' % repo_id
|
logger.warning('Library %s not found.' % repo_id)
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
|
||||||
|
|
||||||
# permission check
|
# permission check
|
||||||
username = request.user.username
|
username = request.user.username
|
||||||
@@ -212,22 +215,24 @@ class WorkSpaceView(APIView):
|
|||||||
error_msg = 'Permission denied.'
|
error_msg = 'Permission denied.'
|
||||||
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
# repo status check
|
if repo:
|
||||||
repo_status = repo.status
|
|
||||||
if repo_status != 0:
|
|
||||||
error_msg = 'Permission denied.'
|
|
||||||
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
|
||||||
|
|
||||||
# remove repo
|
# repo status check
|
||||||
try:
|
repo_status = repo.status
|
||||||
seafile_api.remove_repo(repo_id)
|
if repo_status != 0:
|
||||||
except Exception as e:
|
error_msg = 'Permission denied.'
|
||||||
logger.error(e)
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
error_msg = 'Internal Server Error.'
|
|
||||||
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
# remove repo
|
||||||
|
try:
|
||||||
|
seafile_api.remove_repo(repo_id)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = 'Internal Server Error.'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
WorkSpaces.objects.delete_workspace(workspace_id)
|
Workspaces.objects.delete_workspace(workspace_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
error_msg = 'Internal Server Error.'
|
error_msg = 'Internal Server Error.'
|
||||||
@@ -257,9 +262,9 @@ class DTableView(APIView):
|
|||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
# resource check
|
# resource check
|
||||||
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id)
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
if not workspace:
|
if not workspace:
|
||||||
error_msg = 'WorkSpace %s not found.' % workspace_id
|
error_msg = 'Workspace %s not found.' % workspace_id
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
repo_id = workspace.repo_id
|
repo_id = workspace.repo_id
|
||||||
@@ -302,9 +307,9 @@ class DTableView(APIView):
|
|||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
# resource check
|
# resource check
|
||||||
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id)
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
if not workspace:
|
if not workspace:
|
||||||
error_msg = 'WorkSpace %s not found.' % workspace_id
|
error_msg = 'Workspace %s not found.' % workspace_id
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
repo_id = workspace.repo_id
|
repo_id = workspace.repo_id
|
||||||
@@ -368,9 +373,9 @@ class DTableView(APIView):
|
|||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
# resource check
|
# resource check
|
||||||
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id)
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
if not workspace:
|
if not workspace:
|
||||||
error_msg = 'WorkSpace %s not found.' % workspace_id
|
error_msg = 'Workspace %s not found.' % workspace_id
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
repo_id = workspace.repo_id
|
repo_id = workspace.repo_id
|
||||||
@@ -426,9 +431,9 @@ class DTableView(APIView):
|
|||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
# resource check
|
# resource check
|
||||||
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id)
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
if not workspace:
|
if not workspace:
|
||||||
error_msg = 'WorkSpace %s not found.' % workspace_id
|
error_msg = 'Workspace %s not found.' % workspace_id
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
repo_id = workspace.repo_id
|
repo_id = workspace.repo_id
|
||||||
@@ -476,9 +481,9 @@ class DTableUpdateLinkView(APIView):
|
|||||||
"""get table file update link
|
"""get table file update link
|
||||||
"""
|
"""
|
||||||
# resource check
|
# resource check
|
||||||
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id)
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
if not workspace:
|
if not workspace:
|
||||||
error_msg = 'WorkSpace %s not found.' % workspace_id
|
error_msg = 'Workspace %s not found.' % workspace_id
|
||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
repo_id = workspace.repo_id
|
repo_id = workspace.repo_id
|
||||||
@@ -513,7 +518,7 @@ class DTableUpdateLinkView(APIView):
|
|||||||
def dtable_file_view(request, workspace_id, name):
|
def dtable_file_view(request, workspace_id, name):
|
||||||
|
|
||||||
# resource check
|
# resource check
|
||||||
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id)
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
if not workspace:
|
if not workspace:
|
||||||
raise Http404
|
raise Http404
|
||||||
|
|
||||||
@@ -533,15 +538,21 @@ def dtable_file_view(request, workspace_id, name):
|
|||||||
if username != owner:
|
if username != owner:
|
||||||
return render_permission_error(request, _(u'Unable to view file'))
|
return render_permission_error(request, _(u'Unable to view file'))
|
||||||
|
|
||||||
|
filetype, fileext = get_file_type_and_ext(name)
|
||||||
|
|
||||||
return_dict = {
|
return_dict = {
|
||||||
'repo': repo,
|
|
||||||
'workspace_id': workspace_id,
|
|
||||||
'path': table_path,
|
|
||||||
'filename': name,
|
|
||||||
'filetype': CTABLE,
|
|
||||||
'share_link_expire_days_default': SHARE_LINK_EXPIRE_DAYS_DEFAULT,
|
'share_link_expire_days_default': SHARE_LINK_EXPIRE_DAYS_DEFAULT,
|
||||||
'share_link_expire_days_min': SHARE_LINK_EXPIRE_DAYS_MIN,
|
'share_link_expire_days_min': SHARE_LINK_EXPIRE_DAYS_MIN,
|
||||||
'share_link_expire_days_max': SHARE_LINK_EXPIRE_DAYS_MAX,
|
'share_link_expire_days_max': SHARE_LINK_EXPIRE_DAYS_MAX,
|
||||||
}
|
}
|
||||||
|
|
||||||
return render(request, 'ctable_file_view_react.html', return_dict)
|
if filetype == CTABLE:
|
||||||
|
return_dict['repo'] = repo
|
||||||
|
return_dict['workspace_id'] = workspace_id
|
||||||
|
return_dict['path'] = table_path
|
||||||
|
return_dict['filename'] = name
|
||||||
|
return_dict['filetype'] = filetype
|
||||||
|
return render(request, 'ctable_file_view_react.html', return_dict)
|
||||||
|
else:
|
||||||
|
return_dict['err'] = "File preview unsupported"
|
||||||
|
return render(request, 'unknown_file_view_react.html', return_dict)
|
||||||
|
@@ -7,23 +7,23 @@ from seahub.base.fields import LowerCaseCharField
|
|||||||
from seahub.utils.timeutils import timestamp_to_isoformat_timestr, datetime_to_isoformat_timestr
|
from seahub.utils.timeutils import timestamp_to_isoformat_timestr, datetime_to_isoformat_timestr
|
||||||
|
|
||||||
|
|
||||||
class WorkSpacesManager(models.Manager):
|
class WorkspacesManager(models.Manager):
|
||||||
|
|
||||||
def get_workspaces_by_owner(self, owner):
|
def get_workspaces_by_owner(self, owner):
|
||||||
try:
|
try:
|
||||||
return super(WorkSpacesManager, self).filter(owner=owner)
|
return super(WorkspacesManager, self).filter(owner=owner)
|
||||||
except self.model.DoesNotExist:
|
except self.model.DoesNotExist:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_workspace_by_id(self, workspace_id):
|
def get_workspace_by_id(self, workspace_id):
|
||||||
try:
|
try:
|
||||||
return super(WorkSpacesManager, self).get(pk=workspace_id)
|
return super(WorkspacesManager, self).get(pk=workspace_id)
|
||||||
except self.model.DoesNotExist:
|
except self.model.DoesNotExist:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def create_workspace(self, name, owner, repo_id):
|
def create_workspace(self, name, owner, repo_id):
|
||||||
try:
|
try:
|
||||||
return super(WorkSpacesManager, self).get(name=name, owner=owner, repo_id=repo_id)
|
return super(WorkspacesManager, self).get(name=name, owner=owner, repo_id=repo_id)
|
||||||
except self.model.DoesNotExist:
|
except self.model.DoesNotExist:
|
||||||
workspace = self.model(name=name, owner=owner, repo_id=repo_id)
|
workspace = self.model(name=name, owner=owner, repo_id=repo_id)
|
||||||
workspace.save()
|
workspace.save()
|
||||||
@@ -31,21 +31,21 @@ class WorkSpacesManager(models.Manager):
|
|||||||
|
|
||||||
def delete_workspace(self, workspace_id):
|
def delete_workspace(self, workspace_id):
|
||||||
try:
|
try:
|
||||||
workspace = super(WorkSpacesManager, self).get(pk=workspace_id)
|
workspace = super(WorkspacesManager, self).get(pk=workspace_id)
|
||||||
workspace.delete()
|
workspace.delete()
|
||||||
return True
|
return True
|
||||||
except self.model.DoesNotExist:
|
except self.model.DoesNotExist:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
class WorkSpaces(models.Model):
|
class Workspaces(models.Model):
|
||||||
|
|
||||||
name = LowerCaseCharField(max_length=255)
|
name = LowerCaseCharField(max_length=255)
|
||||||
owner = models.CharField(max_length=255)
|
owner = models.CharField(max_length=255)
|
||||||
repo_id = models.CharField(max_length=36, db_index=True)
|
repo_id = models.CharField(max_length=36, db_index=True)
|
||||||
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
|
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
|
||||||
|
|
||||||
objects = WorkSpacesManager()
|
objects = WorkspacesManager()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = (('owner', 'repo_id'),)
|
unique_together = (('owner', 'repo_id'),)
|
||||||
|
@@ -84,7 +84,7 @@ from seahub.api2.endpoints.related_files import RelatedFilesView, RelatedFileVie
|
|||||||
from seahub.api2.endpoints.webdav_secret import WebdavSecretView
|
from seahub.api2.endpoints.webdav_secret import WebdavSecretView
|
||||||
from seahub.api2.endpoints.starred_items import StarredItems
|
from seahub.api2.endpoints.starred_items import StarredItems
|
||||||
from seahub.api2.endpoints.markdown_lint import MarkdownLintView
|
from seahub.api2.endpoints.markdown_lint import MarkdownLintView
|
||||||
from seahub.api2.endpoints.dtable import WorkSpacesView, WorkSpaceView, DTableView, \
|
from seahub.api2.endpoints.dtable import WorkspacesView, WorkspaceView, DTableView, \
|
||||||
DTableUpdateLinkView, dtable_file_view
|
DTableUpdateLinkView, dtable_file_view
|
||||||
|
|
||||||
# Admin
|
# Admin
|
||||||
@@ -346,10 +346,10 @@ urlpatterns = [
|
|||||||
url(r'^api/v2.1/markdown-lint/$', MarkdownLintView.as_view(), name='api-v2.1-markdown-lint'),
|
url(r'^api/v2.1/markdown-lint/$', MarkdownLintView.as_view(), name='api-v2.1-markdown-lint'),
|
||||||
|
|
||||||
# user: workspaces
|
# user: workspaces
|
||||||
url(r'^api/v2.1/workspaces/$', WorkSpacesView.as_view(), name='api-v2.1-workspaces'),
|
url(r'^api/v2.1/workspaces/$', WorkspacesView.as_view(), name='api-v2.1-workspaces'),
|
||||||
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/$', WorkSpaceView.as_view(), name='api-v2.1-workspace'),
|
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/$', WorkspaceView.as_view(), name='api-v2.1-workspace'),
|
||||||
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/dtable-update-link/$', DTableUpdateLinkView.as_view()),
|
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/dtable/$', DTableView.as_view(), name='api-v2.1-workspace-dtable'),
|
||||||
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/dtable/$', DTableView.as_view(), name='api-v2.1-workspace-table'),
|
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/dtable-update-link/$', DTableUpdateLinkView.as_view(), name='api-v2.1-workspace-dtable-update-link'),
|
||||||
url(r'^workspace/(?P<workspace_id>\d+)/dtable/(?P<name>.*)/$', dtable_file_view, name='dtable-file-view'),
|
url(r'^workspace/(?P<workspace_id>\d+)/dtable/(?P<name>.*)/$', dtable_file_view, name='dtable-file-view'),
|
||||||
|
|
||||||
# Deprecated
|
# Deprecated
|
||||||
|
200
tests/api/endpoints/test_dtable.py
Normal file
200
tests/api/endpoints/test_dtable.py
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import json
|
||||||
|
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
|
||||||
|
from seaserv import seafile_api
|
||||||
|
|
||||||
|
from seahub.dtable.models import Workspaces
|
||||||
|
from seahub.test_utils import BaseTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class WorkspacesViewTest(BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
workspace = Workspaces.objects.create_workspace("name1", self.user.username, self.repo.id)
|
||||||
|
self.url = reverse('api-v2.1-workspaces')
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
def test_can_list(self):
|
||||||
|
assert len(Workspaces.objects.all()) == 1
|
||||||
|
|
||||||
|
resp = self.client.get(self.url)
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
self.assertIsNotNone(json_resp["workspace_list"])
|
||||||
|
|
||||||
|
def test_list_with_invalid_repo(self):
|
||||||
|
assert len(Workspaces.objects.all()) == 1
|
||||||
|
|
||||||
|
url = reverse('api2-repo', args=[self.repo.id])
|
||||||
|
resp = self.client.delete(url, {}, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.get(self.url)
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["workspace_list"] == []
|
||||||
|
|
||||||
|
def test_can_create(self):
|
||||||
|
assert len(Workspaces.objects.all()) == 1
|
||||||
|
|
||||||
|
resp = self.client.post(self.url, {'name': 'name2'})
|
||||||
|
self.assertEqual(201, resp.status_code)
|
||||||
|
|
||||||
|
assert len(Workspaces.objects.all()) == 2
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["workspace"]["name"] == 'name2'
|
||||||
|
|
||||||
|
|
||||||
|
class WorkspaceViewTest(BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.workspace = Workspaces.objects.create_workspace("name1", self.user.username, self.repo.id)
|
||||||
|
self.url = reverse('api-v2.1-workspace', args=[self.workspace.id])
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
def test_can_rename(self):
|
||||||
|
data = 'name=%s' % 'name2'
|
||||||
|
resp = self.client.put(self.url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["workspace"]["name"] == 'name2'
|
||||||
|
|
||||||
|
def test_rename_with_invalid_permission(self):
|
||||||
|
self.logout()
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
data = 'name=%s' % 'name2'
|
||||||
|
resp = self.client.put(self.url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_rename_with_invalid_repo(self):
|
||||||
|
url = reverse('api2-repo', args=[self.workspace.repo_id])
|
||||||
|
resp = self.client.delete(url, {}, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
data = 'name=%s' % 'name2'
|
||||||
|
resp = self.client.put(self.url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_delete(self):
|
||||||
|
assert len(Workspaces.objects.all()) == 1
|
||||||
|
|
||||||
|
resp = self.client.delete(self.url, {'name': 'name1'})
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
assert len(Workspaces.objects.all()) == 0
|
||||||
|
|
||||||
|
def test_delete_with_invalid_permission(self):
|
||||||
|
self.logout()
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
resp = self.client.delete(self.url, {'name': 'name1'})
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
|
||||||
|
class DTableTest(BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.workspace = Workspaces.objects.create_workspace("workspace", self.user.username, self.repo.id)
|
||||||
|
self.url = reverse('api-v2.1-workspace-dtable', args=[self.workspace.id])
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
def test_can_create(self):
|
||||||
|
resp = self.client.post(self.url, {'name': 'table1'})
|
||||||
|
self.assertEqual(201, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["table"]["name"] == 'table1'
|
||||||
|
|
||||||
|
def test_create_with_invalid_repo(self):
|
||||||
|
url = reverse('api2-repo', args=[self.workspace.repo_id])
|
||||||
|
resp = self.client.delete(url, {}, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.post(self.url, {'name': 'table1'})
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_rename(self):
|
||||||
|
resp = self.client.post(self.url, {'name': 'table4'})
|
||||||
|
self.assertEqual(201, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["table"]["name"] == 'table4'
|
||||||
|
|
||||||
|
old_name = json_resp["table"]["name"]
|
||||||
|
new_name = 'table5'
|
||||||
|
|
||||||
|
resp = self.client.put(
|
||||||
|
self.url,
|
||||||
|
'old_name=table4&new_name=table5',
|
||||||
|
'application/x-www-form-urlencoded'
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["table"]["name"] == 'table5'
|
||||||
|
|
||||||
|
def test_rename_with_invalid_workspace(self):
|
||||||
|
resp = self.client.post(self.url, {'name': 'table6'})
|
||||||
|
self.assertEqual(201, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["table"]["name"] == 'table6'
|
||||||
|
|
||||||
|
url = reverse('api-v2.1-workspace', args=[self.workspace.id])
|
||||||
|
resp = self.client.delete(url, {'name': 'workspace'})
|
||||||
|
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.put(
|
||||||
|
self.url,
|
||||||
|
'old_name=table6&new_name=table7',
|
||||||
|
'application/x-www-form-urlencoded'
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_delete(self):
|
||||||
|
resp = self.client.post(self.url, {'name': 'table1'})
|
||||||
|
self.assertEqual(201, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["table"]["name"] == 'table1'
|
||||||
|
|
||||||
|
data = 'name=%s' % 'table1'
|
||||||
|
resp = self.client.delete(self.url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
def test_delete_with_invalid_permission(self):
|
||||||
|
resp = self.client.post(self.url, {'name': 'table2'})
|
||||||
|
self.assertEqual(201, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["table"]["name"] == 'table2'
|
||||||
|
|
||||||
|
self.logout()
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
data = 'name=%s' % 'table2'
|
||||||
|
resp = self.client.delete(self.url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_delete_with_repo_only_read(self):
|
||||||
|
resp = self.client.post(self.url, {'name': 'table3'})
|
||||||
|
self.assertEqual(201, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp["table"]["name"] == 'table3'
|
||||||
|
|
||||||
|
seafile_api.set_repo_status(self.workspace.repo_id, 1)
|
||||||
|
|
||||||
|
data = 'name=%s' % 'table3'
|
||||||
|
resp = self.client.delete(self.url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(403, resp.status_code)
|
1
tests/seahub/dtable/__init__.py
Normal file
1
tests/seahub/dtable/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
35
tests/seahub/dtable/test_models.py
Normal file
35
tests/seahub/dtable/test_models.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from seahub.dtable.models import Workspaces
|
||||||
|
from seahub.test_utils import BaseTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class WorkspacesManagerTest(BaseTestCase):
|
||||||
|
|
||||||
|
def test_get_workspaces_by_owner(self):
|
||||||
|
assert len(Workspaces.objects.all()) == 0
|
||||||
|
Workspaces.objects.create_workspace("test_name", self.user.username, self.repo.id)
|
||||||
|
|
||||||
|
workspace_list = Workspaces.objects.get_workspaces_by_owner(self.user.username)
|
||||||
|
|
||||||
|
assert len(workspace_list) == 1
|
||||||
|
|
||||||
|
def test_get_workspace_by_id(self):
|
||||||
|
assert len(Workspaces.objects.all()) == 0
|
||||||
|
workspace = Workspaces.objects.create_workspace("test_name", self.user.username, self.repo.id)
|
||||||
|
|
||||||
|
assert workspace is not None
|
||||||
|
workspace_id = workspace.id
|
||||||
|
|
||||||
|
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
|
||||||
|
assert workspace is not None
|
||||||
|
|
||||||
|
def test_delete_workspace(self):
|
||||||
|
assert len(Workspaces.objects.all()) == 0
|
||||||
|
workspace = Workspaces.objects.create_workspace("test_name", self.user.username, self.repo.id)
|
||||||
|
|
||||||
|
assert len(Workspaces.objects.all()) == 1
|
||||||
|
workspace_id = workspace.id
|
||||||
|
|
||||||
|
Workspaces.objects.delete_workspace(workspace_id)
|
||||||
|
assert len(Workspaces.objects.all()) == 0
|
Reference in New Issue
Block a user