• 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

82.35
/apps/ideas/models.py
1
from autoslug import AutoSlugField
1✔
2
from django.contrib.contenttypes.fields import GenericRelation
1✔
3
from django.contrib.contenttypes.models import ContentType
1✔
4
from django.db import models
1✔
5
from django.urls import reverse
1✔
6
from django.utils.translation import gettext_lazy as _
1✔
7
from django_ckeditor_5.fields import CKEditor5Field
1✔
8

9
from adhocracy4 import transforms
1✔
10
from adhocracy4.categories.fields import CategoryField
1✔
11
from adhocracy4.comments import models as comment_models
1✔
12
from adhocracy4.images.fields import ConfiguredImageField
1✔
13
from adhocracy4.labels import models as labels_models
1✔
14
from adhocracy4.models import query
1✔
15
from adhocracy4.modules import models as module_models
1✔
16
from adhocracy4.ratings import models as rating_models
1✔
17
from apps.moderatorfeedback.models import Moderateable
1✔
18
from apps.moderatorremark import models as remark_models
1✔
19

20

21
class IdeaQuerySet(query.RateableQuerySet, query.CommentableQuerySet):
1✔
22
    pass
1✔
23

24

25
class AbstractIdea(module_models.Item, Moderateable):
1✔
26
    item_ptr = models.OneToOneField(
1✔
27
        to=module_models.Item,
28
        parent_link=True,
29
        related_name="%(app_label)s_%(class)s",
30
        on_delete=models.CASCADE,
31
    )
32
    slug = AutoSlugField(populate_from="name", unique=True)
1✔
33
    name = models.CharField(max_length=120, verbose_name=_("Title"))
1✔
34
    description = CKEditor5Field(verbose_name=_("Description"))
1✔
35
    image = ConfiguredImageField(
1✔
36
        "idea_image",
37
        verbose_name=_("Add image"),
38
        upload_to="ideas/images/%Y/%m/%d/",
39
        blank=True,
40
        help_prefix=_("Visualize your idea."),
41
    )
42
    category = CategoryField()
1✔
43

44
    labels = models.ManyToManyField(
1✔
45
        labels_models.Label,
46
        verbose_name=_("Labels"),
47
        related_name=("%(app_label)s_" "%(class)s_label"),
48
    )
49

50
    objects = IdeaQuerySet.as_manager()
1✔
51

52
    @property
1✔
53
    def reference_number(self):
1✔
54
        return "{:d}-{:05d}".format(self.created.year, self.pk)
×
55

56
    @property
1✔
57
    def remark(self):
1✔
58
        content_type = ContentType.objects.get_for_model(self)
×
59
        return remark_models.ModeratorRemark.objects.filter(
×
60
            item_content_type=content_type, item_object_id=self.id
61
        ).first()
62

63
    class Meta:
1✔
64
        abstract = True
1✔
65

66
    def __str__(self):
1✔
67
        return self.name
×
68

69
    def save(self, update_fields=None, *args, **kwargs):
1✔
70
        self.description = transforms.clean_html_field(self.description)
×
71
        if update_fields:
×
72
            update_fields = {"description"}.union(update_fields)
×
73
        super().save(update_fields=update_fields, *args, **kwargs)
×
74

75

76
class Idea(AbstractIdea):
1✔
77
    ratings = GenericRelation(
1✔
78
        rating_models.Rating, related_query_name="idea", object_id_field="object_pk"
79
    )
80
    comments = GenericRelation(
1✔
81
        comment_models.Comment, related_query_name="idea", object_id_field="object_pk"
82
    )
83

84
    def get_absolute_url(self):
1✔
85
        return reverse(
×
86
            "a4_candy_ideas:idea-detail",
87
            kwargs=dict(
88
                organisation_slug=self.project.organisation.slug,
89
                pk="{:05d}".format(self.pk),
90
                year=self.created.year,
91
            ),
92
        )
93

94
    class Meta:
1✔
95
        ordering = ["-created"]
1✔
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