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.
353 lines
13 KiB
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)
|
||
|
|