from datetime import timedelta from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.shortcuts import render from django.urls import reverse_lazy from django.utils import timezone from django.views.generic import TemplateView, ListView, CreateView, UpdateView from DepoT.mixins.LineFiltweFormMixin import LineFilterFormMixin from booking.models import Booking from common.forms.company import CompanyCreateForm, CompanyUpdateForm from common.forms.line import LineCreateForm, LineUpdateForm from common.models import CompanyModel, LinesModel from common.utils.utils import filter_queryset_by_user from containers.models import Container from payments.models import Payment from preinfo.models import Preinfo from django.db.models import Q class ClientDashboardView(LoginRequiredMixin, TemplateView): template_name = 'client-dashboard-content.html' extra_context = { 'title': 'Client Dashboard', 'description': 'This is the client dashboard page.', } def test_func(self): return self.request.user.user_type in ('CA', 'CL') def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) user = self.request.user today = timezone.now() last_week = today - timedelta(days=7) containers_queryset = filter_queryset_by_user(Container.objects, user) preinfo_queryset = filter_queryset_by_user(Preinfo.objects.filter(deleted=False), user) bookings_queryset = filter_queryset_by_user(Booking.objects.filter(~Q(status='deleted')), user) payment_queryset = Payment.objects.filter(company=user.company) containers = containers_queryset.filter(expedited=False).count() containers_week = containers_queryset.filter(received_on__gte=last_week).count() preinfos = preinfo_queryset.filter(received=False).count() preinfos_week = preinfo_queryset.filter(created_on__gte=last_week).count() bookings = bookings_queryset.filter(status='active').count() bookings_week = bookings_queryset.filter(created_on__gte=last_week).count() context['containers'] = containers context['preinfos'] = preinfos context['bookings'] = bookings context['containers_week'] = containers_week context['preinfos_week'] = preinfos_week context['bookings_week'] = bookings_week context['recent_containers'] = containers_queryset.order_by('-expedited_on', '-received_on')[:10] context['recent_payments'] = payment_queryset.order_by('-created_on')[:10] return context class ClientCompanyListView(LoginRequiredMixin, UserPassesTestMixin, ListView): model = CompanyModel template_name = 'common/../../templates/employee/company-list.html' context_object_name = 'objects' paginate_by = 20 # base_template = 'client-base.html' def test_func(self): return self.request.user.user_type in ('CA', 'CL') # def get_context_data(self, **kwargs): # context = super().get_context_data(**kwargs) # context['base_template'] = self.base_template # return context def get_queryset(self): queryset = super().get_queryset() user = self.request.user queryset = filter_queryset_by_user(queryset, user) data_filter = self.request.GET.get('filter') if data_filter != 'all': queryset = queryset.filter(status='active') queryset = queryset.order_by('-name') return queryset class ClientCompanyCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView): model = CompanyModel template_name = 'common/../../templates/employee/company-create.html' form_class = CompanyCreateForm success_url = reverse_lazy('client-company') def test_func(self): return True # self.request.user.has_company_perm('can_create_preinfo') or self.request.user.user_type == 'CA' # def form_valid(self, form): # form.instance.created_by = self.request.user # form.instance.updated_by = self.request.user # return super().form_valid(form) class ClientCompanyUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = CompanyModel template_name = 'common/../../templates/employee/company-update.html' form_class = CompanyUpdateForm success_url = reverse_lazy('client-company') def test_func(self): return True # self.request.user.ha.s_company_perm('can_edit_preinfo') or self.request.user.user_type == 'CA' # def form_valid(self, form): # form.instance.updated_by = self.request.user # return super().form_valid(form) class ClientLineListView(LoginRequiredMixin, UserPassesTestMixin, ListView): model = LinesModel template_name = 'client/line-list.html' context_object_name = 'objects' paginate_by = 20 def test_func(self): return self.request.user.user_type == 'CA' def get_queryset(self): queryset = super().get_queryset() user = self.request.user queryset = queryset.filter(company=user.company) data_filter = self.request.GET.get('filter') if data_filter != 'all': queryset = queryset.filter(active=True) queryset = queryset.order_by('-name') return queryset class ClientLineCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView): model = LinesModel template_name = 'client/line-create.html' form_class = LineCreateForm success_url = reverse_lazy('client-line') def test_func(self): return self.request.user.user_type == 'CA' def get_form(self, form_class=None): form = super().get_form(form_class) form.fields['company'].queryset = CompanyModel.objects.filter(id=self.request.user.company.id) form.fields['company'].initial = self.request.user.company.id return form def form_valid(self, form): # todo more validation form.instance.company = self.request.user.company return super().form_valid(form) class ClientLineUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = LinesModel template_name = 'client/line-update.html' form_class = LineUpdateForm success_url = reverse_lazy('client-company') def test_func(self): return self.request.user.user_type == 'CA' def get_form(self, form_class=None): form = super().get_form(form_class) form.fields['company'].queryset = CompanyModel.objects.filter(id=self.request.user.company.id) form.fields['company'].initial = self.request.user.company.id return form def form_valid(self, form): # todo more validation form.instance.company = self.request.user.company return super().form_valid(form)