django_magazine/accounts/views.py

328 lines
12 KiB
Python

import requests
from django.shortcuts import render, redirect,get_object_or_404
from django.contrib import messages, auth
from django.contrib.auth.decorators import login_required
from .forms import RegisterationFrom, UserForm, UserProfileForm
from .models import Account
# verification email
from django.contrib.sites.shortcuts import get_current_site
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes
from django.utils.encoding import force_str
from django.contrib.auth.tokens import default_token_generator
from django.core.mail import EmailMessage
from .token import account_activation_token
from django.conf import settings
import uuid
from cart.views import _cart_id
from cart.models import Cart, CartItem
from orders.models import Order
from .models import UserProfile
from orders.models import OrderProduct
def register(request):
if request.method == "POST":
form = RegisterationFrom(request.POST)
if form.is_valid():
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
phone_number = form.cleaned_data['Phone_number']
email = form.cleaned_data['email']
password = form.cleaned_data['password']
username = email.split("@")[0]
user = Account.objects.create_user(first_name=first_name, last_name=last_name, email=email, username=username, password=password)
user.Phone_number = phone_number
# user.is_active = True
user.save()
# Create a user profile
profile = UserProfile()
profile.user_id = user.id
# profile.profile_picture = 'default/default-user.png'
profile.save()
# USER ACTIVATION
current_site = get_current_site(request)
subject = 'Please activate your account'
message = render_to_string('shop/accounts/email_activate/account_verification_email.html', {
'user': user,
'domain': current_site,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
to_email = email
send_email = EmailMessage(subject, message, to=[to_email])
send_email.send()
# messages.success(request, 'Check Gmail To Active Your Account')
return redirect('/account/register/?command=verification&email='+email)
# auth.login(request, user)
# messages.success(request, 'You Loged in')
# return redirect('accounts:dashboard')
else : # request == GET
form = RegisterationFrom()
context = {
'forms': form,
}
return render(request, 'shop/accounts/register.html', context)
def login(request):
if request.method == "POST":
email = request.POST['email']
password = request.POST['password']
user = auth.authenticate(email=email, password=password)
if user is not None:
try:
cart = Cart.objects.get(cart_id=_cart_id(request))
is_cart_item_exists = CartItem.objects.filter(cart=cart).exists()
if is_cart_item_exists:
cart_item = CartItem.objects.filter(cart=cart)
# Getting the product variations by cart id
product_variation = []
for item in cart_item:
variation = item.variation.all()
product_variation.append(list(variation))
# Get the cart items from the user to access his product variations
cart_item = CartItem.objects.filter(user=user)
ex_var_list = []
id = []
for item in cart_item:
existing_variation = item.variation.all()
ex_var_list.append(list(existing_variation))
id.append(item.id)
for pr in product_variation:
if pr in ex_var_list:
index = ex_var_list.index(pr)
item_id = id[index]
item = CartItem.objects.get(id=item_id)
item.quantity += 1
item.user = user
item.save()
else:
cart_item = CartItem.objects.filter(cart=cart)
for item in cart_item:
item.user = user
item.save()
except:
pass
auth.login(request, user)
url = request.META.get('HTTP_REFERER')
try:
query = requests.utils.urlparse(url).query
# next=/cart/checkout/
params = dict(x.split('=') for x in query.split('&'))
if 'next' in params:
nextPage = params['next']
return redirect(nextPage)
except:
return redirect('accounts:dashboard')
return redirect('accounts:dashboard')
else:
messages.error(request, 'Your email or password is wrong!')
return redirect('accounts:login')
return render(request, 'shop/accounts/login.html')
@login_required(login_url = 'accounts:login')
def logout(request):
auth.logout(request)
messages.success(request, "You've successfully logged out . Come back soon!")
return redirect('accounts:login')
def activate(request, uidb64, token):
try:
uid = urlsafe_base64_decode(uidb64).decode()
user = Account._default_manager.get(pk=uid)
except (TypeError, ValueError, OverflowError, Account.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.save()
messages.success(request, "Your account is activated, log in and let's go.")
return redirect('accounts:login')
else:
messages.error(request, "Invalid activation link, Try again!")
return redirect('accounts:register')
@login_required(login_url = 'accounts:login')
def dashboard(request):
orders = Order.objects.order_by('-created_at').filter(user_id=request.user.id, is_ordered=True)
profile = UserProfile.objects.get(user_id=request.user.id)
orders_count = orders.count()
context = {
'orders_count':orders_count,
'profile':profile,
}
return render(request, 'shop/accounts/dashboard/dashboard.html', context)
@login_required(login_url = 'accounts:login')
def my_orders(request):
orders = Order.objects.filter(user=request.user, is_ordered=True).order_by('-created_at')
orders_count = orders.count()
context = {
'orders':orders,
'orders_count':orders_count,
}
return render(request, 'shop/accounts/dashboard/my_orders.html', context)
@login_required(login_url = 'accounts:login')
def edit_profile(request):
userprofile = get_object_or_404(UserProfile, user=request.user)
if request.method == 'POST':
user_form = UserForm(request.POST, instance=request.user)
profile_form = UserProfileForm(request.POST, request.FILES, instance=userprofile)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
messages.success(request, 'Your profile has been updated.')
return redirect('accounts:edit_profile')
else:
user_form = UserForm(instance=request.user)
profile_form = UserProfileForm(instance=userprofile)
context = {
'user_form': user_form,
'profile_form': profile_form,
'userprofile': userprofile,
}
return render(request, 'shop/accounts/dashboard/edit_profile.html', context)
@login_required(login_url = 'accounts:login')
def change_password(request):
if request.method == 'POST':
old_password = request.POST['old_password']
new_password = request.POST['new_password']
repeat_new_password = request.POST['repeat_new_password']
user = Account.objects.get(username__exact=request.user.username)
if new_password == repeat_new_password:
success = user.check_password(old_password)
if success :
user.set_password(new_password)
user.save()
auth.login(request, user)
messages.success(request, 'Password Updated successfully.')
return redirect('accounts:change_password')
else:
messages.error(request, 'Old password is wrong')
return redirect('accounts:change_password')
else:
messages.error(request, 'Password does not match')
return redirect('accounts:change_password')
return render(request, 'shop/accounts/dashboard/change_password.html')
@login_required(login_url = 'accounts:login')
def order_detail(request,order_id):
order_detail = OrderProduct.objects.filter(order__order_number=order_id)
order = Order.objects.get(order_number=order_id)
subtotal = 0
for x in order_detail:
subtotal += x.product_price * x.quantity
context = {
'order_detail': order_detail,
'order': order,
'subtotal': subtotal,
}
return render(request, 'shop/accounts/dashboard/order_detail.html', context)
def forget_password(request):
if request.method == 'POST':
email = request.POST['email']
if Account.objects.filter(email=email).exists():
user = Account.objects.get(email__exact=email)
# SEND EMAIL
current_site = get_current_site(request)
subject = 'Reset Your Password'
message = render_to_string('shop/accounts/forget_password/send_resetpassword_email.html', {
'user': user,
'domain': current_site,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
to_email = email
send_email = EmailMessage(subject, message, to=[to_email])
send_email.send()
# essages.success(request, "We sent a verification message to your email, click verify it, and let's start")
return redirect('/account/forget_password/?command=resetpassword&email='+email)
else:
messages.error(request, 'This email does not exist!')
return redirect('accounts:forget_password')
return render(request, 'shop/accounts/forget_password/forget_password.html')
def resetpassword_validate(request, uidb64, token):
try:
uid = force_str(urlsafe_base64_decode(uidb64))
user = Account.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, Account.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
request.session['uid'] = uid
return redirect('accounts:reset_password')
else:
messages.error(request, 'This is link has been expired !')
return redirect('accounts:forget_password')
def reset_password(request):
if request.method == 'POST':
password = request.POST['password']
repeat_password = request.POST['confirm_password']
try:
if password == repeat_password:
uid = request.session.get('uid')
user = Account.objects.get(pk=uid)
user.set_password(password)
user.save()
messages.success(request, 'Password Reset Successful')
return redirect('accounts:login')
else:
messages.error(request, "Password does not match!")
return redirect('accounts:reset_password')
except Account.DoesNotExist:
messages.error(request, "Please enter your email address here first! ")
return redirect('accounts:forget_password')
else:
return render(request, 'shop/accounts/forget_password/reset_password.html')