Files
ups-infra/ups_management/ups_manager/views.py

321 lines
11 KiB
Python
Raw Normal View History

import logging
2026-04-28 17:11:19 +08:00
from django.shortcuts import render, redirect
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from django.contrib import messages
2026-04-28 17:11:19 +08:00
from .models import UPSHost, Battery, Contact, Supplier, MaintenanceRecord
from .forms import BatteryFormSet, UPSHostForm
2026-04-28 17:11:19 +08:00
logger = logging.getLogger(__name__)
2026-04-28 17:11:19 +08:00
class DashboardView(ListView):
template_name = 'ups_manager/index.html'
context_object_name = 'dashboard_data'
def get_queryset(self):
return None
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['ups_count'] = UPSHost.objects.count()
context['battery_count'] = Battery.objects.count()
context['contact_count'] = Contact.objects.count()
context['supplier_count'] = Supplier.objects.count()
context['maintenance_count'] = MaintenanceRecord.objects.count()
context['recent_maintenances'] = MaintenanceRecord.objects.order_by('-maintenance_date')[:5]
context['recent_batteries'] = Battery.objects.order_by('-created_at')[:5]
ups_with_batteries = []
for ups in UPSHost.objects.prefetch_related('battery_set').all():
batteries = ups.battery_set.all()
if batteries:
for battery in batteries:
ups_with_batteries.append({
'ups_brand': ups.brand,
'ups_model': ups.model,
'ups_quantity': ups.quantity,
'battery_brand': battery.brand,
'battery_location': battery.location,
'battery_model': battery.model,
'battery_weight': battery.weight,
'battery_quantity': battery.quantity,
})
else:
ups_with_batteries.append({
'ups_brand': ups.brand,
'ups_model': ups.model,
'ups_quantity': ups.quantity,
'battery_brand': '-',
'battery_location': ups.location,
'battery_model': '-',
'battery_weight': '-',
'battery_quantity': '-',
})
context['ups_with_batteries'] = ups_with_batteries
locations = {}
for ups in UPSHost.objects.all():
if ups.location not in locations:
locations[ups.location] = {
'ups_count': 0,
'battery_count': 0,
'total_weight': 0,
'ups_models': []
}
locations[ups.location]['ups_count'] += ups.quantity
locations[ups.location]['ups_models'].append(f"{ups.brand} {ups.model}")
for battery in ups.battery_set.all():
locations[ups.location]['battery_count'] += battery.quantity
locations[ups.location]['total_weight'] += battery.weight * battery.quantity
context['location_summary'] = sorted(locations.items(), key=lambda x: x[0])
return context
class UPSHostListView(ListView):
model = UPSHost
template_name = 'ups_manager/ups_list.html'
context_object_name = 'ups_list'
paginate_by = 10
def get_queryset(self):
queryset = super().get_queryset().prefetch_related('battery_set')
2026-04-28 17:11:19 +08:00
brand = self.request.GET.get('brand')
model = self.request.GET.get('model')
location = self.request.GET.get('location')
contact = self.request.GET.get('contact')
if brand:
queryset = queryset.filter(brand__icontains=brand)
if model:
queryset = queryset.filter(model__icontains=model)
if location:
queryset = queryset.filter(location__icontains=location)
if contact:
queryset = queryset.filter(contact__name__icontains=contact)
return queryset.order_by('-created_at')
class UPSHostCreateView(CreateView):
model = UPSHost
template_name = 'ups_manager/ups_form.html'
form_class = UPSHostForm
2026-04-28 17:11:19 +08:00
success_url = reverse_lazy('ups_list')
class UPSHostUpdateView(UpdateView):
model = UPSHost
template_name = 'ups_manager/ups_form.html'
form_class = UPSHostForm
2026-04-28 17:11:19 +08:00
success_url = reverse_lazy('ups_list')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.request.POST:
context['battery_formset'] = BatteryFormSet(self.request.POST, instance=self.object)
else:
context['battery_formset'] = BatteryFormSet(instance=self.object)
return context
def form_valid(self, form):
logger.info(f"POST data: {self.request.POST}")
logger.info(f"Form data: {form.cleaned_data}")
logger.info(f"last_maintenance_date value: {form.cleaned_data.get('last_maintenance_date')}")
self.object = form.save()
if self.request.POST:
battery_formset = BatteryFormSet(self.request.POST, instance=self.object)
if battery_formset.is_valid():
battery_formset.save()
messages.success(self.request, 'UPS主机和电池信息已更新')
return redirect(self.success_url)
def form_invalid(self, form):
logger.error(f"Form errors: {form.errors}")
return super().form_invalid(form)
2026-04-28 17:11:19 +08:00
class UPSHostDeleteView(DeleteView):
model = UPSHost
template_name = 'ups_manager/ups_confirm_delete.html'
success_url = reverse_lazy('ups_list')
class BatteryListView(ListView):
model = Battery
template_name = 'ups_manager/battery_list.html'
context_object_name = 'battery_list'
paginate_by = 10
def get_queryset(self):
queryset = super().get_queryset()
model = self.request.GET.get('model')
brand = self.request.GET.get('brand')
location = self.request.GET.get('location')
if model:
queryset = queryset.filter(model__icontains=model)
if brand:
queryset = queryset.filter(brand__icontains=brand)
if location:
queryset = queryset.filter(location__icontains=location)
return queryset.order_by('-created_at')
class BatteryCreateView(CreateView):
model = Battery
template_name = 'ups_manager/battery_form.html'
fields = ['brand', 'model', 'weight', 'quantity', 'location', 'install_date', 'last_maintenance_date', 'ups_host']
success_url = reverse_lazy('battery_list')
class BatteryUpdateView(UpdateView):
model = Battery
template_name = 'ups_manager/battery_form.html'
fields = ['brand', 'model', 'weight', 'quantity', 'location', 'install_date', 'last_maintenance_date', 'ups_host']
success_url = reverse_lazy('battery_list')
class BatteryDeleteView(DeleteView):
model = Battery
template_name = 'ups_manager/battery_confirm_delete.html'
success_url = reverse_lazy('battery_list')
class ContactListView(ListView):
model = Contact
template_name = 'ups_manager/contact_list.html'
context_object_name = 'contact_list'
paginate_by = 10
def get_queryset(self):
queryset = super().get_queryset()
name = self.request.GET.get('name')
phone = self.request.GET.get('phone')
if name:
queryset = queryset.filter(name__icontains=name)
if phone:
queryset = queryset.filter(phone__icontains=phone)
return queryset.order_by('-created_at')
class ContactCreateView(CreateView):
model = Contact
template_name = 'ups_manager/contact_form.html'
fields = ['name', 'phone', 'email']
success_url = reverse_lazy('contact_list')
class ContactUpdateView(UpdateView):
model = Contact
template_name = 'ups_manager/contact_form.html'
fields = ['name', 'phone', 'email']
success_url = reverse_lazy('contact_list')
class ContactDeleteView(DeleteView):
model = Contact
template_name = 'ups_manager/contact_confirm_delete.html'
success_url = reverse_lazy('contact_list')
class SupplierListView(ListView):
model = Supplier
template_name = 'ups_manager/supplier_list.html'
context_object_name = 'supplier_list'
paginate_by = 10
def get_queryset(self):
queryset = super().get_queryset()
company_name = self.request.GET.get('company_name')
contact_person = self.request.GET.get('contact_person')
if company_name:
queryset = queryset.filter(company_name__icontains=company_name)
if contact_person:
queryset = queryset.filter(contact_person__icontains=contact_person)
return queryset.order_by('-created_at')
class SupplierCreateView(CreateView):
model = Supplier
template_name = 'ups_manager/supplier_form.html'
fields = ['company_name', 'contact_person', 'phone', 'email', 'address', 'remark']
success_url = reverse_lazy('supplier_list')
class SupplierUpdateView(UpdateView):
model = Supplier
template_name = 'ups_manager/supplier_form.html'
fields = ['company_name', 'contact_person', 'phone', 'email', 'address', 'remark']
success_url = reverse_lazy('supplier_list')
class SupplierDeleteView(DeleteView):
model = Supplier
template_name = 'ups_manager/supplier_confirm_delete.html'
success_url = reverse_lazy('supplier_list')
class MaintenanceListView(ListView):
2026-04-28 17:11:19 +08:00
model = MaintenanceRecord
template_name = 'ups_manager/maintenance_list.html'
context_object_name = 'maintenance_list'
paginate_by = 10
def get_queryset(self):
queryset = super().get_queryset()
ups_host = self.request.GET.get('ups_host')
2026-04-28 17:11:19 +08:00
technician = self.request.GET.get('technician')
if ups_host:
queryset = queryset.filter(ups_host__model__icontains=ups_host)
2026-04-28 17:11:19 +08:00
if technician:
queryset = queryset.filter(technician__icontains=technician)
return queryset.order_by('-maintenance_date')
class HostMaintenanceCreateView(CreateView):
2026-04-28 17:11:19 +08:00
model = MaintenanceRecord
template_name = 'ups_manager/host_maintenance_form.html'
fields = ['ups_host', 'supplier', 'maintenance_date', 'technician', 'content']
2026-04-28 17:11:19 +08:00
success_url = reverse_lazy('maintenance_list')
def form_valid(self, form):
form.instance.maintenance_type = 'host'
return super().form_valid(form)
class BatteryMaintenanceCreateView(CreateView):
model = MaintenanceRecord
template_name = 'ups_manager/battery_maintenance_form.html'
fields = ['ups_host', 'battery', 'supplier', 'maintenance_date', 'technician', 'content']
success_url = reverse_lazy('maintenance_list')
def form_valid(self, form):
form.instance.maintenance_type = 'battery'
return super().form_valid(form)
2026-04-28 17:11:19 +08:00
class MaintenanceUpdateView(UpdateView):
2026-04-28 17:11:19 +08:00
model = MaintenanceRecord
template_name = 'ups_manager/maintenance_form.html'
fields = ['ups_host', 'battery', 'supplier', 'maintenance_date', 'technician', 'content']
2026-04-28 17:11:19 +08:00
success_url = reverse_lazy('maintenance_list')
class MaintenanceDeleteView(DeleteView):
2026-04-28 17:11:19 +08:00
model = MaintenanceRecord
template_name = 'ups_manager/maintenance_confirm_delete.html'
success_url = reverse_lazy('maintenance_list')