我有一个Django应用,其中用户创建了一个帐户,并且必须在我的管理页面上手动批准该帐户才能生效。有什么选择可以让我自动化吗?就像用户创建帐户后一样,他们应该能够登录而无需等待任何管理员权限。
答案 0 :(得分:0)
@薄荷
from django.shortcuts import redirect
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.core.exceptions import ImproperlyConfigured, PermissionDenied
from django.utils import six
from allauth.account import views
from django_hosts.resolvers import reverse, reverse_lazy
def host_check(user):
return user.is_host and user.establishment
def establishment_check(user):
return user.is_active and user.is_establishment and user.establishment
def guest_check(user):
return not host_check(user) and user.is_active
class LoginRequiredMixin(object):
def dispatch(self, *args, **kwargs):
if not self.request.user.is_authenticated():
params = ''
for key in self.request.GET:
params += '%s=%s&' % (key, self.request.GET.get(key))
next_url = '{0}?{1}'.format(self.request.path, params[:-1]) if params else self.request.path
return redirect(reverse('login_page', host='guests') + '?next=%s' % next_url)
return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)
class TOSRequiredMixin(object):
def dispatch(self, *args, **kwargs):
if not self.request.user.guestprofile.tos_checked:
if (self.request.user.guestprofile.full_name and
self.request.user.guestprofile.location and
self.request.user.guestprofile.phone_number):
return redirect("guest_tos")
else:
return redirect("update_guest")
pass
return super(TOSRequiredMixin, self).dispatch(*args, **kwargs)
class GuestRequiredMixin(TOSRequiredMixin):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
if not guest_check(self.request.user):
self.request.user.convert_to_guest()
return super(GuestRequiredMixin, self).dispatch(*args, **kwargs)
class MEARequiredMixin(LoginRequiredMixin):
@method_decorator(login_required(login_url=reverse_lazy('account_login', host='host')))
def dispatch(self, *args, **kwargs):
if not self.request.user.establishment.mea_checked:
return redirect(reverse('merchant_agreement', host='host'))
return super(MEARequiredMixin, self).dispatch(*args, **kwargs)
class HostRequiredMixin(MEARequiredMixin):
@method_decorator(login_required(login_url=reverse_lazy('account_login', host='host')))
def dispatch(self, *args, **kwargs):
if not host_check(self.request.user) and self.request.user.is_active:
if not self.request.user.convert_to_host():
return redirect(reverse_lazy('user_not_host', host='host'))
elif host_check(self.request.user) and not self.request.user.is_active:
return redirect(reverse_lazy('user_not_active', host='host'))
return super(HostRequiredMixin, self).dispatch(*args, **kwargs)
class EstablishmentRequiredMixin(LoginRequiredMixin):
@method_decorator(login_required(login_url=reverse_lazy('account_login', host='host')))
def dispatch(self, *args, **kwargs):
if not establishment_check(self.request.user):
return redirect(reverse_lazy('user_not_host', host='host'))
return super(EstablishmentRequiredMixin, self).dispatch(*args, **kwargs)
class AuthOwnerMixin(LoginRequiredMixin):
"""
Only request owner should have access
"""
owner_field = "customer"
def get_queryset(self):
qs = super(AuthOwnerMixin, self).get_queryset()
return qs.filter(**{self.owner_field: self.request.user})
class AuthEstablishmentMixin(LoginRequiredMixin):
establishment_field = 'establishment'
def get_queryset(self):
qs = super(AuthEstablishmentMixin, self).get_queryset()
return qs.filter(**{self.establishment_field: self.request.user.establishment})
class PermissionRequiredMixin(LoginRequiredMixin):
permission_required = None
permission_denied_message = 'You have not permission.'
def get_permission_required(self):
if self.permission_required is None:
raise ImproperlyConfigured(
'{0} is missing the permission_required attribute. Define {0}.permission_required, or override '
'{0}.get_permission_required().'.format(self.__class__.__name__)
)
if isinstance(self.permission_required, six.string_types):
perms = (self.permission_required,)
else:
perms = self.permission_required
return perms
def has_permission(self):
perms = self.get_permission_required()
return self.request.user.has_perms(perms)
def dispatch(self, request, *args, **kwargs):
if not self.has_permission():
raise PermissionDenied(self.permission_denied_message)
return super(PermissionRequiredMixin, self).dispatch(request, *args, **kwargs)
class BetterLoginView(views.LoginView):
def get_initial(self):
initial = super(BetterLoginView, self).get_initial()
if 'email' not in initial and 'email' in self.request.GET:
initial['login'] = self.request.GET.get('email')
return initial
views.login = BetterLoginView.as_view()
class BetterPasswordResetDoneView(BetterLoginView):
template_name = views.PasswordResetDoneView.template_name
views.password_reset_done = BetterPasswordResetDoneView.as_view()