diff --git a/seahub/api2/endpoints/dtable.py b/seahub/api2/endpoints/dtable.py index 58df236881..30804d17c4 100644 --- a/seahub/api2/endpoints/dtable.py +++ b/seahub/api2/endpoints/dtable.py @@ -29,7 +29,7 @@ from seahub.views.file import send_file_access_msg from seahub.auth.decorators import login_required from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, SHARE_LINK_EXPIRE_DAYS_MIN, \ SHARE_LINK_EXPIRE_DAYS_MAX, SHARE_LINK_EXPIRE_DAYS_DEFAULT -from seahub.dtable.utils import check_share_dtable_permission +from seahub.dtable.utils import check_dtable_share_permission from seahub.constants import PERMISSION_ADMIN, PERMISSION_READ_WRITE @@ -300,7 +300,7 @@ class DTableView(APIView): return api_error(status.HTTP_403_FORBIDDEN, error_msg) else: if username != owner and \ - not check_share_dtable_permission(dtable, username): + not check_dtable_share_permission(dtable, username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) @@ -535,7 +535,7 @@ class DTableUpdateLinkView(APIView): return api_error(status.HTTP_403_FORBIDDEN, error_msg) else: if username != owner and \ - check_share_dtable_permission(dtable, username) not in WRITE_PERMISSION_TUPLE: + check_dtable_share_permission(dtable, username) not in WRITE_PERMISSION_TUPLE: error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) @@ -595,7 +595,7 @@ class DTableAssetUploadLinkView(APIView): username = request.user.username owner = workspace.owner if username != owner and \ - check_share_dtable_permission(dtable, username) not in WRITE_PERMISSION_TUPLE: + check_dtable_share_permission(dtable, username) not in WRITE_PERMISSION_TUPLE: error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) @@ -663,7 +663,7 @@ def dtable_file_view(request, workspace_id, name): return api_error(status.HTTP_403_FORBIDDEN, error_msg) else: if username != owner and \ - not check_share_dtable_permission(dtable, username): + not check_dtable_share_permission(dtable, username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) @@ -719,7 +719,7 @@ def dtable_asset_access(request, workspace_id, dtable_id, path): username = request.user.username owner = workspace.owner if username != owner and \ - check_share_dtable_permission(dtable, username) not in WRITE_PERMISSION_TUPLE: + check_dtable_share_permission(dtable, username) not in WRITE_PERMISSION_TUPLE: return render_permission_error(request, 'Permission denied.') token = seafile_api.get_fileserver_access_token(repo_id, asset_id, 'view', diff --git a/seahub/dtable/api.py b/seahub/dtable/api.py index 49fa7670e1..aeac0ca50f 100644 --- a/seahub/dtable/api.py +++ b/seahub/dtable/api.py @@ -14,7 +14,7 @@ from seahub.base.accounts import User from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error, get_user_common_info -from seahub.dtable.models import Workspaces, DTables, ShareDTable +from seahub.dtable.models import Workspaces, DTables, DTableShare from seahub.base.templatetags.seahub_tags import email2nickname from seahub.utils import is_valid_username, is_org_context from seahub.api2.endpoints.utils import is_org_user @@ -31,18 +31,18 @@ permission_tuple = (PERMISSION_ADMIN, PERMISSION_PREVIEW, PERMISSION_PREVIEW_EDI GROUP_DOMAIN = '@seafile_group' -class ShareDTablesView(APIView): +class SharedDTablesView(APIView): authentication_classes = (TokenAuthentication, SessionAuthentication) permission_classes = (IsAuthenticated,) throttle_classes = (UserRateThrottle,) def get(self, request): - """get dtables from share + """list dtables from shared """ to_user = request.user.username try: - share_queryset = ShareDTable.objects.list_by_to_user(to_user) + share_queryset = DTableShare.objects.list_by_to_user(to_user) except Exception as e: logger.error(e) error_msg = 'Internal Server Error.' @@ -73,7 +73,7 @@ class ShareDTablesView(APIView): return Response({'table_list': table_list}) -class ShareDTableView(APIView): +class DTableShareView(APIView): authentication_classes = (TokenAuthentication, SessionAuthentication) permission_classes = (IsAuthenticated,) throttle_classes = (UserRateThrottle,) @@ -148,12 +148,12 @@ class ShareDTableView(APIView): # main try: - obj = ShareDTable.objects.get_by_dtable_and_to_user(dtable, to_user) + obj = DTableShare.objects.get_by_dtable_and_to_user(dtable, to_user) if obj: error_msg = 'table %s already shared to %s.' % (table_name, to_user) return api_error(status.HTTP_409_CONFLICT, error_msg) - ShareDTable.objects.add(dtable, from_user, to_user, permission) + DTableShare.objects.add(dtable, from_user, to_user, permission) except Exception as e: logger.error(e) error_msg = 'Internal Server Error.' @@ -162,7 +162,7 @@ class ShareDTableView(APIView): return Response({"success": True}, status=status.HTTP_201_CREATED) def get(self, request, workspace_id, name): - """list share users in share dtable + """list share users in dtable share """ from_user = request.user.username table_name = name @@ -198,7 +198,7 @@ class ShareDTableView(APIView): # main try: - share_queryset = ShareDTable.objects.list_by_dtable(dtable) + share_queryset = DTableShare.objects.list_by_dtable(dtable) except Exception as e: logger.error(e) error_msg = 'Internal Server Error.' @@ -213,7 +213,7 @@ class ShareDTableView(APIView): return Response({"user_list": user_list}) def put(self, request, workspace_id, name): - """modify share dtable permission + """modify dtable share permission """ from_user = request.user.username table_name = name @@ -270,7 +270,7 @@ class ShareDTableView(APIView): # main try: - obj = ShareDTable.objects.get_by_dtable_and_to_user(dtable, to_user) + obj = DTableShare.objects.get_by_dtable_and_to_user(dtable, to_user) if not obj: error_msg = 'table %s not shared to %s.' % (table_name, to_user) return api_error(status.HTTP_404_NOT_FOUND, error_msg) @@ -331,7 +331,7 @@ class ShareDTableView(APIView): # main try: - obj = ShareDTable.objects.get_by_dtable_and_to_user(dtable, to_user) + obj = DTableShare.objects.get_by_dtable_and_to_user(dtable, to_user) if not obj: error_msg = 'table %s not shared to %s.' % (table_name, to_user) return api_error(status.HTTP_404_NOT_FOUND, error_msg) diff --git a/seahub/dtable/migrations/0002_auto.py b/seahub/dtable/migrations/0002_auto.py index 1da7176cab..d5a9467dc2 100644 --- a/seahub/dtable/migrations/0002_auto.py +++ b/seahub/dtable/migrations/0002_auto.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.15 on 2019-06-26 02:29 +# Generated by Django 1.11.15 on 2019-07-02 05:20 from __future__ import unicode_literals from django.db import migrations, models @@ -14,7 +14,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='ShareDTable', + name='DTableShare', fields=[ ('id', models.BigAutoField(primary_key=True, serialize=False)), ('from_user', models.CharField(db_index=True, max_length=255)), @@ -23,11 +23,11 @@ class Migration(migrations.Migration): ('dtable', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dtable.DTables')), ], options={ - 'db_table': 'share_dtable', + 'db_table': 'dtable_share', }, ), migrations.AlterUniqueTogether( - name='sharedtable', + name='dtableshare', unique_together=set([('dtable', 'to_user')]), ), ] diff --git a/seahub/dtable/models.py b/seahub/dtable/models.py index d1832d2e9a..77076bf5e6 100644 --- a/seahub/dtable/models.py +++ b/seahub/dtable/models.py @@ -152,7 +152,7 @@ class DTables(models.Model): } -class ShareDTableManager(models.Manager): +class DTableShareManager(models.Manager): def list_by_dtable(self, dtable): return self.filter(dtable=dtable) @@ -173,8 +173,8 @@ class ShareDTableManager(models.Manager): return obj -class ShareDTable(models.Model): - """Model used to share dtable +class DTableShare(models.Model): + """Model used to dtable share from_user, to_user: user email or group_id@seafile_group """ @@ -184,8 +184,8 @@ class ShareDTable(models.Model): to_user = models.CharField(max_length=255, db_index=True) permission = models.CharField(max_length=15) - objects = ShareDTableManager() + objects = DTableShareManager() class Meta: unique_together = (('dtable', 'to_user'),) - db_table = 'share_dtable' + db_table = 'dtable_share' diff --git a/seahub/dtable/utils.py b/seahub/dtable/utils.py index b67b42cad2..d1fd63cc94 100644 --- a/seahub/dtable/utils.py +++ b/seahub/dtable/utils.py @@ -1,8 +1,8 @@ -from seahub.dtable.models import ShareDTable +from seahub.dtable.models import DTableShare -def check_share_dtable_permission(dtable, to_user): - share_dtable_obj = ShareDTable.objects.get_by_dtable_and_to_user(dtable, to_user) +def check_dtable_share_permission(dtable, to_user): + share_dtable_obj = DTableShare.objects.get_by_dtable_and_to_user(dtable, to_user) if share_dtable_obj: return share_dtable_obj.permission diff --git a/seahub/urls.py b/seahub/urls.py index 982bf13ffa..9baeb5b565 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -91,7 +91,7 @@ from seahub.api2.endpoints.starred_items import StarredItems from seahub.api2.endpoints.markdown_lint import MarkdownLintView from seahub.api2.endpoints.dtable import WorkspacesView, DTableView, DTablesView, \ DTableUpdateLinkView, DTableAssetUploadLinkView, dtable_file_view, dtable_asset_access -from seahub.dtable.api import ShareDTablesView, ShareDTableView +from seahub.dtable.api import SharedDTablesView, DTableShareView # Admin from seahub.api2.endpoints.admin.revision_tag import AdminTaggedItemsView @@ -374,8 +374,8 @@ urlpatterns = [ url(r'^api/v2.1/workspace/(?P\d+)/dtable-asset-upload-link/$', DTableAssetUploadLinkView.as_view(), name='api-v2.1-workspace-dtable-asset-upload-link'), url(r'^workspace/(?P\d+)/dtable/(?P.*)/$', dtable_file_view, name='dtable-file-view'), url(r'^workspace/(?P\d+)/asset/(?P[-0-9a-f]{36})/(?P.*)$', dtable_asset_access, name='dtable-asset-access'), - url(r'^api/v2.1/dtables/shared/$', ShareDTablesView.as_view(), name='api-v2.1-dtables-share'), - url(r'^api/v2.1/workspace/(?P\d+)/dtable/(?P.*)/share/$', ShareDTableView.as_view(), name='api-v2.1-dtable-share'), + url(r'^api/v2.1/dtables/shared/$', SharedDTablesView.as_view(), name='api-v2.1-dtables-share'), + url(r'^api/v2.1/workspace/(?P\d+)/dtable/(?P.*)/share/$', DTableShareView.as_view(), name='api-v2.1-dtable-share'), # Deprecated url(r'^api/v2.1/repos/(?P[-0-9a-f]{36})/tags/$', FileTagsView.as_view(), name="api-v2.1-filetags-view"), diff --git a/tests/seahub/dtable/test_api.py b/tests/seahub/dtable/test_api.py index 3168002f39..2e0d4fae59 100644 --- a/tests/seahub/dtable/test_api.py +++ b/tests/seahub/dtable/test_api.py @@ -1,7 +1,7 @@ import json from django.core.urlresolvers import reverse -from seahub.dtable.models import Workspaces, ShareDTable, DTables +from seahub.dtable.models import Workspaces, DTableShare, DTables from seaserv import seafile_api from seahub.test_utils import BaseTestCase @@ -14,7 +14,7 @@ except ImportError: LOCAL_PRO_DEV_ENV = False -class ShareDTablesViewTest(BaseTestCase): +class SharedDTablesViewTest(BaseTestCase): def setUp(self): # create workspace self.workspace = Workspaces.objects.create_workspace( @@ -27,9 +27,9 @@ class ShareDTablesViewTest(BaseTestCase): self.user.username, self.workspace, 'dtable1') assert len(DTables.objects.all()) == 1 # share dtable to admin - ShareDTable.objects.add( + DTableShare.objects.add( self.dtable, self.user.username, self.admin.username, 'rw') - assert len(ShareDTable.objects.all()) == 1 + assert len(DTableShare.objects.all()) == 1 self.url = reverse('api-v2.1-dtables-share') @@ -61,7 +61,7 @@ class ShareDTablesViewTest(BaseTestCase): assert json_resp['table_list'][0]['name'] == 'dtable1' -class ShareDTableViewTest(BaseTestCase): +class DTableShareViewTest(BaseTestCase): def setUp(self): # create workspace self.workspace = Workspaces.objects.create_workspace( @@ -74,9 +74,9 @@ class ShareDTableViewTest(BaseTestCase): self.user.username, self.workspace, 'dtable1') assert len(DTables.objects.all()) == 1 # share dtable to admin - ShareDTable.objects.add( + DTableShare.objects.add( self.dtable, self.user.username, self.admin.username, 'rw') - assert len(ShareDTable.objects.all()) == 1 + assert len(DTableShare.objects.all()) == 1 self.url = reverse('api-v2.1-dtable-share', args=[self.workspace.id, self.dtable.name]) @@ -88,9 +88,9 @@ class ShareDTableViewTest(BaseTestCase): self.remove_repo() def test_can_post(self): - assert len(ShareDTable.objects.all()) == 1 - ShareDTable.objects.all().delete() - assert len(ShareDTable.objects.all()) == 0 + assert len(DTableShare.objects.all()) == 1 + DTableShare.objects.all().delete() + assert len(DTableShare.objects.all()) == 0 self.login_as(self.user) @@ -100,10 +100,10 @@ class ShareDTableViewTest(BaseTestCase): } resp = self.client.post(self.url, data) self.assertEqual(201, resp.status_code) - assert len(ShareDTable.objects.all()) == 1 + assert len(DTableShare.objects.all()) == 1 def test_can_not_post_with_already_share(self): - assert len(ShareDTable.objects.all()) == 1 + assert len(DTableShare.objects.all()) == 1 self.login_as(self.user) @@ -115,9 +115,9 @@ class ShareDTableViewTest(BaseTestCase): self.assertEqual(409, resp.status_code) def test_can_not_post_with_not_owner(self): - assert len(ShareDTable.objects.all()) == 1 - ShareDTable.objects.all().delete() - assert len(ShareDTable.objects.all()) == 0 + assert len(DTableShare.objects.all()) == 1 + DTableShare.objects.all().delete() + assert len(DTableShare.objects.all()) == 0 self.login_as(self.admin) @@ -129,9 +129,9 @@ class ShareDTableViewTest(BaseTestCase): self.assertEqual(403, resp.status_code) def test_can_not_post_with_share_to_owner(self): - assert len(ShareDTable.objects.all()) == 1 - ShareDTable.objects.all().delete() - assert len(ShareDTable.objects.all()) == 0 + assert len(DTableShare.objects.all()) == 1 + DTableShare.objects.all().delete() + assert len(DTableShare.objects.all()) == 0 self.login_as(self.user) @@ -146,9 +146,9 @@ class ShareDTableViewTest(BaseTestCase): if not LOCAL_PRO_DEV_ENV: return - assert len(ShareDTable.objects.all()) == 1 - ShareDTable.objects.all().delete() - assert len(ShareDTable.objects.all()) == 0 + assert len(DTableShare.objects.all()) == 1 + DTableShare.objects.all().delete() + assert len(DTableShare.objects.all()) == 0 self.login_as(self.user) @@ -190,13 +190,13 @@ class ShareDTableViewTest(BaseTestCase): resp = self.client.put(self.url, json.dumps(data), 'application/json') self.assertEqual(200, resp.status_code) - assert ShareDTable.objects.get_by_dtable_and_to_user( + assert DTableShare.objects.get_by_dtable_and_to_user( self.dtable, self.admin.username).permission == 'r' def test_can_not_put_with_not_shared(self): - assert len(ShareDTable.objects.all()) == 1 - ShareDTable.objects.all().delete() - assert len(ShareDTable.objects.all()) == 0 + assert len(DTableShare.objects.all()) == 1 + DTableShare.objects.all().delete() + assert len(DTableShare.objects.all()) == 0 self.login_as(self.user) @@ -235,7 +235,7 @@ class ShareDTableViewTest(BaseTestCase): } resp = self.client.delete(self.url, json.dumps(data), 'application/json') self.assertEqual(200, resp.status_code) - assert len(ShareDTable.objects.all()) == 0 + assert len(DTableShare.objects.all()) == 0 def test_can_delete_with_share_user(self): self.login_as(self.admin) @@ -245,12 +245,12 @@ class ShareDTableViewTest(BaseTestCase): } resp = self.client.delete(self.url, json.dumps(data), 'application/json') self.assertEqual(200, resp.status_code) - assert len(ShareDTable.objects.all()) == 0 + assert len(DTableShare.objects.all()) == 0 def test_can_not_delete_with_not_shared(self): - assert len(ShareDTable.objects.all()) == 1 - ShareDTable.objects.all().delete() - assert len(ShareDTable.objects.all()) == 0 + assert len(DTableShare.objects.all()) == 1 + DTableShare.objects.all().delete() + assert len(DTableShare.objects.all()) == 0 self.login_as(self.user)