Skip to content
This repository has been archived by the owner on Mar 26, 2024. It is now read-only.

Commit

Permalink
fix #15, испавлен импорт картинок, некоторые били с расширением JPEG …
Browse files Browse the repository at this point in the history
…а внутри PNG
  • Loading branch information
mmmcorpsvit committed Nov 16, 2017
1 parent 32df034 commit 1478a2b
Show file tree
Hide file tree
Showing 1,547 changed files with 136 additions and 12 deletions.
141 changes: 131 additions & 10 deletions apps/utils/management/commands/sophoshop_import_from_xls_prom.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# import os
import os
# from os import rename
# import tarfile
# import zipfile
# import zlib
Expand All @@ -18,23 +19,54 @@
# from django.db.transaction import atomic
# from django.db import transaction
# from django.utils.translation import ugettext_lazy as _
from django.db.transaction import atomic

from oscar.apps.catalogue.categories import create_from_breadcrumbs
from oscar.core.loading import get_class, get_classes, get_model

from openpyxl import load_workbook

from shutil import move
from PIL import Image

import subprocess

from settings import SITE_ROOT


ImportingError = get_class('partner.exceptions', 'ImportingError')
Partner, StockRecord = get_classes('partner.models', ['Partner', 'StockRecord'])
ProductClass, Product, Category, ProductCategory = get_classes(
'catalogue.models', ('ProductClass', 'Product', 'Category', 'ProductCategory'))
ProductClass, ProductAttribute, Product, Category, ProductCategory = get_classes(
'catalogue.models', ('ProductClass', 'ProductAttribute', 'Product',
'Category', 'ProductCategory'))

AttributeOption, AttributeOptionGroup = get_classes(
'catalogue.models', ('AttributeOption', 'AttributeOptionGroup'))

ProductImage = get_model('catalogue', 'productimage')


logger = logging.getLogger('oscar.catalogue.import')
urllib3.disable_warnings()

# use: sophoshop_import_from_xls_prom export-products.xlsx --flush --add_images
# must be in _private/ImageMagic/convert.exe from ImagePagic Portable


def run_win_cmd(cmd):
result = []
process = subprocess.Popen(cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
for line in process.stdout:
result.append(line)
errcode = process.returncode
for line in result:
logger.info(line)
if errcode is not None:
logger.error(cmd)
raise Exception('cmd %s failed, see above for details', cmd)


def download(c, url, filename):
Expand Down Expand Up @@ -65,13 +97,66 @@ def __init__(self, logger2, flush=False, add_images=False):
self._flush = flush
self._add_images = add_images

def _create_item(self, product_class, category_str, upc, title, description, images_urls, price, stats):
def _create_item(self, product_class_name, manufactur, category_str, upc, title, description, images_urls,
price, stats):
# Ignore any entries that are NULL
if description == 'NULL':
description = ''

# Create item class and item
product_class, __ = ProductClass.objects.get_or_create(name=product_class)
product_class, __ = ProductClass.objects.get_or_create(name=product_class_name, track_stock=False)

# группа опцый
# sleep_pace_options = AttributeOptionGroup.objects.get_or_create(name='Размеры спального места',
# slug='sleep place')
# AttributeOption.objects.get_or_create(
# group=sleep_pace_options,
# name='Ширина',
# # code='A1',
# code='width',
# type='integer',
# )
#

# language = AttributeOptionGroup.objects.get_or_create(name='Language')
#
# AttributeOption.objects.get_or_create(
# group=language,
# option='English'
# )
# AttributeOption.objects.get_or_create(
# group=language,
# option='Croatian'
# )
#
# klass = ProductClass.objects.create(name='foo', slug='bar')
# ProductAttribute.objects.create(
# product_class=klass,
# name='Language',
# code='language',
# type='option',
# option_group=language
# )

# if ProductAttribute.get(name=product_class_name) is None:
ProductAttribute.objects.get_or_create(
product_class=product_class,
name='Виробник',
required=True,
code='manufacturer',
type='text',
)

ProductAttribute.objects.get_or_create(
product_class=product_class,
name='Ширина',
# code='A1',
code='width',
type='integer',
)

# product_class.Виробник = manufactur

try:
item = Product.objects.get(upc=upc)
stats['updated_items'] += 1
Expand All @@ -81,6 +166,7 @@ def _create_item(self, product_class, category_str, upc, title, description, ima
item.upc = upc
item.title = title
item.description = description
# item.attr.manufactur = manufactur
item.product_class = product_class
if not (price is None):
item.price = price
Expand All @@ -103,10 +189,31 @@ def _create_item(self, product_class, category_str, upc, title, description, ima

# data = download(image)

file_name = image.replace('https://images.ua.prom.st/', '')
file_name = image.replace('https://images.ua.prom.st/', '').strip()
fn = tempfile.gettempdir() + '\\' + file_name
fn = fn.strip()
# logger.info(fn)

download(c, image_url, fn)
# logger.info(image_url)

# fix #15, some files has png on jpeg file error content
with Image.open(fn) as img:
image_format = img.format

# logger.info(img.format) # 'JPEG'
if image_format == 'PNG':
nfn = os.path.splitext(fn)[0]+'.jpg'
s = '%s/%s/convert.exe "%s" -background white -flatten "%s"' % \
(SITE_ROOT, '_private/ImageMagic', fn, nfn)
logger.info(s)
res = run_win_cmd(s)
logging.info(res)
fn = nfn
else:
if not image_format == 'JPEG':
logger.error('image_format=%s' % image_format)
exit()

new_file = File(open(fn, 'rb'))
im = ProductImage(product=item)
Expand All @@ -116,7 +223,7 @@ def _create_item(self, product_class, category_str, upc, title, description, ima

# stockrecord
self._create_stockrecord(item, 'Світ Комфорту', upc,
price, 14)
price, 0)

return item

Expand All @@ -138,7 +245,7 @@ def d(x):
stock.partner_sku = partner_sku
stock.price_excl_tax = d(price)
stock.price_retail = d(price)
stock.num_in_stock = num_in_stock
# stock.num_in_stock = num_in_stock
stock.save()

def _flush_product_data(self):
Expand All @@ -150,6 +257,8 @@ def _flush_product_data(self):
ProductClass.objects.all().delete()
Partner.objects.all().delete()
StockRecord.objects.all().delete()
AttributeOptionGroup.objects.all().delete()
AttributeOption.objects.all().delete()
if not self._add_images:
logger.info('Flush images')
ProductImage.objects.all().delete()
Expand All @@ -172,6 +281,13 @@ def handle(self, fn):

for row in wb.rows:
index += 1

# if index > 50:
# break

# if index < 71:
# continue

if skip_first_row:
logger.info('[0 = skip]')
skip_first_row = False
Expand All @@ -196,12 +312,17 @@ def handle(self, fn):
.replace("Дитячі ліжка", 'Ліжка') \
.replace('Столи', 'Столи гостьові') \
.replace('Столи гостьові-трансформери', 'Столи журнальні')\
.replace('Стільці', 'Стільці та табурети')
.replace('Стільці', 'Стільці та табурети') \
.replace('Дитячі дивани', 'Дивани') \
.replace('Кутові дивани', 'Дивани') \
.replace('Прямі дивани', 'Дивани')

cats[cat] = None

self._create_item(
product_class=str(row[16].value).replace('https://prom.ua/', ''),
# product_class=str(row[16].value).replace('https://prom.ua/', ''),
product_class_name=cat,
manufactur=str(row[24].value),
category_str=cat,
upc=str(row[20].value),
title=str(row[1].value).strip(),
Expand Down
Binary file modified db.sqlite
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Loading

0 comments on commit 1478a2b

Please sign in to comment.