Added Shop app with pricing for amiibo

This commit is contained in:
Felipe Martín 2015-06-22 21:12:26 +02:00
parent 122de410b3
commit 8af1c02015
16 changed files with 264 additions and 1 deletions

View File

@ -0,0 +1,7 @@
# coding: utf-8
# py3
from __future__ import unicode_literals
default_app_config = 'amiibofindr.apps.amiibo.apps.AmiiboAppConfig'

View File

@ -10,7 +10,7 @@ import reversion
# amiibo
from .models import Collection, Amiibo
from .models import Collection, Amiibo, AmiiboPrice, AmiiboPriceHistory
class ColectionResource(resources.ModelResource):
@ -49,5 +49,14 @@ class AmiiboAdmin(ImportExportModelAdmin, reversion.VersionAdmin):
box_image.allow_tags = True
class AmiiboPriceAdmin(reversion.VersionAdmin):
pass
class AmiiboPriceHistoryAdmin(admin.ModelAdmin):
pass
admin.site.register(Collection, CollectionAdmin)
admin.site.register(Amiibo, AmiiboAdmin)
admin.site.register(AmiiboPrice, AmiiboPriceAdmin)
admin.site.register(AmiiboPriceHistory, AmiiboPriceHistoryAdmin)

View File

@ -0,0 +1,31 @@
# coding: utf-8
# py3
from __future__ import unicode_literals
# django
from django.apps import AppConfig
from django.db.models.signals import pre_save, post_save
# amiibo
from .handlers import (
pre_check_price_change, post_check_price_change,
save_historical_price
)
from .signals import amiibo_price_changed
class AmiiboAppConfig(AppConfig):
name = 'amiibofindr.apps.amiibo'
def ready(self):
AmiiboPrice = self.get_model('AmiiboPrice')
# pre_save.connect(pre_check_price_change,
# sender=AmiiboPrice)
post_save.connect(post_check_price_change,
sender=AmiiboPrice)
amiibo_price_changed.connect(save_historical_price,
sender=AmiiboPrice)

View File

@ -0,0 +1,31 @@
# coding: utf-8
# py3
from __future__ import unicode_literals
# python
import copy
# amiibo
from .signals import amiibo_price_changed
def save_historical_price(sender, instance, **kwargs):
old_price = kwargs.get('old_price')
new_price = kwargs.get('new_price')
instance.save_history(old_price, new_price)
def pre_check_price_change(sender, instance, **kwargs):
instance.old_price = copy.deepcopy(instance.price)
def post_check_price_change(sender, instance, created, **kwargs):
if instance.price != instance.old_price:
amiibo_price_changed.send(
sender=instance.__class__,
instance=instance,
amiibo=instance.amiibo,
old_price=instance.old_price,
new_price=instance.price
)

View File

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('shop', '0001_initial'),
('amiibo', '0005_auto_20150616_2142'),
]
operations = [
migrations.CreateModel(
name='AmiiboPrice',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('price', models.DecimalField(max_digits=6, decimal_places=2)),
('currency', models.CharField(default=b'EUR', max_length=3)),
('date', models.DateTimeField(auto_now_add=True)),
('amiibo', models.ForeignKey(to='amiibo.Amiibo')),
('shop', models.ForeignKey(to='shop.Shop')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='AmiiboPriceHistory',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('price', models.DecimalField(max_digits=6, decimal_places=2)),
('currency', models.CharField(default=b'EUR', max_length=3)),
('date', models.DateTimeField(auto_now_add=True)),
('amiibo', models.ForeignKey(to='amiibo.Amiibo')),
('shop', models.ForeignKey(to='shop.Shop')),
],
options={
'abstract': False,
},
),
]

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('amiibo', '0006_amiiboprice_amiibopricehistory'),
]
operations = [
migrations.AddField(
model_name='amiibopricehistory',
name='diff',
field=models.DecimalField(default=0, max_digits=6, decimal_places=2),
preserve_default=False,
),
]

View File

@ -87,3 +87,50 @@ class Amiibo(models.Model):
@property
def name(self):
return self.name_eu
class AmiiboPrice(models.Model):
amiibo = models.ForeignKey(Amiibo)
shop = models.ForeignKey('shop.Shop')
price = models.DecimalField(max_digits=6, decimal_places=2)
currency = models.CharField(default='EUR', max_length=3)
date = models.DateTimeField(auto_now_add=True)
def __init__(self, *args, **kwargs):
super(AmiiboPrice, self).__init__(*args, **kwargs)
self.old_price = self.price
def __unicode__(self):
return u'{} price for {}: {}{}'.format(
self.amiibo.name,
self.shop.name,
self.price, self.currency
)
def save_history(self, old_price, new_price):
history = AmiiboPriceHistory(
amiibo=self.amiibo,
shop_id=self.shop_id,
price=self.price,
currency=self.currency,
diff=new_price-old_price
)
return history.save()
class AmiiboPriceHistory(models.Model):
amiibo = models.ForeignKey(Amiibo)
shop = models.ForeignKey('shop.Shop')
price = models.DecimalField(max_digits=6, decimal_places=2)
currency = models.CharField(default='EUR', max_length=3)
date = models.DateTimeField(auto_now_add=True)
diff = models.DecimalField(max_digits=6, decimal_places=2)
def __unicode__(self):
return u'{} price for {}: {}{} [{}{}] ({})'.format(
self.amiibo.name,
self.shop.name,
self.price, self.currency,
self.diff, self.currency,
self.date
)

View File

@ -0,0 +1,12 @@
# coding: utf-8
# py3
from __future__ import unicode_literals
# django
from django import dispatch
amiibo_price_changed = dispatch.Signal(
providing_args=["instance", "amiibo", "old_price", "new_price"]
)

View File

View File

@ -0,0 +1,16 @@
# coding: utf-8
# django
from django.contrib import admin
# third party
import reversion
# shop
from amiibofindr.apps.shop.models import Shop
class ShopAdmin(reversion.VersionAdmin):
pass
admin.site.register(Shop, ShopAdmin)

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='Shop',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(max_length=64)),
('slug', models.CharField(max_length=64)),
('url', models.CharField(max_length=64)),
('referer_id', models.CharField(max_length=64, null=True, blank=True)),
],
),
]

View File

@ -0,0 +1,17 @@
# coding: utf-8
# py3
from __future__ import unicode_literals
# django
from django.db import models
class Shop(models.Model):
name = models.CharField(max_length=64)
slug = models.CharField(max_length=64)
url = models.CharField(max_length=64)
referer_id = models.CharField(max_length=64, blank=True, null=True)
def __unicode__(self):
return self.name

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

View File

@ -45,6 +45,7 @@ INSTALLED_APPS = (
# own apps
'amiibofindr.apps.core',
'amiibofindr.apps.amiibo',
'amiibofindr.apps.shop',
'amiibofindr.apps.home',
)