From 443dfd4f8e1295d423d467c8a4e52ad7adb9d6a6 Mon Sep 17 00:00:00 2001 From: Lacey Williams Henschel Date: Fri, 6 Jan 2023 10:11:54 -0800 Subject: [PATCH 1/4] :sparkles: Add form to select library category --- libraries/forms.py | 8 ++++++++ libraries/tests/test_forms.py | 6 ++++++ 2 files changed, 14 insertions(+) create mode 100644 libraries/forms.py create mode 100644 libraries/tests/test_forms.py diff --git a/libraries/forms.py b/libraries/forms.py new file mode 100644 index 00000000..fa78bb41 --- /dev/null +++ b/libraries/forms.py @@ -0,0 +1,8 @@ +from django.forms import ModelForm +from .models import Library, Category + + +class LibraryForm(ModelForm): + class Meta: + model = Library + fields = ["categories"] diff --git a/libraries/tests/test_forms.py b/libraries/tests/test_forms.py new file mode 100644 index 00000000..96b2759e --- /dev/null +++ b/libraries/tests/test_forms.py @@ -0,0 +1,6 @@ +from ..forms import LibraryForm + + +def test_library_form_success(tp, library, category): + form = LibraryForm(data={"categories": [category]}) + assert form.is_valid() is True From 0c8552a45bbb2cdea48b91fe0da32b6a2ea6e5c6 Mon Sep 17 00:00:00 2001 From: Lacey Williams Henschel Date: Fri, 6 Jan 2023 10:13:20 -0800 Subject: [PATCH 2/4] :sparkles: :umbrella: User is able to filter libraries by category in the UI --- libraries/tests/fixtures.py | 5 +++++ libraries/tests/test_views.py | 17 +++++++++++++++++ libraries/views.py | 22 ++++++++++++++++++++-- templates/libraries/list.html | 23 +++++++++++++++-------- 4 files changed, 57 insertions(+), 10 deletions(-) diff --git a/libraries/tests/fixtures.py b/libraries/tests/fixtures.py index a8a85bc2..7d0f01d2 100644 --- a/libraries/tests/fixtures.py +++ b/libraries/tests/fixtures.py @@ -3,6 +3,11 @@ from fastcore.xtras import dict2obj from model_bakery import baker +@pytest.fixture +def category(db): + return baker.make("libraries.Category", name="Math", slug="math") + + @pytest.fixture def library(db): return baker.make( diff --git a/libraries/tests/test_views.py b/libraries/tests/test_views.py index 396f5ba1..6a25eb34 100644 --- a/libraries/tests/test_views.py +++ b/libraries/tests/test_views.py @@ -7,6 +7,23 @@ def test_library_list(library, tp): tp.response_200(res) +def test_library_list_select_category(library, category, tp): + """POST /libraries/ to submit a category redirects to the libraries-by-category page""" + res = tp.post("libraries", data={"categories": category.pk}) + tp.response_302(res) + + +def test_libraries_by_category(tp, library, category): + """GET /libraries-by-category/{slug}/""" + baker.make("libraries.Library", name="Sample") + library.categories.add(category) + res = tp.get("libraries-by-category", category.slug) + tp.response_200(res) + assert "library_list" in res.context + assert len(res.context["library_list"]) == 1 + assert library in res.context["library_list"] + + def test_library_detail(library, tp): """GET /libraries/{repo}/""" url = tp.reverse("library-detail", library.slug) diff --git a/libraries/views.py b/libraries/views.py index 4be02f30..d913d80c 100644 --- a/libraries/views.py +++ b/libraries/views.py @@ -1,7 +1,14 @@ -from django.views.generic import DetailView, ListView +import structlog +from django.shortcuts import redirect +from django.views.generic import DetailView, ListView +from django.views.generic.edit import FormMixin + +from .forms import LibraryForm from .models import Category, Issue, Library, PullRequest +logger = structlog.get_logger() + class CategoryMixin: def get_context_data(self, **kwargs): @@ -10,15 +17,26 @@ class CategoryMixin: return context -class LibraryList(CategoryMixin, ListView): +class LibraryList(CategoryMixin, FormMixin, ListView): """List all of our libraries by name""" + form_class = LibraryForm paginate_by = 25 queryset = ( Library.objects.prefetch_related("authors", "categories").all().order_by("name") ) template_name = "libraries/list.html" + def post(self, request): + """User has submitted a form and will be redirected to the right results""" + form = self.get_form() + if form.is_valid(): + category = form.cleaned_data["categories"][0] + return redirect("libraries-by-category", category=category.slug) + else: + logger.info("library_list_invalid_category") + return super().get(request) + class LibraryByLetter(CategoryMixin, ListView): """List all of our libraries that begin with a certain letter""" diff --git a/templates/libraries/list.html b/templates/libraries/list.html index 3d3fd3a8..166ba583 100644 --- a/templates/libraries/list.html +++ b/templates/libraries/list.html @@ -43,14 +43,21 @@ -
- -
+ + +
+ {% csrf_token %} +
+ + +
+ +
From 5046b7e8a26c77edce7926bc8330ed489e29d8fd Mon Sep 17 00:00:00 2001 From: Lacey Williams Henschel Date: Fri, 6 Jan 2023 10:15:23 -0800 Subject: [PATCH 3/4] :pencil: Hide label --- templates/libraries/list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/libraries/list.html b/templates/libraries/list.html index 166ba583..c8217d3c 100644 --- a/templates/libraries/list.html +++ b/templates/libraries/list.html @@ -48,7 +48,7 @@
{% csrf_token %}
- + {% for c in categories %} - + {% endfor %}
- +