MtSorre
MtSorre

Reputation: 43

Django-allauth restrict registration to list of emails

I'm using Django-allauth, I have a list of emails and I want to restrict registration to this list. My idea was to check the signing up user email and, if not in the emails list, stop registration process and redirect. As suggested by Chetan Ganji I tried editing allauth.account.views.SignupView but it does not subscribe the form_valid method. How can i do that? Thank you for help

from allauth.account.views import SignupView

class AllauthCustomSignupView(SignupView):

    def form_valid(self, form):
        email = form.cleaned_data['email']
        auth_user_list =    [   'email_1',
                                'email_2',
                                ...
                            ]

        if not any(email in s for s in auth_user_list):
            return reverse('url')
        return super(MySignupView, self).form_valid(form)

Upvotes: 4

Views: 2786

Answers (2)

Gajesh
Gajesh

Reputation: 190

You can do it by extending the DefaultAccountAdapter class. You have to figure out a way to store and fetch the restricted list on demand. You can then use the adapters and raise validation error in the registration from. Extend a DefaultAccountAdapter and override the clean_email method. Create an adapter.py in your project directory and extend the default adapter class.

from allauth.account.adapter import DefaultAccountAdapter
from django.forms import ValidationError

class RestrictEmailAdapter(DefaultAccountAdapter):

    def clean_email(self,email):
        RestrictedList = ['Your restricted list goes here.']
        if email in RestrictedList
            raise ValidationError('You are restricted from registering. Please contact admin.')
        return email

Finally, point the account adapter in settings.py to your extended class.

ACCOUNT_ADAPTER = 'YourProject.adapter.RestrictEmailAdapter'

Upvotes: 7

RyuCoder
RyuCoder

Reputation: 1822

Maybe try with this code

class AllauthCustomSignupView(SignupView):

    def form_valid(self, form):
        email = form.cleaned_data['email']
        auth_user_list =    [   'email_1',
                                'email_2',
                                ...
                            ]

        if email in auth_user_list:
            return reverse('blocked-email') # whatever url, make sure that the url is defined inside form_valid or in approriate location.
        else:
            return super(AllauthCustomSignupView, self).form_valid(form)

class BlockedEmailView(TemplateView):
    template_name = "blocked-email.html"

Add below line to your urls.py

url(r'^signup/$', views.AllauthCustomSignupView.as_view(), name="signup"),
url(r'^blocked/email$', views.BlockedEmailView.as_view(), name="blocked-email"),

Also, you will need to change the action attribute of the form that SignupView has. So, your will have to override the template of that view, keep everything else the same, just change the action to point to "signup/".

Upvotes: 0

Related Questions