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

liqd / a4-defakts / 9581866703

19 Jun 2024 12:18PM UTC coverage: 88.019% (+0.001%) from 88.018%
9581866703

push

github

goapunk
apps/cms: change button for col_cta_block to be more inline with the behavior of the background_cta_block

fixes #42

5973 of 6786 relevant lines covered (88.02%)

0.88 hits per line

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

52.67
/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 zeep import Client
1✔
13

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

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

22
CAPTCHA_HELP = _(
1✔
23
    "Solve the math problem and click on the correct result.<br>"
24
    "If you are having difficulty please contact us  by {}email{}."
25
)
26

27

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

38

39
class DefaultSignupForm(SignupForm):
1✔
40
    terms_of_use = forms.BooleanField(label=_("Terms of use"))
1✔
41
    get_newsletters = forms.BooleanField(
1✔
42
        label=_("I would like to receive further information"),
43
        help_text=_(
44
            "Projects you are following can send you "
45
            "additional information via email."
46
        ),
47
        required=False,
48
    )
49
    captcha = CaptcheckCaptchaField(label=_("I am not a robot"))
1✔
50

51
    def __init__(self, *args, **kwargs):
1✔
52
        super().__init__(*args, **kwargs)
1✔
53
        self.fields["username"].help_text = _(
1✔
54
            "Your username will appear publicly next to your posts."
55
        )
56
        self.fields["email"].widget.attrs["autofocus"] = True
1✔
57
        del self.fields["username"].widget.attrs["placeholder"]
1✔
58
        del self.fields["email"].widget.attrs["placeholder"]
1✔
59
        del self.fields["password1"].widget.attrs["placeholder"]
1✔
60
        del self.fields["password2"].widget.attrs["placeholder"]
1✔
61
        self.fields["email"].widget.attrs["autocomplete"] = "username"
1✔
62
        self.fields["password1"].widget.attrs["autocomplete"] = "new-password"
1✔
63
        self.fields["password2"].widget.attrs["autocomplete"] = "new-password"
1✔
64
        if not (hasattr(settings, "CAPTCHA_URL") and settings.CAPTCHA_URL):
1✔
65
            del self.fields["captcha"]
1✔
66
        else:
67
            self.fields["captcha"].help_text = helpers.add_email_link_to_helptext(
1✔
68
                self.fields["captcha"].help_text, CAPTCHA_HELP
69
            )
70

71
    def save(self, request):
1✔
72
        user = super().save(request)
1✔
73
        if user:
1✔
74
            user.get_newsletters = self.cleaned_data["get_newsletters"]
1✔
75
            user.language = get_language()
1✔
76
            user.save()
1✔
77
            return user
1✔
78

79

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

107
    def validateMemberNumberAndDate(self, member_number, birth_date):
1✔
108
        if not hasattr(settings, "IGBCE_NAV_URL") or not hasattr(
×
109
            settings, "IGBCE_NAV_SECURITYID"
110
        ):
111
            raise forms.ValidationError(
×
112
                _("Something is wrong with the setup - please try again later")
113
            )
114

115
        if Member.objects.filter(member_number=member_number).exists():
×
116
            raise forms.ValidationError(
×
117
                _(
118
                    "There is already a participant with this membership "
119
                    "number. Please check your entry. If this is your "
120
                    "membership number, please send an email to "
121
                    '"zukunftsgewerkschaft@igbce.de".'
122
                )
123
            )
124

125
        result = False
×
126
        try:
×
127
            client = Client("{}".format(settings.IGBCE_NAV_URL))
×
128
            parameters = "{};{}".format(member_number, birth_date.strftime("%d.%m.%Y"))
×
129
            connection_parameters = (
×
130
                "ObjectID:0;SecurityID:{};SetSize:0;UnitopProxyVersion:2.0".format(
131
                    settings.IGBCE_NAV_SECURITYID
132
                )
133
            )
134

135
            response = client.service.SendRequest(
×
136
                functionName="CALCONNECT_MemberNoBirthDate",
137
                functionParameters=parameters,
138
                filters="",
139
                connectionParameters=connection_parameters,
140
            )
141

142
            result_str = xmltodict.parse(response)["Response"]["ResponseData"][
×
143
                "Object"
144
            ]["CalConnectorResult"]
145

146
            if result_str == "true":
×
147
                result = True
×
148

149
        except BaseException:
×
150
            logger.exception("IGBCE API error")
×
151
            raise forms.ValidationError(
×
152
                _("Something is wrong with the setup - please try again later")
153
            )
154

155
        if not result:
×
156
            raise forms.ValidationError(
×
157
                _(
158
                    "Unfortunately, the member number and / or date of birth "
159
                    "could not be linked to an active member account. Please "
160
                    "check your input and try again. If you still have "
161
                    'problems, please contact "zukunftsgewerkschaft@igbce.de".'
162
                )
163
            )
164

165
    def clean(self):
1✔
166
        super().clean()
×
167

168
        if any(self.errors):
×
169
            return self.errors
×
170

171
        member_number = self.cleaned_data.get("member_number")
×
172
        birth_date = self.cleaned_data.get("birth_date")
×
173

174
        self.validateMemberNumberAndDate(member_number, birth_date)
×
175

176
    def save(self, request):
1✔
177
        user = super().save(request)
×
178
        if hasattr(settings, "SITE_ORGANISATION_SLUG"):
×
179
            organisation = Organisation.objects.get(
×
180
                slug=settings.SITE_ORGANISATION_SLUG
181
            )
182
            additional_info = {"birth_date": self.cleaned_data["birth_date"]}
×
183
            member = Member(
×
184
                member=user,
185
                member_number=self.cleaned_data["member_number"],
186
                organisation=organisation,
187
                additional_info=additional_info,
188
            )
189
            member.save()
×
190
        return user
×
191

192

193
class SocialTermsSignupForm(SocialSignupForm):
1✔
194
    terms_of_use = forms.BooleanField(label=_("Terms of use"))
1✔
195
    get_newsletters = forms.BooleanField(
1✔
196
        label=_("I would like to receive further information"),
197
        help_text=_(
198
            "Projects you are following can send you "
199
            "additional information via email."
200
        ),
201
        required=False,
202
    )
203
    email = forms.EmailField(widget=forms.HiddenInput())
1✔
204

205
    def __init__(self, *args, **kwargs):
1✔
206
        super().__init__(*args, **kwargs)
×
207
        self.prevent_enumeration = False
×
208
        self.fields["username"].help_text = _(
×
209
            "Your username will appear publicly next to your posts."
210
        )
211
        del self.fields["username"].widget.attrs["placeholder"]
×
212

213
    def save(self, request):
1✔
214
        user = super().save(request)
×
215
        user.get_newsletters = self.cleaned_data["get_newsletters"]
×
216
        user.language = get_language()
×
217
        user.save()
×
218
        return user
×
219

220

221
class ChangeUserAdminForm(auth_forms.UserChangeForm):
1✔
222
    def clean_username(self):
1✔
223
        username = self.cleaned_data["username"]
×
224
        try:
×
225
            user = User.objects.get(username__iexact=username)
×
226
            if user != self.instance:
×
227
                raise forms.ValidationError(
×
228
                    User._meta.get_field("username").error_messages["unique"]
229
                )
230
        except User.DoesNotExist:
×
231
            pass
×
232

233
        try:
×
234
            user = User.objects.get(email__iexact=username)
×
235
            if user != self.instance:
×
236
                raise forms.ValidationError(
×
237
                    User._meta.get_field("username").error_messages["used_as_email"]
238
                )
239
        except User.DoesNotExist:
×
240
            pass
×
241

242
        return username
×
243

244

245
class AddUserAdminForm(auth_forms.UserCreationForm):
1✔
246
    def clean_username(self):
1✔
247
        username = self.cleaned_data["username"]
×
248
        user = User.objects.filter(username__iexact=username)
×
249
        if user.exists():
×
250
            raise forms.ValidationError(
×
251
                User._meta.get_field("username").error_messages["unique"]
252
            )
253
        else:
254
            user = User.objects.filter(email__iexact=username)
×
255
            if user.exists():
×
256
                raise forms.ValidationError(
×
257
                    User._meta.get_field("username").error_messages["used_as_email"]
258
                )
259
        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