From 0f77c11a873846bbca896948108ed22c851add18 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sun, 18 Nov 2012 10:47:15 -0800 Subject: [PATCH] add ProductPrice --- rattail/django/rattail/admin.py | 11 +++++- .../django/rattail/migrations/0001_initial.py | 31 +++++++++++++++ rattail/django/rattail/models/rattail.py | 35 ++++++++++++++++- rattail/django/util.py | 39 +++++++++++++++++++ 4 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 rattail/django/util.py diff --git a/rattail/django/rattail/admin.py b/rattail/django/rattail/admin.py index 2d43de3..51a345e 100644 --- a/rattail/django/rattail/admin.py +++ b/rattail/django/rattail/admin.py @@ -72,4 +72,13 @@ admin.site.register(Category, ModelAdmin) admin.site.register(Brand, ModelAdmin) -admin.site.register(Product, ModelAdmin) +class ProductPriceInline(admin.TabularInline): + model = ProductPrice + verbose_name_plural = "Prices" + exclude = ('uuid',) + extra = 0 + +class ProductAdmin(ModelAdmin): + inlines = [ProductPriceInline] + +admin.site.register(Product, ProductAdmin) diff --git a/rattail/django/rattail/migrations/0001_initial.py b/rattail/django/rattail/migrations/0001_initial.py index deebc47..e1586a6 100644 --- a/rattail/django/rattail/migrations/0001_initial.py +++ b/rattail/django/rattail/migrations/0001_initial.py @@ -86,8 +86,26 @@ class Migration(SchemaMigration): )) db.send_create_signal('rattail', ['Product']) + # Adding model 'ProductPrice' + db.create_table('rattail_product_prices', ( + ('uuid', self.gf('rattail.django.rattail.models.core.UUIDField')(max_length=32, primary_key=True)), + ('product', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rattail.Product'], db_column='product_uuid')), + ('type', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('level', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('starts', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('ends', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('price', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=8, decimal_places=3, blank=True)), + ('multiple', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('pack_price', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=8, decimal_places=3, blank=True)), + ('pack_multiple', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + )) + db.send_create_signal('rattail', ['ProductPrice']) + def backwards(self, orm): + # Deleting model 'ProductPrice' + db.delete_table('rattail_product_prices') + # Deleting model 'Product' db.delete_table('rattail_products') @@ -176,6 +194,19 @@ class Migration(SchemaMigration): 'upc': ('rattail.django.rattail.models.rattail.GPCField', [], {'db_index': 'True'}), 'uuid': ('rattail.django.rattail.models.core.UUIDField', [], {'max_length': '32', 'primary_key': 'True'}) }, + 'rattail.productprice': { + 'Meta': {'object_name': 'ProductPrice', 'db_table': "'rattail_product_prices'"}, + 'ends': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'level': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'multiple': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'pack_multiple': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'pack_price': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '3', 'blank': 'True'}), + 'price': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '3', 'blank': 'True'}), + 'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rattail.Product']", 'db_column': "'product_uuid'"}), + 'starts': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'type': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'uuid': ('rattail.django.rattail.models.core.UUIDField', [], {'max_length': '32', 'primary_key': 'True'}) + }, } complete_apps = ['rattail'] diff --git a/rattail/django/rattail/models/rattail.py b/rattail/django/rattail/models/rattail.py index a615e0e..e12a22d 100644 --- a/rattail/django/rattail/models/rattail.py +++ b/rattail/django/rattail/models/rattail.py @@ -30,15 +30,17 @@ from __future__ import absolute_import from django.db import models +import rattail from rattail.gpc import GPC from rattail.django.rattail.models import Model, uuid_field from rattail.django.rattail.models.contact import ( ContactInfoManager, PhoneNumber, EmailAddress) +from rattail.django.util import enum_to_choices __all__ = ['Store', 'StorePhoneNumber', 'StoreEmailAddress', - 'Department', 'Subdepartment', 'Category', - 'Brand', 'Product'] + 'Department', 'Subdepartment', 'Category', 'Brand', + 'Product', 'ProductPrice'] class GPCField(models.BigIntegerField): @@ -210,3 +212,32 @@ class Product(Model): def __unicode__(self): return unicode(self.description or '') + + +class ProductPrice(Model): + """ + Represents a price for a product. + """ + + class Meta(Model.Meta): + db_table = Model.prefix('product_prices') + + PRICE_TYPE_CHOICES = enum_to_choices(rattail.PRICE_TYPE) + + uuid = uuid_field() + product = models.ForeignKey(Product, db_column='product_uuid') + type = models.IntegerField(choices=PRICE_TYPE_CHOICES, blank=True, null=True) + level = models.IntegerField(blank=True, null=True) + starts = models.DateTimeField(blank=True, null=True) + ends = models.DateTimeField(blank=True, null=True) + price = models.DecimalField(max_digits=8, decimal_places=3, blank=True, null=True) + multiple = models.IntegerField(blank=True, null=True) + pack_price = models.DecimalField(max_digits=8, decimal_places=3, blank=True, null=True) + pack_multiple = models.IntegerField(blank=True, null=True) + + def __repr__(self): + return "" % (self.product, self.price) + + def __unicode__(self): + type = rattail.PRICE_TYPE.get(self.type, "?") + return u'$ %0.2f / %d (%s)' % (self.price, self.multiple or 1, type) diff --git a/rattail/django/util.py b/rattail/django/util.py new file mode 100644 index 0000000..3b7d510 --- /dev/null +++ b/rattail/django/util.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +################################################################################ +# +# Rattail -- Retail Software Framework +# Copyright © 2010-2012 Lance Edgar +# +# This file is part of Rattail. +# +# Rattail is free software: you can redistribute it and/or modify it under the +# terms of the GNU Affero General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for +# more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with Rattail. If not, see . +# +################################################################################ + +""" +``rattail.django.util`` -- Utilities +""" + + +def enum_to_choices(enum): + """ + Convert ``enum`` (which should be an enumeration as is normally used by + Rattail) into a "choices" tuple as is normally used by Django. + """ + + choices = [] + for key, value in enum.iteritems(): + choices.append((key, value)) + return tuple(choices)