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

327 lines
9.7 KiB
Python

from django.shortcuts import render, get_object_or_404
from .decorators import *
from billing.models import *
from billing.add.views import *
from .models import *
from django.db.models import Q
from django.http import Http404
from django.db.models import OuterRef, Subquery
from customercore.views import *
from django.contrib.auth.hashers import check_password
from django.contrib.auth import update_session_auth_hash, logout
import json
# Create your views here.
@customer_login_required
def redirect_osimenu(request):
user_email = request.user.email
key = 'pbkdf2_sha256600000'
url = f"https://osimenu.com/login/{user_email}/{key}/"
return redirect(url)
@customer_login_required
def redirect_osicard(request):
user_email = request.user.email
key = 'pbkdf2_sha256600000'
url = f"https://mybusinesscardpage.com/login/{user_email}/{key}/"
return redirect(url)
# LISTING
@customer_login_required
def customer_invoices(request, *args, **kwargs):
invoices = Invoice.objects.filter(order__customer = request.user.customerprofile)
context = {
'invoices' : invoices,
}
return render(request, 'listing_pages/customer-invoices.html', context)
@customer_login_required
def all_products(request, *args, **kwargs):
context = {
}
return render(request, 'listing_pages/products.html', context)
@customer_login_required
def customer_orders(request, *args, **kwargs):
customer = request.user.customerprofile
orders = Order.objects.filter(customer=customer, orderstatus__isnull=False).order_by('-order_id')
context = {
'orders': orders,
}
return render(request, 'listing_pages/customer-orders.html', context)
def customer_order_details(request, order_id):
order = get_object_or_404(Order, order_id=order_id)
order_items = OrderItem.objects.filter(order=order).order_by('-id')
order_item_ids = order_items.values_list('item_id', flat=True)
services = Item.objects.filter(Q(type='Service') & (Q(customer=order.customer) | Q(customer__isnull=True))).exclude(id__in=order_item_ids).order_by('-id')
products = Item.objects.filter(Q(type='Product') & (Q(customer=order.customer) | Q(customer__isnull=True))).exclude(id__in=order_item_ids).order_by('-id')
payments = OrderPayment.objects.filter(order = order).order_by('-id')
context = {
'order' : order,
'order_items' : order_items,
'services': services,
'payments' : payments,
}
return render(request, 'details_templates/inner-customer-order.html', context)
@customer_login_required
def customer_projects(request, *args, **kwargs):
projects = Project.objects.filter(customer=request.user.customerprofile)
context = {
'projects': projects,
}
return render(request, 'listing_pages/customer-projects.html', context)
@customer_login_required
def customer_project_details(request, project_id):
project = get_object_or_404(Project, project_id=project_id)
context = {
'project': project,
}
return render(request, 'details_templates/inner-customer-project.html', context)
@customer_login_required
def customer_tickets(request, *args, **kwargs):
all_tickets = Ticket.objects.filter(customer=request.user.customerprofile)
all_tickets_with_update_date = all_tickets.annotate(
latest_update_date=Max('ticketupdate__date_added')
)
all_tickets_ordered = all_tickets_with_update_date.order_by('-latest_update_date')
open_tickets = []
closed_tickets = []
for ticket in all_tickets_ordered:
last_status = ticket.ticketstatus_set.last()
if last_status:
last_status = last_status.status
if last_status == 'Closed':
closed_tickets.append(ticket)
else:
open_tickets.append(ticket)
else:
# If no status is found, assume it's open
open_tickets.append(ticket)
for ticket in open_tickets:
unread_updates_count = 0
for ticket_update in ticket.ticketupdate_set.exclude(added_by=request.user):
if not TicketRead.objects.filter(ticket_update=ticket_update, user=request.user, read=True).exists():
unread_updates_count += 1
ticket.unread_updates_count = unread_updates_count
context = {
'open_tickets': open_tickets,
'closed_tickets': closed_tickets,
}
return render(request, 'listing_pages/customer-tickets.html', context)
# DETAILS
@customer_login_required
def customer_ticket_details(request, ticket_number):
ticket = get_object_or_404(Ticket, ticket_number=ticket_number)
# Check if the logged-in user is the customer associated with the ticket
if request.user.is_authenticated:
if ticket.customer != request.user.customerprofile:
raise Http404("Page not found.")
# Subquery to get the last reaction added by the logged-in customer for each ticket update
last_reaction_subquery = TicketUpdateReaction.objects.filter(
ticket_update=OuterRef('pk'),
customer=request.user
).order_by('-id').values('reaction')[:1]
ticket_updates = TicketUpdate.objects.filter(ticket=ticket).annotate(
last_customer_reaction=Subquery(last_reaction_subquery)
).order_by('id')
# Mark updates as read for the current user
for update in TicketUpdate.objects.filter(ticket=ticket).exclude(added_by=request.user).order_by('id'):
if not TicketRead.objects.filter(ticket_update=update, user=request.user).exists():
TicketRead.objects.create(ticket_update=update, user=request.user, read=True)
last_ticket_status = TicketStatus.objects.all().last()
else:
ticket_updates = None
last_ticket_status = None
context = {
'ticket': ticket,
'ticket_updates': ticket_updates,
'last_ticket_status': last_ticket_status,
}
return render(request, 'details_templates/inner-customer-ticket.html', context)
# PRODUCTS
@customer_login_required
def osimenu_plans(request, *args, **kwargs):
osimenu_basic = Item.objects.filter(title='OSIMENU BASIC').first()
osimenu_standard = Item.objects.filter(title='OSIMENU STANDARD').first()
osimenu_premium = Item.objects.filter(title='OSIMENU PREMIUM').first()
active_order_item_basic = OrderItem.objects.filter(order__customer=request.user.customerprofile, item=osimenu_basic, active=True)
active_order_item_standard = OrderItem.objects.filter(order__customer=request.user.customerprofile, item=osimenu_standard, active=True)
active_order_item_premium = OrderItem.objects.filter(order__customer=request.user.customerprofile, item=osimenu_premium, active=True)
context = {
'osimenu_basic': osimenu_basic,
'osimenu_standard': osimenu_standard,
'osimenu_premium': osimenu_premium,
'active_order_item_basic': active_order_item_basic,
'active_order_item_standard': active_order_item_standard,
'active_order_item_premium': active_order_item_premium,
}
return render(request, 'products/osimenu-plans.html', context)
@customer_login_required
def osicard_plans(request, *args, **kwargs):
osicard_basic = Item.objects.filter(title='OSICARD BASIC').first()
active_order_item_basic = OrderItem.objects.filter(order__customer=request.user.customerprofile, item=osicard_basic, active=True)
context = {
'active_order_item_basic': active_order_item_basic,
}
return render(request, 'products/osicard-plans.html', context)
@customer_login_required
def shared_hosting_plans(request, *args, **kwargs):
context = {
}
return render(request, 'products/shared-hosting-plans.html', context)
@customer_login_required
def cloud_vps_hosting_plans(request, *args, **kwargs):
context = {
}
return render(request, 'products/cloud-vps-hosting-plans.html', context)
@customer_login_required
def dedicated_servers_plans(request, *args, **kwargs):
context = {
}
return render(request, 'products/dedicated-servers-plans.html', context)
# USER PROFILE
@customer_login_required
def user_profile(request, *args, **kwargs):
context = {
}
return render(request, 'user_profile_pages/user-profile.html', context)
@customer_login_required
def user_settings(request, *args, **kwargs):
context = {
}
return render(request, 'user_profile_pages/user-settings.html', context)
def change_password(request):
if request.method == 'POST':
current_password = request.POST['current_password']
new_password = request.POST['new_password']
confirm_password = request.POST['confirm_password']
if check_password(current_password, request.user.password):
if new_password == confirm_password:
request.user.set_password(new_password)
request.user.save()
update_session_auth_hash(request, request.user)
logout(request)
return redirect('home')
return render(request, 'accounts/change_password.html')
def check_current_password(request):
if request.method == 'POST':
try:
data = json.loads(request.body.decode('utf-8'))
current_password = data.get('current_password')
except json.JSONDecodeError:
return JsonResponse({'is_current_password_correct': False})
user = request.user
if check_password(current_password, request.user.password):
return JsonResponse({'is_current_password_correct': True})
else:
return JsonResponse({'is_current_password_correct': False})
return JsonResponse({'error': 'Invalid request method'}, status=400)