Add in the ability to add links to stores/chains.

This commit is contained in:
2013-04-03 23:14:14 +01:00
parent 850027f50d
commit f30f53204a
10 changed files with 401 additions and 7 deletions

View File

@@ -1,5 +1,11 @@
from django.contrib import admin from django.contrib import admin
from .models import Chain, Store, Address, Brand, ClaimRequest from django.contrib.contenttypes.generic import GenericStackedInline
from .models import Chain, Store, Address, Brand, ClaimRequest, Link, LinkType
class LinkInlineAdmin(GenericStackedInline):
model = Link
ct_field = 'object_type'
class ChainAdmin(admin.ModelAdmin): class ChainAdmin(admin.ModelAdmin):
@@ -7,14 +13,18 @@ class ChainAdmin(admin.ModelAdmin):
list_display = ['name'] list_display = ['name']
prepopulated_fields = {"slug": ("name",)} prepopulated_fields = {"slug": ("name",)}
search_fields = ['name'] search_fields = ['name']
inlines = [
LinkInlineAdmin,
]
class StoreAdmin(admin.ModelAdmin): class StoreAdmin(admin.ModelAdmin):
list_filter = ['chain', 'active'] list_filter = ['chain', 'active']
list_display = ['name', 'store_type', 'active'] list_display = ['name', 'store_type', 'active']
prepopulated_fields = {"slug": ("name",)} prepopulated_fields = {"slug": ("name",)}
search_fields = ['name'] search_fields = ['name']
inlines = [
LinkInlineAdmin,
]
class ClaimAdmin(admin.ModelAdmin): class ClaimAdmin(admin.ModelAdmin):
list_filter = ['status'] list_filter = ['status']
@@ -43,4 +53,5 @@ admin.site.register(Chain, ChainAdmin)
admin.site.register(Store, StoreAdmin) admin.site.register(Store, StoreAdmin)
admin.site.register(Address, admin.ModelAdmin) admin.site.register(Address, admin.ModelAdmin)
admin.site.register(Brand, admin.ModelAdmin) admin.site.register(Brand, admin.ModelAdmin)
admin.site.register(ClaimRequest, ClaimAdmin) admin.site.register(ClaimRequest, ClaimAdmin)
admin.site.register(LinkType, admin.ModelAdmin)

View File

@@ -0,0 +1 @@
[{"pk": 1, "model": "stores.linktype", "fields": {"url_format": "https://www.facebook.com/%(account)s", "is_active": true, "name": "Facebook", "icon": "icon-globe"}}, {"pk": 2, "model": "stores.linktype", "fields": {"url_format": "http://twitter.com/%(account)s", "is_active": true, "name": "Twitter", "icon": "icon-globe"}}]

View File

@@ -3,7 +3,8 @@ import requests
from StringIO import StringIO from StringIO import StringIO
from django.db import transaction from django.db import transaction
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from stores.models import Country, County, Address, Store from stores.models import Country, County, Address, Store, Link, LinkType
from django.contrib.contenttypes.models import ContentType
class Command(BaseCommand): class Command(BaseCommand):
@@ -40,6 +41,10 @@ class Command(BaseCommand):
if website: if website:
store.store_type = Store.STORE_TYPE_BOTH store.store_type = Store.STORE_TYPE_BOTH
store.save() store.save()
if twitter:
Link(object_id=store.pk, object_type=ContentType.objects.get_for_model(store.__class__), account_type=LinkType.objects.get(name='Twitter'), account_name=twitter.split('/')[-1]).save()
#if facebook:
# Link(object_id=store.pk, object_type=ContentType.objects.get_for_model(store.__class__), account_type=LinkType.objects.get(name='Facebook'), account_name=facebook).save()
self.stdout.write("Done\n") self.stdout.write("Done\n")
f.close() f.close()

View File

@@ -0,0 +1,163 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Link'
db.create_table(u'stores_link', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()),
('object_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])),
('account_type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['stores.LinkType'])),
('account_name', self.gf('django.db.models.fields.CharField')(max_length=200)),
))
db.send_create_signal('stores', ['Link'])
# Adding model 'LinkType'
db.create_table(u'stores_linktype', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=200)),
('icon', self.gf('django.db.models.fields.CharField')(default='default_icon.png', max_length=100)),
('url_format', self.gf('django.db.models.fields.CharField')(max_length=255)),
('is_active', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('stores', ['LinkType'])
def backwards(self, orm):
# Deleting model 'Link'
db.delete_table(u'stores_link')
# Deleting model 'LinkType'
db.delete_table(u'stores_linktype')
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'stores.address': {
'Meta': {'object_name': 'Address'},
'address1': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'address2': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
'address3': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
'city': ('django.db.models.fields.CharField', [], {'max_length': "'50'"}),
'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'addresses'", 'to': "orm['stores.Country']"}),
'county': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['stores.County']"}),
'geo_latitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
'geo_longitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'postcode': ('django.db.models.fields.CharField', [], {'max_length': '20'})
},
'stores.brand': {
'Meta': {'ordering': "['name']", 'object_name': 'Brand'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
'stores.chain': {
'Meta': {'ordering': "['name']", 'object_name': 'Chain'},
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'editor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'editable_chains'", 'null': 'True', 'to': u"orm['auth.User']"}),
'head_office': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['stores.Address']", 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'long_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'blank': 'True'}),
'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
'stores.claimrequest': {
'Meta': {'object_name': 'ClaimRequest'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'note': ('django.db.models.fields.TextField', [], {}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'object_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claims'", 'to': u"orm['auth.User']"})
},
'stores.country': {
'Meta': {'ordering': "['name']", 'object_name': 'Country'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'iso_code': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'stores.county': {
'Meta': {'ordering': "['name']", 'object_name': 'County'},
'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'counties'", 'null': 'True', 'to': "orm['stores.Country']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'stores.link': {
'Meta': {'object_name': 'Link'},
'account_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'account_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['stores.LinkType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'object_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"})
},
'stores.linktype': {
'Meta': {'ordering': "['name']", 'object_name': 'LinkType'},
'icon': ('django.db.models.fields.CharField', [], {'default': "'default_icon.png'", 'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'url_format': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
'stores.store': {
'Meta': {'ordering': "['name']", 'object_name': 'Store'},
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'stores'", 'to': "orm['stores.Address']"}),
'brands': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['stores.Brand']", 'null': 'True', 'blank': 'True'}),
'chain': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'stores'", 'null': 'True', 'to': "orm['stores.Chain']"}),
'editor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'editable_stores'", 'null': 'True', 'to': u"orm['auth.User']"}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'long_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'phone': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'blank': 'True'}),
'store_type': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
}
}
complete_apps = ['stores']

View File

@@ -0,0 +1,140 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import DataMigration
from django.db import models
class Migration(DataMigration):
def forwards(self, orm):
from django.core.management import call_command
call_command("loaddata", "linktypes.json")
def backwards(self, orm):
pass
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'stores.address': {
'Meta': {'object_name': 'Address'},
'address1': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'address2': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
'address3': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
'city': ('django.db.models.fields.CharField', [], {'max_length': "'50'"}),
'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'addresses'", 'to': "orm['stores.Country']"}),
'county': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['stores.County']"}),
'geo_latitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
'geo_longitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'postcode': ('django.db.models.fields.CharField', [], {'max_length': '20'})
},
'stores.brand': {
'Meta': {'ordering': "['name']", 'object_name': 'Brand'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
'stores.chain': {
'Meta': {'ordering': "['name']", 'object_name': 'Chain'},
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'editor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'editable_chains'", 'null': 'True', 'to': u"orm['auth.User']"}),
'head_office': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['stores.Address']", 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'long_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'blank': 'True'}),
'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
'stores.claimrequest': {
'Meta': {'object_name': 'ClaimRequest'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'note': ('django.db.models.fields.TextField', [], {}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'object_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claims'", 'to': u"orm['auth.User']"})
},
'stores.country': {
'Meta': {'ordering': "['name']", 'object_name': 'Country'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'iso_code': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'stores.county': {
'Meta': {'ordering': "['name']", 'object_name': 'County'},
'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'counties'", 'null': 'True', 'to': "orm['stores.Country']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'stores.link': {
'Meta': {'object_name': 'Link'},
'account_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'account_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['stores.LinkType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'object_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"})
},
'stores.linktype': {
'Meta': {'ordering': "['name']", 'object_name': 'LinkType'},
'icon': ('django.db.models.fields.CharField', [], {'default': "'icon-globe'", 'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'url_format': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
'stores.store': {
'Meta': {'ordering': "['name']", 'object_name': 'Store'},
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'stores'", 'to': "orm['stores.Address']"}),
'brands': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['stores.Brand']", 'null': 'True', 'blank': 'True'}),
'chain': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'stores'", 'null': 'True', 'to': "orm['stores.Chain']"}),
'editor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'editable_stores'", 'null': 'True', 'to': u"orm['auth.User']"}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'long_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'phone': ('django.db.models.fields.CharField', [], {'max_length': '25', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'blank': 'True'}),
'store_type': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
}
}
complete_apps = ['stores']
symmetrical = True

View File

@@ -0,0 +1,2 @@
from .base import Address, Brand, Chain, ClaimRequest, Country, County, Store
from .links import Link, LinkType

View File

@@ -5,7 +5,7 @@ from django.contrib.auth import get_user_model
from django.contrib.gis.geos import Point from django.contrib.gis.geos import Point
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from .utils import caching_geo_lookup from stores.utils import caching_geo_lookup
USER_MODEL = get_user_model() USER_MODEL = get_user_model()
@@ -19,6 +19,7 @@ class Chain(models.Model):
active = models.BooleanField('Active?', default=True) active = models.BooleanField('Active?', default=True)
long_description = models.TextField('Description', blank=True) long_description = models.TextField('Description', blank=True)
links = generic.GenericRelation('stores.Link', content_type_field='object_type')
def save(self, **kwargs): def save(self, **kwargs):
if self.slug == '': if self.slug == '':
@@ -33,6 +34,7 @@ class Chain(models.Model):
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
app_label = 'stores'
class Store(models.Model): class Store(models.Model):
@@ -58,6 +60,7 @@ class Store(models.Model):
website = website = models.URLField('Website', null=True, blank=True) website = website = models.URLField('Website', null=True, blank=True)
email = models.EmailField('Email', null=True, blank=True, help_text="Contact email address for the store.") email = models.EmailField('Email', null=True, blank=True, help_text="Contact email address for the store.")
phone = models.CharField('Phone', max_length=25, blank=True, help_text="Contact phone number for the store.") phone = models.CharField('Phone', max_length=25, blank=True, help_text="Contact phone number for the store.")
links = generic.GenericRelation('stores.Link', content_type_field='object_type')
long_description = models.TextField('Description', blank=True, help_text="Full description of the store, including any marketing material. Markdown supported.") long_description = models.TextField('Description', blank=True, help_text="Full description of the store, including any marketing material. Markdown supported.")
brands = models.ManyToManyField('stores.Brand', null=True, blank=True, help_text="Brands that are sold by this store.") brands = models.ManyToManyField('stores.Brand', null=True, blank=True, help_text="Brands that are sold by this store.")
@@ -85,6 +88,7 @@ class Store(models.Model):
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
app_label = 'stores'
class Brand(models.Model): class Brand(models.Model):
@@ -96,6 +100,7 @@ class Brand(models.Model):
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
app_label = 'stores'
class County(models.Model): class County(models.Model):
@@ -114,6 +119,7 @@ class County(models.Model):
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
app_label = 'stores'
class Country(models.Model): class Country(models.Model):
@@ -132,6 +138,7 @@ class Country(models.Model):
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
app_label = 'stores'
class Address(models.Model): class Address(models.Model):
@@ -186,6 +193,9 @@ class Address(models.Model):
self.geo_latitude, self.geo_longitude = res[1] self.geo_latitude, self.geo_longitude = res[1]
return super(Address, self).save(**kwargs) return super(Address, self).save(**kwargs)
class Meta:
app_label = 'stores'
class ClaimRequest(models.Model): class ClaimRequest(models.Model):
@@ -205,4 +215,7 @@ class ClaimRequest(models.Model):
user = models.ForeignKey(USER_MODEL, related_name='claims') user = models.ForeignKey(USER_MODEL, related_name='claims')
note = models.TextField('Claim Note') note = models.TextField('Claim Note')
status = models.IntegerField('Status', choices=CLAIM_STATUS_CHOICES, default=CLAIM_STATUS_PENDING) status = models.IntegerField('Status', choices=CLAIM_STATUS_CHOICES, default=CLAIM_STATUS_PENDING)
class Meta:
app_label = 'stores'

View File

@@ -0,0 +1,55 @@
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.template.loader import render_to_string
class LinkType(models.Model):
"""
Define types of links that can be used on objects
"""
name = models.CharField('Name', max_length=200)
icon = models.CharField('Icon', max_length=100, default="icon-globe")
url_format = models.CharField('URL Format', max_length=255)
is_active = models.BooleanField('Active?', default=False)
def __unicode__(self):
return self.name
class Meta:
ordering = ['name']
app_label = 'stores'
class Link(models.Model):
"""
Represents a link that can be bound to a object
"""
object_id = models.PositiveIntegerField()
object_type = models.ForeignKey(ContentType)
generic_obj = generic.GenericForeignKey('object_type', 'object_id')
account_type = models.ForeignKey('stores.LinkType', related_name='+')
account_name = models.CharField('Account Name', max_length=200)
@property
def url(self):
if self.account_type.url_format == '':
return None
return self.account_type.url_format % {'account': self.account_name}
@property
def to_html(self):
dt = {
'url': self.url,
'name': self.account_name,
'type_name': self.account_type,
'type_icon': self.account_type.icon,
}
return render_to_string('stores/link_snippet.html', dt)
def __unicode__(self):
return u'%s - %s' % (self.account_type, self.account_name)
class Meta:
app_label = 'stores'

View File

@@ -0,0 +1 @@
<i class="{{ type_icon }}"></i> <a href="{{ url }}">{{ type_name }}</a>

View File

@@ -93,6 +93,9 @@ $(document).ready(function(){initialize_map_store()});
{% if store.website %}<li>Website: <a class="url" target="_new" href="{{ store.website }}">{{ store.website }}</a></li>{% endif %} {% if store.website %}<li>Website: <a class="url" target="_new" href="{{ store.website }}">{{ store.website }}</a></li>{% endif %}
{% if store.email %}<li>Email: <a class="email" href="mailto:{{ store.email }}">{{ store.email }}</a></li>{% endif %} {% if store.email %}<li>Email: <a class="email" href="mailto:{{ store.email }}">{{ store.email }}</a></li>{% endif %}
{% if store.phone %}<li>Phone: <span class="tel">{{ store.phone }}</span></li>{% endif %} {% if store.phone %}<li>Phone: <span class="tel">{{ store.phone }}</span></li>{% endif %}
{% for link in store.links.all %}
<li>{{ link.to_html|safe }}</li>
{% endfor %}
</ul> </ul>
</div> </div>