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

iplweb / bpp / 18634744198

19 Oct 2025 07:00PM UTC coverage: 31.618% (-29.9%) from 61.514%
18634744198

push

github

mpasternak
Merge branch 'release/v202510.1270'

657 of 9430 branches covered (6.97%)

Branch coverage included in aggregate %.

229 of 523 new or added lines in 42 files covered. (43.79%)

11303 existing lines in 316 files now uncovered.

14765 of 39346 relevant lines covered (37.53%)

0.38 hits per line

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

59.15
src/formdefaults/models.py
1
from django.conf import settings
1✔
2
from django.core.exceptions import ValidationError
1✔
3
from django.db import models
1✔
4
from django.db.models import JSONField
1✔
5

6
from formdefaults.core import get_form_defaults
1✔
7
from formdefaults.util import full_name, get_python_class_by_name
1✔
8

9

10
class FormRepresentationManager(models.Manager):
1✔
11
    def get_or_create_for_instance(self, form_instance):
1✔
12
        """
13
        Ta klasa otrzymuje jako parametr instancję formularza Django wraz
14
        z czytelną nazwą i ewentualnym kodem formularza (jeżeli go nie ma,
15
        zostanie wygenerowany automatycznie na podstawie nazwy).
16

17
        Następnie mapuje pola w tym formularzu po nazwie (w kontekście bazy
18
        danych) i szuka ich ewentualnych ustawień domyślnych (zakodowanych
19
        w formacie JSON)
20
        """
UNCOV
21
        fn = full_name(form_instance)
×
UNCOV
22
        res, created = self.get_or_create(full_name=fn)
×
UNCOV
23
        return res
×
24

25

26
class FormRepresentation(models.Model):
1✔
27
    full_name = models.TextField("Kod formularza", primary_key=True)
1✔
28
    label = models.TextField("Nazwa formularza")
1✔
29

30
    html_before = models.TextField("Kod HTML przed formularzem", null=True, blank=True)
1✔
31
    html_after = models.TextField("Kod HTML po formularzu", null=True, blank=True)
1✔
32

33
    objects = FormRepresentationManager()
1✔
34

35
    def __str__(self):
1✔
UNCOV
36
        return f"Formularz '{self.label}'"
×
37

38
    def get_form_class(self):
1✔
39
        """Zwraca klasę formularza zapisaną pod self.full_name lub None"""
UNCOV
40
        return get_python_class_by_name(self.full_name)
×
41

42
    class Meta:
1✔
43
        unique_together = [("full_name", "label")]
1✔
44
        verbose_name = "Lista wartości domyślnych formularza"
1✔
45
        verbose_name_plural = "Listy wartości domyślnych formularzy"
1✔
46

47

48
class FormFieldRepresentation(models.Model):
1✔
49
    """Default value in a form."""
50

51
    parent = models.ForeignKey(
1✔
52
        FormRepresentation,
53
        on_delete=models.CASCADE,
54
        related_name="fields_set",
55
        help_text="Formularz, do którego należy to pole",
56
    )
57

58
    name = models.TextField("Systemowa nazwa pola")
1✔
59
    label = models.TextField("Czytelna etykieta pola", null=True, blank=True)
1✔
60
    klass = models.TextField("Klasa pola")
1✔
61
    order = models.PositiveSmallIntegerField()
1✔
62

63
    class Meta:
1✔
64
        verbose_name = "Pole formularza"
1✔
65
        verbose_name_plural = "Pola formularzy"
1✔
66
        unique_together = [
1✔
67
            ("parent", "name"),
68
        ]
69
        ordering = ("order",)
1✔
70

71
    def __str__(self):
1✔
UNCOV
72
        return self.label or self.name
×
73

74

75
class FormFieldDefaultValue(models.Model):
1✔
76
    parent = models.ForeignKey(
1✔
77
        FormRepresentation,
78
        on_delete=models.CASCADE,
79
        related_name="values_set",
80
        help_text="Formularz, do którego należy pole, dla którego to zdefiniowana jest"
81
        "ta wartość domyślna pola. ",
82
    )
83

84
    field = models.ForeignKey(
1✔
85
        FormFieldRepresentation,
86
        verbose_name="Pole formularza",
87
        on_delete=models.CASCADE,
88
        related_name="+",
89
        help_text="Pole formularza, dla którego zdefiniowana jest ta wartość domyślna. ",
90
    )
91
    value = JSONField("Wartość", null=True, blank=True)
1✔
92

93
    # Ustawienie może dotyczyć wyłącznie konkretnego użytkownika lub
94
    # wszystkich użytkowników systemu
95
    user = models.ForeignKey(
1✔
96
        settings.AUTH_USER_MODEL,
97
        verbose_name="Użytkownik",
98
        on_delete=models.CASCADE,
99
        null=True,
100
        blank=True,
101
    )
102

103
    def clean(self):
1✔
104
        # Rodzic musi istnieć po obydwu stronach, tzn po stronie FormFieldDefaultValue
105
        # oraz po stronie FormFieldRepresentation
UNCOV
106
        if self.parent_id is None or (
×
107
            self.field_id is not None and self.field.parent is None
108
        ):
UNCOV
109
            raise ValidationError(
×
110
                "Rodzic dla reprezentacji pola i rodzic dla wartości domyślnej "
111
                "powinien być określony w bazie danych. Skontaktuj się z administratorem "
112
                "systemu, jezeli dostajesz ten błąd. "
113
            )
114

UNCOV
115
        if self.parent_id != self.field.parent_id:
×
UNCOV
116
            raise ValidationError(
×
117
                "Rodzic wartości domyślnej i rodzic wybranego pola musi być identyczny"
118
            )
119

120
        # Tu potrzebujemy zaimplementować: zebranie wartości domyślnych dla w/wym formularza
121
        # dla self.user, następnie zainicjowanie formularza z tymi parametrami i ewentualną
122
        # próbę wyrenderowania go. W sytuacji, gdy zostanie podany poprawny JSON ale niepoprawna
123
        # wartość dla danego pola (np wartość dla pola ID jako liczba zmiennoprzecinkowa a nie
124
        # całkowita), użytkownik powinien otrzymać adekwatny błąd"""
125

UNCOV
126
        try:
×
UNCOV
127
            klass = self.parent.get_form_class()
×
UNCOV
128
        except Exception:
×
UNCOV
129
            raise ValidationError(
×
130
                f"Nie udało się odnaleźć klasy formularza w kodzie dla '{self.parent.full_name}'. "
131
                f"Weryfikacja wartości domyślnych formularza nie jest możliwa, a co za tym idzie, "
132
                f"zapis zmian również. Skontaktuj się z administratorem systemu. "
133
            )
134

UNCOV
135
        initial = get_form_defaults(klass(), user=self.user, update_db_repr=False)
×
UNCOV
136
        initial[self.field.name] = self.value
×
137

UNCOV
138
        instance = klass(initial=initial)
×
UNCOV
139
        try:
×
UNCOV
140
            form_field = instance.fields[self.field.name]
×
UNCOV
141
            form_field.required = False
×
142

UNCOV
143
            form_field.to_python(self.value)
×
144
            form_field.validate(self.value)
×
145
            instance.as_p()
×
UNCOV
146
        except Exception as e:
×
UNCOV
147
            raise ValidationError(
×
148
                "Nie udało się wyrenderować formularza z wpisanymi przykładowymi informacjami. "
149
                f"Komunikat błędu: {str(e)}. Proszę, skoryguj daną wartośc i spróbuj ponownie, "
150
                "ewentualnie skontaktuj się z administratorem. "
151
            )
152

153
    class Meta:
1✔
154
        verbose_name = "Wartość domyslna dla pola formularza"
1✔
155
        verbose_name_plural = "Wartości domyślne dla pól formularzy"
1✔
156
        ordering = ("user", "field__order")
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

© 2026 Coveralls, Inc