From b6d297ff35d73d0d5d931dd85b0353a9710bbc26 Mon Sep 17 00:00:00 2001 From: jwokaty Date: Fri, 11 Sep 2020 01:50:35 -0400 Subject: [PATCH 1/3] Add PageAdmin --- member_manager/admin/__init__.py | 3 ++- member_manager/admin/page.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 member_manager/admin/page.py diff --git a/member_manager/admin/__init__.py b/member_manager/admin/__init__.py index 67cdae9..5bf1652 100644 --- a/member_manager/admin/__init__.py +++ b/member_manager/admin/__init__.py @@ -1,7 +1,8 @@ -from django.contrib import admin +"""MemberManagerAdmin classes""" from member_manager.admin.availability import AvailabilityAdmin from member_manager.admin.availability_inline import AvailabilityInline +from member_manager.admin.page import PageAdmin from member_manager.admin.profile import ProfileAdmin from member_manager.admin.profile_skill_inline import ProfileSkillInline from member_manager.admin.profile_skill import ProfileSkillAdmin diff --git a/member_manager/admin/page.py b/member_manager/admin/page.py new file mode 100644 index 0000000..37ce5a0 --- /dev/null +++ b/member_manager/admin/page.py @@ -0,0 +1,18 @@ +"""PageAdmin class""" + +from django.contrib import admin + +from common_files.admin.timestamp import TimestampAdmin +from member_manager.models.page import Page + + +@admin.register(Page) +class PageAdmin(TimestampAdmin): + """PageAdmin inherits from TimestampAdmin""" + + fields = ['title', 'slug', 'content', 'public', 'published'] + list_display = ['title', 'slug', 'content', 'public', 'published'] + list_filter = ['public'] + ordering = ['title', 'slug', 'public'] + readonly_fields = ['created', 'created_by', 'modified', 'modified_by'] + search_fields = ['title', 'slug', 'content'] From f8fd295ef372f25670ed954fdee08e8268bcd398 Mon Sep 17 00:00:00 2001 From: jwokaty Date: Fri, 11 Sep 2020 08:30:48 -0400 Subject: [PATCH 2/3] Add PublishedListFilter --- member_manager/filters/__init__.py | 0 member_manager/filters/published.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 member_manager/filters/__init__.py create mode 100644 member_manager/filters/published.py diff --git a/member_manager/filters/__init__.py b/member_manager/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_manager/filters/published.py b/member_manager/filters/published.py new file mode 100644 index 0000000..79d4a77 --- /dev/null +++ b/member_manager/filters/published.py @@ -0,0 +1,28 @@ +"""PublishedFilter class""" + +from django.contrib import admin +from django.utils.translation import gettext_lazy as _ + + +class PublishedListFilter(admin.SimpleListFilter): + """PublishedListFilter filters published and unpublished pages""" + + title = _('published') + parameter_name = 'published' + + def lookups(self, request, model_admin): + return ( + ('published', _('Yes')), + ('unpublished', _('No')), + ) + + def queryset(self, request, queryset): + """Return queryset of published or unpublished pages.""" + if not self.value(): + return queryset + + if self.value() == 'published': + updated_qs = queryset.filter(published__isnull=False) + elif self.value() == 'unpublished': + updated_qs = queryset.filter(published__isnull=True) + return updated_qs From 264fc8fa8d2fd48d3e6e1824cb46431ace404af8 Mon Sep 17 00:00:00 2001 From: jwokaty Date: Fri, 11 Sep 2020 08:36:17 -0400 Subject: [PATCH 3/3] Add PublishedListFilter tests --- member_manager/tests/__init__.py | 2 + member_manager/tests/published.py | 68 +++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 member_manager/tests/published.py diff --git a/member_manager/tests/__init__.py b/member_manager/tests/__init__.py index 7f969e6..2393321 100644 --- a/member_manager/tests/__init__.py +++ b/member_manager/tests/__init__.py @@ -5,7 +5,9 @@ from member_manager.tests.availability_inline_formset import ( AvailabilityInlineFormSetTest ) +from member_manager.tests.page import PageTest from member_manager.tests.profile import ProfileTest from member_manager.tests.profile_skill import ProfileSkillTest +from member_manager.tests.published import PublishedListFilterTest from member_manager.tests.skill import SkillTest from member_manager.tests.utils import MemberManagerUtilsTest diff --git a/member_manager/tests/published.py b/member_manager/tests/published.py new file mode 100644 index 0000000..e451ab3 --- /dev/null +++ b/member_manager/tests/published.py @@ -0,0 +1,68 @@ +"""PublishedListFilterTest class""" + +from django.contrib.auth.models import User +from django.test import TestCase +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from member_manager.filters.published import PublishedListFilter +from member_manager.models.page import Page + + +class PublishedListFilterTest(TestCase): + """Test PublishedListFilter""" + + @classmethod + def setUpTestData(cls): + user = User.objects.create(username='fbar', email='fb@example.com') + Page.objects.bulk_create([ + Page(title='Title 1', slug='title-1', content='Content of page 1', + public=True, published=timezone.now(), created_by=user, + modified_by=user), + Page(title='Title 2', slug='title-2', content='Content of page 2', + public=False, published=timezone.now(), created_by=user, + modified_by=user), + Page(title='Title 3', slug='title-3', content='Content of page 3', + public=True, published=timezone.now(), created_by=user, + modified_by=user), + Page(title='Title 4', slug='title-4', content='Content of page 4', + public=True, created_by=user, modified_by=user), + Page(title='Title 5', slug='title-5', content='Content of page 5', + public=False, created_by=user, modified_by=user), + Page(title='Title 6', slug='title-6', content='Content of page 6', + public=True, created_by=user, modified_by=user), + ]) + + def test_lookups(self): + """Test lookups""" + lookup_values = ( + ('published', _('Yes')), + ('unpublished', _('No')), + ) + page_lf = PublishedListFilter(None, {'published': None}, Page, None) + self.assertEqual(page_lf.lookups(None, None), lookup_values) + + def test_queryset_with_none_value(self): + """Test queryset with None value""" + page_lf = PublishedListFilter(None, {'published': None}, Page, None) + self.assertIsNone(page_lf.value()) + qs = page_lf.queryset('', Page.objects.all()).order_by('title') + expected = ['', '', '', + '', '', ''] + self.assertQuerysetEqual(qs, expected) + + def test_queryset_with_published_value(self): + """Test queryset with published value""" + page_lf = PublishedListFilter(None, {'published': 'published'}, Page, None) + self.assertEqual(page_lf.value(), 'published') + qs = page_lf.queryset('', Page.objects.all()).order_by('title') + expected = ['', '', ''] + self.assertQuerysetEqual(qs, expected) + + def test_queryset_with_unpublished_value(self): + """Test queryset with unpublished value""" + page_lf = PublishedListFilter(None, {'published': 'unpublished'}, Page, None) + self.assertEqual(page_lf.value(), 'unpublished') + qs = page_lf.queryset('', Page.objects.all()).order_by('title') + expected = ['', '', ''] + self.assertQuerysetEqual(qs, expected)