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

chiefonboarding / ChiefOnboarding / 22209007097

20 Feb 2026 02:35AM UTC coverage: 90.502% (-0.08%) from 90.58%
22209007097

Pull #621

github

web-flow
Merge fedfe8768 into b47beee8a
Pull Request #621: Pritunl compatibility

8185 of 9044 relevant lines covered (90.5%)

0.91 hits per line

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

97.98
back/admin/integrations/serializers.py
1
from django.core.exceptions import ValidationError
1✔
2
from django_q.models import validate_cron
1✔
3
from rest_framework import serializers
1✔
4

5

6
# Credit: https://stackoverflow.com/a/42432240
7
class ValidateMixin:
1✔
8
    def validate(self, data):
1✔
9
        if hasattr(self, "initial_data"):
1✔
10
            unknown_keys = set(self.initial_data.keys()) - set(self.fields.keys())
1✔
11
            if unknown_keys:
1✔
12
                raise ValidationError("Got unknown fields: {}".format(unknown_keys))
×
13
        return data
1✔
14

15

16
class ManifestFormSerializer(ValidateMixin, serializers.Serializer):
1✔
17
    id = serializers.CharField()
1✔
18
    url = serializers.CharField(required=False)
1✔
19
    name = serializers.CharField()
1✔
20
    type = serializers.ChoiceField(
1✔
21
        [
22
            ("multiple_choice", "Multiple choice"),
23
            ("choice", "Choice"),
24
            ("input", "Input field"),
25
            ("generate", "Generate random text"),
26
        ]
27
    )
28
    items = serializers.JSONField(required=False)
1✔
29
    data_from = serializers.CharField(required=False)
1✔
30
    choice_value = serializers.CharField(required=False)
1✔
31
    choice_name = serializers.CharField(required=False)
1✔
32
    options_source = serializers.ChoiceField(
1✔
33
        [
34
            ("fixed list", "fixed list"),
35
            ("fetch url", "fetch url"),
36
        ],
37
        required=False,
38
    )
39

40

41
class ManifestConditionSerializer(ValidateMixin, serializers.Serializer):
1✔
42
    response_notation = serializers.CharField()
1✔
43
    value = serializers.CharField()
1✔
44

45

46
class ManifestPollingSerializer(ValidateMixin, serializers.Serializer):
1✔
47
    interval = serializers.IntegerField(min_value=1, max_value=3600)
1✔
48
    amount = serializers.IntegerField(min_value=1, max_value=100)
1✔
49

50

51
class ManifestExistSerializer(ValidateMixin, serializers.Serializer):
1✔
52
    url = serializers.CharField()
1✔
53
    expected = serializers.CharField()
1✔
54
    status_code = serializers.ListField(
1✔
55
        child=serializers.IntegerField(), required=False
56
    )
57
    extra_headers = serializers.ChoiceField(
1✔
58
        [
59
            ("prituln", "prituln"),
60
        ],
61
        required=False,
62
    )
63
    method = serializers.ChoiceField(
1✔
64
        [
65
            ("GET", "GET"),
66
            ("POST", "POST"),
67
            ("PUT", "PUT"),
68
        ]
69
    )
70

71

72
class ManifestExecuteSerializer(ValidateMixin, serializers.Serializer):
1✔
73
    url = serializers.CharField()
1✔
74
    data = serializers.JSONField(required=False, default=dict)
1✔
75
    headers = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
76
    store_data = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
77
    method = serializers.ChoiceField(
1✔
78
        [
79
            ("HEAD", "HEAD"),
80
            ("GET", "GET"),
81
            ("POST", "POST"),
82
            ("PUT", "PUT"),
83
            ("PATCH", "PATCH"),
84
            ("DELETE", "DELETE"),
85
        ]
86
    )
87
    extra_headers = serializers.ChoiceField(
1✔
88
        [
89
            ("prituln", "prituln"),
90
        ],
91
        required=False,
92
    )
93
    status_code = serializers.ListField(
1✔
94
        child=serializers.IntegerField(), required=False
95
    )
96
    files = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
97
    save_as_file = serializers.CharField(required=False)
1✔
98
    polling = ManifestPollingSerializer(required=False)
1✔
99
    continue_if = ManifestConditionSerializer(required=False)
1✔
100

101
    def validate(self, data):
1✔
102
        # Check that if polling has been filled, that continue_if is also filled
103
        polling = data.get("polling", False)
1✔
104
        continue_if = data.get("continue_if", False)
1✔
105
        if polling and not continue_if:
1✔
106
            raise serializers.ValidationError(
×
107
                "continue_if must be filled if you use polling"
108
            )
109
        return data
1✔
110

111

112
class ManifestRevokeSerializer(ValidateMixin, serializers.Serializer):
1✔
113
    url = serializers.CharField()
1✔
114
    data = serializers.JSONField(required=False, default=dict)
1✔
115
    status_code = serializers.ListField(
1✔
116
        child=serializers.IntegerField(), required=False
117
    )
118
    extra_headers = serializers.ChoiceField(
1✔
119
        [
120
            ("prituln", "prituln"),
121
        ],
122
        required=False,
123
    )
124
    headers = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
125
    method = serializers.ChoiceField(
1✔
126
        [
127
            ("HEAD", "HEAD"),
128
            ("GET", "GET"),
129
            ("POST", "POST"),
130
            ("PUT", "PUT"),
131
            ("PATCH", "PATCH"),
132
            ("DELETE", "DELETE"),
133
        ]
134
    )
135

136

137
class ManifestPostExecuteNotificationSerializer(ValidateMixin, serializers.Serializer):
1✔
138
    type = serializers.ChoiceField(
1✔
139
        [
140
            ("email", "Email message"),
141
            ("text", "Text message"),
142
        ]
143
    )
144
    to = serializers.CharField()
1✔
145
    subject = serializers.CharField()
1✔
146
    message = serializers.CharField()
1✔
147

148

149
class ManifestInitialDataFormSerializer(ValidateMixin, serializers.Serializer):
1✔
150
    id = serializers.CharField()
1✔
151
    name = serializers.CharField()
1✔
152
    secret = serializers.BooleanField(default=True)
1✔
153
    description = serializers.CharField()
1✔
154

155

156
class ManifestExtraUserInfoFormSerializer(ValidateMixin, serializers.Serializer):
1✔
157
    id = serializers.CharField()
1✔
158
    name = serializers.CharField()
1✔
159
    description = serializers.CharField()
1✔
160

161

162
class ManifestOauthSerializer(ValidateMixin, serializers.Serializer):
1✔
163
    authenticate_url = serializers.CharField()
1✔
164
    access_token = ManifestExecuteSerializer(required=True)
1✔
165
    refresh = ManifestExecuteSerializer(required=True)
1✔
166
    without_code = serializers.BooleanField(required=False)
1✔
167

168

169
class WebhookManifestSerializer(ValidateMixin, serializers.Serializer):
1✔
170
    form = ManifestFormSerializer(required=False, many=True)
1✔
171
    exists = ManifestExistSerializer(required=False)
1✔
172
    revoke = ManifestRevokeSerializer(required=False, many=True)
1✔
173
    execute = ManifestExecuteSerializer(many=True)
1✔
174
    post_execute_notification = ManifestPostExecuteNotificationSerializer(
1✔
175
        many=True, required=False
176
    )
177
    initial_data_form = ManifestInitialDataFormSerializer(many=True, required=False)
1✔
178
    extra_user_info = ManifestExtraUserInfoFormSerializer(many=True, required=False)
1✔
179
    headers = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
180
    oauth = ManifestOauthSerializer(required=False)
1✔
181

182

183
class SyncUsersManifestSerializer(ValidateMixin, serializers.Serializer):
1✔
184
    data_from = serializers.CharField(required=False)
1✔
185
    data_structure = serializers.DictField(child=serializers.CharField())
1✔
186
    execute = ManifestExecuteSerializer(many=True)
1✔
187
    next_page_token_from = serializers.CharField(required=False)
1✔
188
    next_page = serializers.CharField(required=False)
1✔
189
    next_page_from = serializers.CharField(required=False)
1✔
190
    schedule = serializers.CharField(required=False, validators=[validate_cron])
1✔
191
    action = serializers.ChoiceField([("create", "create"), ("update", "update")])
1✔
192
    amount_pages_to_fetch = serializers.IntegerField(required=False)
1✔
193
    initial_data_form = ManifestInitialDataFormSerializer(many=True, required=False)
1✔
194
    headers = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
195
    oauth = ManifestOauthSerializer(required=False)
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