Files
he-database/sheets/signals.py

82 lines
3.3 KiB
Python

# sheets/signals.py
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.db.models import Sum
from django.db.models.functions import Coalesce
from decimal import Decimal
# IMPORT THE MODELS AT THE TOP
from .models import ExcelEntry, SecondTableEntry, MonthlySheet, Cell
@receiver([post_save, post_delete], sender=ExcelEntry)
def update_top_right_helium_input(sender, instance, **kwargs):
"""Update top-right table when ExcelEntry changes"""
if instance.date:
# Get the monthly sheet for this date
sheet = MonthlySheet.objects.filter(
year=instance.date.year,
month=instance.date.month
).first()
if sheet:
# Re-populate helium input data
from .views import MonthlySheetView
view = MonthlySheetView()
view.populate_helium_input_to_top_right(sheet)
@receiver([post_save, post_delete], sender=SecondTableEntry)
def update_monthly_sheet_bezug(sender, instance, **kwargs):
"""Update B11 (Bezug) in monthly sheet when SecondTableEntry changes - ONLY for non-start sheets"""
if instance.date and instance.client:
# Check if this is the start sheet (2025-01)
if instance.date.year == 2025 and instance.date.month == 1:
return # Don't auto-update for start sheet
# Get or create the monthly sheet for this date
sheet, created = MonthlySheet.objects.get_or_create(
year=instance.date.year,
month=instance.date.month
)
# Calculate total LHe output for this client in this month
lhe_output_sum = SecondTableEntry.objects.filter(
client=instance.client,
date__year=instance.date.year,
date__month=instance.date.month
).aggregate(
total=Coalesce(Sum('lhe_output'), Decimal('0'))
)['total']
# Update B11 cell (row_index 8 = Excel B11) in TOP-LEFT table
b11_cell_left = Cell.objects.filter(
sheet=sheet,
table_type='top_left',
client=instance.client,
row_index=8 # Excel B11
).first()
if b11_cell_left and (b11_cell_left.value != lhe_output_sum or b11_cell_left.value is None):
b11_cell_left.value = lhe_output_sum
b11_cell_left.save()
# Import here to avoid circular imports
from .views import SaveCellsView
save_view = SaveCellsView()
save_view.calculate_top_left_dependents(sheet, b11_cell_left)
# ALSO update Bezug (row_index 8) in TOP-RIGHT table
b11_cell_right = Cell.objects.filter(
sheet=sheet,
table_type='top_right',
client=instance.client,
row_index=8 # Excel row 12 = Bezug
).first()
if b11_cell_right and (b11_cell_right.value != lhe_output_sum or b11_cell_right.value is None):
b11_cell_right.value = lhe_output_sum
b11_cell_right.save()
# Also trigger top-right calculations
from .views import SaveCellsView
save_view = SaveCellsView()
save_view.calculate_top_right_dependents(sheet, b11_cell_right)