From: Guillaume Pellerin Date: Thu, 20 Oct 2016 18:57:55 +0000 (+0200) Subject: Update product sync command X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=11699a3667cec5db515b00af70639dd839ff898b;p=mezzo.git Update product sync command --- diff --git a/app/local_settings.py b/app/local_settings.py index 957a5f29..a27b60a5 100644 --- a/app/local_settings.py +++ b/app/local_settings.py @@ -215,7 +215,7 @@ GRAPPELLI_INSTALLED = True JQUERY_UI_FILENAME = 'jquery-ui-1.9.2.min.js' #SHOP_CURRENCY_LOCALE = '' -SHOP_USE_VARIATIONS = True +SHOP_USE_VARIATIONS = False SHOP_USE_RATINGS = False diff --git a/app/organization/shop/admin.py b/app/organization/shop/admin.py index fb5f2eb0..e20d78d4 100644 --- a/app/organization/shop/admin.py +++ b/app/organization/shop/admin.py @@ -28,10 +28,15 @@ class ProductLinkInline(TabularDynamicInlineAdmin): model = ProductLink +class ProductPrestashopProductInline(TabularDynamicInlineAdmin): + + model = ProductPrestashopProduct + class CustomProductAdmin(ProductAdmin): - inlines = [ProductImageAdmin, ProductVariationAdmin, ProductLinkInline] + inlines = [ProductImageAdmin, ProductVariationAdmin, ProductLinkInline, + ProductPrestashopProductInline] admin.site.register(ProductList, ProductListAdmin) diff --git a/app/organization/shop/management/__init__.py b/app/organization/shop/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/organization/shop/management/commands/__init__.py b/app/organization/shop/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/app/organization/shop/management/commands/organization-sync-prestashop-products.py b/app/organization/shop/management/commands/organization-sync-prestashop-products.py new file mode 100644 index 00000000..6e059b1a --- /dev/null +++ b/app/organization/shop/management/commands/organization-sync-prestashop-products.py @@ -0,0 +1,85 @@ +from datetime import datetime, timedelta +from optparse import make_option + +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError +from django.contrib.auth.models import User +from django.core.mail import EmailMessage + +from mezzanine.generic.models import AssignedKeyword, Keyword + +import organization.shop.models as os_models +import prestashop.models as pa_models +import cartridge.shop.models as ca_models + + +class Command(BaseCommand): + """Synchronize products from PrestaShop to cartridge.shop + + ex: python manage.py organization-sync-prestashop-products -c "Forumnet" + """ + + option_list = BaseCommand.option_list + ( + make_option('-c', '--category', + dest='category_lang_name', + help='define prestashop PsCategoryLang'), + ) + + default_user = User.objects.get(username='admin') + languages = { 1 : {'code': 'en', 'names': ['english', 'anglais']}, + 2 : {'code': 'fr', 'names': ['french', 'français']},} + + + def cleanup(self): + for product in ca_models.ProductVariation.objects.all(): + product.delete() + for product in ca_models.Product.objects.all(): + product.delete() + + def handle(self, *args, **kwargs): + # !! NOT FOR PROD !! + # self.cleanup() + + products = [] + category_lang_name = kwargs.get('category_lang_name') + + if not category_lang_name: + for category in pa_models.PsCategoryLang.objects.all(): + print(category.name) + return + + category_lang_name = kwargs.get('category_lang_name') + category_lang = pa_models.PsCategoryLang.objects.filter(name=category_lang_name)[0] + category = pa_models.PsCategory.objects.get(id_category=category_lang.id_category) + category_products = pa_models.PsCategoryProduct.objects.filter(id_category=category.id_category) + + for category_product in category_products: + try: + products.append(pa_models.PsProduct.objects.get(id_product=category_product.id_product)) + except: + continue + + for product in products: + print('---------------------------') + print(product.id_product) + + ca_product, c = ca_models.Product.objects.get_or_create(sku=product.reference) + variation, c = ca_models.ProductVariation.objects.get_or_create(product=ca_product, default=True) + + product_langs = pa_models.PsProductLang.objects.filter(id_product=product.id_product) + for product_lang in product_langs: + if product_lang.id_lang in self.languages.keys(): + lang_code = self.languages[product_lang.id_lang]['code'] + print(product_lang.name, lang_code) + setattr(ca_product, 'title' + '_' + lang_code, product_lang.name) + setattr(ca_product, 'content' + '_' + lang_code, product_lang.description) + if lang_code == 'en': + slug = product_lang.link_rewrite + + ca_product.sku = product.reference + ca_product.sale_price = product.price + ca_product.save() + + prestashop_product, c = os_models.ProductPrestashopProduct.objects.get_or_create(product=ca_product, external_id=product.id_product) + prestashop_product.slug = slug + prestashop_product.save() diff --git a/app/organization/shop/migrations/0007_auto_20161020_2035.py b/app/organization/shop/migrations/0007_auto_20161020_2035.py new file mode 100644 index 00000000..daccc5cc --- /dev/null +++ b/app/organization/shop/migrations/0007_auto_20161020_2035.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.10 on 2016-10-20 18:35 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('organization-shop', '0006_productprestashopproduct'), + ] + + operations = [ + migrations.RenameField( + model_name='productprestashopproduct', + old_name='prestashop_slug', + new_name='slug', + ), + migrations.RemoveField( + model_name='productprestashopproduct', + name='prestashop_id', + ), + migrations.RemoveField( + model_name='productprestashopproduct', + name='prestashop_url', + ), + migrations.AddField( + model_name='productprestashopproduct', + name='external_id', + field=models.IntegerField(blank=True, null=True, verbose_name='external id'), + ), + migrations.AddField( + model_name='productprestashopproduct', + name='url', + field=models.CharField(blank=True, max_length=512, null=True, verbose_name='url'), + ), + migrations.AlterField( + model_name='productprestashopproduct', + name='product', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='prestashop_products', to='shop.Product', verbose_name='product'), + ), + ] diff --git a/app/organization/shop/models.py b/app/organization/shop/models.py index 44e22473..32e86fed 100644 --- a/app/organization/shop/models.py +++ b/app/organization/shop/models.py @@ -54,14 +54,14 @@ class ProductLink(Link): class ProductPrestashopProduct(models.Model): - product = models.OneToOneField(Product, verbose_name=_('prestashop product'), related_name='prestashop_products') - prestashop_id = models.IntegerField(verbose_name=_('prestashop id')) - prestashop_slug = models.CharField(max_length=255, verbose_name=_('slug'), null=True, blank=True) - prestashop_url = models.CharField(max_length=512, verbose_name=_('relative url'), null=True, blank=True) + product = models.OneToOneField(Product, verbose_name=_('product'), related_name='prestashop_products') + external_id = models.IntegerField(verbose_name=_('external id'), null=True, blank=True) + slug = models.CharField(max_length=255, verbose_name=_('slug'), null=True, blank=True) + url = models.CharField(max_length=512, verbose_name=_('url'), null=True, blank=True) class Meta: verbose_name = _("prestashop product") verbose_name_plural = _("prestashop products") def __str__(self): - return ' - '.join((self.product.title, self.prestashop_id)) + return ' - '.join((self.product.title, str(self.external_id))) diff --git a/app/organization/shop/translation.py b/app/organization/shop/translation.py index 9f3c1acc..fb51daef 100644 --- a/app/organization/shop/translation.py +++ b/app/organization/shop/translation.py @@ -26,3 +26,9 @@ class PageProductListTranslationOptions(TranslationOptions): class ProductLinkTranslationOptions(TranslationOptions): pass + + +@register(ProductPrestashopProduct) +class ProductPrestashopProductTranslationOptions(TranslationOptions): + + pass