• 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

75.9
src/formdefaults/core.py
1
import json
1✔
2

3
from django.db import transaction
1✔
4
from django.db.models import Q
1✔
5

6
from formdefaults.util import full_name
1✔
7

8

9
def update_form_db_repr(form_instance, form_repr, user=None):
1✔
10
    """
11
    Aktualizuje reprezentację formularza w bazie danych:
12

13
    1) usuwa wszystkie pola które są w bazie a których nie ma w formularzu
14
    2) tworzy pola które są w formularzu wraz z domyślnymi wartościami
15

16
    :type form_repr: formdefaults.models.FormRepresentation
17
    :type form_instance: django.forms.Form
18
    """
19

20
    form_fields = form_instance.fields
1✔
21
    form_fields_names = form_fields.keys()
1✔
22

23
    db_fields = form_repr.fields_set.all()
1✔
24

25
    # Usuwanie pól, których nie ma w formularzu:
26
    db_fields.filter(~Q(name__in=form_fields_names)).delete()
1✔
27

28
    db_fields_dict = {db_field.name: db_field for db_field in db_fields}
1✔
29

30
    # Przeleć listę pól, w razie potrzeby aktualizując typ lub etykietę
31
    for no, field_name in enumerate(form_fields_names):
1✔
32
        form_field = form_fields[field_name]
1✔
33

34
        db_field = db_fields_dict.get(field_name)
1✔
35

36
        created = False
1✔
37
        if db_field is None:
1!
38
            created = True
1✔
39
            db_field = db_fields.create(
1✔
40
                parent=form_repr,
41
                name=field_name,
42
                klass=full_name(form_field),
43
                label=form_field.label or field_name.replace("_", " ").capitalize(),
44
                order=no,
45
            )
46

47
        updated = False
1✔
48
        if db_field.label != form_field.label:
1✔
49
            db_field.label = form_field.label
1✔
50
            updated = True
1✔
51

52
        if full_name(form_field) != db_field.klass:
1!
53
            db_field.klass = full_name(form_field)
×
54
            updated = True
×
55

56
        if updated:
1✔
57
            db_field.save()
1✔
58

59
        # Sprawdź, czy wartość domyślna pola może być zapisana w bazie, tzn. czy
60
        # poddaje się 'testowi' zakodowania jej w formacie JSON. Na tym etapie jeżeli
61
        # wartość domyślna jest liczona np za pomocą funkcji, to system przejdzie
62
        # do kolejnego pola, bez tworzenia wartości domyślnej w bazie danych.
63
        form_field_value = form_field.initial
1✔
64
        try:
1✔
65
            json.dumps(form_field_value)
1✔
66
        except TypeError:
1✔
67
            if not created:
1!
UNCOV
68
                db_field.delete()
×
69
            continue
1✔
70

71
        if created:
1!
72
            # Reprezentację pola w bazie danych własnie utworzono, więc z tej okazji
73
            # zapisz do bazy danych wartość domyślną tego pola w momencie tworzenia go:
74
            form_repr.values_set.create(
1✔
75
                field=db_field, value=form_field_value, user=user
76
            )
77

78
        # Jeżeli jest podany użytkownik to sprawdź, czy dla niego jest wpis w bazie danych;
79
        # Jeżeli tego wpisu nie ma to utwórz go z wartością domyślną
80
        if user is not None:
1!
UNCOV
81
            user_value, created = form_repr.values_set.get_or_create(
×
82
                field=db_field, user=user
83
            )
84

UNCOV
85
            if created:
×
UNCOV
86
                user_value.value = form_field_value
×
UNCOV
87
                user_value.save()
×
88

89

90
@transaction.atomic
1✔
91
def get_form_defaults(form_instance, label=None, user=None, update_db_repr=True):
1✔
92
    fn = full_name(form_instance)
1✔
93

94
    from formdefaults.models import FormRepresentation
1✔
95

96
    form_repr, crt = FormRepresentation.objects.get_or_create(full_name=fn)
1✔
97

98
    if update_db_repr:
1!
99
        if label is not None:
1!
100
            if form_repr.label != label:
1!
101
                form_repr.label = label
1✔
102
                form_repr.save()
1✔
103

104
        # Automatyczne tworzenie reprezentacji bazodanowej formularza w tej
105
        # funkcji NIE przewiduje tworzenia oddzielnych ustaleń dla danego użytkownika
106
        update_form_db_repr(form_instance, form_repr, user=None)
1✔
107

108
    # Weź listę domyślnych wartości (czyli takich gdzie user=None)
109
    values = dict(
1✔
110
        [
111
            (qs["field__name"], qs["value"])
112
            for qs in form_repr.values_set.filter(user=None)
113
            .select_related("field__name")
114
            .values("field__name", "value")
115
        ]
116
    )
117

118
    # Weź listę wartości dla danego użytkownika
119
    if user is not None:
1!
UNCOV
120
        user_values = dict(
×
121
            [
122
                (qs["field__name"], qs["value"])
123
                for qs in form_repr.values_set.filter(user=user)
124
                .select_related("field__name")
125
                .values("field__name", "value")
126
            ]
127
        )
UNCOV
128
        values.update(user_values)
×
129

130
    values.update(
1✔
131
        {
132
            "formdefaults_pre_html": form_repr.html_before,
133
            "formdefaults_post_html": form_repr.html_after,
134
        }
135
    )
136

137
    return values
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