Files
he-database/sheets/views.py
2025-08-28 12:22:27 +02:00

228 lines
8.9 KiB
Python

from django.shortcuts import render
from django.http import JsonResponse
from django.db.models import Q
from decimal import Decimal, InvalidOperation
from django.apps import apps
from datetime import date, datetime
from django.utils import timezone
from .models import Client, SecondTableEntry
from django.db.models import Sum
# Clients Page (Main)
def clients_list(request):
# Annual summary data
current_year = int(request.GET.get('year', datetime.now().year))
clients = Client.objects.all()
monthly_data = []
for client in clients:
monthly_totals = []
for month in range(1, 13):
total = SecondTableEntry.objects.filter(
client=client,
date__year=current_year,
date__month=month
).aggregate(total=Sum('lhe_output'))['total'] or 0
monthly_totals.append(total)
monthly_data.append({
'client': client,
'monthly_totals': monthly_totals,
'year_total': sum(monthly_totals)
})
available_years = SecondTableEntry.objects.dates('date', 'year').distinct()
return render(request, 'clients_table.html', {
'monthly_data': monthly_data,
'current_year': current_year,
'available_years': [y.year for y in available_years],
'months': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
})
# Table One View (ExcelEntry)
def table_one_view(request):
ExcelEntry = apps.get_model('sheets', 'ExcelEntry')
entries_table1 = ExcelEntry.objects.all().select_related('client')
clients = Client.objects.all()
return render(request, 'table_one.html', {
'entries_table1': entries_table1,
'clients': clients,
})
# Table Two View (SecondTableEntry)
def table_two_view(request):
try:
SecondTableEntry = apps.get_model('sheets', 'SecondTableEntry')
entries = SecondTableEntry.objects.all().order_by('-date')
clients = Client.objects.all()
return render(request, 'table_two.html', {
'entries_table2': entries,
'clients': clients,
})
except Exception as e:
return render(request, 'table_two.html', {
'error_message': f"Failed to load data: {str(e)}",
'entries_table2': [],
'clients': Client.objects.all()
})
# Add Entry (Generic)
def add_entry(request, model_name):
if request.method == 'POST':
try:
model = apps.get_model('sheets', model_name)
common_data = {
'client': Client.objects.get(id=request.POST.get('client_id')),
'date': request.POST.get('date'),
'notes': request.POST.get('notes', '')
}
if model_name == 'SecondTableEntry':
# Handle Helium Output (Table Two)
lhe_output = request.POST.get('lhe_output')
entry = model.objects.create(
**common_data,
is_warm=request.POST.get('is_warm') == 'true',
lhe_delivery=request.POST.get('lhe_delivery', ''),
lhe_output=Decimal(lhe_output) if lhe_output else None
)
return JsonResponse({
'status': 'success',
'id': entry.id,
'client_name': entry.client.name,
'date': entry.date.strftime('%Y-%m-%d') if entry.date else '',
'is_warm': entry.is_warm,
'lhe_delivery': entry.lhe_delivery,
'lhe_output': str(entry.lhe_output) if entry.lhe_output else '',
'notes': entry.notes
})
elif model_name == 'ExcelEntry':
# Parse the date string into a date object
date_str = request.POST.get('date')
try:
date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() if date_str else None
except (ValueError, TypeError):
date_obj = None
# Create the entry
entry = model.objects.create(
client=Client.objects.get(id=request.POST.get('client_id')),
date=date_obj,
pressure=Decimal(request.POST.get('pressure', 0)),
purity=Decimal(request.POST.get('purity', 0)),
notes=request.POST.get('notes', '')
)
# Prepare the response
response_data = {
'status': 'success',
'id': entry.id,
'client_name': entry.client.name,
'pressure': str(entry.pressure),
'purity': str(entry.purity),
'notes': entry.notes
}
# Only add date if it exists
if entry.date:
response_data['date'] = entry.date.strftime('%Y-%m-%d')
else:
response_data['date'] = None
return JsonResponse(response_data)
# Keep your existing SecondTableEntry code here...
except Exception as e:
return JsonResponse({'status': 'error', 'message': str(e)}, status=400)
return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400)
# Update Entry (Generic)
def update_entry(request, model_name):
if request.method == 'POST':
try:
model = apps.get_model('sheets', model_name)
entry_id = int(request.POST.get('id'))
entry = model.objects.get(id=entry_id)
# Common updates for both models
entry.client = Client.objects.get(id=request.POST.get('client_id'))
entry.date = request.POST.get('date')
entry.notes = request.POST.get('notes', '')
if model_name == 'SecondTableEntry':
# Handle Helium Output (Table Two)
lhe_output = request.POST.get('lhe_output')
entry.is_warm = request.POST.get('is_warm') == 'true'
entry.lhe_delivery = request.POST.get('lhe_delivery', '')
entry.lhe_output = Decimal(lhe_output) if lhe_output else None
entry.save()
return JsonResponse({
'status': 'success',
'id': entry.id,
'client_name': entry.client.name,
'date': entry.date.strftime('%Y-%m-%d') if entry.date else '',
'is_warm': entry.is_warm,
'lhe_delivery': entry.lhe_delivery,
'lhe_output': str(entry.lhe_output) if entry.lhe_output else '',
'notes': entry.notes
})
elif model_name == 'ExcelEntry':
# Handle Helium Input (Table One)
date_str = request.POST.get('date')
try:
date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() if date_str else None
except (ValueError, TypeError):
date_obj = None
entry.client = Client.objects.get(id=request.POST.get('client_id'))
entry.date = date_obj
entry.pressure = Decimal(request.POST.get('pressure', 0))
entry.purity = Decimal(request.POST.get('purity', 0))
entry.notes = request.POST.get('notes', '')
entry.save()
return JsonResponse({
'status': 'success',
'id': entry.id,
'client_name': entry.client.name,
'pressure': str(entry.pressure),
'purity': str(entry.purity),
'date': entry.date.strftime('%Y-%m-%d') if entry.date else '',
'notes': entry.notes
})
except model.DoesNotExist:
return JsonResponse({'status': 'error', 'message': 'Entry not found'}, status=404)
except Exception as e:
return JsonResponse({'status': 'error', 'message': str(e)}, status=400)
return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)
# Delete Entry (Generic)
def delete_entry(request, model_name):
if request.method == 'POST':
try:
model = apps.get_model('sheets', model_name)
entry_id = request.POST.get('id')
entry = model.objects.get(id=entry_id)
entry.delete()
return JsonResponse({'status': 'success', 'message': 'Entry deleted'})
except model.DoesNotExist:
return JsonResponse({'status': 'error', 'message': 'Entry not found'}, status=404)
except Exception as e:
return JsonResponse({'status': 'error', 'message': str(e)}, status=400)
return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400)