You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BinaryBrains/account/views.py

353 lines
13 KiB

6 months ago
from django.shortcuts import render, redirect, get_object_or_404
from django.db.models import Q
from account.models import CustomUser
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout
from django.conf import settings
from django.http import HttpResponse
from uuid import uuid4
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from django.contrib.auth.models import Group
from .decorators import *
# email
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.core.mail import send_mail, BadHeaderError
from django.core.mail import EmailMultiAlternatives
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes, force_str
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth import update_session_auth_hash
from django.utils import timezone
from account.models import *
# User Login
def user_login(request):
if request.method == 'POST':
email = request.POST.get('email')
password = request.POST.get('password')
user_email = CustomUser.objects.filter(email = email).first()
if not user_email:
messages.success(request, 'Email not found !')
return redirect('survey:home')
user = authenticate(request, email = email, password = password)
if user is not None:
if user.is_active:
login(request, user)
print(" User logged in..")
return redirect('survey:home')
else:
messages.info(request, 'Your account has been disabled!')
return redirect('survey:home')
else:
print("Your email or password is incorrect!-----------------------")
messages.info(request, 'Your email or password is incorrect!')
return redirect('survey:home')
return render(request, 'account/modal/loginModal.html')
# Register User
def register_user(request):
if request.method == 'POST':
email = request.POST.get('email')
first_name = request.POST.get('first_name')
last_name = request.POST.get('last_name')
password = request.POST.get('password')
try:
if CustomUser.objects.filter(email = email).first():
messages.info(request, 'Email is already taken!')
return redirect('survey:home')
user_obj = CustomUser.objects.create(email = email, first_name=first_name, last_name=last_name)
user_obj.set_password(password)
# adding user to group
# group = Group.objects.get(name="bidder")
# user_obj.groups.add(group)
user_obj.save()
# must provide backend for multiple authentication backends
login(request, user_obj, backend='django.contrib.auth.backends.ModelBackend')
messages.success(request, 'Your account has been created successfully.')
return redirect('survey:home')
except Exception as e:
print(e)
# Change User Password
@login_required
def change_password(request):
if request.method == 'POST':
old_password = request.POST.get('old_password')
new_password1 = request.POST.get('password1')
new_password2 = request.POST.get('password2')
print(request.user.check_password(old_password))
if not request.user.check_password(old_password):
return JsonResponse({'status': 'error', 'message': 'The old password is incorrect.'})
if new_password1 != new_password2:
return JsonResponse({'status': 'error', 'message': 'The new passwords do not match.'})
request.user.set_password(new_password1)
request.user.save()
update_session_auth_hash(request, request.user)
return JsonResponse({'status': 'ok', 'message': 'Your password has been chanaged.'})
# Send email verification mail to user
@login_required
def send_verification_email(request):
try:
user_obj = get_object_or_404(CustomUser, email=request.user)
token_string = str(uuid4())
print(token_string)
email_confirmation_token = token_string
user_obj.email_confirmation_token = email_confirmation_token
# expire token in 12 hours
user_obj.email_confirmation_token_expiry = timezone.now() + timezone.timedelta(hours=12)
user_obj.save()
print(request.META.get('HTTP_HOST'))
print(request.scheme)
# sending email
# email details
context = {
'protocol':'https',
'domain' : request.META.get('HTTP_HOST'),
'token': email_confirmation_token,
'site_name': 'Website',
'user_id': user_obj.pk,
}
subject = 'Verify Your Email'
html_message = render_to_string('account/verification_email.html', context)
msg = strip_tags(html_message)
from_email = settings.EMAIL_HOST_USER
recipient_list = [request.user.email]
try:
msg = EmailMultiAlternatives(
subject,
msg,
from_email,
recipient_list
)
msg.attach_alternative(html_message, "text/html")
msg.send()
print("email sent-----------------")
except BadHeaderError:
return JsonResponse({'status': 'error', 'message': 'Invalid header found.'})
return JsonResponse({'status': 'ok', 'message': 'We have resent you the email to verify your email address. Check our inbox.'})
except Exception as e:
print(e)
return JsonResponse({'status': 'error', 'message': 'Error in sending verification email.'})
@login_required
def confirm_email(request, user_id, token):
print("confirm email-------------")
user_obj = get_object_or_404(CustomUser, id=user_id)
if str(token) == str(user_obj.email_confirmation_token) and user_obj.email_confirmation_token_expiry > timezone.now():
user_obj.is_email_confirmed = True
user_obj.save()
print("Email confirmed successfully")
messages.success(request, 'Your email has been verified!')
return redirect('survey:home')
elif user_obj.is_email_confirmed:
messages.info(request, 'Your email has already been verified!')
return
else:
messages.error(request, 'Invalid or confirmation token expired!')
return
# Logout User
@login_required
def user_logout(request):
logout(request)
return redirect('survey:home')
def password_reset_request(request):
if request.method == 'POST':
user_email = request.POST.get('email')
try:
user_obj = CustomUser.objects.get(email=user_email)
uid = urlsafe_base64_encode(force_bytes(user_obj.pk))
protocol = request.scheme
domain = request.META.get('HTTP_HOST')
token = default_token_generator.make_token(user_obj)
site_name = "Bidme"
context = {
'protocol': protocol,
'domain' : domain,
'token': token,
'site_name': site_name,
'user_id': uid,
}
subject = 'Reset your account password'
html_message = render_to_string('account/password_mail_template.html', context)
msg = strip_tags(html_message)
from_email = settings.EMAIL_HOST_USER
recipient_list = [user_email]
try:
msg = EmailMultiAlternatives(
subject,
msg,
from_email,
recipient_list
)
msg.attach_alternative(html_message, "text/html")
msg.send()
messages.success(request, 'We have sent you the email to reset the password. Check your inbox.')
return redirect('account:password_reset_sent')
except BadHeaderError:
messages.error(request, 'Invalid header found.')
except CustomUser.DoesNotExist:
messages.error(request, 'The provided email address is not associated with any account.')
except Exception as e:
print(e)
messages.error(request, 'Error in sending password reset mail.')
return render(request, 'account/forgot_password_form.html')
def password_reset_confirm(request, user_id, token):
try:
uid = force_str(urlsafe_base64_decode(user_id))
print(uid)
user = CustomUser.objects.get(pk=uid)
if user is not None and default_token_generator.check_token(user, token):
if request.method == 'POST':
new_password = request.POST.get('new_password')
confirm_password = request.POST.get('confirm_password')
if new_password != confirm_password:
messages.error(request, "Passwords do not match.")
return
else:
user.set_password(confirm_password)
user.save()
messages.success(request, "Password reset successfully.")
return redirect('survey:home')
return render(request, 'account/password_reset_form.html')
else:
messages.error(request, "Invalid password reset link.")
except Exception as e:
print(e)
def password_reset_sent(request):
return render(request, 'account/password_reset_sent.html')
def user_settings(request):
return render(request, 'account/settings.html')
@login_required
def profileInfo(request):
if request.method == 'POST':
print(request.POST)
first_name = request.POST.get('first_name')
last_name = request.POST.get('last_name')
email = request.POST.get('email')
print('user email--------------', email, first_name)
phone_number = request.POST.get('phone_number')
try:
profile = CustomUser.objects.get(email=request.user)
profile.first_name = first_name
profile.last_name = last_name
profile.email = email
profile.phone_number = phone_number
profile.save()
return JsonResponse({'status': 'ok', 'message':'Profile updated successfully.'})
except CustomUser.DoesNotExist as e:
print(e)
return JsonResponse({'status': 'error', 'message': 'Error submitting profile info!' })
else:
user_profile = get_object_or_404(CustomUser,email=request.user)
context = {
'first_name': user_profile.first_name,
'last_name': user_profile.last_name,
'email': user_profile.email,
'phone_number': user_profile.phone_number
}
return render(request, 'account/settings.html', context)
@login_required
def shippingAddress(request):
print("---------------Shipping Addresss")
if request.method == 'POST':
print(request.POST)
first_name = request.POST.get('shippingAddressFirstName')
last_name = request.POST.get('shippingAddressLastName')
country = request.POST.get('country')
city = request.POST.get('city')
address_line1 = request.POST.get('addressLine1')
address_line2 = request.POST.get('addressLine2')
state = request.POST.get('state')
postal_code = request.POST.get('postalCode')
print(first_name, address_line1)
# phone_number = request.POST.get('phone_number')
try:
shipping_address_obj, created= ShippingAddress.objects.get_or_create(user=request.user)
shipping_address_obj.first_name = first_name
shipping_address_obj.last_name = last_name
shipping_address_obj.country = country
shipping_address_obj.city = city
shipping_address_obj.address_line1 = address_line1
shipping_address_obj.address_line2 = address_line2
shipping_address_obj.state = state
shipping_address_obj.postal_code = postal_code
shipping_address_obj.save()
return JsonResponse({'status': 'ok', 'message': 'Successfully updated details.' })
except Exception as e:
print(e)
return JsonResponse({'status': 'error', 'message': 'Error updating shipping address details!' })
else:
user_profile = get_object_or_404(CustomUser,email=request.user)
shipping_address_obj = get_object_or_404(ShippingAddress, user=request.user)
if user_profile.first_name is None:
shipping_address_obj.first_name = user_profile.first_name
if user_profile.last_name is None:
shipping_address_obj.last_name = user_profile.last_name
context = {
'first_name': shipping_address_obj.first_name,
'last_name': shipping_address_obj.last_name,
'country': shipping_address_obj.country,
'city': shipping_address_obj.city,
'address_line1': shipping_address_obj.address_line1,
'address_line2': shipping_address_obj.address_line2,
'state': shipping_address_obj.state,
'postal_code': shipping_address_obj.postal_code,
}
return JsonResponse(context)