cmc-sales/cmc-django/cmcsales/cmc/views.py
Karl Cordes 6ad0e74ad6 Add instructions to README for docker compose
add cmc-django
add finley to userpasswd
2025-06-03 07:28:32 +10:00

180 lines
6.9 KiB
Python

from django.shortcuts import render
# views.py
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import DetailView, UpdateView, ListView, CreateView
from django.urls import reverse_lazy
from cmc.models import Enquiry, Customer
from cmc.forms import EnquiryForm
from django.core.paginator import Paginator
import logging
logger = logging.getLogger(__name__)
class EnquiryDetailView(DetailView):
model = Enquiry
template_name = 'enquiry_detail.html'
context_object_name = 'enquiry'
class EnquiryUpdateView(UpdateView):
model = Enquiry
form_class = EnquiryForm
template_name = 'enquiry_form.html'
success_url = reverse_lazy('enquiry_list') # Redirect to a list view or another appropriate view after saving
def form_valid(self, form):
return super().form_valid(form)
def enquiry_list(request):
enquiries = Enquiry.objects.all().order_by("-id")
per_page = 500
paginator = Paginator(enquiries, per_page)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'enquiry_list.html', {'page_obj': page_obj})
class EnquiryCreateView(CreateView):
model = Enquiry
form_class = EnquiryForm
template_name = 'enquiry_form.html'
success_url = reverse_lazy('enquiry_list') # Redirect to a list view or another appropriate view after saving
def form_valid(self, form):
return super().form_valid(form)
def customer_autocomplete(request):
if 'term' in request.POST:
qs = Customer.objects.filter(name__icontains=request.POST.get('term'))
logger.debug(qs)
names = list(qs.values_list('name', flat=True))
return render(request, 'customer_autocomplete.html', {'names': names})
return render(request, 'customer_autocomplete.html', {'names': []})
def customer_form(request):
return render(request, 'customer_form.html')
## AI generated add enquiry
from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse
from .models import Enquiry, Customer, Contact
from .forms import EnquiryForm
def add_enquiry(request):
if request.method == 'POST':
form = EnquiryForm(request.POST)
if form.is_valid():
form.save()
return JsonResponse({'success': True})
else:
form = EnquiryForm()
return render(request, 'add_enquiry.html', {'form': form})
def customer_autocomplete(request):
if 'customer' in request.GET and request.GET['customer'] != '':
qs = Customer.objects.filter(name__icontains(request.GET.get('customer')))
customers = list(qs.values('id', 'name'))
return render(request, 'partials/customer_list.html', {'customers': qs})
return render(request, 'partials/customer_list.html', {'customers': []})
def load_contacts(request):
customer_id = request.GET.get('customer_id')
contacts = Contact.objects.filter(customer_id=customer_id).values('id', 'first_name', 'last_name')
return render(request, 'partials/contact_dropdown.html', {'contacts': contacts})
## end AI generated add enquiry
from django.core.paginator import Paginator
from .models import Customer, CustomerCategory
def customer_list(request):
customer_categories = CustomerCategory.objects.all().order_by('name')
selected_category_id = request.GET.get('showonly')
customer_queryset = Customer.objects.select_related('customer_category', 'country').order_by('name')
if selected_category_id:
try:
selected_category_id = int(selected_category_id)
customer_queryset = customer_queryset.filter(customer_category_id=selected_category_id)
except ValueError:
# Handle invalid category ID if necessary, or ignore
pass
paginator = Paginator(customer_queryset, 25) # Show 25 customers per page
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
context = {
'page_obj': page_obj,
'customer_categories': customer_categories,
'selected_category_id': selected_category_id,
}
return render(request, 'cmc/customer_list.html', context)
# You'll also need views for 'customer_detail', 'customer_edit', 'customer_add'
# For example:
# def customer_detail(request, pk):
# customer = get_object_or_404(Customer, pk=pk)
# return render(request, 'cmc/customer_detail.html', {'customer': customer})
def enquiry_detail(request, pk):
enquiry = get_object_or_404(
Enquiry.objects.select_related(
'customer', 'contact', 'status', 'user', 'state', 'country',
'principle', 'billing_address', 'shipping_address',
'billing_address__state', 'billing_address__country', # Pre-fetch for addresses
'shipping_address__state', 'shipping_address__country'
),
pk=pk
)
# Fetch related objects
# Ensure related_names are set up correctly in your models
quotes = enquiry.quotes.select_related('document').order_by('-document__revision', '-created') # Assuming 'document' and 'created' exist
invoices = enquiry.invoices.select_related('job', 'customer', 'document').order_by('-document__revision', '-issue_date')
jobs = enquiry.jobs.all().order_by('-id') # Or appropriate order
order_acknowledgements = enquiry.order_acknowledgements.select_related('job', 'document').order_by('-id')
# Emails (assuming a ManyToManyField from Enquiry to Email or vice-versa)
emails = enquiry.emails.all().order_by('-udate') # Assuming 'udate' for date
# Principle Contacts (this depends heavily on your PrincipleContact model structure)
# Example: if Principle has a related_name 'contacts' from PrincipleContact
principle_contacts = []
if enquiry.principle:
# This is a placeholder. Adjust based on your actual model relationship.
# For example, if PrincipleContact has a ForeignKey to Principle:
# principle_contacts = PrincipleContact.objects.filter(principle=enquiry.principle)
# Or if Principle has a ManyToMany to Contact through PrincipleContact:
# principle_contacts = enquiry.principle.contacts.all() # if 'contacts' is the M2M field
pass # Replace with actual logic
# Packing Lists (complex in CakePHP, assuming Job has a related_name 'packing_lists')
packing_lists = []
for job in jobs:
# Assuming PackingList has a ForeignKey to Job and a 'document' relation
packing_lists.extend(job.packing_lists.select_related('document').all())
context = {
'enquiry': enquiry,
'quotes': quotes,
'invoices': invoices,
'jobs': jobs,
'order_acknowledgements': order_acknowledgements,
'emails': emails,
'principle_contacts': principle_contacts, # You'll need to fetch this based on your models
'packing_lists': packing_lists,
'page_title': f"Enquiry: {enquiry.title}",
}
return render(request, 'cmc/enquiry_detail.html', context)