From 862192514cc0ba65eddfe1c5d3eb780adb282a0c Mon Sep 17 00:00:00 2001 From: llj Date: Fri, 4 May 2018 16:20:01 +0800 Subject: [PATCH] list all wikis (#2095) * [wiki] Update list wikis * [wikis] show wiki owner --- seahub/api2/endpoints/wikis.py | 39 ++++++++++++++++++- seahub/templates/wiki/wiki_list.html | 9 +++-- .../migrations/0003_auto_20180428_0619.py | 20 ++++++++++ seahub/wiki/models.py | 5 ++- tests/api/endpoints/test_wikis.py | 24 ++++++++++++ 5 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 seahub/wiki/migrations/0003_auto_20180428_0619.py diff --git a/seahub/api2/endpoints/wikis.py b/seahub/api2/endpoints/wikis.py index de2a8f0597..93c920c240 100644 --- a/seahub/api2/endpoints/wikis.py +++ b/seahub/api2/endpoints/wikis.py @@ -20,7 +20,7 @@ from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error from seahub.wiki.models import Wiki, DuplicateWikiNameError from seahub.wiki.utils import is_valid_wiki_name -from seahub.utils import is_org_context +from seahub.utils import is_org_context, get_user_repos logger = logging.getLogger(__name__) @@ -33,8 +33,43 @@ class WikisView(APIView): def get(self, request, format=None): """List all wikis. """ + # parse request params + filter_by = { + 'mine': False, + 'shared': False, + 'group': False, + 'org': False, + } + + rtype = request.GET.get('type', "") + if not rtype: + # set all to True, no filter applied + filter_by = filter_by.fromkeys(filter_by.iterkeys(), True) + + for f in rtype.split(','): + f = f.strip() + filter_by[f] = True + username = request.user.username - ret = [x.to_dict() for x in Wiki.objects.filter(username=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 = [] + if filter_by['mine']: + filter_repo_ids += ([r.id for r in owned]) + + if filter_by['shared']: + filter_repo_ids += ([r.id for r in shared]) + + 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)) + ret = [x.to_dict() for x in Wiki.objects.filter( + repo_id__in=filter_repo_ids)] return Response({'data': ret}) diff --git a/seahub/templates/wiki/wiki_list.html b/seahub/templates/wiki/wiki_list.html index 460ea98404..710ef218a2 100644 --- a/seahub/templates/wiki/wiki_list.html +++ b/seahub/templates/wiki/wiki_list.html @@ -16,9 +16,10 @@ {% trans "Name" %} - {% trans "Permission" %} - {% trans "Created At" %} - {% trans "Last Update" %} + {% trans "Permission" %} + {% trans "Owner" %} + {% trans "Created At" %} + {% trans "Last Update" %} @@ -56,6 +57,7 @@ + <%- owner_nickname %> <%= create_time_from_now %> <%= update_time_from_now %> @@ -231,6 +233,7 @@ var wiki = { var update_at_m = moment(obj.updated_at); var data = $.extend({}, obj, { 'permission_text': getPermText(obj.permission), + 'owner_profile_url': '{{SITE_ROOT}}profile/' + encodeURIComponent(obj.owner) + '/', 'create_time': create_at_m.format('LLLL'), 'create_time_from_now': this.util_getRelativeTimeStr(create_at_m), 'update_time': update_at_m.format('LLLL'), diff --git a/seahub/wiki/migrations/0003_auto_20180428_0619.py b/seahub/wiki/migrations/0003_auto_20180428_0619.py new file mode 100644 index 0000000000..55b9b9e60e --- /dev/null +++ b/seahub/wiki/migrations/0003_auto_20180428_0619.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.11 on 2018-04-28 06:19 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wiki', '0002_auto_20180326_0548'), + ] + + operations = [ + migrations.AlterField( + model_name='wiki', + name='repo_id', + field=models.CharField(db_index=True, max_length=36), + ), + ] diff --git a/seahub/wiki/models.py b/seahub/wiki/models.py index 7b4885e7f2..23a54bd15d 100644 --- a/seahub/wiki/models.py +++ b/seahub/wiki/models.py @@ -6,6 +6,7 @@ from django.utils.translation import ugettext_lazy as _ from seaserv import seafile_api from seahub.base.fields import LowerCaseCharField +from seahub.base.templatetags.seahub_tags import email2nickname from seahub.utils import get_site_scheme_and_netloc from seahub.utils.timeutils import (timestamp_to_isoformat_timestr, datetime_to_isoformat_timestr) @@ -101,7 +102,7 @@ class Wiki(models.Model): username = LowerCaseCharField(max_length=255) name = models.CharField(max_length=255) slug = models.CharField(max_length=255, unique=True) - repo_id = models.CharField(max_length=36) + repo_id = models.CharField(max_length=36, db_index=True) permission = models.CharField(max_length=50) # private, public, login created_at = models.DateTimeField(default=timezone.now, db_index=True) objects = WikiManager() @@ -136,6 +137,8 @@ class Wiki(models.Model): def to_dict(self): return { 'id': self.pk, + 'owner': self.username, + 'owner_nickname': email2nickname(self.username), 'name': self.name, 'slug': self.slug, 'link': self.link, diff --git a/tests/api/endpoints/test_wikis.py b/tests/api/endpoints/test_wikis.py index a82a294779..6288b5b4a5 100644 --- a/tests/api/endpoints/test_wikis.py +++ b/tests/api/endpoints/test_wikis.py @@ -4,6 +4,7 @@ from django.core.urlresolvers import reverse import seaserv from seaserv import seafile_api, ccnet_api +from seahub.share.utils import share_dir_to_user from seahub.wiki.models import Wiki from seahub.test_utils import BaseTestCase @@ -29,6 +30,29 @@ class WikisViewTest(BaseTestCase): assert len(json_resp['data']) == 1 assert json_resp['data'][0]['name'] == wiki.name assert 'wikis/test-wiki' in json_resp['data'][0]['link'] + assert json_resp['data'][0]['owner'] == self.user.username + + def test_can_list_others(self): + self.logout() + self.login_as(self.admin) + + resp = self.client.get(self.url) + self.assertEqual(200, resp.status_code) + json_resp = json.loads(resp.content) + assert len(json_resp['data']) == 0 + + share_from = self.user.username + share_to = self.admin.username + share_dir_to_user(self.repo, '/', share_from, share_from, share_to, 'r') + wiki = Wiki.objects.add('test wiki', self.user.username, + repo_id=self.repo.id) + + resp = self.client.get(self.url) + json_resp = json.loads(resp.content) + assert len(json_resp['data']) == 1 + assert json_resp['data'][0]['name'] == wiki.name + assert 'wikis/test-wiki' in json_resp['data'][0]['link'] + assert json_resp['data'][0]['owner'] == self.user.username def test_can_add(self): assert len(Wiki.objects.all()) == 0