From d2fb27a2c3d78f26604299a0883fea4a5f3b247b Mon Sep 17 00:00:00 2001 From: mtyton Date: Thu, 10 Aug 2023 22:24:48 +0200 Subject: [PATCH 1/3] product load finally works --- .gitignore | 1 + artel/store/loader.py | 41 ++++++++++++------- .../management/commands/load_products.py | 2 +- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index b809595..99e9fc6 100644 --- a/.gitignore +++ b/.gitignore @@ -143,3 +143,4 @@ artel/static/ # media artel/media/* +artel/store/data/* diff --git a/artel/store/loader.py b/artel/store/loader.py index 8174711..92f7938 100644 --- a/artel/store/loader.py +++ b/artel/store/loader.py @@ -1,12 +1,13 @@ import logging +import time import requests import pandas as pd -from django.core import files - +from django.core.files.base import ContentFile from store.models import ( ProductTemplate, ProductCategoryParamValue, + ProductCategoryParam, Product, ProductImage ) @@ -29,28 +30,37 @@ class TemplateLoader(BaseLoader): class ProductLoader(BaseLoader): - def _get_images(self, row) -> list[files.ContentFile]: - urls = row["images"] + def _clear(self): + Product.objects.all().delete() + + def __init__(self, path, param_names, clear=False): + super().__init__(path) + self.param_names = param_names + if clear: + self._clear() + + def _get_images(self, row) -> list[ContentFile]: + url = row["images"] images = [] - for url in urls: - response = requests.get(url, stream=True) - if response.status_code == 200: - data = response.raw - file_name = url.split("/")[-1] - image = files.ContentFile(data, name=file_name) + response = requests.get(url+"/download", stream=True) + print(response.status_code) + if response.status_code == 200: + data = response.content + image = ContentFile(data, name=row["template"]) images.append(image) return images def _process_row(self, row): template = ProductTemplate.objects.get(code=row["template"]) - price = float(row["price"]) + price = float(row["price"].strip("zł").replace(",", ".")) name = row["name"] available = bool(row["available"]) params = [] - for param in row["params"]: - key, value = param - param = ProductCategoryParamValue.objects.get(param__key=key, value=value) - params.append(param) + for key in self.param_names: + value = row[key] + param, _ = ProductCategoryParam.objects.get_or_create(key=key, category=template.category) + param_value, _ = ProductCategoryParamValue.objects.get_or_create(param=param, value=value) + params.append(param_value) product = Product.objects.get_or_create_by_params(template=template, params=params) product.price = price product.name = name @@ -66,6 +76,7 @@ class ProductLoader(BaseLoader): data = self.load_data() products = [] for _, row in data.iterrows(): + time.sleep(5) try: product = self._process_row(row) except Exception as e: diff --git a/artel/store/management/commands/load_products.py b/artel/store/management/commands/load_products.py index a277ad0..84197e0 100644 --- a/artel/store/management/commands/load_products.py +++ b/artel/store/management/commands/load_products.py @@ -9,5 +9,5 @@ class Command(BaseCommand): help = "Load products from csv file" def handle(self, *args, **options): - loader = ProductLoader(settings.PRODUCTS_CSV_PATH) + loader = ProductLoader(settings.PRODUCTS_CSV_PATH, ["mocowanie", "format", "wykonanie"], True) loader.process() From 74e8822a183f88caf8707355a8b3754b225df0dd Mon Sep 17 00:00:00 2001 From: mtyton Date: Thu, 10 Aug 2023 22:30:47 +0200 Subject: [PATCH 2/3] fixed form field generation --- artel/store/forms.py | 9 +++++++-- artel/store/models.py | 2 +- .../store/forms/button_toggle_select.html | 16 ---------------- 3 files changed, 8 insertions(+), 19 deletions(-) diff --git a/artel/store/forms.py b/artel/store/forms.py index 64ab14f..8262828 100644 --- a/artel/store/forms.py +++ b/artel/store/forms.py @@ -73,9 +73,14 @@ class ProductTemplateConfigForm(forms.Form): def _create_dynamic_fields(self, template: ProductTemplate): category_params = template.category.category_params.all() for param in category_params: + queryset = ProductCategoryParamValue.objects.filter(param=param) + if queryset.count() >= 4: + widget = forms.Select(attrs={"class": "form-select"}) + else: + widget = ButtonToggleSelect(attrs={"class": "btn-group btn-group-toggle"}) self.fields[param.key] = forms.ModelChoiceField( - queryset=ProductCategoryParamValue.objects.filter(param=param), - widget=ButtonToggleSelect(attrs={"class": "btn-group btn-group-toggle"}), + queryset=queryset, + widget=widget, ) def __init__( diff --git a/artel/store/models.py b/artel/store/models.py index 2919cf9..3937692 100644 --- a/artel/store/models.py +++ b/artel/store/models.py @@ -133,7 +133,7 @@ class ProductCategoryParamValue(ClusterableModel): return def __str__(self): - return f"{self.param.key}: {self.value}" + return str(self.value) class ProductTemplate(ClusterableModel): diff --git a/artel/store/templates/store/forms/button_toggle_select.html b/artel/store/templates/store/forms/button_toggle_select.html index 2d5e4b6..b145705 100644 --- a/artel/store/templates/store/forms/button_toggle_select.html +++ b/artel/store/templates/store/forms/button_toggle_select.html @@ -10,19 +10,3 @@ {% endfor %} {% endwith %} - From d688c00a8028f328de6c70c79eb405986df53248 Mon Sep 17 00:00:00 2001 From: mtyton Date: Thu, 10 Aug 2023 22:52:22 +0200 Subject: [PATCH 3/3] quick fix --- artel/store/loader.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/artel/store/loader.py b/artel/store/loader.py index 92f7938..0d2ee1d 100644 --- a/artel/store/loader.py +++ b/artel/store/loader.py @@ -4,6 +4,7 @@ import requests import pandas as pd from django.core.files.base import ContentFile +from django.conf import settings from store.models import ( ProductTemplate, ProductCategoryParamValue, @@ -42,8 +43,9 @@ class ProductLoader(BaseLoader): def _get_images(self, row) -> list[ContentFile]: url = row["images"] images = [] - response = requests.get(url+"/download", stream=True) - print(response.status_code) + response = requests.get( + url+"/preview", stream=True + ) if response.status_code == 200: data = response.content image = ContentFile(data, name=row["template"])