merge conflix
This commit is contained in:
@@ -34,8 +34,11 @@ SECRET_KEY = 'td*#7t-(1e9^(g0cod*hs**dp(%zvg@=$cug_-dtzcj#i2mrz@'
|
|||||||
# Application definition
|
# Application definition
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
|
'dal',
|
||||||
|
'dal_select2',
|
||||||
'suit',
|
'suit',
|
||||||
|
|
||||||
|
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
'django.contrib.auth',
|
'django.contrib.auth',
|
||||||
'django.contrib.contenttypes',
|
'django.contrib.contenttypes',
|
||||||
@@ -54,7 +57,6 @@ INSTALLED_APPS = [
|
|||||||
'anymail',
|
'anymail',
|
||||||
'storages',
|
'storages',
|
||||||
|
|
||||||
|
|
||||||
# local apps
|
# local apps
|
||||||
'core',
|
'core',
|
||||||
'geo',
|
'geo',
|
||||||
|
|||||||
@@ -42,5 +42,6 @@ urlpatterns = [
|
|||||||
path('api/v1/my_company/', company_views.my_company , name='my-company'),
|
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/my_products/', product_views.my_products, name='my-products'),
|
||||||
path('api/v1/stats/me/', stat_views.track_user, name='user-tracker'),
|
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)),
|
path('api/v1/', include(router.urls)),
|
||||||
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
|
|||||||
@@ -1,10 +1,21 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from . import models
|
from . import models
|
||||||
|
from . import forms
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
|
|
||||||
admin.site.register(models.Product)
|
class ProductAdmin(admin.ModelAdmin):
|
||||||
|
form = forms.ProductTagForm
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
class ProductInline(admin.TabularInline):
|
||||||
|
model = models.Product
|
||||||
|
form = forms.ProductTagForm
|
||||||
|
'''
|
||||||
|
|
||||||
|
admin.site.register(models.Product, ProductAdmin)
|
||||||
admin.site.register(models.TreeTag)
|
admin.site.register(models.TreeTag)
|
||||||
admin.site.register(models.CategoryTag)
|
admin.site.register(models.CategoryTag)
|
||||||
admin.site.register(models.AttributeTag)
|
admin.site.register(models.AttributeTag)
|
||||||
|
|||||||
14
products/forms.py
Normal file
14
products/forms.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
from dal import autocomplete
|
||||||
|
|
||||||
|
from django import forms
|
||||||
|
|
||||||
|
from .models import CategoryTag, Product
|
||||||
|
|
||||||
|
|
||||||
|
class ProductTagForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Product
|
||||||
|
fields = ('__all__')
|
||||||
|
widgets = {
|
||||||
|
'category': autocomplete.TagSelect2(url='category-autocomplete')
|
||||||
|
}
|
||||||
@@ -34,7 +34,6 @@ class AttributeTag(TagTreeModel):
|
|||||||
# autocomplete_view = 'myapp.views.hobbies_autocomplete'
|
# autocomplete_view = 'myapp.views.hobbies_autocomplete'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Product(models.Model):
|
class Product(models.Model):
|
||||||
|
|
||||||
SYNCHRONIZED = 'SYNCHRONIZED'
|
SYNCHRONIZED = 'SYNCHRONIZED'
|
||||||
@@ -63,7 +62,7 @@ class Product(models.Model):
|
|||||||
stock = models.PositiveIntegerField('Stock', null=True, blank=True)
|
stock = models.PositiveIntegerField('Stock', null=True, blank=True)
|
||||||
tags = TagField(to=TreeTag, blank=True)
|
tags = TagField(to=TreeTag, blank=True)
|
||||||
category = SingleTagField(to=CategoryTag, null=True, blank=True, on_delete=models.SET_NULL) # main tag category
|
category = SingleTagField(to=CategoryTag, null=True, blank=True, on_delete=models.SET_NULL) # main tag category
|
||||||
attributes = TagField(to=AttributeTag, related_name='product_attributes', blank=True)
|
attributes = TagField(to=AttributeTag, blank=True, related_name='product_attributes')
|
||||||
identifiers = models.TextField('Identificador único de producto', null=True, blank=True)
|
identifiers = models.TextField('Identificador único de producto', null=True, blank=True)
|
||||||
|
|
||||||
# internal
|
# internal
|
||||||
|
|||||||
@@ -16,10 +16,11 @@ from rest_framework.filters import OrderingFilter
|
|||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from products.models import Product
|
from products.models import Product, CategoryTag
|
||||||
from products.serializers import ProductSerializer, TagFilterSerializer, SearchResultSerializer
|
from products.serializers import ProductSerializer, TagFilterSerializer, SearchResultSerializer
|
||||||
from companies.models import Company
|
from companies.models import Company
|
||||||
from history.models import HistorySync
|
from history.models import HistorySync
|
||||||
|
from dal import autocomplete
|
||||||
|
|
||||||
from back_latienda.permissions import IsCreator
|
from back_latienda.permissions import IsCreator
|
||||||
from .utils import extract_search_filters, find_related_products_v3, find_related_products_v6, product_loader
|
from .utils import extract_search_filters, find_related_products_v3, find_related_products_v6, product_loader
|
||||||
@@ -214,3 +215,19 @@ def product_search(request):
|
|||||||
return Response(data={"filters": filters, "count": total_results, "products": result_list, 'prices': prices})
|
return Response(data={"filters": filters, "count": total_results, "products": result_list, 'prices': prices})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return Response({"errors": {"details": str(e)}}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
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 self.request.user.is_anonymous:
|
||||||
|
return Tag.objects.none()
|
||||||
|
|
||||||
|
qs = Tag.objects.all()
|
||||||
|
if self.q:
|
||||||
|
qs = qs.filter(name__icontains=self.q)
|
||||||
|
|
||||||
|
return qs # [x.label for x in qs]
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ drf-extra-fields==3.0.4
|
|||||||
django-ipware==3.0.2
|
django-ipware==3.0.2
|
||||||
geoip2==4.1.0
|
geoip2==4.1.0
|
||||||
woocommerce==2.1.1
|
woocommerce==2.1.1
|
||||||
|
django-autocomplete-light==3.8.2
|
||||||
# manually install `pip install --default-timeout=100 future` to avoid wcapi to timeout
|
# manually install `pip install --default-timeout=100 future` to avoid wcapi to timeout
|
||||||
# required for production
|
# required for production
|
||||||
django-anymail[amazon_ses]==8.2
|
django-anymail[amazon_ses]==8.2
|
||||||
|
|||||||
Reference in New Issue
Block a user