passerelle-montpellier-enco.../passerelle_montpellier_enco.../views.py

208 lines
7.0 KiB
Python

# passerelle-montpellier-encombrants
# Copyright (C) 2015 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime
from django.urls import reverse, reverse_lazy
from django.views.generic import DetailView, ListView
from django.views.generic.base import View
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView
from django.db import transaction
from passerelle import utils as passerelle_utils
from .models import EncombrantsManagement, Sector, Commune, CollectDay, Street
from .forms import (
EncombrantsManagementForm,
EncombrantsManagementUpdateForm,
CommuneForm,
StreetsForm,
NoStreetsCommuneForm,
)
from .forms import SectorForm
from .utils import prefix_cleanup, get_sector
class EncombrantsManagementDetailView(DetailView):
model = EncombrantsManagement
template_name = 'passerelle_montpellier_encombrants/detail.html'
class EncombrantsManagementCreateView(CreateView):
model = EncombrantsManagement
form_class = EncombrantsManagementForm
template_name = 'passerelle/manage/service_form.html'
class EncombrantsManagementUpdateView(UpdateView):
model = EncombrantsManagement
form_class = EncombrantsManagementUpdateForm
template_name = 'passerelle/manage/service_form.html'
class EncombrantsManagementDeleteView(DeleteView):
model = EncombrantsManagement
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class SectorListView(ListView):
model = Sector
def get_context_data(self, **kwargs):
context = super(SectorListView, self).get_context_data(**kwargs)
context['object'] = EncombrantsManagement.objects.all()[0]
return context
class SectorCreateView(CreateView):
model = Sector
form_class = SectorForm
template_name = 'passerelle/manage/service_form.html'
success_url = reverse_lazy('montpellier-encombrants-sector-listing')
class SectorUpdateView(UpdateView):
model = Sector
form_class = SectorForm
template_name = 'passerelle/manage/service_form.html'
success_url = reverse_lazy('montpellier-encombrants-sector-listing')
class SectorDeleteView(DeleteView):
model = Sector
template_name = 'passerelle/manage/service_confirm_delete.html'
success_url = reverse_lazy('montpellier-encombrants-sector-listing')
class CommuneListView(ListView):
model = Commune
def get_context_data(self, **kwargs):
context = super(CommuneListView, self).get_context_data(**kwargs)
context['object'] = EncombrantsManagement.objects.all()[0]
return context
class CommuneCreateView(CreateView):
model = Commune
form_class = CommuneForm
template_name = 'passerelle/manage/service_form.html'
success_url = reverse_lazy('montpellier-encombrants-commune-listing')
class CommuneView(DetailView):
model = Commune
def get_context_data(self, **kwargs):
context = super(CommuneView, self).get_context_data(**kwargs)
context['object'] = EncombrantsManagement.objects.all()[0]
context['commune'] = self.object
context['streets'] = self.object.street_set.all()
return context
class CommuneUpdateView(UpdateView):
model = Commune
form_class = NoStreetsCommuneForm
template_name = 'passerelle/manage/service_form.html'
success_url = reverse_lazy('montpellier-encombrants-commune-listing')
class CommuneDeleteView(DeleteView):
model = Commune
template_name = 'passerelle/manage/service_confirm_delete.html'
success_url = reverse_lazy('montpellier-encombrants-commune-listing')
class CollectDayListView(ListView):
model = CollectDay
def get_context_data(self, **kwargs):
context = super(CollectDayListView, self).get_context_data(**kwargs)
context['object'] = EncombrantsManagement.objects.all()[0]
return context
class CollectDayCreateView(CreateView):
model = CollectDay
template_name = 'passerelle/manage/service_form.html'
success_url = reverse_lazy('montpellier-encombrants-collectday-listing')
fields = '__all__'
class CollectDayDeleteView(DeleteView):
model = CollectDay
template_name = 'passerelle/manage/service_confirm_delete.html'
success_url = reverse_lazy('montpellier-encombrants-collectday-listing')
class AvailableDaysView(View, SingleObjectMixin):
model = EncombrantsManagement
def get(self, request, *args, **kwargs):
sector = get_sector(kwargs.get('insee'), request.GET.get('adresse'))
if sector:
if datetime.datetime.today().weekday() == 4:
tomorrow = datetime.datetime.today() + datetime.timedelta(days=3)
elif datetime.datetime.today().weekday() == 5:
tomorrow = datetime.datetime.today() + datetime.timedelta(days=2)
else:
tomorrow = datetime.datetime.today() + datetime.timedelta(days=1)
collect_days = sector.collectday_set.filter(date__gt=tomorrow).order_by('date')
else:
collect_days = []
limit = request.GET.get('limit')
result = [
{'id': x.date.strftime('%Y-%m-%d'), 'text': x.date.strftime('%d/%m/%Y')} for x in collect_days
]
if limit:
result = result[: int(limit)]
return passerelle_utils.response_for_json(request, {'data': result})
class StreetEditView(FormView):
form_class = StreetsForm
template_name = 'passerelle/manage/service_form.html'
def get_success_url(self):
return reverse('montpellier-encombrants-commune-view', kwargs={'pk': self.kwargs['pk']})
def get_initial(self):
try:
c = Commune.objects.get(pk=self.kwargs['pk'])
streets = c.street_set.all()
if streets:
return {'streets': '\n'.join([s.name for s in streets])}
except Commune.DoesNotExist:
pass
def form_valid(self, form):
try:
c = Commune.objects.get(pk=self.kwargs['pk'])
with transaction.atomic():
c.street_set.all().delete()
for s in form.cleaned_data.get('streets', '').split('\n'):
s = s.strip()
if s:
Street.objects.create(commune=c, name=s)
except Commune.DoesNotExist:
pass
return super(StreetEditView, self).form_valid(form)