from django.shortcuts import render, redirect from django.urls import reverse from django.contrib.auth.forms import AuthenticationForm as AuthForm from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth import update_session_auth_hash import django.forms as forms from django.views.generic import TemplateView, DetailView from django.contrib.auth.mixins import LoginRequiredMixin from ..models import Storage, Stock, Component, Distributor, Manufacturer, Package, ComponentParameter, DistributorNum from django.core.paginator import Paginator from django.core.exceptions import ValidationError from django.db import IntegrityError from django.db.models import ProtectedError from ..forms import * from django.db.models import Q from django.db.models.functions import Lower import uuid from .generic_views import BaseTemplateMixin class ManufacturersView(LoginRequiredMixin, BaseTemplateMixin, TemplateView): template_name = 'parts/manufacturers.html' base_title = 'Manufacturers' navbar_selected = 'Manufacturers' default_page_size = 25 def search_manufacturers(self, search): qs = Manufacturer.objects.all() if not search: return qs search_fragements = search.strip().split() for search in search_fragements: qs = qs.filter(Q(name__icontains = search) | Q(website__icontains = search)) return qs def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) page_num = self.request.GET.get('page', default=1) search_string = self.request.GET.get('search', default=None) queryset = self.search_manufacturers(search_string) paginator = Paginator(queryset, self.default_page_size) context['search_string'] = search_string context['manufacturers'] = paginator.get_page(page_num) context['new_manufacturer_form'] = ManufacturerForm() return context def handle_add_new_manufacturer(self, request): form = ManufacturerForm(data=request.POST, files=request.FILES) if form.is_valid(): form.save() context = self.get_context_data() if not form.is_valid(): context['new_manufacturer_form'] = form return self.render_to_response(context) def post(self, request, *args, **kwargs): if 'submit-manufacturer-add-new' in request.POST: return self.handle_add_new_manufacturer(request) return super().post(request, *args, **kwargs) class ManufacturerDetailView(LoginRequiredMixin, BaseTemplateMixin, DetailView): template_name = 'parts/manufacturers-detail.html' model = Manufacturer pk_url_kwarg = 'uuid' base_title = '' navbar_selected = 'Manufacturers' def get_context_data(self, **kwargs): self.base_title = 'Manufacturer / '+self.object.name context = super().get_context_data(**kwargs) context['manufacturer'] = self.object context['edit_form'] = ManufacturerForm(instance=self.object) return context def handle_delete_manufacturer(self, request): delete_error = None protected_objects = None # Try to delete this instance try: self.object.delete() except ProtectedError as pe: delete_error = 'Cannot delete this distributor. It is referenced by a component.' protected_objects = pe.protected_objects except: delete_error = 'Cannot delete this distributor. Unknown error' if delete_error: context = self.get_context_data() context['delete_error'] = delete_error context['protected_components'] = protected_objects return self.render_to_response(context) else: return redirect('parts-manufacturers') def edit_manufacturer(self, request): edit_form = ManufacturerForm(data=request.POST, files=request.FILES, instance=self.object) if edit_form.is_valid(): edit_form.save() context = self.get_context_data() if not edit_form.is_valid(): context['edit_form'] = edit_form return self.render_to_response(context) def post(self, request, *args, **kwargs): self.object = self.get_object() if 'submit-manufacturer-delete' in request.POST: return self.handle_delete_manufacturer(request) elif 'submit-manufacturer-edit' in request.POST: return self.edit_manufacturer(request) return super().post(request, *args, **kwargs)