diff --git a/frontend/src/components/wiki-card-view/wiki-card-view.js b/frontend/src/components/wiki-card-view/wiki-card-view.js index ed07a297de..e0a8652391 100644 --- a/frontend/src/components/wiki-card-view/wiki-card-view.js +++ b/frontend/src/components/wiki-card-view/wiki-card-view.js @@ -30,7 +30,7 @@ class WikiCardView extends Component { if (!canPublishRepo || !isPro) return; let departmentMap = {}; wikiAPI.listWikiDepartments().then(res => { - res.data.forEach(item => departmentMap[item.id] = true); + res.data.forEach(item => departmentMap[item.email] = true); this.setState({ departmentMap }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); diff --git a/seahub/api2/endpoints/wiki2.py b/seahub/api2/endpoints/wiki2.py index 9e8a67108f..bbc0b48a71 100644 --- a/seahub/api2/endpoints/wiki2.py +++ b/seahub/api2/endpoints/wiki2.py @@ -21,7 +21,7 @@ from django.utils.translation import gettext as _ from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle -from seahub.api2.utils import api_error, to_python_boolean +from seahub.api2.utils import api_error, to_python_boolean, is_wiki_repo from seahub.utils.db_api import SeafileDB from seahub.wiki2.models import Wiki2 as Wiki from seahub.wiki2.utils import is_valid_wiki_name, can_edit_wiki, get_wiki_dirs_by_path, \ @@ -36,12 +36,12 @@ from seahub.views import check_folder_permission from seahub.views.file import send_file_access_msg from seahub.base.templatetags.seahub_tags import email2nickname from seahub.utils.file_op import check_file_lock, ONLINE_OFFICE_LOCK_OWNER, if_locked_by_online_office -from seahub.utils.repo import parse_repo_perm +from seahub.utils.repo import parse_repo_perm, get_repo_owner from seahub.seadoc.utils import get_seadoc_file_uuid, gen_seadoc_access_token, copy_sdoc_images_with_sdoc_uuid from seahub.settings import SEADOC_SERVER_URL, ENABLE_STORAGE_CLASSES, STORAGE_CLASS_MAPPING_POLICY, \ ENCRYPTED_LIBRARY_VERSION from seahub.seadoc.sdoc_server_api import SdocServerAPI -from seahub.utils.timeutils import timestamp_to_isoformat_timestr +from seahub.utils.timeutils import timestamp_to_isoformat_timestr, datetime_to_isoformat_timestr from seahub.tags.models import FileUUIDMap from seahub.seadoc.models import SeadocHistoryName, SeadocDraft, SeadocCommentReply from seahub.base.models import FileComment @@ -84,32 +84,41 @@ class Wikis2View(APIView): username = request.user.username org_id = request.user.org.org_id if is_org_context(request) else None (owned, shared, groups, public) = get_user_repos(username, org_id) - - filter_repo_ids = [] + + wikis = [] + username = request.user.username if filter_by['mine']: - filter_repo_ids += ([r.id for r in owned]) - + owned_wikis = [r for r in owned if is_wiki_repo(r)] + for r in owned_wikis: + r.owner = username + r.permission = 'rw' + wikis.append(r) + if filter_by['shared']: - filter_repo_ids += ([r.id for r in shared]) + shared_wikis = [r for r in shared if is_wiki_repo(r)] + for r in shared_wikis: + r.owner = r.user + wikis.append(r) if filter_by['group']: - filter_repo_ids += ([r.id for r in groups]) - - if filter_by['org']: - filter_repo_ids += ([r.id for r in public]) - - filter_repo_ids = list(set(filter_repo_ids)) - - wikis = Wiki.objects.filter(repo_id__in=filter_repo_ids) - + group_wikis = [r for r in groups if is_wiki_repo(r)] + for r in group_wikis: + r.owner = r.user + wikis.append(r) + + wikis = list(set(wikis)) wiki_list = [] - for wiki in wikis: + for w in wikis: + wiki = Wiki(w) wiki_info = wiki.to_dict() if is_group_wiki(wiki): - wiki_info['owner_nickname'] = group_id_to_name(wiki.owner) + group_id = int(wiki.owner.split('@')[0]) + wiki_info['owner_nickname'] = group_id_to_name(group_id) else: wiki_info['owner_nickname'] = email2nickname(wiki.owner) wiki_list.append(wiki_info) + + wiki_list = sorted(wiki_list, key=lambda x: x.get('updated_at'), reverse=True) return Response({'wikis': wiki_list}) @@ -138,6 +147,7 @@ class Wikis2View(APIView): else: try: group_id = int(wiki_owner) + wiki_owner = "%s@seafile_group" % group_id except: return api_error(status.HTTP_400_BAD_REQUEST, 'wiki_owner invalid') is_group_owner = True @@ -187,20 +197,22 @@ class Wikis2View(APIView): repo_id = seafile_api.create_repo(wiki_name, '', username) try: - wiki = Wiki.objects.add(wiki_name=wiki_name, owner=wiki_owner, repo_id=repo_id) seafile_db_api = SeafileDB() seafile_db_api.set_repo_type(repo_id, 'wiki') except Exception as e: logger.error(e) msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, msg) - + + repo = seafile_api.get_repo(repo_id) + wiki = Wiki(repo, wiki_owner) wiki_info = wiki.to_dict() if not is_group_owner: wiki_info['owner_nickname'] = email2nickname(wiki.owner) else: - wiki_info['owner_nickname'] = group_id_to_name(wiki.owner) - + group_id = int(wiki.owner.split('@')[0]) + wiki_info['owner_nickname'] = group_id_to_name(group_id) + return Response(wiki_info) @@ -218,35 +230,30 @@ class Wiki2View(APIView): return api_error(status.HTTP_400_BAD_REQUEST, 'name invalid.') username = request.user.username - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = 'Wiki not found.' return api_error(status.HTTP_404_NOT_FOUND, error_msg) - if not check_wiki_admin_permission(wiki, username): - error_msg = 'Permission denied.' - return api_error(status.HTTP_403_FORBIDDEN, error_msg) - if wiki_name == wiki.name: return Response({"success": True}) repo_id = wiki.repo_id repo = seafile_api.get_repo(repo_id) + if not repo: error_msg = "Wiki library not found." return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + if not check_wiki_admin_permission(wiki, username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) if not is_group_wiki(wiki): - if is_org_context(request): - repo_owner = seafile_api.get_org_repo_owner(repo.id) - else: - repo_owner = seafile_api.get_repo_owner(repo.id) - is_owner = True if username == repo_owner else False if not is_owner: return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') @@ -258,40 +265,37 @@ class Wiki2View(APIView): return api_error(status.HTTP_403_FORBIDDEN, error_msg) try: - # desc is '' seafile_api.edit_repo(repo_id, wiki_name, '', username) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) - wiki.name = wiki_name - wiki.save() - return Response({"success": True}) def delete(self, request, wiki_id): """Delete a wiki. """ username = request.user.username - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = 'Wiki not found.' return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + if not check_wiki_admin_permission(wiki, username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) - - wiki.delete() - + org_id = -1 if is_org_context(request): org_id = request.user.org.org_id if is_group_wiki(wiki): - group_id = int(wiki.owner) + group_id = int(wiki.owner.split('@')[0]) try: SeafileAPI.delete_group_owned_repo(group_id, wiki.repo_id, org_id) except Exception as e: @@ -318,12 +322,14 @@ class Wiki2ConfigView(APIView): return api_error(status.HTTP_400_BAD_REQUEST, error_msg) username = request.user.username - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = "Wiki not found." return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + if not check_wiki_permission(wiki, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) @@ -342,12 +348,15 @@ class Wiki2ConfigView(APIView): def get(self, request, wiki_id): - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = "Wiki not found." return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + if not check_wiki_permission(wiki, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) @@ -397,12 +406,15 @@ class Wiki2PagesView(APIView): error_msg = 'page_name invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = "Wiki not found." return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + if not check_wiki_permission(wiki, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) @@ -487,12 +499,15 @@ class Wiki2PagesView(APIView): return Response({'file_info': file_info}) def put(self, request, wiki_id): - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = "Wiki not found." return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + username = request.user.username if not check_wiki_permission(wiki, username): error_msg = 'Permission denied.' @@ -543,12 +558,15 @@ class Wiki2PageView(APIView): def get(self, request, wiki_id, page_id): - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = "Wiki not found." return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + username = request.user.username if not check_wiki_permission(wiki, username): error_msg = 'Permission denied.' @@ -610,12 +628,15 @@ class Wiki2PageView(APIView): }) def delete(self, request, wiki_id, page_id): - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = "Wiki not found." return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + username = request.user.username if not check_wiki_permission(wiki, username): error_msg = 'Permission denied.' @@ -720,12 +741,15 @@ class Wiki2DuplicatePageView(APIView): error_msg = 'page_id invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) - try: - wiki = Wiki.objects.get(id=wiki_id) - except Wiki.DoesNotExist: + + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: error_msg = "Wiki not found." return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + username = request.user.username if not check_wiki_permission(wiki, username): error_msg = 'Permission denied.' diff --git a/seahub/urls.py b/seahub/urls.py index 550603b3ab..f3632d1c5c 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -526,11 +526,11 @@ urlpatterns = [ ## user::wiki2 re_path(r'^api/v2.1/wikis2/$', Wikis2View.as_view(), name='api-v2.1-wikis2'), - re_path(r'^api/v2.1/wiki2/(?P\d+)/$', Wiki2View.as_view(), name='api-v2.1-wiki2'), - re_path(r'^api/v2.1/wiki2/(?P\d+)/config/$', Wiki2ConfigView.as_view(), name='api-v2.1-wiki2-config'), - re_path(r'^api/v2.1/wiki2/(?P\d+)/pages/$', Wiki2PagesView.as_view(), name='api-v2.1-wiki2-pages'), - re_path(r'^api/v2.1/wiki2/(?P\d+)/page/(?P[-0-9a-zA-Z]{4})/$', Wiki2PageView.as_view(), name='api-v2.1-wiki2-page'), - re_path(r'^api/v2.1/wiki2/(?P\d+)/duplicate-page/$', Wiki2DuplicatePageView.as_view(), name='api-v2.1-wiki2-duplicate-page'), + re_path(r'^api/v2.1/wiki2/(?P[-0-9a-f]{36})/$', Wiki2View.as_view(), name='api-v2.1-wiki2'), + re_path(r'^api/v2.1/wiki2/(?P[-0-9a-f]{36})/config/$', Wiki2ConfigView.as_view(), name='api-v2.1-wiki2-config'), + re_path(r'^api/v2.1/wiki2/(?P[-0-9a-f]{36})/pages/$', Wiki2PagesView.as_view(), name='api-v2.1-wiki2-pages'), + re_path(r'^api/v2.1/wiki2/(?P[-0-9a-f]{36})/page/(?P[-0-9a-zA-Z]{4})/$', Wiki2PageView.as_view(), name='api-v2.1-wiki2-page'), + re_path(r'^api/v2.1/wiki2/(?P[-0-9a-f]{36})/duplicate-page/$', Wiki2DuplicatePageView.as_view(), name='api-v2.1-wiki2-duplicate-page'), ## user::drafts re_path(r'^api/v2.1/drafts/$', DraftsView.as_view(), name='api-v2.1-drafts'), diff --git a/seahub/wiki2/models.py b/seahub/wiki2/models.py index 84de5f1377..26a9716d9f 100644 --- a/seahub/wiki2/models.py +++ b/seahub/wiki2/models.py @@ -11,47 +11,36 @@ class WikiDoesNotExist(Exception): pass -class WikiManager(models.Manager): - def add(self, wiki_name, owner, repo_id): - now = timezone.now() - wiki = self.model(owner=owner, name=wiki_name, repo_id=repo_id, created_at=now) - wiki.save(using=self._db) - return wiki +class WikiManager(): + def get(self, wiki_id): + repo = seafile_api.get_repo(wiki_id) + if not repo: + return None + return Wiki2(repo) -class Wiki2(models.Model): +class Wiki2(object): """New wiki model to enable a user has multiple wikis and replace personal wiki. """ - - owner = LowerCaseCharField(max_length=255) - name = models.CharField(max_length=255) - repo_id = models.CharField(max_length=36, db_index=True) - created_at = models.DateTimeField(default=timezone.now, db_index=True) objects = WikiManager() - - class Meta: - db_table = 'wiki_wiki2' - unique_together = (('owner', 'repo_id'),) - ordering = ["name"] - - @property - def updated_at(self): - assert len(self.repo_id) == 36 - - repo = seafile_api.get_repo(self.repo_id) - if not repo: - return '' - - return repo.last_modify - + + def __init__(self, wiki, owner=None): + # wiki a wiki type repo object + self.pk = wiki.id + self.id = wiki.id + self.owner = owner or wiki.owner + self.name = wiki.repo_name + self.updated_at = timestamp_to_isoformat_timestr(wiki.last_modify) + self.repo_id = wiki.repo_id + + def to_dict(self): return { 'id': self.pk, 'owner': self.owner, 'name': self.name, - 'created_at': datetime_to_isoformat_timestr(self.created_at), - 'updated_at': timestamp_to_isoformat_timestr(self.updated_at), + 'updated_at': self.updated_at, 'repo_id': self.repo_id, } @@ -63,5 +52,4 @@ from seahub.signals import repo_deleted @receiver(repo_deleted) def remove_wiki(sender, **kwargs): repo_id = kwargs['repo_id'] - - Wiki2.objects.filter(repo_id=repo_id).delete() + return diff --git a/seahub/wiki2/utils.py b/seahub/wiki2/utils.py index fb76b3f35a..4e095ed390 100644 --- a/seahub/wiki2/utils.py +++ b/seahub/wiki2/utils.py @@ -67,12 +67,12 @@ def get_wiki_config(repo_id, username): def is_group_wiki(wiki): - return not ('@' in wiki.owner) + return '@seafile_group' in wiki.owner def check_wiki_admin_permission(wiki, username): if is_group_wiki(wiki): - group_id = wiki.owner + group_id = int(wiki.owner.split('@')[0]) return is_group_admin(group_id, username) else: if username == wiki.owner: @@ -82,7 +82,7 @@ def check_wiki_admin_permission(wiki, username): def check_wiki_permission(wiki, username): if is_group_wiki(wiki): - group_id = wiki.owner + group_id = int(wiki.owner.split('@')[0]) return is_group_member(group_id, username) else: if username == wiki.owner: diff --git a/seahub/wiki2/views.py b/seahub/wiki2/views.py index d105ad73b4..fe564dd484 100644 --- a/seahub/wiki2/views.py +++ b/seahub/wiki2/views.py @@ -8,7 +8,7 @@ from datetime import datetime from seaserv import seafile_api from django.urls import reverse -from django.http import HttpResponseRedirect +from django.http import HttpResponseRedirect, Http404 from django.shortcuts import render, get_object_or_404, redirect from seahub.share.models import FileShare @@ -21,7 +21,7 @@ from seahub.auth.decorators import login_required from seahub.wiki2.utils import can_edit_wiki, check_wiki_permission, get_wiki_config from seahub.utils.file_op import check_file_lock, ONLINE_OFFICE_LOCK_OWNER, if_locked_by_online_office -from seahub.utils.repo import parse_repo_perm +from seahub.utils.repo import parse_repo_perm, get_repo_owner from seahub.settings import SEADOC_SERVER_URL # Get an instance of a logger @@ -33,8 +33,14 @@ def wiki_view(request, wiki_id): """ edit wiki page. for wiki2 """ # get wiki object or 404 - wiki = get_object_or_404(Wiki, id=wiki_id) - + wiki = Wiki.objects.get(wiki_id=wiki_id) + if not wiki: + raise Http404 + + + repo_owner = get_repo_owner(request, wiki_id) + wiki.owner = repo_owner + page_id = request.GET.get('page_id') file_path = ''