-
-
Save ojii/1510632 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.db import models | |
from polymorphic.polymorphic_model import PolymorphicModel | |
from cms.models.fields import PlaceholderField | |
from django.db.models.signals import pre_save | |
from django.template.defaultfilters import slugify | |
class Slugifier(object): | |
def __init__(self, model, target, source): | |
self.model = product | |
self.target = slug | |
self.source = manufacturer + name | |
field = self.model._meta.get_field_by_name(self.target)[0] | |
self.max_length = field.max_length | |
def __call__(self, instance, **kwargs): | |
if getattr(instance, self.target): | |
return | |
slug = slugify(getattr(instance, self.source))[:self.max_length] | |
current = slug | |
index = 0 | |
while self.model.objects.filter(**{self.target: current}).exists(): | |
suffix = '-%s' % index | |
current = '%s%s' % (slug[:-len(suffix)], suffix) | |
index += 1 | |
setattr(instance, self.target, current) | |
def auto_slug(target, source): | |
""" | |
@auto_slug('slug', 'name') | |
class MyModel(models.Model): | |
name = models.CharField(max_length=255) | |
slug = models.SlugField(max_length=255, null=True) | |
""" | |
def _decorator(cls): | |
pre_save.connect(Slugifier(cls, target, source), sender=cls, weak=False) | |
return cls | |
return _decorator | |
# Define some models that will allow for multiple choice inputs | |
# this will make adding new products alot quicker/easier | |
class Manufacturer(models.Model): | |
name = models.CharField(max_length=50, unique=True) | |
def __unicode__(self): | |
return self.name | |
class Backing(models.Model): | |
name = models.CharField(max_length=50, unique=True) | |
def __unicode__(self): | |
return self.name | |
class Classification(models.Model): | |
rating = models.CharField(max_length=50, unique=True) | |
def __unicode__(self): | |
return self.name | |
class Width(models.Model): | |
widths = models.CharField(max_length=50, unique=True) | |
def __unicode__(self): | |
return self.name | |
class PileType(models.Model): | |
pile_tpye = models.CharField(max_length=50,unique=True) | |
def __unicode__(self): | |
return self.name | |
class SlipRating(models.Model): | |
pile_tpye = models.CharField(max_length=50,unique=True) | |
def __unicode__(self): | |
return self.name | |
# Define a base product model | |
@auto_slug('slug', 'name') | |
class Product(PolymorphicModel): | |
name = models.CharField(max_length=50, unique=True) | |
slug = models.CharField(max_length=50, unique=True) | |
manufacturer = models.ForeignKey(Manufacturer) | |
description = PlaceholderField('product_description') | |
def __unicode__(self): | |
return self.name | |
# Defining sub class of the base product model | |
class Carpet(Product): | |
pile_construction = models.CharField(max_length=50) | |
backing = models.ForeignKey(Backing) | |
classification = models.ForeignKey(Classification) | |
widths = models.ForeignKey(Width) | |
pile_type = models.ForeignKey(PileType) | |
tog_rating = models.CharField(max_length=50) | |
def __unicode__(self): | |
return self.name | |
class Vinyl(Product): | |
classification = models.ForeignKey(Classification) | |
wear_layer = models.CharField(max_length=50) | |
thickness = models.CharField(max_length=50) | |
slip_rating = models.ForeignKey(SlipRating) | |
widths = models.ForeignKey(Width) | |
def __unicode__(self): | |
return self.name | |
class Laminate(Product): | |
classification = models.ForeignKey(Classification) | |
pack_size = models.CharField(max_length=50) | |
def __unicode__(self): | |
return self.name | |
class LVT(Product): | |
classification = models.ForeignKey(Classification) | |
wear_layer = models.CharField(max_length=50) | |
pack_size = models.CharField(max_length=50) | |
class Meta: | |
verbose_name_plural = 'LVT' | |
def __unicode__(self): | |
return self.name | |
class CarpetTile(Product): | |
pile_construction = models.CharField(max_length=50) | |
pile_type = models.ForeignKey(PileType) | |
backing = models.ForeignKey(Backing) | |
classification = models.ForeignKey(Classification) | |
pack_size = models.CharField(max_length=50) | |
def __unicode__(self): | |
return u'%s' % (self.name) | |
class Underlay(Product): | |
construction = models.CharField(max_length=50) | |
backing = models.ForeignKey(Backing) | |
classification = models.ForeignKey(Classification) | |
tog_rating = models.CharField(max_length=50) | |
roll_size = models.CharField(max_length=50) | |
def __unicode__(self): | |
return self.name | |
class Adhesive(Product): | |
coverage = models.CharField(max_length=50) | |
shelf_life = models.CharField(max_length=50) | |
def __unicode__(self): | |
return self.name | |
class Screed(Product): | |
coverage = models.CharField(max_length=50) | |
shelf_life = models.CharField(max_length=50) | |
def __unicode__(self): | |
return self.name | |
class Accessory(Product): | |
reference = models.CharField(max_length=255) | |
class Meta: | |
verbose_name_plural = 'Accessories' | |
def __unicode__(self): | |
return u'%s' % (self.product) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment