From 657b717c0703434ef998af2fb58ba84ca55c862b Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 4 Mar 2021 12:37:15 +0000 Subject: [PATCH 1/3] working to fix tag widgets in admin --- back_latienda/settings/base.py | 4 +++- back_latienda/urls.py | 1 + products/admin.py | 13 ++++++++++++- products/forms.py | 14 ++++++++++++++ products/models.py | 1 - products/views.py | 20 +++++++++++++++++++- requirements.txt | 1 + 7 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 products/forms.py diff --git a/back_latienda/settings/base.py b/back_latienda/settings/base.py index 0859a1c..cdb5888 100644 --- a/back_latienda/settings/base.py +++ b/back_latienda/settings/base.py @@ -34,8 +34,11 @@ SECRET_KEY = 'td*#7t-(1e9^(g0cod*hs**dp(%zvg@=$cug_-dtzcj#i2mrz@' # Application definition INSTALLED_APPS = [ + 'dal', + 'dal_select2', 'suit', + 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -54,7 +57,6 @@ INSTALLED_APPS = [ 'anymail', 'storages', - # local apps 'core', 'geo', diff --git a/back_latienda/urls.py b/back_latienda/urls.py index 3dd674f..508c0f5 100644 --- a/back_latienda/urls.py +++ b/back_latienda/urls.py @@ -42,5 +42,6 @@ urlpatterns = [ path('api/v1/my_company/', company_views.my_company , name='my-company'), path('api/v1/my_products/', product_views.my_products, name='my-products'), path('api/v1/stats/me/', stat_views.track_user, name='user-tracker'), + path('api/v1/autocomplete/category-tag/', product_views.CategoryTagAutocomplete.as_view(), name='category-autocomplete'), path('api/v1/', include(router.urls)), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/products/admin.py b/products/admin.py index af39311..b90c08f 100644 --- a/products/admin.py +++ b/products/admin.py @@ -1,10 +1,21 @@ from django.contrib import admin from . import models +from . import forms # Register your models here. +class CagtegoryAdmin(admin.ModelAdmin): + form = forms.CategoryTagForm + + + +class CategoryInline(admin.TabularInline): + model = models.CategoryTag + form = forms.CategoryTagForm + + admin.site.register(models.Product) admin.site.register(models.TreeTag) -admin.site.register(models.CategoryTag) +admin.site.register(models.CategoryTag, CagtegoryAdmin) admin.site.register(models.AttributeTag) diff --git a/products/forms.py b/products/forms.py new file mode 100644 index 0000000..456df98 --- /dev/null +++ b/products/forms.py @@ -0,0 +1,14 @@ +from dal import autocomplete + +from django import forms + +from .models import CategoryTag + + +class CategoryTagForm(forms.ModelForm): + class Meta: + model = CategoryTag + fields = ('__all__') + widgets = { + 'category': autocomplete.ModelSelect2(url='cagtegory-autocomplete') + } diff --git a/products/models.py b/products/models.py index 699ab0a..27062b9 100644 --- a/products/models.py +++ b/products/models.py @@ -34,7 +34,6 @@ class AttributeTag(TagTreeModel): # autocomplete_view = 'myapp.views.hobbies_autocomplete' - class Product(models.Model): SYNCHRONIZED = 'SYNCHRONIZED' diff --git a/products/views.py b/products/views.py index c7dd670..35ac069 100644 --- a/products/views.py +++ b/products/views.py @@ -16,10 +16,11 @@ from rest_framework.filters import OrderingFilter from django_filters.rest_framework import DjangoFilterBackend import requests -from products.models import Product +from products.models import Product, CategoryTag from products.serializers import ProductSerializer, TagFilterSerializer, SearchResultSerializer from companies.models import Company from history.models import HistorySync +from dal import autocomplete from back_latienda.permissions import IsCreator from .utils import extract_search_filters, find_related_products_v3, find_related_products_v6, product_loader @@ -214,3 +215,20 @@ def product_search(request): return Response(data={"filters": filters, "count": total_results, "products": result_list, 'prices': prices}) except Exception as e: return Response({"errors": {"details": str(e)}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +class CategoryTagAutocomplete(autocomplete.Select2QuerySetView): + def get_queryset(self): + # Get the tag model dynamically + Tag = Product.category.tag_model + + # Return nothing if not auth + if not self.request.is_authenticated(): + return Tag.objects.none() + + qs = Tag.objects.all() + + if self.q: + qs = qs.filter(name__istartswith=self.q) + + return self.q diff --git a/requirements.txt b/requirements.txt index 0c7f6f8..5b07f13 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,6 +14,7 @@ drf-extra-fields==3.0.4 django-ipware==3.0.2 geoip2==4.1.0 woocommerce==2.1.1 +django-autocomplete-light==3.8.2 # manually install `pip install --default-timeout=100 future` to avoid wcapi to timeout # required for production django-anymail[amazon_ses]==8.2 From 085c6f86a723dd7658b89d259b61fe8df69e3708 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 4 Mar 2021 13:23:11 +0000 Subject: [PATCH 2/3] added custom autocomplete for category in product admin, still not working correctly --- products/admin.py | 18 +++++++++--------- products/forms.py | 8 ++++---- products/models.py | 4 ++-- products/views.py | 7 +++---- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/products/admin.py b/products/admin.py index b90c08f..e6393ee 100644 --- a/products/admin.py +++ b/products/admin.py @@ -5,17 +5,17 @@ from . import forms # Register your models here. -class CagtegoryAdmin(admin.ModelAdmin): - form = forms.CategoryTagForm +class ProductAdmin(admin.ModelAdmin): + form = forms.ProductTagForm +''' +class ProductInline(admin.TabularInline): + model = models.Product + form = forms.ProductTagForm +''' -class CategoryInline(admin.TabularInline): - model = models.CategoryTag - form = forms.CategoryTagForm - - -admin.site.register(models.Product) +admin.site.register(models.Product, ProductAdmin) admin.site.register(models.TreeTag) -admin.site.register(models.CategoryTag, CagtegoryAdmin) +admin.site.register(models.CategoryTag) admin.site.register(models.AttributeTag) diff --git a/products/forms.py b/products/forms.py index 456df98..3bb035d 100644 --- a/products/forms.py +++ b/products/forms.py @@ -2,13 +2,13 @@ from dal import autocomplete from django import forms -from .models import CategoryTag +from .models import CategoryTag, Product -class CategoryTagForm(forms.ModelForm): +class ProductTagForm(forms.ModelForm): class Meta: - model = CategoryTag + model = Product fields = ('__all__') widgets = { - 'category': autocomplete.ModelSelect2(url='cagtegory-autocomplete') + 'category': autocomplete.ListSelect2(url='category-autocomplete') } diff --git a/products/models.py b/products/models.py index 27062b9..63ad73a 100644 --- a/products/models.py +++ b/products/models.py @@ -60,9 +60,9 @@ class Product(models.Model): update_date = models.DateTimeField('Fecha de actualización de producto', null=True, blank=True) discount = models.DecimalField('Descuento', max_digits=5, decimal_places=2, null=True, blank=True) stock = models.PositiveIntegerField('Stock', null=True, blank=True) - tags = TagField(to=TreeTag) + tags = TagField(to=TreeTag, blank=True) category = SingleTagField(to=CategoryTag, null=True, blank=True, on_delete=models.SET_NULL) # main tag category - attributes = TagField(to=AttributeTag, related_name='product_attributes') + attributes = TagField(to=AttributeTag, blank=True, related_name='product_attributes') identifiers = models.TextField('Identificador único de producto', null=True, blank=True) # internal diff --git a/products/views.py b/products/views.py index 35ac069..4f3e153 100644 --- a/products/views.py +++ b/products/views.py @@ -223,12 +223,11 @@ class CategoryTagAutocomplete(autocomplete.Select2QuerySetView): Tag = Product.category.tag_model # Return nothing if not auth - if not self.request.is_authenticated(): + if self.request.user.is_anonymous: return Tag.objects.none() qs = Tag.objects.all() - if self.q: - qs = qs.filter(name__istartswith=self.q) + qs = qs.filter(name__icontains=self.q) - return self.q + return qs # [x.label for x in qs] From 6d79583540df8691f7cd70ce1dd53c992f2ee7a4 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 4 Mar 2021 13:34:46 +0000 Subject: [PATCH 3/3] product category in admin almost fixed --- products/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products/forms.py b/products/forms.py index 3bb035d..9ef26b5 100644 --- a/products/forms.py +++ b/products/forms.py @@ -10,5 +10,5 @@ class ProductTagForm(forms.ModelForm): model = Product fields = ('__all__') widgets = { - 'category': autocomplete.ListSelect2(url='category-autocomplete') + 'category': autocomplete.TagSelect2(url='category-autocomplete') }