• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

liqd / adhocracy-plus / 18908688697

29 Oct 2025 12:59PM UTC coverage: 44.622% (-44.5%) from 89.135%
18908688697

Pull #2986

github

web-flow
Merge 1dfde8ee7 into 445e1d498
Pull Request #2986: Draft: Speed up Github Ci Tests

3012 of 6750 relevant lines covered (44.62%)

0.45 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.09
/apps/topicprio/views.py
1
from django.urls import reverse
1✔
2
from django.utils.translation import gettext_lazy as _
1✔
3

4
from adhocracy4.categories import filters as category_filters
1✔
5
from adhocracy4.dashboard import mixins
1✔
6
from adhocracy4.exports.views import DashboardExportView
1✔
7
from adhocracy4.filters import filters as a4_filters
1✔
8
from adhocracy4.filters import views as filter_views
1✔
9
from adhocracy4.filters import widgets as filters_widgets
1✔
10
from adhocracy4.filters.filters import FreeTextFilter
1✔
11
from adhocracy4.projects.mixins import DisplayProjectOrModuleMixin
1✔
12
from adhocracy4.projects.mixins import ProjectMixin
1✔
13
from apps.contrib.widgets import AplusOrderingWidget
1✔
14
from apps.ideas import views as idea_views
1✔
15

16
from . import forms
1✔
17
from . import models
1✔
18

19

20
class FreeTextFilterWidget(filters_widgets.FreeTextFilterWidget):
1✔
21
    label = _("Search")
1✔
22

23

24
class TopicFilterSet(a4_filters.DefaultsFilterSet):
1✔
25
    defaults = {"ordering": "name"}
1✔
26
    category = category_filters.CategoryFilter()
1✔
27
    ordering = a4_filters.DynamicChoicesOrderingFilter(
1✔
28
        choices=(
29
            ("name", _("Alphabetical")),
30
            ("-positive_rating_count", _("Most popular")),
31
            ("-comment_count", _("Most commented")),
32
        ),
33
        widget=AplusOrderingWidget,
34
    )
35
    search = FreeTextFilter(widget=FreeTextFilterWidget, fields=["name"])
1✔
36

37
    class Meta:
1✔
38
        model = models.Topic
1✔
39
        fields = ["search", "category"]
1✔
40

41

42
class TopicListView(idea_views.AbstractIdeaListView, DisplayProjectOrModuleMixin):
1✔
43
    model = models.Topic
1✔
44
    filter_set = TopicFilterSet
1✔
45

46

47
class TopicDetailView(idea_views.AbstractIdeaDetailView):
1✔
48
    model = models.Topic
1✔
49
    queryset = (
1✔
50
        models.Topic.objects.annotate_positive_rating_count().annotate_negative_rating_count()
51
    )
52
    permission_required = "a4_candy_topicprio.view_topic"
1✔
53

54

55
class TopicCreateFilterSet(a4_filters.DefaultsFilterSet):
1✔
56
    defaults = {"ordering": "name"}
1✔
57

58
    category = category_filters.CategoryFilter()
1✔
59

60
    ordering = a4_filters.DynamicChoicesOrderingFilter(
1✔
61
        choices=(("name", _("Alphabetical")),), widget=AplusOrderingWidget
62
    )
63

64
    class Meta:
1✔
65
        model = models.Topic
1✔
66
        fields = ["category"]
1✔
67

68

69
class TopicListDashboardView(
1✔
70
    ProjectMixin,
71
    mixins.DashboardBaseMixin,
72
    mixins.DashboardComponentMixin,
73
    filter_views.FilteredListView,
74
):
75
    model = models.Topic
1✔
76
    template_name = "a4_candy_topicprio/topic_dashboard_list.html"
1✔
77
    filter_set = TopicCreateFilterSet
1✔
78
    permission_required = "a4projects.change_project"
1✔
79

80
    def get_queryset(self):
1✔
81
        return super().get_queryset().filter(module=self.module)
×
82

83
    def get_permission_object(self):
1✔
84
        return self.project
×
85

86

87
class TopicCreateView(
1✔
88
    mixins.DashboardBaseMixin,
89
    mixins.DashboardComponentMixin,
90
    mixins.DashboardComponentFormSignalMixin,
91
    idea_views.AbstractIdeaCreateView,
92
):
93
    model = models.Topic
1✔
94
    form_class = forms.TopicForm
1✔
95
    permission_required = "a4_candy_topicprio.add_topic"
1✔
96
    template_name = "a4_candy_topicprio/topic_create_form.html"
1✔
97

98
    def get_success_url(self):
1✔
99
        return reverse(
×
100
            "a4dashboard:topic-list",
101
            kwargs={
102
                "organisation_slug": self.module.project.organisation.slug,
103
                "module_slug": self.module.slug,
104
            },
105
        )
106

107
    def get_permission_object(self):
1✔
108
        return self.module
×
109

110

111
class TopicUpdateView(
1✔
112
    mixins.DashboardBaseMixin,
113
    mixins.DashboardComponentMixin,
114
    mixins.DashboardComponentFormSignalMixin,
115
    idea_views.AbstractIdeaUpdateView,
116
):
117
    model = models.Topic
1✔
118
    form_class = forms.TopicForm
1✔
119
    permission_required = "a4_candy_topicprio.change_topic"
1✔
120
    template_name = "a4_candy_topicprio/topic_update_form.html"
1✔
121

122
    @property
1✔
123
    def organisation(self):
1✔
124
        return self.project.organisation
×
125

126
    def get_success_url(self):
1✔
127
        return reverse(
×
128
            "a4dashboard:topic-list",
129
            kwargs={
130
                "organisation_slug": self.module.project.organisation.slug,
131
                "module_slug": self.module.slug,
132
            },
133
        )
134

135
    def get_permission_object(self):
1✔
136
        return self.get_object()
×
137

138

139
class TopicDeleteView(
1✔
140
    mixins.DashboardBaseMixin,
141
    mixins.DashboardComponentMixin,
142
    mixins.DashboardComponentFormSignalMixin,
143
    idea_views.AbstractIdeaDeleteView,
144
):
145
    model = models.Topic
1✔
146
    success_message = _("The topic has been deleted")
1✔
147
    permission_required = "a4_candy_topicprio.change_topic"
1✔
148
    template_name = "a4_candy_topicprio/topic_confirm_delete.html"
1✔
149

150
    @property
1✔
151
    def organisation(self):
1✔
152
        return self.project.organisation
×
153

154
    def get_success_url(self):
1✔
155
        return reverse(
×
156
            "a4dashboard:topic-list",
157
            kwargs={
158
                "organisation_slug": self.module.project.organisation.slug,
159
                "module_slug": self.module.slug,
160
            },
161
        )
162

163
    def get_permission_object(self):
1✔
164
        return self.get_object()
×
165

166

167
class TopicDashboardExportView(DashboardExportView):
1✔
168
    template_name = "a4exports/export_dashboard.html"
1✔
169

170
    def get_context_data(self, **kwargs):
1✔
171
        context = super().get_context_data(**kwargs)
×
172
        context["export"] = reverse(
×
173
            "a4dashboard:topic-export",
174
            kwargs={
175
                "organisation_slug": self.module.project.organisation.slug,
176
                "module_slug": self.module.slug,
177
            },
178
        )
179
        context["comment_export"] = reverse(
×
180
            "a4dashboard:topic-comment-export",
181
            kwargs={
182
                "organisation_slug": self.module.project.organisation.slug,
183
                "module_slug": self.module.slug,
184
            },
185
        )
186
        return context
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc