What I am trying to do ?
I am trying to redirect a new user to login dialog after user sets a password for the first time. (I am doing this because the movement user sets a password Django implicitly logout the user)
What is the problem ?
For some reason the password_set
signal doesn't seem to work. i.e the sender function loginAfterPassChange
doesn't get executed.
My Code:
How do I set password
views.py:
@receiver(user_logged_in)
def getFirstTimePass(user, request, **kwargs): #this works
if user.profile.provider != '' and user.profile.firstTimeLogin:
user.profile.firstTimeLogin = False
user.profile.save()
raise ImmediateHttpResponse(render(request, 'index.html', {'type': user.profile.provider, 'email': user.email}))
@receiver(password_set)
def loginAfterPassChange(request, user, **kwargs): #this doesn't work
data = {'msg': 'Please login with your new password.'}
return HttpResponse(data)
def setPassword(request): #this works
data = {'errMsg': 'Something went wrong.'}
if not request.user.has_usable_password():
password = request.POST.get('password')
request.user.set_password(password)
request.user.save()
data['errMsg'] = ''
return JsonResponse(data)
urls.py:
from django.conf.urls import url
from .import views
urlpatterns = [
url(r'^updatePro', views.setPassword, name='updatePro')
]
models.py:
class Profile(models.Model):
user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE)
provider = models.CharField(max_length=256, default='')
firstTimeLogin = models.BooleanField(default=True)
if user.profile.provider != ''
Check to see if user is logged in with social account or local account.