• 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

65.12
/apps/offlineevents/models.py
1
from datetime import timedelta
1✔
2

3
from autoslug import AutoSlugField
1✔
4
from django.db import models
1✔
5
from django.utils import timezone
1✔
6
from django.utils.functional import cached_property
1✔
7
from django.utils.translation import gettext_lazy as _
1✔
8
from django_ckeditor_5.fields import CKEditor5Field
1✔
9

10
from adhocracy4 import transforms
1✔
11
from adhocracy4.images.validators import ImageAltTextValidator
1✔
12
from adhocracy4.models.base import UserGeneratedContentModel
1✔
13
from adhocracy4.projects import models as project_models
1✔
14

15

16
class OfflineEventsQuerySet(models.QuerySet):
1✔
17
    def starts_within(self, hours=72):
1✔
18
        """All offlineevents starting within the given time."""
19
        now = timezone.now()
×
20
        return self.filter(date__gt=now, date__lt=(now + timedelta(hours=hours)))
×
21

22

23
class OfflineEvent(UserGeneratedContentModel):
1✔
24
    slug = AutoSlugField(populate_from="name", unique=True)
1✔
25
    name = models.CharField(max_length=120, verbose_name=_("Title"))
1✔
26
    event_type = models.CharField(
1✔
27
        max_length=30,
28
        verbose_name=_("Event type"),
29
    )
30
    date = models.DateTimeField(verbose_name=_("Date"))
1✔
31
    description = CKEditor5Field(
1✔
32
        config_name="collapsible-image-editor",
33
        verbose_name=_("Description"),
34
        validators=[ImageAltTextValidator()],
35
    )
36
    project = models.ForeignKey(project_models.Project, on_delete=models.CASCADE)
1✔
37

38
    objects = OfflineEventsQuerySet.as_manager()
1✔
39

40
    class Meta:
1✔
41
        ordering = ["-date"]
1✔
42

43
    def __str__(self):
1✔
44
        return self.name
×
45

46
    def save(self, update_fields=None, *args, **kwargs):
1✔
47
        self.description = transforms.clean_html_field(self.description, "image-editor")
×
48
        if update_fields:
×
49
            update_fields = {"description"}.union(update_fields)
×
50
        super().save(update_fields=update_fields, *args, **kwargs)
×
51

52
    @cached_property
1✔
53
    def get_timeline_index(self):
1✔
54
        if self.project.display_timeline:
×
55
            for count, cluster in enumerate(self.project.participation_dates):
×
56
                if "event_type" in cluster and self.slug == cluster["slug"]:
×
57
                    return count
×
58
        return 0
×
59

60
    def get_absolute_url(self):
1✔
61
        if self.project.display_timeline:
×
62
            return "{}?initialSlide={}#timeline-carousel".format(
×
63
                self.project.get_absolute_url(), self.get_timeline_index
64
            )
65
        return self.project.get_absolute_url()
×
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