from django.shortcuts import render, get_object_or_404 from django.views.generic import ListView, CreateView, DetailView, UpdateView, RedirectView from django.views.generic.detail import SingleObjectMixin from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin from django.http import HttpResponseGone from django.urls import reverse from djadhere.utils import get_active_filter from .models import Service, ServiceType, IPResource, ResourceAllocation from .forms import ServiceForm, ResourceAllocationForm class ServiceMixin(PermissionRequiredMixin): model = Service permission_required = 'services.change_service' class ServiceList(ServiceMixin, ListView): pass class ServiceCreate(ServiceMixin, CreateView): form_class = ServiceForm class ServiceDetail(LoginRequiredMixin, DetailView): def get_queryset(self): if self.request.user.is_superuser: return Service.objects.all() else: return Service.objects.filter(adhesion__pk__in=self.request.user.profile.adhesions.values_list('pk')) \ .order_by('-created') class ServiceUpdate(ServiceMixin, UpdateView): fields = ('label', 'notes', 'active',) class ServiceAllocate(PermissionRequiredMixin, CreateView): model = ResourceAllocation permission_required = 'services.change_resourceallocation' fields = ('service', 'resource',) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['service'] = get_object_or_404(Service, pk=self.kwargs['pk']) return context def get_form(self): service = get_object_or_404(Service, pk=self.kwargs['pk']) kwargs = super().get_form_kwargs() kwargs['initial'].update({'service': service.pk}) form = self.get_form_class()(**kwargs) form.fields['service'].disabled = True form.fields['resource'].queryset = IPResource.objects.exclude(get_active_filter('allocation')) return form def get_success_url(self): return reverse('service-detail', kwargs={'pk': self.kwargs['pk']}) class ServiceTypeMixin(PermissionRequiredMixin): model = ServiceType permission_required = 'services.change_servicetype' class ServiceTypeList(ServiceTypeMixin, ListView): pass class ServiceTypeCreate(ServiceTypeMixin, CreateView): fields = ('name',) class ServiceTypeDetail(ServiceTypeMixin, DetailView): pass class ServiceTypeUpdate(ServiceTypeMixin, UpdateView): fields = ('name',) class IPResourceMixin(PermissionRequiredMixin): model = IPResource permission_required = 'services.change_ipresource' class IPResourceList(IPResourceMixin, ListView): pass class IPResourceDetail(IPResourceMixin, DetailView): pass class IPResourceAllocate(PermissionRequiredMixin, CreateView): model = ResourceAllocation permission_required = 'services.change_resourceallocation' fields = ('service', 'resource',) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['ipresource'] = get_object_or_404(IPResource, pk=self.kwargs['pk']) return context def get(self, request, *args, **kwargs): resource = get_object_or_404(IPResource, pk=self.kwargs['pk']) if resource.in_use: return HttpResponseGone("Cette IP est déjà alloué !") return super().get(request, *args, **kwargs) def get_form(self): resource = get_object_or_404(IPResource, pk=self.kwargs['pk']) kwargs = super().get_form_kwargs() kwargs['initial'].update({'resource': resource.pk}) form = self.get_form_class()(**kwargs) form.fields['resource'].disabled = True return form def get_success_url(self): return reverse('ip-detail', kwargs={'pk': self.kwargs['pk']}) class ResourceAllocationMixin(PermissionRequiredMixin): model = ResourceAllocation permission_required = 'services.change_resourceallocation' class ResourceAllocationDeallocate(ResourceAllocationMixin, SingleObjectMixin, RedirectView): http_method_names = ['post'] def get_object(self, queryset=None): obj = super().get_object(queryset) obj.deallocate() obj.save() return obj def get_redirect_url(self, *args, **kwargs): return self.get_object().get_absolute_url()