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

chiefonboarding / ChiefOnboarding / 17811718134

17 Sep 2025 09:57PM UTC coverage: 89.6% (-0.1%) from 89.705%
17811718134

Pull #387

github

web-flow
Merge 96b02d664 into 390599d86
Pull Request #387: Implement allauth

6780 of 7567 relevant lines covered (89.6%)

0.9 hits per line

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

98.61
back/admin/settings/forms.py
1
import pytz
1✔
2
from crispy_forms.helper import FormHelper
1✔
3
from crispy_forms.layout import Div, Field, Layout, Submit
1✔
4
from django import forms
1✔
5
from django.contrib.auth import get_user_model
1✔
6
from django.utils.safestring import mark_safe
1✔
7
from django.utils.translation import gettext_lazy as _
1✔
8
from django_q.models import Schedule
1✔
9

10
from admin.templates.forms import UploadField
1✔
11
from organization.models import Organization, WelcomeMessage
1✔
12

13

14
class OrganizationGeneralForm(forms.ModelForm):
1✔
15
    timezone = forms.ChoiceField(
1✔
16
        label=_("Timezone"), choices=[(x, x) for x in pytz.common_timezones]
17
    )
18
    default_sequences = forms.ModelMultipleChoiceField(
1✔
19
        label=_("Sequences that are preselected for all new hires:"),
20
        queryset=None,
21
        to_field_name="id",
22
        required=False,
23
    )
24

25
    def __init__(self, *args, **kwargs):
1✔
26
        super().__init__(*args, **kwargs)
1✔
27
        # Avoid circular import
28
        from admin.sequences.models import Sequence
1✔
29

30
        self.helper = FormHelper()
1✔
31
        self.fields["logo"].required = False
1✔
32
        self.fields["custom_email_template"].required = False
1✔
33
        self.fields["default_sequences"].queryset = Sequence.objects.all()
1✔
34
        self.fields["default_sequences"].initial = Sequence.objects.filter(
1✔
35
            auto_add=True
36
        )
37

38
        layout = Layout(
1✔
39
            Div(
40
                Div(
41
                    Field("name"),
42
                    Field("language"),
43
                    Field("timezone"),
44
                    Field("new_hire_email"),
45
                    Field("new_hire_email_reminders"),
46
                    Field("new_hire_email_overdue_reminders"),
47
                    Field("default_sequences"),
48
                    css_class="col-6",
49
                ),
50
                Div(
51
                    UploadField("logo", extra_context={"file": self.instance.logo}),
52
                    Field("base_color"),
53
                    Field("accent_color"),
54
                    Field("custom_email_template"),
55
                    css_class="col-6",
56
                ),
57
                css_class="row",
58
            ),
59
            Submit(name="submit", value="Update"),
60
        )
61
        self.helper.layout = layout
1✔
62

63
    class Meta:
1✔
64
        model = Organization
1✔
65
        fields = [
1✔
66
            "name",
67
            "language",
68
            "timezone",
69
            "base_color",
70
            "accent_color",
71
            "logo",
72
            "new_hire_email",
73
            "new_hire_email_reminders",
74
            "new_hire_email_overdue_reminders",
75
            "custom_email_template",
76
        ]
77

78

79
class SlackSettingsForm(forms.ModelForm):
1✔
80
    def __init__(self, *args, **kwargs):
1✔
81
        super().__init__(*args, **kwargs)
1✔
82
        self.fields["slack_confirm_person"].required = False
1✔
83
        self.fields["slack_birthday_wishes_channel"].required = False
1✔
84

85
        auto_create_new_hire_class = ""
1✔
86
        if not self.instance.auto_create_user:
1✔
87
            auto_create_new_hire_class = "d-none"
1✔
88

89
        auto_create_without_confirm_class = ""
1✔
90
        if self.instance.create_new_hire_without_confirm:
1✔
91
            auto_create_without_confirm_class = "d-none"
×
92

93
        self.helper = FormHelper()
1✔
94
        self.helper.layout = Layout(
1✔
95
            Field("bot_color"),
96
            Field("slack_buttons"),
97
            Field("ask_colleague_welcome_message"),
98
            Field("send_new_hire_start_reminder"),
99
            Field("slack_default_channel"),
100
            Field("auto_create_user"),
101
            Div(
102
                Field("create_new_hire_without_confirm"),
103
                Div(
104
                    Field("slack_confirm_person"),
105
                    css_class=auto_create_without_confirm_class,
106
                ),
107
                css_class=auto_create_new_hire_class,
108
            ),
109
            Field("slack_birthday_wishes_channel"),
110
            Submit(name="submit", value="Update"),
111
        )
112

113
    def save(self, commit=True):
1✔
114
        slack_settings = super().save(commit=commit)
1✔
115
        slack_settings.save()
1✔
116

117
        # Add birthday schedule if not exists but should be there (just got enabled)
118
        if (
1✔
119
            slack_settings.slack_birthday_wishes_channel is not None
120
            and not Schedule.objects.filter(name="birthday_reminder").exists()
121
        ):
122
            Schedule.objects.create(
1✔
123
                func="slack_bot.tasks.birthday_reminder",
124
                name="birthday_reminder",
125
                schedule_type=Schedule.DAILY,
126
            )
127

128
        # Remove birthday schedule if channel got set to None
129
        if (
1✔
130
            slack_settings.slack_birthday_wishes_channel is None
131
            and Schedule.objects.filter(name="birthday_reminder").exists()
132
        ):
133
            Schedule.objects.filter(
1✔
134
                name="birthday_reminder",
135
            ).delete()
136

137
        return slack_settings
1✔
138

139
    class Meta:
1✔
140
        model = Organization
1✔
141
        fields = [
1✔
142
            "bot_color",
143
            "slack_buttons",
144
            "ask_colleague_welcome_message",
145
            "send_new_hire_start_reminder",
146
            "slack_default_channel",
147
            "auto_create_user",
148
            "create_new_hire_without_confirm",
149
            "slack_confirm_person",
150
            "slack_birthday_wishes_channel",
151
        ]
152

153

154
class AdministratorsCreateForm(forms.ModelForm):
1✔
155
    def __init__(self, *args, **kwargs):
1✔
156
        super(AdministratorsCreateForm, self).__init__(*args, **kwargs)
1✔
157
        self.fields["role"].choices = ((1, _("Administrator")), (2, _("Manager")))
1✔
158

159
    def validate_unique(self):
1✔
160
        pass
1✔
161

162
    class Meta:
1✔
163
        model = get_user_model()
1✔
164
        fields = ["first_name", "last_name", "email", "role"]
1✔
165

166

167
class AdministratorsUpdateForm(forms.ModelForm):
1✔
168
    def __init__(self, *args, **kwargs):
1✔
169
        super(AdministratorsUpdateForm, self).__init__(*args, **kwargs)
1✔
170
        self.fields["role"].choices = ((1, _("Administrator")), (2, _("Manager")))
1✔
171

172
    class Meta:
1✔
173
        model = get_user_model()
1✔
174
        fields = [
1✔
175
            "role",
176
        ]
177

178

179
class WelcomeMessagesUpdateForm(forms.ModelForm):
1✔
180
    class Meta:
1✔
181
        model = WelcomeMessage
1✔
182
        fields = ["message"]
1✔
183
        widgets = {
1✔
184
            "message": forms.Textarea,
185
        }
186
        help_texts = {
1✔
187
            "message": mark_safe(
188
                _(
189
                    "You can use {{ first_name }}, "
190
                    "{{ last_name }}, {{ position "
191
                    "}}, {{ department }}, {{ "
192
                    "manager }}, and {{ "
193
                    "buddy }} in the editor. It will be replaced by the "
194
                    "values corresponding to the new hire."
195
                )
196
            )
197
        }
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