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

chiefonboarding / ChiefOnboarding / 16129945001

07 Jul 2025 11:17PM UTC coverage: 90.649% (+0.01%) from 90.638%
16129945001

push

github

web-flow
Add patch method to execute and revoke integration (#559)

8269 of 9122 relevant lines covered (90.65%)

0.91 hits per line

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

97.92
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
    method = serializers.ChoiceField(
1✔
58
        [
59
            ("GET", "GET"),
60
            ("POST", "POST"),
61
            ("PUT", "PUT"),
62
        ]
63
    )
64

65

66
class ManifestExecuteSerializer(ValidateMixin, serializers.Serializer):
1✔
67
    url = serializers.CharField()
1✔
68
    data = serializers.JSONField(required=False, default=dict)
1✔
69
    headers = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
70
    store_data = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
71
    method = serializers.ChoiceField(
1✔
72
        [
73
            ("HEAD", "HEAD"),
74
            ("GET", "GET"),
75
            ("POST", "POST"),
76
            ("PUT", "PUT"),
77
            ("PATCH", "PATCH"),
78
            ("DELETE", "DELETE"),
79
        ]
80
    )
81
    status_code = serializers.ListField(
1✔
82
        child=serializers.IntegerField(), required=False
83
    )
84
    files = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
85
    save_as_file = serializers.CharField(required=False)
1✔
86
    polling = ManifestPollingSerializer(required=False)
1✔
87
    continue_if = ManifestConditionSerializer(required=False)
1✔
88

89
    def validate(self, data):
1✔
90
        # Check that if polling has been filled, that continue_if is also filled
91
        polling = data.get("polling", False)
1✔
92
        continue_if = data.get("continue_if", False)
1✔
93
        if polling and not continue_if:
1✔
94
            raise serializers.ValidationError(
×
95
                "continue_if must be filled if you use polling"
96
            )
97
        return data
1✔
98

99

100
class ManifestRevokeSerializer(ValidateMixin, serializers.Serializer):
1✔
101
    url = serializers.CharField()
1✔
102
    data = serializers.JSONField(required=False, default=dict)
1✔
103
    status_code = serializers.ListField(
1✔
104
        child=serializers.IntegerField(), required=False
105
    )
106
    headers = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
107
    method = serializers.ChoiceField(
1✔
108
        [
109
            ("HEAD", "HEAD"),
110
            ("GET", "GET"),
111
            ("POST", "POST"),
112
            ("PUT", "PUT"),
113
            ("PATCH", "PATCH"),
114
            ("DELETE", "DELETE"),
115
        ]
116
    )
117

118

119
class ManifestPostExecuteNotificationSerializer(ValidateMixin, serializers.Serializer):
1✔
120
    type = serializers.ChoiceField(
1✔
121
        [
122
            ("email", "Email message"),
123
            ("text", "Text message"),
124
        ]
125
    )
126
    to = serializers.CharField()
1✔
127
    subject = serializers.CharField()
1✔
128
    message = serializers.CharField()
1✔
129

130

131
class ManifestInitialDataFormSerializer(ValidateMixin, serializers.Serializer):
1✔
132
    id = serializers.CharField()
1✔
133
    name = serializers.CharField()
1✔
134
    secret = serializers.BooleanField(default=True)
1✔
135
    description = serializers.CharField()
1✔
136

137

138
class ManifestExtraUserInfoFormSerializer(ValidateMixin, serializers.Serializer):
1✔
139
    id = serializers.CharField()
1✔
140
    name = serializers.CharField()
1✔
141
    description = serializers.CharField()
1✔
142

143

144
class ManifestOauthSerializer(ValidateMixin, serializers.Serializer):
1✔
145
    authenticate_url = serializers.CharField()
1✔
146
    access_token = ManifestExecuteSerializer(required=True)
1✔
147
    refresh = ManifestExecuteSerializer(required=True)
1✔
148
    without_code = serializers.BooleanField(required=False)
1✔
149

150

151
class WebhookManifestSerializer(ValidateMixin, serializers.Serializer):
1✔
152
    form = ManifestFormSerializer(required=False, many=True)
1✔
153
    exists = ManifestExistSerializer(required=False)
1✔
154
    revoke = ManifestRevokeSerializer(required=False, many=True)
1✔
155
    execute = ManifestExecuteSerializer(many=True)
1✔
156
    post_execute_notification = ManifestPostExecuteNotificationSerializer(
1✔
157
        many=True, required=False
158
    )
159
    initial_data_form = ManifestInitialDataFormSerializer(many=True, required=False)
1✔
160
    extra_user_info = ManifestExtraUserInfoFormSerializer(many=True, required=False)
1✔
161
    headers = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
162
    oauth = ManifestOauthSerializer(required=False)
1✔
163

164

165
class SyncUsersManifestSerializer(ValidateMixin, serializers.Serializer):
1✔
166
    data_from = serializers.CharField(required=False)
1✔
167
    data_structure = serializers.DictField(child=serializers.CharField())
1✔
168
    execute = ManifestExecuteSerializer(many=True)
1✔
169
    next_page_token_from = serializers.CharField(required=False)
1✔
170
    next_page = serializers.CharField(required=False)
1✔
171
    next_page_from = serializers.CharField(required=False)
1✔
172
    schedule = serializers.CharField(required=False, validators=[validate_cron])
1✔
173
    action = serializers.ChoiceField([("create", "create"), ("update", "update")])
1✔
174
    amount_pages_to_fetch = serializers.IntegerField(required=False)
1✔
175
    initial_data_form = ManifestInitialDataFormSerializer(many=True, required=False)
1✔
176
    headers = serializers.DictField(child=serializers.CharField(), default=dict)
1✔
177
    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