• 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

66.67
/apps/mapideas/views.py
1
import re
1✔
2

3
from django.core.paginator import EmptyPage
1✔
4
from django.core.paginator import Paginator
1✔
5
from django.urls import reverse
1✔
6
from django.utils.translation import gettext_lazy as _
1✔
7

8
from adhocracy4.categories import filters as category_filters
1✔
9
from adhocracy4.exports.views import DashboardExportView
1✔
10
from adhocracy4.filters import filters as a4_filters
1✔
11
from adhocracy4.projects.mixins import DisplayProjectOrModuleMixin
1✔
12
from apps.contrib.widgets import AplusOrderingWidget
1✔
13
from apps.ideas import views as idea_views
1✔
14
from apps.organisations.mixins import UserFormViewMixin
1✔
15

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

19

20
def get_ordering_choices(view):
1✔
21
    choices = (("-created", _("Most recent")),)
×
22
    if view.module.has_feature("rate", models.MapIdea):
×
23
        choices += (("-positive_rating_count", _("Most popular")),)
×
24
    choices += (("-comment_count", _("Most commented")),)
×
25
    return choices
×
26

27

28
class MapIdeaFilterSet(a4_filters.DefaultsFilterSet):
1✔
29
    defaults = {"ordering": "-created"}
1✔
30
    category = category_filters.CategoryFilter()
1✔
31
    ordering = a4_filters.DynamicChoicesOrderingFilter(
1✔
32
        choices=get_ordering_choices, widget=AplusOrderingWidget
33
    )
34

35
    class Meta:
1✔
36
        model = models.MapIdea
1✔
37
        fields = ["category"]
1✔
38

39

40
class MapIdeaListView(idea_views.AbstractIdeaListView, DisplayProjectOrModuleMixin):
1✔
41
    model = models.MapIdea
1✔
42
    filter_set = MapIdeaFilterSet
1✔
43
    paginate_by = 0  # Maps need all ideas, pagination is handled get_context_data
1✔
44

45
    def get_context_data(self, **kwargs):
1✔
46
        context = super().get_context_data(**kwargs)
×
47
        ua = self.request.headers.get("User-Agent", "")
×
48
        is_mobile = bool(re.search(r"Mobi|Android|iPhone|iPod|Windows Phone", ua, re.I))
×
49
        page_size = int(self.request.GET.get("page_size", 15 if is_mobile else 8))
×
50
        self.mode = self.request.GET.get("mode", "map")
×
51
        object_list = context.get("object_list", [])
×
52

53
        if page_size > 0:
×
54
            paginator = Paginator(object_list, page_size)
×
55
            page = int(self.request.GET.get("page", 1))
×
56
            try:
×
57
                paginated_list = paginator.page(page)
×
58
            except EmptyPage:
×
59
                paginated_list = paginator.page(paginator.num_pages)
×
60
        else:
61
            paginated_list = object_list
×
62
        context["paginated_list"] = paginated_list
×
63
        context["page_obj"] = paginated_list  # page_obj ist die paginierte Liste selbst
×
64
        context["is_paginated"] = paginator.num_pages > 1 if page_size > 0 else False
×
65
        return context
×
66

67

68
class MapIdeaDetailView(idea_views.AbstractIdeaDetailView):
1✔
69
    model = models.MapIdea
1✔
70
    queryset = (
1✔
71
        models.MapIdea.objects.annotate_positive_rating_count().annotate_negative_rating_count()
72
    )
73
    permission_required = "a4_candy_mapideas.view_mapidea"
1✔
74

75

76
class MapIdeaCreateView(idea_views.AbstractIdeaCreateView, UserFormViewMixin):
1✔
77
    model = models.MapIdea
1✔
78
    form_class = forms.MapIdeaForm
1✔
79
    permission_required = "a4_candy_mapideas.add_mapidea"
1✔
80
    template_name = "a4_candy_mapideas/mapidea_create_form.html"
1✔
81

82

83
class MapIdeaUpdateView(idea_views.AbstractIdeaUpdateView, UserFormViewMixin):
1✔
84
    model = models.MapIdea
1✔
85
    form_class = forms.MapIdeaForm
1✔
86
    permission_required = "a4_candy_mapideas.change_mapidea"
1✔
87
    template_name = "a4_candy_mapideas/mapidea_update_form.html"
1✔
88

89

90
class MapIdeaDeleteView(idea_views.AbstractIdeaDeleteView):
1✔
91
    model = models.MapIdea
1✔
92
    success_message = _("Your Idea has been deleted")
1✔
93
    permission_required = "a4_candy_mapideas.change_mapidea"
1✔
94
    template_name = "a4_candy_mapideas/mapidea_confirm_delete.html"
1✔
95

96

97
class MapIdeaModerateView(idea_views.AbstractIdeaModerateView):
1✔
98
    model = models.MapIdea
1✔
99
    permission_required = "a4_candy_mapideas.moderate_mapidea"
1✔
100
    template_name = "a4_candy_mapideas/mapidea_moderate_form.html"
1✔
101
    moderateable_form_class = forms.MapIdeaModerateForm
1✔
102

103

104
class MapIdeaDashboardExportView(DashboardExportView):
1✔
105
    template_name = "a4exports/export_dashboard.html"
1✔
106

107
    def get_context_data(self, **kwargs):
1✔
108
        context = super().get_context_data(**kwargs)
×
109
        context["export"] = reverse(
×
110
            "a4dashboard:mapidea-export",
111
            kwargs={
112
                "organisation_slug": self.module.project.organisation.slug,
113
                "module_slug": self.module.slug,
114
            },
115
        )
116
        context["comment_export"] = reverse(
×
117
            "a4dashboard:mapidea-comment-export",
118
            kwargs={
119
                "organisation_slug": self.module.project.organisation.slug,
120
                "module_slug": self.module.slug,
121
            },
122
        )
123
        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