Wrote autocompletion for foreign key field

This commit is contained in:
2022-01-01 17:18:08 +01:00
parent 563a769064
commit f21ce223bc
8 changed files with 133 additions and 69 deletions

View File

@@ -4,49 +4,65 @@ from django.core.exceptions import ValidationError
from parts import models as parts_models
from shimatta_modules.EngineeringNumberConverter import EngineeringNumberConverter
import uuid
from django.urls import reverse
class AutoCompleteWidget(widgets.Input):
template_name = 'widgets/autocomplete-foreign-key.html'
def __init__(self, api_search_url, image_field_name, foreign_model, *args, **kwargs):
def __init__(self, api_search_url, image_field_name, foreign_model, name_field_name, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image_field_name = image_field_name
self.foreign_model = foreign_model
self.api_search_url = api_search_url
self.name_field_name = name_field_name
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
if value is not None:
try:
instance = self.foreign_model.objects.get(id=uuid.UUID(value))
try:
my_id = uuid.UUID(value)
except:
my_id = int(value)
instance = self.foreign_model.objects.get(id=my_id)
except Exception as ex:
instance = None
else:
instance = None
image = None
if instance is not None:
if instance is not None and self.image_field_name is not None:
image = getattr(instance, self.image_field_name)
display_name = None
if instance:
display_name = getattr(instance, self.name_field_name)
context['custom'] = {
'search_url': self.api_search_url,
'search_url': reverse(self.api_search_url),
'image_field_name': self.image_field_name,
'current_instance': instance,
'image': image,
'name_field_name': self.name_field_name,
'name': display_name,
}
return context
class AutocompleteForeingKeyField(forms.UUIDField):
def __init__(self, foreign_model=None, api_search_url=None, image_field_name='image', **kwargs):
def __init__(self, foreign_model=None, api_search_url=None, image_field_name='image', name_field_name='name', **kwargs):
super().__init__(**kwargs)
self.widget = AutoCompleteWidget(api_search_url, image_field_name, foreign_model)
self.widget = AutoCompleteWidget(api_search_url, image_field_name, foreign_model, name_field_name)
self.foreign_model = foreign_model
def clean(self, value):
pre_cleaned_uuid = super().clean(value)
try:
pre_cleaned_uuid = super().clean(value)
except Exception as ex:
try:
pre_cleaned_uuid = int(value)
except:
raise ex
if pre_cleaned_uuid is None and not self.required:
return None
try:
@@ -161,9 +177,9 @@ class AddStockForm(forms.Form):
new_stock.save()
class ComponentForm(forms.ModelForm):
manufacturer = AutocompleteForeingKeyField(api_search_url='foo', foreign_model=parts_models.Manufacturer)
component_type = AutocompleteForeingKeyField(api_search_url='bar', foreign_model=parts_models.ComponentType, required=False, image_field_name=None)
package = AutocompleteForeingKeyField(api_search_url='pkgurl', foreign_model=parts_models.Package, required=False)
manufacturer = AutocompleteForeingKeyField(api_search_url='manufacturer-list', foreign_model=parts_models.Manufacturer, required=False)
component_type = AutocompleteForeingKeyField(api_search_url='componenttype-list', foreign_model=parts_models.ComponentType, name_field_name='class_name', required=False, image_field_name=None)
package = AutocompleteForeingKeyField(api_search_url='package-list', foreign_model=parts_models.Package, required=False)
class Meta:
model = parts_models.Component
fields = '__all__'