You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
depot_django/containers/views/barrier_views.py

311 lines
12 KiB
Python

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.shortcuts import render, redirect
from django.urls import reverse_lazy
from django.utils import timezone
from django.views import View
from django.views.generic import CreateView, UpdateView, FormView, ListView
from booking.models import Booking
from common.utils.utils import get_container_by_number
from containers.forms import ContainerReceiveForm, ContainerExpeditionForm
from containers.models import Container, ContainerPhotos
from containers.services import get_container_for_booking
from preinfo.models import Preinfo
# Create your views here.
class ContainerReceiveView(LoginRequiredMixin, UserPassesTestMixin, FormView):
template_name = 'container-receive.html'
form_class = ContainerReceiveForm
success_url = reverse_lazy('container_photos')
def test_func(self):
return self.request.user.user_type == 'BS'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['show_search'] = True
search_number = self.request.GET.get('number')
if search_number:
preinfo = Preinfo.objects.filter(container_number=search_number).first()
if preinfo:
form = self.form_class(initial={'number': preinfo.container_number})
context.update({
'form': form,
'preinfo': preinfo,
'search_number': search_number,
'show_search': False
})
else:
context.update({
'error': 'Preinfo for this container not found',
'search_number': search_number
})
return context
def form_valid(self, form):
container = form.save(commit=False)
preinfo = Preinfo.objects.filter(container_number=self.request.POST.get('number')).first()
preinfo.received = True
preinfo.save()
# Set required fields from preinfo
container.container_type = preinfo.container_type
container.line = preinfo.line
container.received_by = self.request.user
container.preinfo = preinfo
container.save()
return redirect('container_photos', pk=container.pk)
def get_form(self, form_class=None):
form = super().get_form(form_class)
search_number = self.request.GET.get('number') # Changed from search_number
if search_number:
preinfo = Preinfo.objects.filter(container_number=search_number).first()
if preinfo:
form.initial['number'] = preinfo.container_number
form.fields['number'].widget.readonly = True
return form
def form_invalid(self, form):
return self.render_to_response(self.get_context_data(
form=form,
search_number=self.request.POST.get('number'),
show_search=False
))
class ContainerSearchView(View):
template_name = 'container-search.html'
def get(self, request):
return render(request, self.template_name)
def post(self, request):
booking = Booking.objects.get(number=request.POST.get('number'))
if not booking:
return render(request, self.template_name, {'error': 'Booking not found'})
filters = {
'expedited': False,
}
if booking.container_number:
filters['container_number'] = booking.container_number
else:
filters['container_type'] = booking.container_type
filters['line'] = booking.line
container = Container.objects.filter(**filters).order_by('received_on').first()
if not container:
return render(request, self.template_name, {'error': 'Not found'})
next_url = request.POST.get('param')
return redirect(next_url, pk=booking.pk)
# class ContainerExpedition(UpdateView):
# template_name = 'container-expedition.html'
# model = Container
# form_class = ContainerExpeditionForm
# success_url = reverse_lazy('dashboard')
#
# def get_context_data(self, **kwargs):
# context = super().get_context_data(**kwargs)
# pk = self.kwargs.get('pk')
# booking = Booking.objects.get(pk=pk)
# filters = {
# 'expedited': False,
# }
# if booking.container_number:
# filters['container_number'] = booking.container_number
# else:
# filters['container_type'] = booking.container_type
# filters['line'] = booking.line
#
# container = Container.objects.filter(**filters).order_by('received_on').first()
# context['container'] = container
# context['booking'] = booking
# return context
#
# def form_valid(self, form):
# booking_id = self.request.POST.get('booking_id')
# container_id = self.request.POST.get('container_id')
#
# try:
# booking = Booking.objects.get(id=booking_id)
# container = Container.objects.get(id=container_id)
# vehicle = form.cleaned_data['expedition_vehicle']
# # Update container
# container.expedited = True
# container.expedited_on = timezone.now()
# container.expedited_by = self.request.user
# container.expedition_vehicle = vehicle
# container.booking = booking
# container.save()
#
# # Update booking status if needed
# booking.container_expedited_count += 1
# if booking.vehicles:
# vehicles_list = booking.vehicles.split(',')
# if vehicle in vehicles_list:
# vehicles_list.remove(vehicle)
# booking.vehicles = ','.join(vehicles_list)
# if booking.container_expedited_count >= booking.container_count:
# booking.status = 'completed' # or any other status you want to set
# booking.save()
#
# return redirect(self.success_url)
#
# except (Booking.DoesNotExist, Container.DoesNotExist):
# form.add_error(None, 'Invalid booking or container')
# return self.form_invalid(form)
#
#
# # try:
# # booking = Booking.objects.get(id=booking_id)
# # except Booking.DoesNotExist:
# # booking = None
# # # validate if data is correct, comparing user data with booking data
# # if booking and booking.container_number == form.cleaned_data.get('container_number') and not booking.expedited:
# # booking.expedited = True
# # booking.save()
# #
# # form.instance.expedited_by = self.request.user
# # form.instance.line = booking.line
# # form.instance.container_type = booking.container_type
# # else:
# # form.add_error('container_number', 'Invalid data')
#
# # if preinfo:
# # context['preinfo'] = preinfo
# # context['containers'] = Container.objects.order_by('-received_on').all()[:10] # Fetch the last 10 containers
# # return context
# # return redirect(reverse_lazy('container_search'))
class ContainerExpedition(LoginRequiredMixin, UserPassesTestMixin, FormView):
template_name = 'container-expedition.html'
form_class = ContainerExpeditionForm
success_url = reverse_lazy('barrier_dashboard')
def test_func(self):
return self.request.user.user_type == 'BS'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['show_search'] = True
search_number = self.request.GET.get('number')
if search_number:
booking = Booking.objects.filter(number=search_number).first()
if booking:
container = get_container_for_booking(booking)
if container:
# Initialize form with container data
form = self.form_class(initial={
'number': container.number,
'position': container.position,
'line': container.line.id,
'container_type': container.container_type.id,
'damages': container.damages,
'heavy_damaged': container.heavy_damaged,
'expedition_vehicle': container.expedition_vehicle
})
context.update({
'form': form,
'booking': booking,
'container': container,
'search_number': search_number,
'show_search': False
})
else:
context.update({
'error': 'No available container found for this booking',
'search_number': search_number
})
else:
context.update({
'error': 'Booking not found',
'search_number': search_number
})
return context
def form_valid(self, form):
booking_id = self.request.POST.get('booking_id')
container_id = self.request.POST.get('container_id')
try:
booking = Booking.objects.get(id=booking_id)
container = Container.objects.get(id=container_id)
# Update container
container.expedited = True
container.expedited_on = timezone.now()
container.expedited_by = self.request.user
container.expedition_vehicle = form.cleaned_data['expedition_vehicle']
container.booking = booking
container.save()
# Update booking
booking.container_expedited_count += 1
if booking.vehicles:
vehicles_list = booking.vehicles.split(',')
if container.expedition_vehicle in vehicles_list:
vehicles_list.remove(container.expedition_vehicle)
booking.vehicles = ','.join(vehicles_list)
if booking.container_expedited_count >= booking.container_count:
booking.status = 'completed'
booking.save()
return redirect(self.success_url)
except (Booking.DoesNotExist, Container.DoesNotExist):
form.add_error(None, 'Invalid booking or container')
return self.form_invalid(form)
def form_invalid(self, form):
print("Form errors:", form.errors) # Debug print
print("Form data:", form.data) # Debug print
return self.render_to_response(self.get_context_data(
form=form,
search_number=self.request.POST.get('number'),
show_search=False
))
def get_form(self, form_class=None):
form_class = self.get_form_class()
if self.request.method == 'POST':
search_number = self.request.POST.get('search_number')
booking = Booking.objects.filter(number=search_number).first()
if booking:
container = get_container_for_booking(booking)
if container:
data = self.request.POST.copy()
data.update({
'number': container.number,
'position': container.position,
'line': container.line,
'container_type': container.container_type,
'damages': container.damages,
'heavy_damaged': container.heavy_damaged,
})
return form_class(data)
return form_class()
# containers/views/barrier_views.py
class ContainerPhotosView(View):
template_name = 'container-photos.html'
def get(self, request, pk):
container = Container.objects.get(pk=pk)
photos = ContainerPhotos.objects.filter(container=container)
return render(request, self.template_name, {
'container': container,
'photos': photos,
'photos_count': photos.count()
})