Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from django.db import models
- from mptt.models import MPTTModel, TreeForeignKey
- from django.core.urlresolvers import reverse
- import urllib.request
- import os
- from django.core.files import File
- import sys
- from django.core.exceptions import ObjectDoesNotExist
- class Category(MPTTModel):
- name = models.CharField(max_length=255, verbose_name='Категория')
- slug = models.SlugField(max_length=255)
- parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
- short_desc = models.TextField(null=True, blank=True, verbose_name='Короткое описание')
- long_desc = models.TextField(null=True, blank=True, verbose_name='Полное писание')
- photo = models.ImageField(max_length=255, upload_to="category/", blank=True, null=True)
- active = models.BooleanField(default=True, verbose_name='Активность')
- class Meta:
- verbose_name = 'Категория'
- verbose_name_plural = 'Категории'
- class MPTTMeta:
- order_insertion_by = ['name']
- def __str__(self):
- return self.name
- def get_absolute_url(self):
- parents_slug_list = [ancestor.slug for ancestor in self.get_ancestors()]
- parents_path = ''
- if parents_slug_list:
- parents_path = '/'.join(parents_slug_list) + '/'
- return reverse('in_catalog', args=[parents_path + self.slug])
- class Attribute(models.Model):
- name = models.CharField(max_length=255, verbose_name='Название')
- xml_id = models.CharField(max_length=255, verbose_name='XML_ID')
- active = models.BooleanField(default=True, verbose_name='Активность')
- def __str__(self):
- return self.name
- class Meta:
- verbose_name = 'Свойство'
- verbose_name_plural = 'Свойства'
- class Product(models.Model):
- xml_id = models.CharField(max_length=255, verbose_name='XML_ID', unique=True)
- name = models.CharField(max_length=255, verbose_name='Название')
- slug = models.SlugField(max_length=255)
- category = models.ManyToManyField(Category,
- verbose_name='Категории',
- related_name='products',
- through='ProductCategory')
- short_desc = models.TextField(null=True, blank=True, verbose_name='Короткое описание')
- long_desc = models.TextField(null=True, blank=True, verbose_name='Полное писание')
- active = models.BooleanField(default=True, verbose_name='Активность')
- attributes = models.ManyToManyField(Attribute, through='ProductAttribute', verbose_name='Свойства')
- price = models.FloatField(verbose_name='Цена')
- price1 = models.FloatField(verbose_name='Цена1')
- price2 = models.FloatField(verbose_name='Цена2')
- price3 = models.FloatField(verbose_name='Цена3')
- sku = models.CharField(max_length=255, verbose_name='Артикул')
- xml_url = models.URLField(max_length=255, verbose_name='Страница поставщика', blank=True)
- class Meta:
- verbose_name = 'Товар'
- verbose_name_plural = 'Товары'
- def __str__(self):
- return self.name
- def intro(self):
- return self.short_desc or self.long_desc
- def get_photo(self):
- try:
- return self.photos.all()[0]
- except IndexError:
- return None
- def get_photos(self):
- return self.photos.all()
- def get_absolute_url(self):
- try:
- main_cat = self.category.get(productcategory__main=True)
- except ObjectDoesNotExist:
- main_cat = self.category.all()[0]
- category_ancestor_slug_list = [ancestor.slug for ancestor in main_cat.get_ancestors()]
- ancestor_path = ''
- if category_ancestor_slug_list:
- ancestor_path = '/'.join(category_ancestor_slug_list) + '/'
- return reverse('in_catalog', args=[ancestor_path + main_cat.slug + '/' + self.slug])
- class ProductCategory(models.Model):
- product = models.ForeignKey(Product, verbose_name='Товар')
- category = models.ForeignKey(Category, verbose_name='Категория')
- main = models.BooleanField(default=False)
- def save(self, *args, **kwargs):
- if self.main:
- try:
- temp = ProductCategory.objects.get(main=True)
- if self != temp:
- temp.main = False
- temp.save()
- except ProductCategory.DoesNotExist:
- pass
- super(ProductCategory, self).save(*args, **kwargs)
- class Meta:
- verbose_name = 'Продукт-Категория'
- verbose_name_plural = 'Продукты-Категории'
- def __str__(self):
- return self.product.name + '/' + self.category.name
- class ProductAttribute(models.Model):
- product = models.ForeignKey(Product, verbose_name='Товар')
- attribute = models.ForeignKey(Attribute, verbose_name='Свойство', related_name='with_products')
- value = models.CharField(max_length=255, verbose_name='Значение')
- class Meta:
- verbose_name = 'Продукт-Свойство'
- verbose_name_plural = 'Продукты-Свойства'
- def __str__(self):
- return self.product.name + '/' + self.attribute.name + '/' + self.value
- class ProductPhoto(models.Model):
- url = models.CharField(max_length=255, unique=True)
- photo = models.ImageField(max_length=255, upload_to='products/', blank=True)
- product = models.ForeignKey(Product, verbose_name='Товар', related_name='photos')
- def cache(self):
- """Store image locally if we have a URL"""
- if self.url and not self.photo:
- result = urllib.request.urlretrieve(self.url)
- self.photo.save(
- os.path.basename(self.url),
- File(open(result[0], 'rb'))
- )
- self.save()
- def __str__(self):
- return self.product.name
- class Meta:
- verbose_name = 'Изображение'
- verbose_name_plural = 'Изображения'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement