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

liqd / diid_adplus / 7275812296

20 Dec 2023 01:04PM UTC coverage: 88.945% (+0.8%) from 88.163%
7275812296

push

github

goapunk
release v2306.2

6010 of 6757 relevant lines covered (88.94%)

0.89 hits per line

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

53.79
/apps/users/forms.py
1
import logging
1✔
2

3
import xmltodict
1✔
4
from allauth.account.forms import LoginForm
1✔
5
from allauth.account.forms import SignupForm
1✔
6
from allauth.socialaccount.forms import SignupForm as SocialSignupForm
1✔
7
from django import forms
1✔
8
from django.conf import settings
1✔
9
from django.contrib.auth import forms as auth_forms
1✔
10
from django.utils.translation import get_language
1✔
11
from django.utils.translation import gettext_lazy as _
1✔
12
from django.utils.translation import pgettext_lazy
1✔
13
from zeep import Client
1✔
14

15
from apps.captcha.fields import CaptcheckCaptchaField
1✔
16
from apps.cms.settings import helpers
1✔
17
from apps.organisations.models import Member
1✔
18
from apps.organisations.models import Organisation
1✔
19
from apps.users.models import User
1✔
20

21
logger = logging.getLogger(__name__)
1✔
22

23
CAPTCHA_HELP = _("If you are having difficulty please contact us" " by {}email{}.")
1✔
24

25

26
class DefaultLoginForm(LoginForm):
1✔
27
    def __init__(self, *args, **kwargs):
1✔
28
        super().__init__(*args, **kwargs)
1✔
29
        self.fields["login"].label = _("Username/e-mail")
1✔
30
        del self.fields["login"].widget.attrs["placeholder"]
1✔
31
        del self.fields["password"].widget.attrs["placeholder"]
1✔
32
        self.fields["login"].widget.attrs["autocomplete"] = "username"
1✔
33
        self.fields["password"].widget.attrs["autocomplete"] = "current-password"
1✔
34

35

36
class DefaultSignupForm(SignupForm):
1✔
37
    terms_of_use = forms.BooleanField(
1✔
38
        label=_('Terms of use')
39
    )
40
    data_protection = forms.BooleanField(
1✔
41
        label=_('Data protection')
42
    )
43
    get_notifications = forms.BooleanField(
1✔
44
        label=pgettext_lazy(
45
            'diid',
46
            'Notifications: Yes, I would like to be notified by e-mail about '
47
            'the beginning and end of participation opportunities and about '
48
            'comments on my contributions by other users. This applies to all '
49
            'projects I follow.'
50
        ),
51
        required=False
52
    )
53
    get_newsletters = forms.BooleanField(
1✔
54
        label=pgettext_lazy(
55
            'diid',
56
            'Newsletter: Yes, I would like to receive e-mail newsletters '
57
            'about the projects I follow.'
58
        ),
59
        required=False
60
    )
61
    captcha = CaptcheckCaptchaField(label=_("I am not a robot"))
1✔
62

63
    def __init__(self, *args, **kwargs):
1✔
64
        super().__init__(*args, **kwargs)
1✔
65
        self.fields["username"].help_text = _(
1✔
66
            "Your username will appear publicly next to your posts."
67
        )
68
        self.fields["email"].widget.attrs["autofocus"] = True
1✔
69
        del self.fields["username"].widget.attrs["placeholder"]
1✔
70
        del self.fields["email"].widget.attrs["placeholder"]
1✔
71
        del self.fields["password1"].widget.attrs["placeholder"]
1✔
72
        del self.fields["password2"].widget.attrs["placeholder"]
1✔
73
        self.fields["email"].widget.attrs["autocomplete"] = "username"
1✔
74
        self.fields["password1"].widget.attrs["autocomplete"] = "new-password"
1✔
75
        self.fields["password2"].widget.attrs["autocomplete"] = "new-password"
1✔
76
        if not (hasattr(settings, "CAPTCHA_URL") and settings.CAPTCHA_URL):
1✔
77
            del self.fields["captcha"]
1✔
78
        else:
79
            self.fields["captcha"].help_text = helpers.add_email_link_to_helptext(
1✔
80
                self.fields["captcha"].help_text, CAPTCHA_HELP
81
            )
82

83
    def save(self, request):
1✔
84
        user = super().save(request)
1✔
85
        if user:
1✔
86
            user.get_newsletters = self.cleaned_data["get_newsletters"]
1✔
87
            user.language = get_language()
1✔
88
            user.save()
1✔
89
            return user
1✔
90

91

92
class IgbceSignupForm(DefaultSignupForm):
1✔
93
    member_number = forms.IntegerField(
1✔
94
        label=_("Membership number of IG BCE"),
95
        help_text=_(
96
            "The membership number consists of a seven-digit number "
97
            "and can be found on the membership card."
98
        ),
99
        max_value=99999999999999999999,
100
        min_value=0,
101
    )
102
    birth_date = forms.DateField(
1✔
103
        label=_("Date of birth"),
104
        help_text=_(
105
            "Please also enter your date of birth in the format "
106
            "MM/DD/YYYY for authentication. Only members of the "
107
            "IG BCE can participate."
108
        ),
109
    )
110
    terms_of_use_extra = forms.BooleanField(
1✔
111
        label=_(
112
            "I confirm that I have read and accepted the "
113
            '<a href="/info/ig-bce-datenschutz/" '
114
            'target="_blank">data protection policy</a> of IG '
115
            "BCE."
116
        )
117
    )
118

119
    def validateMemberNumberAndDate(self, member_number, birth_date):
1✔
120
        if not hasattr(settings, "IGBCE_NAV_URL") or not hasattr(
×
121
            settings, "IGBCE_NAV_SECURITYID"
122
        ):
123
            raise forms.ValidationError(
×
124
                _("Something is wrong with the setup - please try again later")
125
            )
126

127
        if Member.objects.filter(member_number=member_number).exists():
×
128
            raise forms.ValidationError(
×
129
                _(
130
                    "There is already a participant with this membership "
131
                    "number. Please check your entry. If this is your "
132
                    "membership number, please send an email to "
133
                    '"zukunftsgewerkschaft@igbce.de".'
134
                )
135
            )
136

137
        result = False
×
138
        try:
×
139
            client = Client("{}".format(settings.IGBCE_NAV_URL))
×
140
            parameters = "{};{}".format(member_number, birth_date.strftime("%d.%m.%Y"))
×
141
            connection_parameters = (
×
142
                "ObjectID:0;SecurityID:{};SetSize:0;UnitopProxyVersion:2.0".format(
143
                    settings.IGBCE_NAV_SECURITYID
144
                )
145
            )
146

147
            response = client.service.SendRequest(
×
148
                functionName="CALCONNECT_MemberNoBirthDate",
149
                functionParameters=parameters,
150
                filters="",
151
                connectionParameters=connection_parameters,
152
            )
153

154
            result_str = xmltodict.parse(response)["Response"]["ResponseData"][
×
155
                "Object"
156
            ]["CalConnectorResult"]
157

158
            if result_str == "true":
×
159
                result = True
×
160

161
        except BaseException:
×
162
            logger.exception("IGBCE API error")
×
163
            raise forms.ValidationError(
×
164
                _("Something is wrong with the setup - please try again later")
165
            )
166

167
        if not result:
×
168
            raise forms.ValidationError(
×
169
                _(
170
                    "Unfortunately, the member number and / or date of birth "
171
                    "could not be linked to an active member account. Please "
172
                    "check your input and try again. If you still have "
173
                    'problems, please contact "zukunftsgewerkschaft@igbce.de".'
174
                )
175
            )
176

177
    def clean(self):
1✔
178
        super().clean()
×
179

180
        if any(self.errors):
×
181
            return self.errors
×
182

183
        member_number = self.cleaned_data.get("member_number")
×
184
        birth_date = self.cleaned_data.get("birth_date")
×
185

186
        self.validateMemberNumberAndDate(member_number, birth_date)
×
187

188
    def save(self, request):
1✔
189
        user = super().save(request)
×
190
        if hasattr(settings, "SITE_ORGANISATION_SLUG"):
×
191
            organisation = Organisation.objects.get(
×
192
                slug=settings.SITE_ORGANISATION_SLUG
193
            )
194
            additional_info = {"birth_date": self.cleaned_data["birth_date"]}
×
195
            member = Member(
×
196
                member=user,
197
                member_number=self.cleaned_data["member_number"],
198
                organisation=organisation,
199
                additional_info=additional_info,
200
            )
201
            member.save()
×
202
        return user
×
203

204

205
class SocialTermsSignupForm(SocialSignupForm):
1✔
206
    terms_of_use = forms.BooleanField(label=_("Terms of use"))
1✔
207
    get_newsletters = forms.BooleanField(
1✔
208
        label=_("I would like to receive further information"),
209
        help_text=_(
210
            "Projects you are following can send you "
211
            "additional information via email."
212
        ),
213
        required=False,
214
    )
215
    email = forms.EmailField(widget=forms.HiddenInput())
1✔
216

217
    def __init__(self, *args, **kwargs):
1✔
218
        super().__init__(*args, **kwargs)
×
219
        self.fields["username"].help_text = _(
×
220
            "Your username will appear publicly next to your posts."
221
        )
222
        del self.fields["username"].widget.attrs["placeholder"]
×
223

224
    def save(self, request):
1✔
225
        user = super().save(request)
×
226
        user.get_newsletters = self.cleaned_data["get_newsletters"]
×
227
        user.language = get_language()
×
228
        user.save()
×
229
        return user
×
230

231

232
class ChangeUserAdminForm(auth_forms.UserChangeForm):
1✔
233
    def clean_username(self):
1✔
234
        username = self.cleaned_data["username"]
×
235
        try:
×
236
            user = User.objects.get(username__iexact=username)
×
237
            if user != self.instance:
×
238
                raise forms.ValidationError(
×
239
                    User._meta.get_field("username").error_messages["unique"]
240
                )
241
        except User.DoesNotExist:
×
242
            pass
×
243

244
        try:
×
245
            user = User.objects.get(email__iexact=username)
×
246
            if user != self.instance:
×
247
                raise forms.ValidationError(
×
248
                    User._meta.get_field("username").error_messages["used_as_email"]
249
                )
250
        except User.DoesNotExist:
×
251
            pass
×
252

253
        return username
×
254

255

256
class AddUserAdminForm(auth_forms.UserCreationForm):
1✔
257
    def clean_username(self):
1✔
258
        username = self.cleaned_data["username"]
×
259
        user = User.objects.filter(username__iexact=username)
×
260
        if user.exists():
×
261
            raise forms.ValidationError(
×
262
                User._meta.get_field("username").error_messages["unique"]
263
            )
264
        else:
265
            user = User.objects.filter(email__iexact=username)
×
266
            if user.exists():
×
267
                raise forms.ValidationError(
×
268
                    User._meta.get_field("username").error_messages["used_as_email"]
269
                )
270
        return username
×
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