From 8bb9dc5ebaebe60724f35e59c70222300731cdf1 Mon Sep 17 00:00:00 2001 From: Ozgur Gunes Date: Thu, 22 Nov 2012 17:46:06 +0200 Subject: [PATCH] attributes --- adworks/admin.py | 76 +++-- adworks/fixtures/test.json | 127 +++++++++ adworks/models.py | 261 ++++++++++-------- adworks/static/css/adworks.css | 4 - adworks/templates/adworks/base.html | 7 +- .../templates/adworks/campaign_detail.html | 12 +- adworks/templates/adworks/client_detail.html | 7 +- .../templates/adworks/show_banner_detail.html | 32 ++- adworks/tests/__init__.py | 1 + adworks/tests/adworks_testdata.serialized | 0 adworks/tests/adworks_testmaker.py | 11 + adworks/tests/models.py | 72 +++++ adworks/views.py | 4 +- 13 files changed, 435 insertions(+), 179 deletions(-) create mode 100644 adworks/fixtures/test.json delete mode 100644 adworks/static/css/adworks.css create mode 100644 adworks/tests/__init__.py create mode 100644 adworks/tests/adworks_testdata.serialized create mode 100644 adworks/tests/adworks_testmaker.py create mode 100644 adworks/tests/models.py diff --git a/adworks/admin.py b/adworks/admin.py index 1ab2605..5864848 100644 --- a/adworks/admin.py +++ b/adworks/admin.py @@ -1,42 +1,74 @@ # -*- coding: utf-8 -*- from django.contrib import admin -from adworks.models import * +from adworks.models import (Client, Campaign, Dimension, + Attribute, Banner, Version) + + +def smart_truncate(content, length=100, suffix='...'): + if len(str(content)) <= length: + return content + else: + return content[:length].rsplit(' ', 1)[0]+suffix + class ClientAdmin(admin.ModelAdmin): - list_display = ('title', 'website', 'created_date') + def campaign_count(self, instance): + return instance.campaign_set.count() + + list_display = ('title', 'website', 'campaign_count') search_fields = ('title', 'about') prepopulated_fields = {'slug': ('title',)} - fieldsets = [ - (None, {'fields': ['title', 'slug', 'about', 'website', 'logo']}), - ] -admin.site.register(Client, ClientAdmin) + fields = ('title', 'slug', 'logo', 'website', 'about') + class CampaignAdmin(admin.ModelAdmin): - list_display = ('title', 'client', 'created_date') - list_filter = ('client',) + def banner_count(self, instance): + return instance.banner_set.count() + + list_display = ('title', 'client', 'banner_count') + list_filter = ('client__title',) search_fields = ('title', 'summary', 'client') prepopulated_fields = {'slug': ('title',)} - fieldsets = [ - (None, {'fields': ['client', 'title', 'slug', 'summary', 'mediaplan']}), - ] -admin.site.register(Campaign, CampaignAdmin) + fields = ('client', 'title', 'slug', 'summary', 'mediaplan') + class VersionInline(admin.StackedInline): model=Version extra=1 + class BannerAdmin(admin.ModelAdmin): - list_display = ('size', 'campaign') - list_filter = ('size', 'campaign') + def version_count(self, instance): + return instance.version_set.count() + + list_display = ('dimension', 'attribute', 'campaign', 'version_count') + list_filter = ('dimension__width', 'dimension__height', + 'attribute__title', 'campaign__title', 'campaign__client__title') search_fields = ('description',) - fieldsets = [ - (None, {'fields': ['campaign', 'size', 'description']}), - ] + fields = ('campaign', ('dimension', 'attribute'), 'description') inlines = [VersionInline,] -admin.site.register(Banner, BannerAdmin) -class SizeAdmin(admin.ModelAdmin): - list_display = ('width', 'height', 'attribute') - list_filter = ('attribute',) -admin.site.register(Size, SizeAdmin) +class AttributeAdmin(admin.ModelAdmin): + def summary(self, instance): + return smart_truncate(instance.description) + + list_display = ('title', 'summary') + + +class DimensionAdmin(admin.ModelAdmin): + def dimension(self, instance): + return u'%sx%s px' % (instance.width, instance.height) + + def summary(self, instance): + return smart_truncate(instance.description) + + list_display = ('dimension', 'summary') + list_filter = ('width', 'height') + + +admin.site.register(Client, ClientAdmin) +admin.site.register(Campaign, CampaignAdmin) +admin.site.register(Banner, BannerAdmin) +admin.site.register(Dimension, DimensionAdmin) +admin.site.register(Attribute, AttributeAdmin) diff --git a/adworks/fixtures/test.json b/adworks/fixtures/test.json new file mode 100644 index 0000000..5c8b37f --- /dev/null +++ b/adworks/fixtures/test.json @@ -0,0 +1,127 @@ +[ +{ + "pk": 1, + "model": "sites.site", + "fields": + { + "domain": "localhost:8000", + "name": "Example Site" + } +}, +{ + "pk": 1, + "model": "auth.user", + "fields": + { + "username": "admin", + "first_name": "Admin", + "last_name": "User", + "is_active": true, + "is_superuser": true, + "is_staff": true, + "last_login": "2012-01-01 00:00:00", + "groups": [], + "user_permissions": [], + "password": "sha1$e467e$508942f1c9be858fd46dc976c2496ba133ba4122", + "email": "admin@example.com", + "date_joined": "2012-01-01 00:00:00" + } +}, +{ + "pk": 2, + "model": "auth.user", + "fields": + { + "username": "test", + "first_name": "Test", + "last_name": "User", + "is_active": true, + "is_superuser": true, + "is_staff": false, + "last_login": "2012-01-01 00:00:00", + "groups": [], + "user_permissions": [], + "password": "sha1$3cb32$046d34b6eee347cb4ce099b266f1b9b3d066553a", + "email": "test@example.com", + "date_joined": "2012-01-01 00:00:00" + } +}, +{ + "pk": 3, + "model": "auth.user", + "fields": + { + "username": "demo", + "first_name": "Demo", + "last_name": "User", + "is_active": true, + "is_superuser": false, + "is_staff": false, + "last_login": "2012-01-01 00:00:00", + "groups": [], + "user_permissions": [], + "password": "sha1$1e2d3$0fd3f38117e48024ad68058252c42e9b9d69ca43", + "email": "demo@example.com", + "date_joined": "2012-01-01 00:00:00" + } +}, +{ + "pk": 1, + "model": "adworks.client", + "fields": + { + "title": "Acme Corp", + "slug": "acme-corp", + "token": "7c879ad6a7611d94b34c1911910257c9" + } +}, +{ + "pk": 1, + "model": "adworks.campaign", + "fields": + { + "client": 1, + "title": "Campaign 1", + "slug": "campaign-1", + "token": "8216b7b37bbeef046f576d2c076058c2" + } +}, +{ + "pk": 1, + "model": "adworks.dimension", + "fields": + { + "width": 300, + "height": 200 + } +}, +{ + "pk": 1, + "model": "adworks.attribute", + "fields": + { + "title": "Normal" + } +}, +{ + "pk": 1, + "model": "adworks.banner", + "fields": + { + "campaign": 1, + "dimension": 1, + "attribute": 1, + "token": "6a42f69d58e6232d44aa73fce282ac1a" + } +}, +{ + "pk": 1, + "model": "adworks.version", + "fields": + { + "banner": 1, + "revision": 1, + "created_date": "2012-01-01T00:00:00" + } +} +] diff --git a/adworks/models.py b/adworks/models.py index 74d69b0..af5e463 100644 --- a/adworks/models.py +++ b/adworks/models.py @@ -13,138 +13,159 @@ def get_upload_to(instance, filename): re.sub('[^\.0-9a-zA-Z()_-]', '_', filename)) -class Client(models.Model): - title = models.CharField(_(u'Title'), max_length=100, unique=True) - slug = models.CharField(_(u'Slug'), max_length=100) - about = models.TextField(_(u'About'), blank=True) - website = models.CharField(_(u'Website'), max_length=150) - logo = models.ImageField(_(u'Logo'), upload_to=get_upload_to, blank=True) - token = models.CharField(_(u'Token'), max_length=64, blank=True) - created_date = models.DateTimeField(_(u'Created date'), auto_now_add=True) - - def __unicode__(self): - return u'%s' % self.title - - @models.permalink - def get_absolute_url(self): - return ('client_detail',(), { - 'client': self.slug, - 'token': self.token - }) - - def save(self): - if not self.slug: - self.slug=defaultfilters.slugify(self.title) - if not self.token: - hash_str = md5(str(datetime.now())).hexdigest() - self.token = hash_str - super(Client, self).save() +class TokenBase(models.Model): + token = models.CharField(_(u'Token'), max_length=64, blank=False) + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + if not self.token: + self.token = md5(str(datetime.now())).hexdigest() + return super(TokenBase, self).save(*args, **kwargs) + + +class Client(TokenBase): + title = models.CharField(_(u'Title'), max_length=100, unique=True) + slug = models.CharField(_(u'Slug'), max_length=100, unique=True) + about = models.TextField(_(u'About'), blank=True) + website = models.CharField(_(u'Website'), max_length=150) + logo = models.ImageField(_(u'Logo'), upload_to=get_upload_to, blank=True) + + class Meta: + verbose_name = _('Client') + verbose_name_plural = _('Clients') + + def __unicode__(self): + return u'%s' % self.title + + @models.permalink + def get_absolute_url(self): + return ('client_detail',(), { + 'client': self.slug, + 'token': self.token + }) + + def save(self, *args, **kwargs): + if not self.slug: + self.slug=defaultfilters.slugify(self.title) + super(Client, self).save(*args, **kwargs) -class Campaign(models.Model): - client = models.ForeignKey(Client, blank=False, null=False) - title = models.CharField(_(u'Title'), max_length=100) - slug = models.CharField(_(u'Slug'), max_length=100) - summary = models.TextField(_(u'Summary'), blank=True) - mediaplan = models.FileField(_(u'Media plan'), upload_to=get_upload_to, blank=True) - token = models.CharField(_(u'Token'), max_length=64) - created_date = models.DateTimeField(_(u'Created date'), auto_now_add=True) +class Campaign(TokenBase): + client = models.ForeignKey(Client) + title = models.CharField(_(u'Title'), max_length=100) + slug = models.CharField(_(u'Slug'), max_length=100) + summary = models.TextField(_(u'Summary'), blank=True) + mediaplan = models.FileField(_(u'Media plan'), + upload_to=get_upload_to, blank=True) - def __unicode__(self): - return u'%s' % self.title - - @models.permalink - def get_absolute_url(self): - return ('campaign_detail',(), { - 'client': self.client.slug, - 'campaign': self.slug, - 'token': self.token - }) - - def save(self): - if not self.slug: - self.slug=defaultfilters.slugify(self.title) - if not self.token: - hash_str = md5(str(datetime.now())).hexdigest() - self.token = hash_str - super(Campaign, self).save() + class Meta: + verbose_name = _('Campaign') + verbose_name_plural = _('Campaigns') + + def __unicode__(self): + return u'%s' % self.title + + @models.permalink + def get_absolute_url(self): + return ('campaign_detail',(), { + 'client': self.client.slug, + 'campaign': self.slug, + 'token': self.token + }) + + def save(self, *args, **kwargs): + if not self.slug: + self.slug=defaultfilters.slugify(self.title) + super(Campaign, self).save(*args, **kwargs) + + +class Attribute(models.Model): + title = models.CharField(_(u'Title'), max_length=32) + description = models.TextField(_(u'Description'), blank=True) + + class Meta: + verbose_name = _('Attribute') + verbose_name_plural = _('Attributes') + + def __unicode__(self): + return u'%s' % self.title -class Size(models.Model): - """size model""" - ATTRIBUTE_CHOICES = ( - (1, _(u'Normal')), - (2, _(u'Floating')), - (3, _(u'Pageskin')), - (4, _(u'Rich')), - (5, _(u'Widget')), - ) - - width = models.IntegerField(_(u'Width'), default=0, blank=False, null=False) - height = models.IntegerField(_(u'Height'), default=0, blank=False, null=False) - attribute = models.IntegerField(_(u'Attribute'), choices=ATTRIBUTE_CHOICES, default=1) +class Dimension(models.Model): + width = models.IntegerField(_(u'Width'), default=0, blank=False) + height = models.IntegerField(_(u'Height'), default=0, blank=False) + description = models.TextField(_(u'Description'), blank=True) + + class Meta: + verbose_name = _('Dimension') + verbose_name_plural = _('Dimensions') def __unicode__(self): - return u'%s x %s (%s)' % (self.width, self.height, self.get_attribute_display()) + return u'%sx%s' % (self.width, self.height) -class Banner(models.Model): - campaign = models.ForeignKey(Campaign, blank=False, null=False) - size = models.ForeignKey(Size, blank=False, null=False) - description = models.TextField(_(u'Description'), blank=True) - token = models.CharField(_(u'Token'), max_length=64) - created_date = models.DateTimeField(_(u'Created date'), auto_now_add=True) +class Banner(TokenBase): + campaign = models.ForeignKey(Campaign) + dimension = models.ForeignKey(Dimension) + attribute = models.ForeignKey(Attribute) + description = models.TextField(_(u'Description'), blank=True) - def __unicode__(self): - return u'%s' % self.size + class Meta: + verbose_name = _('Banner') + verbose_name_plural = _('Banners') + + def __unicode__(self): + return u'%s - %s' % (self.dimension, self.attribute) - @models.permalink - def get_absolute_url(self): - return ('banner_detail',(), { - 'client': self.campaign.client.slug, - 'campaign': self.campaign.slug, - 'id': self.id, - 'token': self.token - }) - - @property - def client(self): - return self.campaign.client + @models.permalink + def get_absolute_url(self): + return ('banner_detail',(), { + 'client': self.campaign.client.slug, + 'campaign': self.campaign.slug, + 'id': self.id, + 'token': self.token + }) + + @property + def client(self): + return self.campaign.client - def save(self): - if not self.token: - hash_str = md5(str(datetime.now())).hexdigest() - self.token = hash_str - super(Banner, self).save() - class Version(models.Model): - banner = models.ForeignKey(Banner, blank=False, null=False) - revision = models.IntegerField(_(u'Revision'), blank=True, null=False) - comment = models.TextField(_(u'Comment'), blank=True) - file = models.FileField(_(u'File'), upload_to=get_upload_to, blank=False) - alternative = models.ImageField(_(u'Alternative'), upload_to=get_upload_to, blank=True) - created_date = models.DateTimeField(_(u'Created date'), auto_now_add=True) + banner = models.ForeignKey(Banner) + revision = models.IntegerField(_(u'Revision'), blank=True) + comment = models.TextField(_(u'Comment'), blank=True) + file = models.FileField(_(u'File'), upload_to=get_upload_to, + blank=False, null=False) + alternative = models.ImageField(_(u'Alternative'), upload_to=get_upload_to, + blank=True) + created_date = models.DateTimeField(_(u'Created date'), auto_now_add=True) - def __unicode__(self): - return u'Revizyon: %s' % self.revision - - @models.permalink - def get_absolute_url(self): - return ('banner_version',(), { - 'client': self.banner.client.slug, - 'campaign': self.banner.campaign.slug, - 'id': self.banner.id, - 'token': self.banner.token, - 'revision': self.revision - }) - - def save(self): - if not self.revision: - versions=self.banner.version_set.order_by('-revision') - if not versions: - self.revision=1 - else: - self.revision=versions[0].revision+1 - super(Version, self).save() - + class Meta: + verbose_name = _('Version') + verbose_name_plural = _('Versions') + + def __unicode__(self): + return u'%s: %s' % (_('Revision'), self.revision) + + @models.permalink + def get_absolute_url(self): + return ('banner_version',(), { + 'client': self.banner.client.slug, + 'campaign': self.banner.campaign.slug, + 'id': self.banner.id, + 'token': self.banner.token, + 'revision': self.revision + }) + + def save(self, *args, **kwargs): + if not self.revision: + versions=self.banner.version_set.order_by('-revision') + if not versions: + self.revision=1 + else: + self.revision=versions[0].revision+1 + super(Version, self).save(*args, **kwargs) + \ No newline at end of file diff --git a/adworks/static/css/adworks.css b/adworks/static/css/adworks.css deleted file mode 100644 index 91b5a9d..0000000 --- a/adworks/static/css/adworks.css +++ /dev/null @@ -1,4 +0,0 @@ -.bannercontainer { - text-align: center; - margin-bottom: 1em; -} \ No newline at end of file diff --git a/adworks/templates/adworks/base.html b/adworks/templates/adworks/base.html index 8db404a..7fa6389 100644 --- a/adworks/templates/adworks/base.html +++ b/adworks/templates/adworks/base.html @@ -1,8 +1,3 @@ {% extends "base.html" %} -{% block title %}Banner Proof - {{ block.super }}{% endblock %} -{% block head %} - {{ block.super }} - - -{% endblock %} +{% block title %}Adworks - {{ block.super }}{% endblock %} {% block content %}{% endblock %} \ No newline at end of file diff --git a/adworks/templates/adworks/campaign_detail.html b/adworks/templates/adworks/campaign_detail.html index 2d4fba1..b46b929 100644 --- a/adworks/templates/adworks/campaign_detail.html +++ b/adworks/templates/adworks/campaign_detail.html @@ -1,20 +1,20 @@ {% extends "adworks/base.html" %} {% block title %}{{ campaign.title }} ({{ campaign.client.title }}) - {{ block.super }}{% endblock %} -{% block nav %} -{{campaign.client.title}} > {{ campaign.title }} -{% endblock %} - {% block content %} +

{{ campaign.title }}

{{ campaign.summary }}

{% if campaign.mediaplan %} -

{% trans "Media planını indir" %}

+

{% trans "Download media plan" %}

{% endif %}
-

{% trans "Bannerlar" %}

+

{% trans "Banners" %}

{% if banners %}