Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from decimal import Decimal as D
  2. import datetime
  3. from django.db.transaction import commit_on_success
  4. from oscar.apps.dashboard.reports.csv_utils import CsvUnicodeReader
  5. from oscar.apps.catalogue import models, categories
  6. from oscar.apps.partner import models as partner_models
  7. class Importer(object):
  8. """
  9. Quick and dirty catalogue importer
  10. """
  11. def __init__(self, logger):
  12. self.logger = logger
  13. @commit_on_success
  14. def handle(self, product_class_name, filepath):
  15. product_class = models.ProductClass.objects.get(
  16. name=product_class_name)
  17. attribute_codes = []
  18. for row in CsvUnicodeReader(open(filepath, 'r')):
  19. if row[1] == 'UPC':
  20. attribute_codes = row[9:]
  21. continue
  22. self.create_product(product_class, attribute_codes, row)
  23. def create_product(self, product_class, attribute_codes, row):
  24. ptype, upc, title, description, category, partner, sku, price, stock = row[0:9]
  25. # Create product
  26. is_variant = ptype.lower() == 'variant'
  27. is_group = ptype.lower() == 'group'
  28. if upc:
  29. try:
  30. product = models.Product.objects.get(
  31. upc=upc)
  32. except models.Product.DoesNotExist:
  33. product = models.Product(upc=upc)
  34. else:
  35. product = models.Product()
  36. if not is_variant:
  37. product.title = title
  38. product.description = description
  39. product.product_class = product_class
  40. # Attributes
  41. if not is_group:
  42. for code, value in zip(attribute_codes, row[9:]):
  43. # Need to check if the attribute requires an Option instance
  44. attr = product_class.attributes.get(
  45. code=code)
  46. if attr.is_option:
  47. value = attr.option_group.options.get(option=value)
  48. if attr.type == 'date':
  49. value = datetime.datetime.strptime(value, "%d/%m/%Y").date()
  50. setattr(product.attr, code, value)
  51. # Assign parent for variants
  52. if is_variant:
  53. product.parent = self.parent
  54. product.save()
  55. # Save a reference to last group product
  56. if is_group:
  57. self.parent = product
  58. # Category information
  59. if category:
  60. leaf = categories.create_from_breadcrumbs(category)
  61. models.ProductCategory.objects.get_or_create(
  62. product=product, category=leaf)
  63. # Stock record
  64. if partner:
  65. partner, __ = partner_models.Partner.objects.get_or_create(
  66. name=partner)
  67. try:
  68. record = partner_models.StockRecord.objects.get(
  69. product=product)
  70. except partner_models.StockRecord.DoesNotExist:
  71. record = partner_models.StockRecord(
  72. product=product)
  73. record.partner = partner
  74. record.partner_sku = sku
  75. record.price_excl_tax = D(price)
  76. if stock != 'NULL':
  77. record.num_in_stock = stock
  78. record.save()