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.filter(ticket=ticket).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) # CLOSE TICKET CONFIRMATION MODAL @customer_login_required def close_ticket_status_modal(request, *args, **kwargs): context = { } return render(request, 'edit_templates/close-ticket-status-modal.html', context)