from django.contrib.auth import authenticate, login from django.http import HttpResponseRedirect, QueryDict from django.views.generic import TemplateView from django.conf import settings from django.contrib import messages from .services import LoginService import urllib import json class Login(TemplateView): def dispatch(self, request, *args, **kwargs): if request.user.is_authenticated: redirect_to = LoginService.get_user_redirect_url(request) return HttpResponseRedirect(redirect_to) return super(Login, self).dispatch(request, *args, **kwargs) def do_login(self, context, email, password, request, result): if result['success']: return self.handle_recaptcha_success(context, email, password, request) else: messages.error(request, 'Invalid reCAPTCHA. Please try again.') return self.render_to_response(context=context) def handle_recaptcha_success(self, context, email, password, request): user = authenticate(email=email, password=password) if user is not None: redirect_to = LoginService.get_redirect_login_sucess(request, user) return HttpResponseRedirect(redirect_to) else: context["error_message"] = "Email atau Password anda salah." return self.render_to_response(context=context) def get_recaptcha_result(self, recaptcha_response): url = 'https://www.google.com/recaptcha/api/siteverify' values = { 'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY, 'response': recaptcha_response } data = urllib.parse.urlencode(values).encode() req = urllib.request.Request(url, data=data) response = urllib.request.urlopen(req) result = json.loads(response.read().decode()) return result def get_template_names(self): if self.request.path == "/login_admin/": template_name = "login_admin.html" else: template_name = "login.html" return template_name def get_context_data(self, *args, **kwargs): context = super().get_context_data(**kwargs) return context def get(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) context['captcha_site_key'] = settings.GOOGLE_RECAPTCHA_SITE_KEY return self.render_to_response(context=context) def post(self, request, *args, **kwargs): email = request.POST.get("email", None) password = request.POST.get("pass", None) context = self.get_context_data(*args, **kwargs) if email is None or password is None: context = self.get_context_data(*args, **kwargs) context["error_message"] = "Email atau Password anda kosong." return self.render_to_response(context=context) else: recaptcha_response = request.POST.get('g-recaptcha-response') result = self.get_recaptcha_result(recaptcha_response) return self.do_login(context, email, password, request, result) from app.models import NotifikasiKontributor def kontributor_notif_context(request): if request.user.is_authenticated and request.user.is_contributor: notifs = NotifikasiKontributor.objects.filter(user=request.user) return { 'kontributor_notif':notifs } else: return {}