]> git.parisson.com Git - diggersdigest.git/commitdiff
Add record_shop app
authorThomas Fillon <thomas@parisson.com>
Fri, 28 Aug 2015 16:42:39 +0000 (18:42 +0200)
committerThomas Fillon <thomas@parisson.com>
Fri, 28 Aug 2015 16:42:39 +0000 (18:42 +0200)
diggersdigest/diggersdigest/migrations/__init__.py [new file with mode: 0644]
diggersdigest/diggersdigest/migrations/shop/0001_initial.py [new file with mode: 0644]
diggersdigest/diggersdigest/migrations/shop/__init__.py [new file with mode: 0644]
diggersdigest/diggersdigest/settings.py
diggersdigest/records_shop/__init__.py [new file with mode: 0644]
diggersdigest/records_shop/admin.py [new file with mode: 0644]
diggersdigest/records_shop/migrations/0001_initial.py [new file with mode: 0644]
diggersdigest/records_shop/migrations/__init__.py [new file with mode: 0644]
diggersdigest/records_shop/models.py [new file with mode: 0644]
diggersdigest/records_shop/tests.py [new file with mode: 0644]
diggersdigest/records_shop/views.py [new file with mode: 0644]

diff --git a/diggersdigest/diggersdigest/migrations/__init__.py b/diggersdigest/diggersdigest/migrations/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/diggersdigest/diggersdigest/migrations/shop/0001_initial.py b/diggersdigest/diggersdigest/migrations/shop/0001_initial.py
new file mode 100644 (file)
index 0000000..d8a505f
--- /dev/null
@@ -0,0 +1,284 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+from decimal import Decimal
+import mezzanine.utils.models
+import django.db.models.deletion
+import mezzanine.core.fields
+import cartridge.shop.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('pages', '0003_auto_20150527_1555'),
+        ('sites', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Cart',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('last_updated', models.DateTimeField(null=True, verbose_name='Last updated')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='CartItem',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('sku', cartridge.shop.fields.SKUField(max_length=20, verbose_name='SKU')),
+                ('description', models.CharField(max_length=2000, verbose_name='Description')),
+                ('quantity', models.IntegerField(default=0, verbose_name='Quantity')),
+                ('unit_price', cartridge.shop.fields.MoneyField(decimal_places=2, default=Decimal('0'), max_digits=10, blank=True, null=True, verbose_name='Unit price')),
+                ('total_price', cartridge.shop.fields.MoneyField(decimal_places=2, default=Decimal('0'), max_digits=10, blank=True, null=True, verbose_name='Total price')),
+                ('url', models.CharField(max_length=2000)),
+                ('image', models.CharField(max_length=200, null=True)),
+                ('cart', models.ForeignKey(related_name='items', to='shop.Cart')),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+        migrations.CreateModel(
+            name='Category',
+            fields=[
+                ('page_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pages.Page')),
+                ('content', mezzanine.core.fields.RichTextField(verbose_name='Content')),
+                ('featured_image', mezzanine.core.fields.FileField(max_length=255, null=True, verbose_name='Featured Image', blank=True)),
+                ('price_min', cartridge.shop.fields.MoneyField(null=True, verbose_name='Minimum price', max_digits=10, decimal_places=2, blank=True)),
+                ('price_max', cartridge.shop.fields.MoneyField(null=True, verbose_name='Maximum price', max_digits=10, decimal_places=2, blank=True)),
+                ('combined', models.BooleanField(default=True, help_text='If checked, products must match all specified filters, otherwise products can match any specified filter.', verbose_name='Combined')),
+            ],
+            options={
+                'ordering': ('_order',),
+                'verbose_name': 'Product category',
+                'verbose_name_plural': 'Product categories',
+            },
+            bases=('pages.page', models.Model),
+        ),
+        migrations.CreateModel(
+            name='DiscountCode',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('title', models.CharField(max_length=100, verbose_name='Title')),
+                ('active', models.BooleanField(default=False, verbose_name='Active')),
+                ('discount_deduct', cartridge.shop.fields.MoneyField(null=True, verbose_name='Reduce by amount', max_digits=10, decimal_places=2, blank=True)),
+                ('discount_percent', cartridge.shop.fields.PercentageField(null=True, verbose_name='Reduce by percent', max_digits=5, decimal_places=2, blank=True)),
+                ('discount_exact', cartridge.shop.fields.MoneyField(null=True, verbose_name='Reduce to amount', max_digits=10, decimal_places=2, blank=True)),
+                ('valid_from', models.DateTimeField(null=True, verbose_name='Valid from', blank=True)),
+                ('valid_to', models.DateTimeField(null=True, verbose_name='Valid to', blank=True)),
+                ('code', cartridge.shop.fields.DiscountCodeField(unique=True, max_length=20, verbose_name='Code')),
+                ('min_purchase', cartridge.shop.fields.MoneyField(null=True, verbose_name='Minimum total purchase', max_digits=10, decimal_places=2, blank=True)),
+                ('free_shipping', models.BooleanField(default=False, verbose_name='Free shipping')),
+                ('uses_remaining', models.IntegerField(help_text='If you wish to limit the number of times a code may be used, set this value. It will be decremented upon each use.', null=True, verbose_name='Uses remaining', blank=True)),
+                ('categories', models.ManyToManyField(related_name='discountcode_related', verbose_name='Categories', to='shop.Category', blank=True)),
+            ],
+            options={
+                'verbose_name': 'Discount code',
+                'verbose_name_plural': 'Discount codes',
+            },
+        ),
+        migrations.CreateModel(
+            name='Order',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('billing_detail_first_name', models.CharField(max_length=100, verbose_name='First name')),
+                ('billing_detail_last_name', models.CharField(max_length=100, verbose_name='Last name')),
+                ('billing_detail_street', models.CharField(max_length=100, verbose_name='Street')),
+                ('billing_detail_city', models.CharField(max_length=100, verbose_name='City/Suburb')),
+                ('billing_detail_state', models.CharField(max_length=100, verbose_name='State/Region')),
+                ('billing_detail_postcode', models.CharField(max_length=10, verbose_name='Zip/Postcode')),
+                ('billing_detail_country', models.CharField(max_length=100, verbose_name='Country')),
+                ('billing_detail_phone', models.CharField(max_length=20, verbose_name='Phone')),
+                ('billing_detail_email', models.EmailField(max_length=254, verbose_name='Email')),
+                ('shipping_detail_first_name', models.CharField(max_length=100, verbose_name='First name')),
+                ('shipping_detail_last_name', models.CharField(max_length=100, verbose_name='Last name')),
+                ('shipping_detail_street', models.CharField(max_length=100, verbose_name='Street')),
+                ('shipping_detail_city', models.CharField(max_length=100, verbose_name='City/Suburb')),
+                ('shipping_detail_state', models.CharField(max_length=100, verbose_name='State/Region')),
+                ('shipping_detail_postcode', models.CharField(max_length=10, verbose_name='Zip/Postcode')),
+                ('shipping_detail_country', models.CharField(max_length=100, verbose_name='Country')),
+                ('shipping_detail_phone', models.CharField(max_length=20, verbose_name='Phone')),
+                ('additional_instructions', models.TextField(verbose_name='Additional instructions', blank=True)),
+                ('time', models.DateTimeField(auto_now_add=True, verbose_name='Time', null=True)),
+                ('key', models.CharField(max_length=40)),
+                ('user_id', models.IntegerField(null=True, blank=True)),
+                ('shipping_type', models.CharField(max_length=50, verbose_name='Shipping type', blank=True)),
+                ('shipping_total', cartridge.shop.fields.MoneyField(null=True, verbose_name='Shipping total', max_digits=10, decimal_places=2, blank=True)),
+                ('tax_type', models.CharField(max_length=50, verbose_name='Tax type', blank=True)),
+                ('tax_total', cartridge.shop.fields.MoneyField(null=True, verbose_name='Tax total', max_digits=10, decimal_places=2, blank=True)),
+                ('item_total', cartridge.shop.fields.MoneyField(null=True, verbose_name='Item total', max_digits=10, decimal_places=2, blank=True)),
+                ('discount_code', cartridge.shop.fields.DiscountCodeField(max_length=20, verbose_name='Discount code', blank=True)),
+                ('discount_total', cartridge.shop.fields.MoneyField(null=True, verbose_name='Discount total', max_digits=10, decimal_places=2, blank=True)),
+                ('total', cartridge.shop.fields.MoneyField(null=True, verbose_name='Order total', max_digits=10, decimal_places=2, blank=True)),
+                ('transaction_id', models.CharField(max_length=255, null=True, verbose_name='Transaction ID', blank=True)),
+                ('status', models.IntegerField(default=1, verbose_name='Status', choices=[(1, 'Unprocessed'), (2, 'Processed')])),
+                ('site', models.ForeignKey(editable=False, to='sites.Site')),
+            ],
+            options={
+                'ordering': ('-id',),
+                'verbose_name': 'Order',
+                'verbose_name_plural': 'Orders',
+            },
+        ),
+        migrations.CreateModel(
+            name='OrderItem',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('sku', cartridge.shop.fields.SKUField(max_length=20, verbose_name='SKU')),
+                ('description', models.CharField(max_length=2000, verbose_name='Description')),
+                ('quantity', models.IntegerField(default=0, verbose_name='Quantity')),
+                ('unit_price', cartridge.shop.fields.MoneyField(decimal_places=2, default=Decimal('0'), max_digits=10, blank=True, null=True, verbose_name='Unit price')),
+                ('total_price', cartridge.shop.fields.MoneyField(decimal_places=2, default=Decimal('0'), max_digits=10, blank=True, null=True, verbose_name='Total price')),
+                ('order', models.ForeignKey(related_name='items', to='shop.Order')),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+        migrations.CreateModel(
+            name='Product',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('keywords_string', models.CharField(max_length=500, editable=False, blank=True)),
+                ('rating_count', models.IntegerField(default=0, editable=False)),
+                ('rating_sum', models.IntegerField(default=0, editable=False)),
+                ('rating_average', models.FloatField(default=0, editable=False)),
+                ('title', models.CharField(max_length=500, verbose_name='Title')),
+                ('slug', models.CharField(help_text='Leave blank to have the URL auto-generated from the title.', max_length=2000, null=True, verbose_name='URL', blank=True)),
+                ('_meta_title', models.CharField(help_text='Optional title to be used in the HTML title tag. If left blank, the main title field will be used.', max_length=500, null=True, verbose_name='Title', blank=True)),
+                ('description', models.TextField(verbose_name='Description', blank=True)),
+                ('gen_description', models.BooleanField(default=True, help_text='If checked, the description will be automatically generated from content. Uncheck if you want to manually set a custom description.', verbose_name='Generate description')),
+                ('created', models.DateTimeField(null=True, editable=False)),
+                ('updated', models.DateTimeField(null=True, editable=False)),
+                ('status', models.IntegerField(default=2, help_text='With Draft chosen, will only be shown for admin users on the site.', verbose_name='Status', choices=[(1, 'Draft'), (2, 'Published')])),
+                ('publish_date', models.DateTimeField(help_text="With Published chosen, won't be shown until this time", null=True, verbose_name='Published from', db_index=True, blank=True)),
+                ('expiry_date', models.DateTimeField(help_text="With Published chosen, won't be shown after this time", null=True, verbose_name='Expires on', blank=True)),
+                ('short_url', models.URLField(null=True, blank=True)),
+                ('in_sitemap', models.BooleanField(default=True, verbose_name='Show in sitemap')),
+                ('content', mezzanine.core.fields.RichTextField(verbose_name='Content')),
+                ('unit_price', cartridge.shop.fields.MoneyField(null=True, verbose_name='Unit price', max_digits=10, decimal_places=2, blank=True)),
+                ('sale_id', models.IntegerField(null=True)),
+                ('sale_price', cartridge.shop.fields.MoneyField(null=True, verbose_name='Sale price', max_digits=10, decimal_places=2, blank=True)),
+                ('sale_from', models.DateTimeField(null=True, verbose_name='Sale start', blank=True)),
+                ('sale_to', models.DateTimeField(null=True, verbose_name='Sale end', blank=True)),
+                ('sku', cartridge.shop.fields.SKUField(max_length=20, unique=True, null=True, verbose_name='SKU', blank=True)),
+                ('num_in_stock', models.IntegerField(null=True, verbose_name='Number in stock', blank=True)),
+                ('available', models.BooleanField(default=False, verbose_name='Available for purchase')),
+                ('image', models.CharField(max_length=100, null=True, verbose_name='Image', blank=True)),
+                ('date_added', models.DateTimeField(auto_now_add=True, verbose_name='Date added', null=True)),
+                ('categories', models.ManyToManyField(to='shop.Category', verbose_name='Product categories', blank=True)),
+                ('related_products', models.ManyToManyField(related_name='related_products_rel_+', verbose_name='Related products', to='shop.Product', blank=True)),
+                ('site', models.ForeignKey(editable=False, to='sites.Site')),
+                ('upsell_products', models.ManyToManyField(related_name='upsell_products_rel_+', verbose_name='Upsell products', to='shop.Product', blank=True)),
+            ],
+            options={
+                'verbose_name': 'Product',
+                'verbose_name_plural': 'Products',
+            },
+            bases=(models.Model, mezzanine.utils.models.AdminThumbMixin),
+        ),
+        migrations.CreateModel(
+            name='ProductAction',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('timestamp', models.IntegerField()),
+                ('total_cart', models.IntegerField(default=0)),
+                ('total_purchase', models.IntegerField(default=0)),
+                ('product', models.ForeignKey(related_name='actions', to='shop.Product')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='ProductImage',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('_order', mezzanine.core.fields.OrderField(null=True, verbose_name='Order')),
+                ('file', mezzanine.core.fields.FileField(max_length=255, verbose_name='Image')),
+                ('description', models.CharField(max_length=100, verbose_name='Description', blank=True)),
+                ('product', models.ForeignKey(related_name='images', to='shop.Product')),
+            ],
+            options={
+                'ordering': ('_order',),
+                'verbose_name': 'Image',
+                'verbose_name_plural': 'Images',
+            },
+        ),
+        migrations.CreateModel(
+            name='ProductOption',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('type', models.IntegerField(verbose_name='Type', choices=[(1, 'Cover condition'), (2, 'Vinyl condition')])),
+                ('name', cartridge.shop.fields.OptionField(max_length=50, null=True, verbose_name='Name')),
+            ],
+            options={
+                'verbose_name': 'Product option',
+                'verbose_name_plural': 'Product options',
+            },
+        ),
+        migrations.CreateModel(
+            name='ProductVariation',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('unit_price', cartridge.shop.fields.MoneyField(null=True, verbose_name='Unit price', max_digits=10, decimal_places=2, blank=True)),
+                ('sale_id', models.IntegerField(null=True)),
+                ('sale_price', cartridge.shop.fields.MoneyField(null=True, verbose_name='Sale price', max_digits=10, decimal_places=2, blank=True)),
+                ('sale_from', models.DateTimeField(null=True, verbose_name='Sale start', blank=True)),
+                ('sale_to', models.DateTimeField(null=True, verbose_name='Sale end', blank=True)),
+                ('sku', cartridge.shop.fields.SKUField(max_length=20, unique=True, null=True, verbose_name='SKU', blank=True)),
+                ('num_in_stock', models.IntegerField(null=True, verbose_name='Number in stock', blank=True)),
+                ('default', models.BooleanField(default=False, verbose_name='Default')),
+                ('option1', cartridge.shop.fields.OptionField(max_length=50, null=True, verbose_name='Cover condition')),
+                ('option2', cartridge.shop.fields.OptionField(max_length=50, null=True, verbose_name='Vinyl condition')),
+                ('image', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, verbose_name='Image', blank=True, to='shop.ProductImage', null=True)),
+                ('product', models.ForeignKey(related_name='variations', to='shop.Product')),
+            ],
+            options={
+                'ordering': ('-default',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Sale',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('title', models.CharField(max_length=100, verbose_name='Title')),
+                ('active', models.BooleanField(default=False, verbose_name='Active')),
+                ('discount_deduct', cartridge.shop.fields.MoneyField(null=True, verbose_name='Reduce by amount', max_digits=10, decimal_places=2, blank=True)),
+                ('discount_percent', cartridge.shop.fields.PercentageField(null=True, verbose_name='Reduce by percent', max_digits=5, decimal_places=2, blank=True)),
+                ('discount_exact', cartridge.shop.fields.MoneyField(null=True, verbose_name='Reduce to amount', max_digits=10, decimal_places=2, blank=True)),
+                ('valid_from', models.DateTimeField(null=True, verbose_name='Valid from', blank=True)),
+                ('valid_to', models.DateTimeField(null=True, verbose_name='Valid to', blank=True)),
+                ('categories', models.ManyToManyField(related_name='sale_related', verbose_name='Categories', to='shop.Category', blank=True)),
+                ('products', models.ManyToManyField(to='shop.Product', verbose_name='Products', blank=True)),
+            ],
+            options={
+                'verbose_name': 'Sale',
+                'verbose_name_plural': 'Sales',
+            },
+        ),
+        migrations.AddField(
+            model_name='discountcode',
+            name='products',
+            field=models.ManyToManyField(to='shop.Product', verbose_name='Products', blank=True),
+        ),
+        migrations.AddField(
+            model_name='category',
+            name='options',
+            field=models.ManyToManyField(related_name='product_options', verbose_name='Product options', to='shop.ProductOption', blank=True),
+        ),
+        migrations.AddField(
+            model_name='category',
+            name='products',
+            field=models.ManyToManyField(to='shop.Product', verbose_name='Products', blank=True),
+        ),
+        migrations.AddField(
+            model_name='category',
+            name='sale',
+            field=models.ForeignKey(verbose_name='Sale', blank=True, to='shop.Sale', null=True),
+        ),
+        migrations.AlterUniqueTogether(
+            name='productaction',
+            unique_together=set([('product', 'timestamp')]),
+        ),
+    ]
diff --git a/diggersdigest/diggersdigest/migrations/shop/__init__.py b/diggersdigest/diggersdigest/migrations/shop/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
index 26fddcf257beaeda904368585013d2aafbd3c64a..dc5878267087d00ae2092fa1b50e2fea00f9ed62 100644 (file)
@@ -296,7 +296,7 @@ INSTALLED_APPS = (
     # "mezzanine.accounts",
     # "mezzanine.mobile",
     "records",
+    "records_shop",
 )
 
 # List of processors used by RequestContext to populate the context.
@@ -349,6 +349,10 @@ MIDDLEWARE_CLASSES = (
 PACKAGE_NAME_FILEBROWSER = "filebrowser_safe"
 PACKAGE_NAME_GRAPPELLI = "grappelli_safe"
 
+# Add Migration Module path see : https://github.com/stephenmcd/mezzanine/blob/master/docs/model-customization.rst#field-injection-caveats
+MIGRATION_MODULES = {
+    "shop": "diggersdigest.migrations.shop",
+}
 #########################
 # OPTIONAL APPLICATIONS #
 #########################
@@ -361,7 +365,7 @@ OPTIONAL_APPS = (
     PACKAGE_NAME_FILEBROWSER,
     PACKAGE_NAME_GRAPPELLI,
 )
-
+       
 ##################
 # LOCAL SETTINGS #
 ##################
diff --git a/diggersdigest/records_shop/__init__.py b/diggersdigest/records_shop/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/diggersdigest/records_shop/admin.py b/diggersdigest/records_shop/admin.py
new file mode 100644 (file)
index 0000000..5b32f4a
--- /dev/null
@@ -0,0 +1,6 @@
+from django.contrib import admin
+
+# Register your models here.
+from .models import RecordProduct
+
+admin.site.register(RecordProduct)
diff --git a/diggersdigest/records_shop/migrations/0001_initial.py b/diggersdigest/records_shop/migrations/0001_initial.py
new file mode 100644 (file)
index 0000000..a0121bb
--- /dev/null
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('records', '0005_auto_20150828_1545'),
+        ('shop', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='RecordProduct',
+            fields=[
+                ('product_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='shop.Product')),
+                ('record', models.ForeignKey(related_name='record', verbose_name='record', to='records.Record')),
+            ],
+            options={
+                'abstract': False,
+            },
+            bases=('shop.product',),
+        ),
+    ]
diff --git a/diggersdigest/records_shop/migrations/__init__.py b/diggersdigest/records_shop/migrations/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/diggersdigest/records_shop/models.py b/diggersdigest/records_shop/models.py
new file mode 100644 (file)
index 0000000..e0ef9e5
--- /dev/null
@@ -0,0 +1,12 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+from cartridge.shop.models import Product, ProductVariation
+
+from records.models import Record
+
+class RecordProduct(Product):
+    record = models.ForeignKey(Record, verbose_name=_('record'), related_name='record')
diff --git a/diggersdigest/records_shop/tests.py b/diggersdigest/records_shop/tests.py
new file mode 100644 (file)
index 0000000..7ce503c
--- /dev/null
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/diggersdigest/records_shop/views.py b/diggersdigest/records_shop/views.py
new file mode 100644 (file)
index 0000000..91ea44a
--- /dev/null
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.