Skip to content

Instantly share code, notes, and snippets.

@ojii
Forked from crooksey/gist:1510607
Created December 22, 2011 15:11
Show Gist options
  • Save ojii/1510632 to your computer and use it in GitHub Desktop.
Save ojii/1510632 to your computer and use it in GitHub Desktop.
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