diff --git a/meinberlin/apps/ideas/views.py b/meinberlin/apps/ideas/views.py index b7d81711ea..b2f77d7dcc 100644 --- a/meinberlin/apps/ideas/views.py +++ b/meinberlin/apps/ideas/views.py @@ -4,16 +4,11 @@ from django.utils.translation import gettext_lazy as _ from django.views import generic -from adhocracy4.categories import filters as category_filters from adhocracy4.categories import forms as category_forms from adhocracy4.categories import models as category_models from adhocracy4.dashboard import mixins as a4dashboard_mixins from adhocracy4.exports.views import DashboardExportView -from adhocracy4.filters import filters as a4_filters from adhocracy4.filters import views as filter_views -from adhocracy4.filters import widgets as filters_widgets -from adhocracy4.filters.filters import FreeTextFilter -from adhocracy4.labels import filters as label_filters from adhocracy4.labels import forms as label_forms from adhocracy4.labels import models as label_models from adhocracy4.projects.mixins import DisplayProjectOrModuleMixin @@ -21,6 +16,8 @@ from adhocracy4.rules import mixins as rules_mixins from meinberlin.apps.contrib import forms as contrib_forms from meinberlin.apps.contrib.views import CanonicalURLDetailView +from meinberlin.apps.ideas import forms +from meinberlin.apps.ideas import models from meinberlin.apps.moderatorfeedback.forms import ModeratorFeedbackForm from meinberlin.apps.moderatorfeedback.models import ModeratorFeedback from meinberlin.apps.moderatorremark.models import ModeratorRemark @@ -28,42 +25,9 @@ NotifyCreatorOrContactOnModeratorFeedback, ) -from . import forms -from . import models - - -class FreeTextFilterWidget(filters_widgets.FreeTextFilterWidget): - label = _("Search") - - -def get_ordering_choices(view): - choices = (("-created", _("Most recent")),) - if view.module.has_feature("rate", models.Idea): - choices += (("-positive_rating_count", _("Most popular")),) - choices += (("-comment_count", _("Most commented")),) - return choices - - -class IdeaFilterSet(a4_filters.DefaultsFilterSet): - defaults = {"ordering": "-created"} - ordering = a4_filters.DynamicChoicesOrderingFilter(choices=get_ordering_choices) - search = FreeTextFilter(widget=FreeTextFilterWidget, fields=["name"]) - - class Meta: - model = models.Idea - fields = ["search", "category", "labels"] - - def __init__(self, data, *args, **kwargs): - self.base_filters["category"] = category_filters.CategoryAliasFilter( - module=kwargs["view"].module, field_name="category" - ) - self.base_filters["labels"] = label_filters.LabelAliasFilter( - module=kwargs["view"].module, field_name="labels" - ) - super().__init__(data, *args, **kwargs) - class AbstractIdeaListView(ProjectMixin, filter_views.FilteredListView): + # Todo: only used by budgeting, remove once budgeting is fully in react paginate_by = 15 def get_queryset(self): @@ -89,12 +53,9 @@ def get_queryset(self): return qs -class IdeaListView(AbstractIdeaListView, DisplayProjectOrModuleMixin): - model = models.Idea - filter_set = IdeaFilterSet - - def get_queryset(self): - return super().get_queryset().filter(module=self.module) +class IdeaListView(ProjectMixin, DisplayProjectOrModuleMixin, generic.TemplateView): + template_name = "meinberlin_ideas/idea_list.html" + pass class AbstractIdeaDetailView( diff --git a/meinberlin/apps/kiezkasse/views.py b/meinberlin/apps/kiezkasse/views.py index 3dcb2cbd90..7ae838a21a 100644 --- a/meinberlin/apps/kiezkasse/views.py +++ b/meinberlin/apps/kiezkasse/views.py @@ -1,55 +1,15 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from adhocracy4.categories import filters as category_filters from adhocracy4.exports.views import DashboardExportView -from adhocracy4.filters import filters as a4_filters -from adhocracy4.labels import filters as label_filters -from adhocracy4.projects.mixins import DisplayProjectOrModuleMixin from meinberlin.apps.ideas import views as idea_views +from meinberlin.apps.ideas.views import IdeaListView +from meinberlin.apps.kiezkasse import forms +from meinberlin.apps.kiezkasse import models -from . import forms -from . import models - -def get_ordering_choices(view): - choices = (("-created", _("Most recent")),) - if view.module.has_feature("rate", models.Proposal): - choices += (("-positive_rating_count", _("Most popular")),) - choices += (("-comment_count", _("Most commented")),) - return choices - - -class ProposalFilterSet(a4_filters.DefaultsFilterSet): - defaults = {"ordering": "-created"} - ordering = a4_filters.DynamicChoicesOrderingFilter(choices=get_ordering_choices) - - class Meta: - model = models.Proposal - fields = ["category", "labels"] - - def __init__(self, data, *args, **kwargs): - self.base_filters["category"] = category_filters.CategoryAliasFilter( - module=kwargs["view"].module, field_name="category" - ) - self.base_filters["labels"] = label_filters.LabelAliasFilter( - module=kwargs["view"].module, field_name="labels" - ) - super().__init__(data, *args, **kwargs) - - -class ProposalListView(idea_views.AbstractIdeaListView, DisplayProjectOrModuleMixin): - model = models.Proposal - filter_set = ProposalFilterSet - - def dispatch(self, request, **kwargs): - self.mode = request.GET.get("mode", "map") - if self.mode == "map": - self.paginate_by = 0 - return super().dispatch(request, **kwargs) - - def get_queryset(self): - return super().get_queryset().filter(module=self.module) +class ProposalListView(IdeaListView): + template_name = "meinberlin_kiezkasse/proposal_list.html" class ProposalDetailView(idea_views.AbstractIdeaDetailView): diff --git a/meinberlin/apps/mapideas/views.py b/meinberlin/apps/mapideas/views.py index c8e69a90f2..cb4a4cf2e2 100644 --- a/meinberlin/apps/mapideas/views.py +++ b/meinberlin/apps/mapideas/views.py @@ -1,55 +1,15 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from adhocracy4.categories import filters as category_filters from adhocracy4.exports.views import DashboardExportView -from adhocracy4.filters import filters as a4_filters -from adhocracy4.labels import filters as label_filters -from adhocracy4.projects.mixins import DisplayProjectOrModuleMixin from meinberlin.apps.ideas import views as idea_views +from meinberlin.apps.ideas.views import IdeaListView +from meinberlin.apps.mapideas import forms +from meinberlin.apps.mapideas import models -from . import forms -from . import models - -def get_ordering_choices(view): - choices = (("-created", _("Most recent")),) - if view.module.has_feature("rate", models.MapIdea): - choices += (("-positive_rating_count", _("Most popular")),) - choices += (("-comment_count", _("Most commented")),) - return choices - - -class MapIdeaFilterSet(a4_filters.DefaultsFilterSet): - defaults = {"ordering": "-created"} - ordering = a4_filters.DynamicChoicesOrderingFilter(choices=get_ordering_choices) - - class Meta: - model = models.MapIdea - fields = ["category", "labels"] - - def __init__(self, data, *args, **kwargs): - self.base_filters["category"] = category_filters.CategoryAliasFilter( - module=kwargs["view"].module, field_name="category" - ) - self.base_filters["labels"] = label_filters.LabelAliasFilter( - module=kwargs["view"].module, field_name="labels" - ) - super().__init__(data, *args, **kwargs) - - -class MapIdeaListView(idea_views.AbstractIdeaListView, DisplayProjectOrModuleMixin): - model = models.MapIdea - filter_set = MapIdeaFilterSet - - def dispatch(self, request, **kwargs): - self.mode = request.GET.get("mode", "map") - if self.mode == "map": - self.paginate_by = 0 - return super().dispatch(request, **kwargs) - - def get_queryset(self): - return super().get_queryset().filter(module=self.module) +class MapIdeaListView(IdeaListView): + template_name = "meinberlin_mapideas/mapidea_list.html" class MapIdeaDetailView(idea_views.AbstractIdeaDetailView): diff --git a/meinberlin/apps/maptopicprio/views.py b/meinberlin/apps/maptopicprio/views.py index c2c229244c..d55d0eb0a2 100644 --- a/meinberlin/apps/maptopicprio/views.py +++ b/meinberlin/apps/maptopicprio/views.py @@ -7,38 +7,15 @@ from adhocracy4.filters import filters as a4_filters from adhocracy4.filters import views as filter_views from adhocracy4.labels import filters as label_filters -from adhocracy4.projects.mixins import DisplayProjectOrModuleMixin from adhocracy4.projects.mixins import ProjectMixin from meinberlin.apps.ideas import views as idea_views +from meinberlin.apps.ideas.views import IdeaListView +from meinberlin.apps.maptopicprio import forms +from meinberlin.apps.maptopicprio import models -from . import forms -from . import models - -def get_ordering_choices(view): - choices = (("-created", _("Most recent")),) - if view.module.has_feature("rate", models.MapTopic): - choices += (("-positive_rating_count", _("Most popular")),) - choices += (("-comment_count", _("Most commented")),) - return choices - - -class MapTopicFilterSet(a4_filters.DefaultsFilterSet): - defaults = {"ordering": "-created"} - ordering = a4_filters.DynamicChoicesOrderingFilter(choices=get_ordering_choices) - - class Meta: - model = models.MapTopic - fields = ["category", "labels"] - - def __init__(self, data, *args, **kwargs): - self.base_filters["category"] = category_filters.CategoryAliasFilter( - module=kwargs["view"].module, field_name="category" - ) - self.base_filters["labels"] = label_filters.LabelAliasFilter( - module=kwargs["view"].module, field_name="labels" - ) - super().__init__(data, *args, **kwargs) +class MapTopicListView(IdeaListView): + template_name = "meinberlin_maptopicprio/maptopic_list.html" class MapTopicCreateFilterSet(a4_filters.DefaultsFilterSet): @@ -64,20 +41,6 @@ class MapTopicDetailView(idea_views.AbstractIdeaDetailView): permission_required = "meinberlin_maptopicprio.view_maptopic" -class MapTopicListView(idea_views.AbstractIdeaListView, DisplayProjectOrModuleMixin): - model = models.MapTopic - filter_set = MapTopicFilterSet - - def dispatch(self, request, **kwargs): - self.mode = request.GET.get("mode", "map") - if self.mode == "map": - self.paginate_by = 0 - return super().dispatch(request, **kwargs) - - def get_queryset(self): - return super().get_queryset().filter(module=self.module) - - class MapTopicListDashboardView( ProjectMixin, mixins.DashboardBaseMixin, diff --git a/meinberlin/apps/topicprio/views.py b/meinberlin/apps/topicprio/views.py index b060ea51c2..969da07955 100644 --- a/meinberlin/apps/topicprio/views.py +++ b/meinberlin/apps/topicprio/views.py @@ -6,52 +6,16 @@ from adhocracy4.exports.views import DashboardExportView from adhocracy4.filters import filters as a4_filters from adhocracy4.filters import views as filter_views -from adhocracy4.filters import widgets as filters_widgets -from adhocracy4.filters.filters import FreeTextFilter from adhocracy4.labels import filters as label_filters -from adhocracy4.projects.mixins import DisplayProjectOrModuleMixin from adhocracy4.projects.mixins import ProjectMixin from meinberlin.apps.ideas import views as idea_views +from meinberlin.apps.ideas.views import IdeaListView +from meinberlin.apps.topicprio import forms +from meinberlin.apps.topicprio import models -from . import forms -from . import models - -class FreeTextFilterWidget(filters_widgets.FreeTextFilterWidget): - label = _("Search") - - -class TopicFilterSet(a4_filters.DefaultsFilterSet): - defaults = {"ordering": "name"} - ordering = a4_filters.DynamicChoicesOrderingFilter( - choices=( - ("name", _("Alphabetical")), - ("-positive_rating_count", _("Most popular")), - ("-comment_count", _("Most commented")), - ) - ) - search = FreeTextFilter(widget=FreeTextFilterWidget, fields=["name"]) - - class Meta: - model = models.Topic - fields = ["search", "category", "labels"] - - def __init__(self, data, *args, **kwargs): - self.base_filters["category"] = category_filters.CategoryAliasFilter( - module=kwargs["view"].module, field_name="category" - ) - self.base_filters["labels"] = label_filters.LabelAliasFilter( - module=kwargs["view"].module, field_name="labels" - ) - super().__init__(data, *args, **kwargs) - - -class TopicListView(idea_views.AbstractIdeaListView, DisplayProjectOrModuleMixin): - model = models.Topic - filter_set = TopicFilterSet - - def get_queryset(self): - return super().get_queryset().filter(module=self.module) +class TopicListView(IdeaListView): + template_name = "meinberlin_topicprio/topic_list.html" class TopicDetailView(idea_views.AbstractIdeaDetailView): diff --git a/tests/ideas/views/test_idea_list.py b/tests/ideas/views/test_idea_list.py index 3a92fbe75d..bc09eb1b1f 100644 --- a/tests/ideas/views/test_idea_list.py +++ b/tests/ideas/views/test_idea_list.py @@ -1,8 +1,5 @@ import pytest -from adhocracy4.categories import filters as a4_category_filters -from adhocracy4.filters import filters as a4_filters -from adhocracy4.labels import filters as a4_label_filters from adhocracy4.test.helpers import assert_template_response from adhocracy4.test.helpers import freeze_phase from adhocracy4.test.helpers import setup_phase @@ -22,65 +19,5 @@ def test_list_view(client, phase_factory, idea_factory): with freeze_phase(phase): response = client.get(url) assert_template_response(response, "meinberlin_ideas/idea_list.html") - assert idea in response.context_data["idea_list"] - assert idea_2 not in response.context_data["idea_list"] - assert response.context_data["idea_list"][0].comment_count == 0 - assert response.context_data["idea_list"][0].positive_rating_count == 0 - assert response.context_data["idea_list"][0].negative_rating_count == 0 - - -@pytest.mark.django_db -def test_list_view_qs_gets_annotated(client, phase_factory, idea_factory): - phase, module, project, idea = setup_phase( - phase_factory, idea_factory, phases.FeedbackPhase - ) - url = project.get_absolute_url() - - with freeze_phase(phase): - response = client.get(url) - annotated_idea = response.context_data["idea_list"][0] - assert hasattr(annotated_idea, "comment_count") - assert hasattr(annotated_idea, "positive_rating_count") - assert hasattr(annotated_idea, "negative_rating_count") - - # test that qs still gets annotated for invalid filter values - response = client.get(url + "?ordering=invalid_ordering") - annotated_idea = response.context_data["idea_list"][0] - assert hasattr(annotated_idea, "comment_count") - assert hasattr(annotated_idea, "positive_rating_count") - assert hasattr(annotated_idea, "negative_rating_count") - - -@pytest.mark.django_db -def test_list_view_filter_set(client, phase_factory, idea_factory): - phase, module, project, idea = setup_phase( - phase_factory, idea_factory, phases.FeedbackPhase - ) - url = project.get_absolute_url() - response = client.get(url) - - assert len(response.context["view"].filter_set.base_filters) - - assert "ordering" in response.context["view"].filter_set.base_filters - assert isinstance( - response.context["view"].filter_set.base_filters["ordering"], - a4_filters.DynamicChoicesOrderingFilter, - ) - - assert "search" in response.context["view"].filter_set.base_filters - assert isinstance( - response.context["view"].filter_set.base_filters["search"], - a4_filters.FreeTextFilter, - ) - - assert "category" in response.context["view"].filter_set.base_filters - assert isinstance( - response.context["view"].filter_set.base_filters["category"], - a4_category_filters.CategoryAliasFilter, - ) - - assert "labels" in response.context["view"].filter_set.base_filters - assert isinstance( - response.context["view"].filter_set.base_filters["labels"], - a4_label_filters.LabelAliasFilter, - ) + assert response.context["project"] == project + assert response.context["module"] == module diff --git a/tests/mapideas/views/test_mapidea_list.py b/tests/mapideas/views/test_mapidea_list.py index 7d72eb6cea..25b75b68b7 100644 --- a/tests/mapideas/views/test_mapidea_list.py +++ b/tests/mapideas/views/test_mapidea_list.py @@ -19,8 +19,5 @@ def test_list_view(client, phase_factory, map_idea_factory): with freeze_phase(phase): response = client.get(url) assert_template_response(response, "meinberlin_mapideas/mapidea_list.html") - assert mapidea in response.context_data["mapidea_list"] - assert mapidea_2 not in response.context_data["mapidea_list"] - assert response.context_data["mapidea_list"][0].comment_count == 0 - assert response.context_data["mapidea_list"][0].positive_rating_count == 0 - assert response.context_data["mapidea_list"][0].negative_rating_count == 0 + assert response.context["project"] == project + assert response.context["module"] == module diff --git a/tests/maptopicprio/views/test_maptopic_list.py b/tests/maptopicprio/views/test_maptopic_list.py index bf193febbd..54374e2343 100644 --- a/tests/maptopicprio/views/test_maptopic_list.py +++ b/tests/maptopicprio/views/test_maptopic_list.py @@ -19,8 +19,5 @@ def test_list_view(client, phase_factory, maptopic_factory): with freeze_phase(phase): response = client.get(url) assert_template_response(response, "meinberlin_maptopicprio/maptopic_list.html") - assert maptopic in response.context_data["maptopic_list"] - assert maptopic_2 not in response.context_data["maptopic_list"] - assert response.context_data["maptopic_list"][0].comment_count == 0 - assert response.context_data["maptopic_list"][0].positive_rating_count == 0 - assert response.context_data["maptopic_list"][0].negative_rating_count == 0 + assert response.context["project"] == project + assert response.context["module"] == module diff --git a/tests/topicprio/views/test_topic_list.py b/tests/topicprio/views/test_topic_list.py index 2dce6fd567..de3df5a842 100644 --- a/tests/topicprio/views/test_topic_list.py +++ b/tests/topicprio/views/test_topic_list.py @@ -19,8 +19,5 @@ def test_list_view(client, phase_factory, topic_factory): with freeze_phase(phase): response = client.get(url) assert_template_response(response, "meinberlin_topicprio/topic_list.html") - assert topic in response.context_data["topic_list"] - assert topic_2 not in response.context_data["topic_list"] - assert response.context_data["topic_list"][0].comment_count == 0 - assert response.context_data["topic_list"][0].positive_rating_count == 0 - assert response.context_data["topic_list"][0].negative_rating_count == 0 + assert response.context["project"] == project + assert response.context["module"] == module