from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.shortcuts import render, redirect from django.views import View from django.views.generic import ListView from common.models import CompanyModel from common.utils.utils import get_preinfo_by_number, get_container_by_number, filter_queryset_by_user from containers.models import Container class ClientContainersListView(LoginRequiredMixin, UserPassesTestMixin, ListView): template_name = 'employee/containers-list.html' model = Container context_object_name = 'objects' paginate_by = 20 def test_func(self): return self.request.user.user_type in ('CA', 'CL') def get_queryset(self): queryset = super().get_queryset() queryset = filter_queryset_by_user(queryset, self.request.user) data_filter = self.request.GET.get('filter') if data_filter != 'all': queryset = queryset.filter(expedited=False) queryset = queryset.order_by('-received_on') return queryset class ReportContainersUnpaidListView(LoginRequiredMixin, UserPassesTestMixin, ListView): template_name = 'employee/unpaid-list.html' model = Container context_object_name = 'objects' paginate_by = 20 def test_func(self): return self.request.user.has_company_perm('can_manage_payment') or self.request.user.user_type == 'CA' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['companies'] = CompanyModel.objects.all().order_by('name') return context def get_queryset(self): queryset = self.model.objects.filter(expedited=True) # Get date from request parameters date = self.request.GET.get('date') if date: queryset = queryset.filter(expedited_on__date__lte=date) # Get company from request parameters company = self.request.user.company if company: queryset = queryset.filter(line__company_id=company) # Add payment filter to show only unpaid containers queryset = queryset.filter(payment_containers__isnull=True) return queryset.order_by('-expedited_on') class ContainerSearchView(LoginRequiredMixin, UserPassesTestMixin, View): template_name = 'barrier/container-search.html' # Single template for all searches def test_func(self): return self.request.user.user_type in ('CA', 'CL') def get(self, request): search_type = request.GET.get('param') # container_receive or container_expedition return render(request, self.template_name, {'search_type': search_type}) def post(self, request): number = request.POST.get('number') search_type = request.POST.get('search_type') if search_type == 'container_receive': preinfo = get_preinfo_by_number(number) if preinfo: return redirect('receive_container', pk=preinfo.pk) else: # container_expedition container = get_container_by_number(number) if container: return redirect('expedite_container', pk=container.pk) return render(request, self.template_name, { 'error': 'Not found', 'search_type': search_type })