from django.shortcuts import render, redirect from django.http import HttpResponse from django.template import loader from django.core.urlresolvers import reverse import django.contrib.auth as auth from django.conf import settings # Create your views here. from django.views.generic import TemplateView,ListView from django.views.generic.detail import DetailView from django.views.generic.edit import CreateView, UpdateView, DeleteView from django.core.urlresolvers import reverse_lazy from dispatch.models import Company, Load from django.contrib.auth.models import User from django.contrib.auth.mixins import UserPassesTestMixin from django.http import HttpResponseRedirect from datetime import datetime, timedelta from django.utils import formats from dateutil import rrule def home(request): return render(request,"dispatch/index.html") def get_week_dates(date=None): if date == None: date = formats.date_format(datetime.now(), "SHORT_DATE_FORMAT") dt = datetime.strptime(date, '%m/%d/%Y') weekday = dt.weekday() if weekday == 6: start_date = dt else: weekday = weekday + 1 start_date = dt - timedelta(days=weekday) end_date = start_date + timedelta(days=6) next_week = end_date + timedelta(days=1) previous_week = start_date - timedelta(days=1) return start_date, end_date, next_week, previous_week def split_loads_by_day(loads,start_date,end_date): split_loads = {} for date in rrule.rrule(rrule.DAILY,dtstart=start_date, until=end_date): str_date = formats.date_format(date, "SHORT_DATE_FORMAT") if str_date not in split_loads: split_loads[str_date] = loads.filter(date=date) return split_loads class LoadDateSort(DetailView): def get_context_data(self, **kwargs): context = super(DetailView, self).get_context_data(**kwargs) start_date, end_date, next_week, previous_week = get_week_dates(self.request.GET.get('date',None)) loads = self.get_object().load_set.filter(date__range=(start_date, end_date)).prefetch_related('company') context['loads'] = split_loads_by_day(loads,start_date,end_date) context['start_date'] = formats.date_format(start_date, "SHORT_DATE_FORMAT") context['end_date'] = formats.date_format(end_date, "SHORT_DATE_FORMAT") context['next_week'] = formats.date_format(next_week, "SHORT_DATE_FORMAT") context['previous_week'] = formats.date_format(previous_week, "SHORT_DATE_FORMAT") return context class FilteredListView(ListView): def get_queryset(self): base_qs = super(FilteredListView, self).get_queryset() if not self.request.user.is_superuser: return base_qs.filter(user=self.request.user) return base_qs class FilteredUpdateView(UpdateView): def get_queryset(self): base_qs = super(FilteredUpdateView, self).get_queryset() if not self.request.user.is_superuser: return base_qs.filter(user=self.request.user) return base_qs class FilteredDeleteView(DeleteView): def get_queryset(self): base_qs = super(FilteredDeleteView, self).get_queryset() if not self.request.user.is_superuser: return base_qs.filter(user=self.request.user) return base_qs # Driver CRUD class DriverList(UserPassesTestMixin, ListView): template_name = "dispatch/drivers/list.html" model = User def test_func(self): return self.request.user.is_superuser class DriverDetail(LoadDateSort): template_name = "dispatch/drivers/detail.html" model = User def test_func(self): return self.request.user.is_superuser class DriverUpdate(UpdateView): template_name = "dispatch/drivers/edit.html" model = User success_url = reverse_lazy('driver_list') fields = ['username', 'first_name','last_name','email','groups', 'is_active'] def test_func(self): return self.request.user.is_superuser # Company CRUD class CompanyList(ListView): template_name = "dispatch/companies/list.html" model = Company class CompanyCreate(CreateView): template_name = "dispatch/companies/create.html" model = Company success_url = reverse_lazy('company_list') fields = ['name', 'address', 'phone_number','email_address'] class CompanyDetail(LoadDateSort): template_name = "dispatch/companies/detail.html" model = Company class CompanyUpdate(UpdateView): template_name = "dispatch/loads/edit.html" model = Company success_url = reverse_lazy('company_list') fields = ['name', 'address', 'phone_number','email_address'] class CompanyDelete(DeleteView): template_name = "dispatch/loads/delete.html" model = Company success_url = reverse_lazy('company_list') def test_func(self): return self.request.user.is_superuser # Load CRUD class LoadList(FilteredListView): template_name = "dispatch/loads/list.html" model = Load def get_queryset(self): base_qs = super(LoadList, self).get_queryset() start_date, end_date, next_week, previous_week = get_week_dates(self.request.GET.get('date',None)) return base_qs.filter(date__range=(start_date, end_date)) def get_context_data(self, **kwargs): context = super(LoadList, self).get_context_data(**kwargs) start_date, end_date, next_week, previous_week = get_week_dates(self.request.GET.get('date',None)) context['start_date'] = formats.date_format(start_date, "SHORT_DATE_FORMAT") context['end_date'] = formats.date_format(end_date, "SHORT_DATE_FORMAT") context['next_week'] = formats.date_format(next_week, "SHORT_DATE_FORMAT") context['previous_week'] = formats.date_format(previous_week, "SHORT_DATE_FORMAT") context['loads'] = split_loads_by_day(self.object_list,start_date,end_date) return context class LoadCreate(CreateView): template_name = "dispatch/loads/create.html" model = Load success_url = reverse_lazy('load_list') fields = ['date', 'company','description','amount'] def get(self,request): if request.user.is_superuser: self.fields.insert(1,'user') return super(LoadCreate, self).get(request) def form_valid(self, form): if not self.request.user.is_superuser: load = form.save(commit=False) load.user = self.request.user return super(LoadCreate, self).form_valid(form) class LoadDetail(DetailView): template_name = "dispatch/loads/detail.html" model = Load def get_context_data(self, **kwargs): context = super(LoadDetail, self).get_context_data(**kwargs) return context class LoadUpdate(FilteredUpdateView): template_name = "dispatch/loads/edit.html" model = Load success_url = reverse_lazy('load_list') fields = ['date', 'company','load_number','description','amount'] def get(self,request,pk): if request.user.is_superuser: self.fields.insert(1,'user') return super(LoadUpdate, self).get(request) def form_valid(self, form): if not self.request.user.is_superuser: load = form.save(commit=False) load.user = self.request.user return super(LoadUpdate, self).form_valid(form) class LoadDelete(FilteredDeleteView): template_name = "dispatch/loads/delete.html" model = Load success_url = reverse_lazy('load_list')