├── adzone ├── south_migrations │ ├── __init__.py │ ├── 0004_auto__del_field_adbase_enabled.py │ ├── 0003_copy_enabled.py │ ├── 0006_add_all_sites.py │ ├── 0002_auto__add_field_adbase_start_showing__add_field_adbase_stop_showing.py │ ├── 0005_auto__chg_field_adbase_category.py │ └── 0001_initial.py ├── locale │ ├── pt_BR │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── ru │ │ └── LC_MESSAGES │ │ │ └── django.po │ └── af │ │ └── LC_MESSAGES │ │ └── django.po ├── context_processors.py ├── urls.py ├── __init__.py ├── templatetags │ ├── __init__.py │ └── adzone_tags.py ├── templates │ └── adzone │ │ └── ad_tag.html ├── views.py ├── managers.py ├── admin.py ├── models.py └── tests.py ├── .gitignore ├── MANIFEST.in ├── setup.py ├── LICENSE ├── README.textile └── src └── adzone └── migrations ├── 0006_add_all_sites.py └── 0005_auto__chg_field_adbase_category.py /adzone/south_migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *~ 3 | *.db 4 | *.mo 5 | *.swp 6 | venv 7 | demo 8 | -------------------------------------------------------------------------------- /adzone/locale/pt_BR/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrewebdev/django-adzone/HEAD/adzone/locale/pt_BR/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include setup.py MANIFEST.in LICENSE 2 | recursive-include adzone/templates * 3 | recursive-include adzone/locale * 4 | recursive-include adzone/migrations * 5 | global-exclude *~ 6 | -------------------------------------------------------------------------------- /adzone/context_processors.py: -------------------------------------------------------------------------------- 1 | def get_source_ip(request): 2 | if 'REMOTE_ADDR' in request.META: 3 | return {'from_ip': request.META.get('REMOTE_ADDR')} 4 | else: 5 | return {} 6 | -------------------------------------------------------------------------------- /adzone/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import patterns, url 2 | 3 | from adzone.views import ad_view 4 | 5 | urlpatterns = patterns('', 6 | url(r'^view/(?P[\d]+)/$', ad_view, name='adzone_ad_view'), 7 | ) 8 | -------------------------------------------------------------------------------- /adzone/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # © Copyright 2009 Andre Engelbrecht. All Rights Reserved. 4 | # This script is licensed under the BSD Open Source Licence 5 | # Please see the text file LICENCE for more information 6 | # If this script is distributed, it must be accompanied by the Licence 7 | -------------------------------------------------------------------------------- /adzone/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # © Copyright 2009 Andre Engelbrecht. All Rights Reserved. 4 | # This script is licensed under the BSD Open Source Licence 5 | # Please see the text file LICENCE for more information 6 | # If this script is distributed, it must be accompanied by the Licence 7 | 8 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name="django-adzone", 5 | version="0.2", 6 | url="http://github.com/winterweaver/django-adzone", 7 | description="A django app to manage adverts according to zones on a website.", 8 | author="Andre Engelbrecht", 9 | packages=find_packages(), 10 | install_requires=[ 11 | 'django>=1.4', 12 | ], 13 | include_package_data=True, 14 | ) 15 | -------------------------------------------------------------------------------- /adzone/templates/adzone/ad_tag.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | A instance of AdBase is passed to this tag. 3 | {% endcomment %} 4 | 5 | {% if ad.textad %} 6 |
7 |

{{ ad.textad.content }}

8 |
9 | {% endif %} 10 | 11 | {% if ad.bannerad %} 12 |
13 | {{ ad.title }} 14 |
15 | {% endif %} 16 | -------------------------------------------------------------------------------- /adzone/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # © Copyright 2009 Andre Engelbrecht. All Rights Reserved. 4 | # This script is licensed under the BSD Open Source Licence 5 | # Please see the text file LICENCE for more information 6 | # If this script is distributed, it must be accompanied by the Licence 7 | 8 | from datetime import datetime 9 | 10 | from django.shortcuts import get_object_or_404 11 | from django.http import HttpResponseRedirect 12 | 13 | from adzone.models import AdBase, AdClick 14 | 15 | 16 | def ad_view(request, id): 17 | """ Record the click in the database, then redirect to ad url """ 18 | ad = get_object_or_404(AdBase, id=id) 19 | 20 | click = AdClick.objects.create( 21 | ad=ad, 22 | click_date=datetime.now(), 23 | source_ip=request.META.get('REMOTE_ADDR', '') 24 | ) 25 | click.save() 26 | 27 | redirect_url = ad.url 28 | if not redirect_url.startswith('http://'): 29 | # Add http:// to the url so that the browser redirects correctly 30 | redirect_url = 'http://' + redirect_url 31 | 32 | return HttpResponseRedirect(redirect_url) 33 | -------------------------------------------------------------------------------- /adzone/managers.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | 3 | from django.contrib.sites.models import Site 4 | 5 | from django.db import models 6 | try: 7 | from django.utils.timezone import now 8 | except ImportError: 9 | now = datetime.datetime.now 10 | 11 | 12 | class AdManager(models.Manager): 13 | """ A Custom Manager for ads """ 14 | 15 | def get_random_ad(self, ad_zone, ad_category=None): 16 | """ 17 | Returns a random advert that belongs for the specified ``ad_category`` 18 | and ``ad_zone``. 19 | If ``ad_category`` is None, the ad will be category independent. 20 | """ 21 | qs = self.get_queryset().filter(start_showing__lte=now(), 22 | stop_showing__gte=now(), 23 | zone__slug=ad_zone, 24 | sites=Site.objects.get_current().pk 25 | ).select_related('textad', 26 | 'bannerad') 27 | if ad_category: 28 | qs = qs.filter(category__slug=ad_category) 29 | try: 30 | ad = qs.order_by('?')[0] 31 | except IndexError: 32 | return None 33 | return ad 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010, Andre Engelbrecht 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | * Neither the name of django-adzone nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 9 | 10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 11 | -------------------------------------------------------------------------------- /adzone/locale/ru/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Django AdZone 2 | # Copyright (C) 2011 Ruslan Popov 3 | # This file is distributed under the same license as the Django-AdZone package. 4 | # Ruslan Popov , 2011. 5 | # Ruslan Popov , 2011. 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: 1.0\n" 10 | "Report-Msgid-Bugs-To: ruslan.popov@gmail.com\n" 11 | "POT-Creation-Date: 2011-01-16 15:02+0300\n" 12 | "PO-Revision-Date: 2011-01-16 15:11+0300\n" 13 | "Last-Translator: Ruslan Popov \n" 14 | "Language-Team: ru \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" 19 | "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 20 | 21 | #: models.py:22 22 | msgid "Company Name" 23 | msgstr "Название компании" 24 | 25 | #: models.py:23 26 | msgid "Company Site" 27 | msgstr "Сайт компании" 28 | 29 | #: models.py:27 30 | msgid "Ad Provider" 31 | msgstr "Рекламодатель" 32 | 33 | #: models.py:28 34 | msgid "Advertisers" 35 | msgstr "Рекламодатели" 36 | 37 | #: models.py:42 models.py:59 models.py:78 38 | msgid "Title" 39 | msgstr "Заголовок" 40 | 41 | #: models.py:43 models.py:60 42 | msgid "Slug" 43 | msgstr "Транслит" 44 | 45 | #: models.py:44 models.py:61 46 | msgid "Description" 47 | msgstr "Описание" 48 | 49 | #: models.py:79 50 | msgid "Advertised URL" 51 | msgstr "Рекламируемый URL" 52 | 53 | #: models.py:80 54 | msgid "Enabled" 55 | msgstr "Активен" 56 | 57 | #: models.py:81 58 | msgid "Since" 59 | msgstr "С момента" 60 | 61 | #: models.py:82 62 | msgid "Updated" 63 | msgstr "Обновлён" 64 | 65 | #: models.py:108 models.py:121 66 | msgid "When" 67 | msgstr "Когда" 68 | 69 | #: models.py:109 models.py:122 70 | msgid "Who" 71 | msgstr "Кто" 72 | 73 | #: models.py:132 models.py:136 74 | msgid "Content" 75 | msgstr "Содержимое" 76 | -------------------------------------------------------------------------------- /adzone/templatetags/adzone_tags.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # © Copyright 2009 Andre Engelbrecht. All Rights Reserved. 4 | # This script is licensed under the BSD Open Source Licence 5 | # Please see the text file LICENCE for more information 6 | # If this script is distributed, it must be accompanied by the Licence 7 | 8 | from datetime import datetime 9 | from django import template 10 | from adzone.models import AdBase, AdImpression 11 | 12 | register = template.Library() 13 | 14 | 15 | @register.inclusion_tag('adzone/ad_tag.html', takes_context=True) 16 | def random_zone_ad(context, ad_zone): 17 | """ 18 | Returns a random advert for ``ad_zone``. 19 | The advert returned is independent of the category 20 | 21 | In order for the impression to be saved add the following 22 | to the TEMPLATE_CONTEXT_PROCESSORS: 23 | 24 | 'adzone.context_processors.get_source_ip' 25 | 26 | Tag usage: 27 | {% load adzone_tags %} 28 | {% random_zone_ad 'zone_slug' %} 29 | 30 | """ 31 | to_return = {} 32 | 33 | # Retrieve a random ad for the zone 34 | ad = AdBase.objects.get_random_ad(ad_zone) 35 | to_return['ad'] = ad 36 | 37 | # Record a impression for the ad 38 | if 'from_ip' in context and ad: 39 | from_ip = context.get('from_ip') 40 | try: 41 | impression = AdImpression( 42 | ad=ad, impression_date=datetime.now(), source_ip=from_ip) 43 | impression.save() 44 | except: 45 | pass 46 | return to_return 47 | 48 | 49 | @register.inclusion_tag('adzone/ad_tag.html', takes_context=True) 50 | def random_category_ad(context, ad_zone, ad_category): 51 | """ 52 | Returns a random advert from the specified category. 53 | 54 | Usage: 55 | {% load adzone_tags %} 56 | {% random_category_ad 'zone_slug' 'my_category_slug' %} 57 | 58 | """ 59 | to_return = {} 60 | 61 | # Retrieve a random ad for the category and zone 62 | ad = AdBase.objects.get_random_ad(ad_zone, ad_category) 63 | to_return['ad'] = ad 64 | 65 | # Record a impression for the ad 66 | if 'from_ip' in context and ad: 67 | from_ip = context.get('from_ip') 68 | try: 69 | impression = AdImpression( 70 | ad=ad, impression_date=datetime.now(), source_ip=from_ip) 71 | impression.save() 72 | except: 73 | pass 74 | return to_return 75 | -------------------------------------------------------------------------------- /adzone/locale/af/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # django-adzone Translation. 2 | # 3 | # Copyright (C) 2017, 4 | # This file is distributed under the same license as the django-adzone package. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: v0.2b\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2017-10-26 02:14-0200\n" 11 | "PO-Revision-Date: 2017-10-26 02:09-0200\n" 12 | "Last-Translator: Jacques de Villiers \n" 13 | "Language-Team: Afrikaans \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=1;\n" 18 | 19 | #: models.py:19 20 | msgid "Company name" 21 | msgstr "Maatskappy naam" 22 | 23 | #: models.py:20 24 | msgid "Website" 25 | msgstr "Webwerf" 26 | 27 | #: models.py:21 28 | msgid "User" 29 | msgstr "Gebruiker" 30 | 31 | #: models.py:24 models.py:79 32 | msgid "Ad Provider" 33 | msgstr "Adverteerder" 34 | 35 | #: models.py:25 36 | msgid "Advertisers" 37 | msgstr "Adverteerders" 38 | 39 | #: models.py:38 models.py:54 models.py:72 40 | msgid "Title" 41 | msgstr "Titel" 42 | 43 | #: models.py:39 models.py:55 44 | msgid "Slug" 45 | msgstr "Slug" 46 | 47 | #: models.py:40 models.py:56 48 | msgid "Description" 49 | msgstr "Beskrywing" 50 | 51 | #: models.py:43 52 | msgid "Ad Category" 53 | msgstr "Advertensie kategorie" 54 | 55 | #: models.py:44 56 | msgid "Ad Categories" 57 | msgstr "Advertensie kategorieë" 58 | 59 | #: models.py:59 60 | msgid "Ad Zone" 61 | msgstr "Advertensie sone" 62 | 63 | #: models.py:60 64 | msgid "Ad Zones" 65 | msgstr "Advertensie sones" 66 | 67 | #: models.py:73 68 | msgid "URL" 69 | msgstr "URL" 70 | 71 | #: models.py:74 72 | msgid "Enabled" 73 | msgstr "Geaktiveer" 74 | 75 | #: models.py:75 76 | msgid "Since" 77 | msgstr "Sedert" 78 | 79 | #: models.py:76 80 | msgid "Updated" 81 | msgstr "Opgedateer" 82 | 83 | #: models.py:80 84 | msgid "Category" 85 | msgstr "Kategorie" 86 | 87 | #: models.py:81 88 | msgid "Zone" 89 | msgstr "Sone" 90 | 91 | #: models.py:87 92 | msgid "Ad Base" 93 | msgstr "Advertensie basis" 94 | 95 | #: models.py:88 96 | msgid "Ad Bases" 97 | msgstr "Advertensie basisse" 98 | 99 | #: models.py:106 100 | msgid "Impression date" 101 | msgstr "Indruk datum" 102 | 103 | #: models.py:107 models.py:120 104 | msgid "Source IP" 105 | msgstr "Bron IP" 106 | 107 | #: models.py:108 models.py:121 108 | msgid "Ad" 109 | msgstr "Advertensie" 110 | 111 | #: models.py:111 112 | msgid "Ad Impression" 113 | msgstr "Advertensie indruk" 114 | 115 | #: models.py:112 116 | msgid "Ad Impressions" 117 | msgstr "Advertensie indrukke" 118 | 119 | #: models.py:119 120 | msgid "Click date" 121 | msgstr "Klik datum" 122 | 123 | #: models.py:124 124 | msgid "Ad Click" 125 | msgstr "Advertensie klik" 126 | 127 | #: models.py:125 128 | msgid "Ad Clicks" 129 | msgstr "Advertensie klike" 130 | 131 | #: models.py:130 132 | msgid "Content" 133 | msgstr "Inhoud" 134 | 135 | #: models.py:133 136 | msgid "Text ad" 137 | msgstr "Teks advertensie" 138 | 139 | #: models.py:134 140 | msgid "Texts ads" 141 | msgstr "Teks advertensies" 142 | 143 | #: models.py:138 144 | msgid "Banner" 145 | msgstr "Banier" 146 | 147 | #: models.py:141 148 | msgid "Banner ad" 149 | msgstr "Banier advertensie" 150 | 151 | #: models.py:142 152 | msgid "Banners ads" 153 | msgstr "Banier advertensies" 154 | 155 | -------------------------------------------------------------------------------- /adzone/locale/pt_BR/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # django-adzone Translation. 2 | # 3 | # Copyright (C) 2010, 4 | # This file is distributed under the same license as the django-adzone package. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: v0.2a\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2010-10-29 02:14-0200\n" 11 | "PO-Revision-Date: 2010-10-29 02:09-0200\n" 12 | "Last-Translator: Rafael Floriano da Silva \n" 13 | "Language-Team: Brazilian Portuguese \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | 19 | #: models.py:19 20 | msgid "Company name" 21 | msgstr "Nome da empresa" 22 | 23 | #: models.py:20 24 | msgid "Website" 25 | msgstr "Site" 26 | 27 | #: models.py:21 28 | msgid "User" 29 | msgstr "Usuário" 30 | 31 | #: models.py:24 models.py:79 32 | msgid "Ad Provider" 33 | msgstr "Anunciante" 34 | 35 | #: models.py:25 36 | msgid "Advertisers" 37 | msgstr "Anunciantes" 38 | 39 | #: models.py:38 models.py:54 models.py:72 40 | msgid "Title" 41 | msgstr "Título" 42 | 43 | #: models.py:39 models.py:55 44 | msgid "Slug" 45 | msgstr "Slug" 46 | 47 | #: models.py:40 models.py:56 48 | msgid "Description" 49 | msgstr "Descrição" 50 | 51 | #: models.py:43 52 | msgid "Ad Category" 53 | msgstr "Categoria de anúncio" 54 | 55 | #: models.py:44 56 | msgid "Ad Categories" 57 | msgstr "Categoria de anúncios" 58 | 59 | #: models.py:59 60 | msgid "Ad Zone" 61 | msgstr "Zona de categoria" 62 | 63 | #: models.py:60 64 | msgid "Ad Zones" 65 | msgstr "Zonas de categorias" 66 | 67 | #: models.py:73 68 | msgid "URL" 69 | msgstr "URL" 70 | 71 | #: models.py:74 72 | msgid "Enabled" 73 | msgstr "Habilitado" 74 | 75 | #: models.py:75 76 | msgid "Since" 77 | msgstr "Desde" 78 | 79 | #: models.py:76 80 | msgid "Updated" 81 | msgstr "Atualizado" 82 | 83 | #: models.py:80 84 | msgid "Category" 85 | msgstr "Categoria" 86 | 87 | #: models.py:81 88 | msgid "Zone" 89 | msgstr "Zona" 90 | 91 | #: models.py:87 92 | msgid "Ad Base" 93 | msgstr "Base de anúncio" 94 | 95 | #: models.py:88 96 | msgid "Ad Bases" 97 | msgstr "Base de anúncios" 98 | 99 | #: models.py:106 100 | msgid "Impression date" 101 | msgstr "Data de impressão" 102 | 103 | #: models.py:107 models.py:120 104 | msgid "Source IP" 105 | msgstr "IP fonte" 106 | 107 | #: models.py:108 models.py:121 108 | msgid "Ad" 109 | msgstr "Anúncio" 110 | 111 | #: models.py:111 112 | msgid "Ad Impression" 113 | msgstr "Impressão de anúncio" 114 | 115 | #: models.py:112 116 | msgid "Ad Impressions" 117 | msgstr "Impressões de anúncios" 118 | 119 | #: models.py:119 120 | msgid "Click date" 121 | msgstr "Data do clique" 122 | 123 | #: models.py:124 124 | msgid "Ad Click" 125 | msgstr "Clique de anúncio" 126 | 127 | #: models.py:125 128 | msgid "Ad Clicks" 129 | msgstr "Cliques de anúncios" 130 | 131 | #: models.py:130 132 | msgid "Content" 133 | msgstr "Conteúdo" 134 | 135 | #: models.py:133 136 | msgid "Text ad" 137 | msgstr "Anúncio de texto" 138 | 139 | #: models.py:134 140 | msgid "Texts ads" 141 | msgstr "Anúncios de textos" 142 | 143 | #: models.py:138 144 | msgid "Banner" 145 | msgstr "Banner" 146 | 147 | #: models.py:141 148 | msgid "Banner ad" 149 | msgstr "Anúncio de banner" 150 | 151 | #: models.py:142 152 | msgid "Banners ads" 153 | msgstr "Anúncio de banners" 154 | 155 | -------------------------------------------------------------------------------- /README.textile: -------------------------------------------------------------------------------- 1 | h1. django-adzone Documentation 2 | 3 | © Copyright 2013 Andre Engelbrecht. All Rights Reserved. 4 | 5 | h2. License 6 | 7 | Please see the LICENCE file for information on the License. 8 | 9 | h2. Disclaimer 10 | 11 | Please take note: django-adzone has just gone through a major update. If you 12 | have been using the previous version of django-adzone, then you should not 13 | upgrade since you are highly likely to break something. You have been warned :) 14 | 15 | *0.2b* is a alpha release. Please test and report any bugs that you may find. 16 | 17 | h2. Release Notes 18 | 19 | * Many thanks to, *Rafael* for adding internationalization and pt_BR translation! 20 | * AdBase model is no longer abstract. 21 | * Added a manager to the AdBase class which can be used to return specific ads 22 | * AdBase child models (ie. textad and bannerad) no longer needs a get_absolute_url method 23 | * Removed the FlashAd model. This will be used in a example on how to create your own ad types (coming soon) 24 | * The url to view a ad is now a named url pattern, so reverse lookups can be used. 25 | * The zone_ad template tag is now a inclusion_tag 26 | 27 | h2. Concept behind adzone 28 | 29 | The concept behind adzone is quite simple. You have certain areas on your 30 | website reserved for adverts. The size and nature of the ads may differ for 31 | each of these areas. Adzone allows exactly this kind of functionality, by 32 | choosing which adds belong to certain zones. 33 | 34 | Ads are grouped according to 2 criteria 35 | 36 | h3. 1.The Category 37 | 38 | The ad category explains the nature or subject matter for the advert. 39 | This can help to specify in which pages of your site you want a specific group 40 | of ads to appear. For example, you have a bunch of ads related to your blog, 41 | so you add them to your Blog category. 42 | 43 | h3. 2.The Zone 44 | 45 | Zone specifies what area on the current page the ad belongs to. If you are 46 | displaying a ad on your blog you might have 2 zones, one for content, and one 47 | for the right column. 48 | 49 | These two grouping criteria provides enough flexability to control what ads 50 | will display where. All you need to do is to use the adzone template tags, to 51 | specify categories and zones in your templates. 52 | 53 | h2. Note on Adblock plugins for browsers. 54 | 55 | If you have any adblock plugins installed in your browser, it may be best to 56 | either disable them or add your site admin to the whitelist. If you dont, 57 | there is a risk that certain fields may not show up when you want to edit 58 | anything. 59 | 60 | h2. Installing 61 | 62 | Installation instructions may vary depending on your environment. 63 | To install system wide however, just run: 64 | 65 | @python setup.py install@ 66 | 67 | h2. How to use 68 | 69 | h3. Getting Started 70 | 71 | 1. Add @adzone@ to your installed apps. 72 | 2. To make sure that the user IP is recorded on the impressions, add the following to your TEMPLATE_CONTEXT_PROCESSORS: 73 | @'adzone.context_processors.get_source_ip'@ (this is not a requirement for the app to work in general) 74 | 3. Add the adzone urls to your project urls: @(r'^adzone/', include('adzone.urls')),@ 75 | 4. Remember to run syncdb again :) 76 | 77 | h3. Using the built-in template tag to display an ad 78 | 79 | To show a specific ad in a template, you can use the built-in template tag. 80 | Lets say you have the following Ad Category and Zone set up in your database (via Admin): 81 | _ad category_ title: 'General' 82 | _ad category_ slug : 'general' 83 | _ad zone_ title: 'Content' 84 | _ad zone_ slug: 'content' 85 | 86 | Now, in your template, you first want to load the tag library: 87 | @{% load adzone_tags %}@ 88 | 89 | Averts are loaded through the use of two tags: 90 | 91 | @{% random_zone_ad 'sidebar' %}@ - Loads a random advert for the sidebar zone 92 | 93 | @{% random_category_ad 'sidebar' 'general' %}@ - Loads a random advert from the "general" category, for the sidebar zone. 94 | -------------------------------------------------------------------------------- /adzone/admin.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # © Copyright 2009 Andre Engelbrecht. All Rights Reserved. 4 | # This script is licensed under the BSD Open Source Licence 5 | # Please see the text file LICENCE for more information 6 | # If this script is distributed, it must be accompanied by the Licence 7 | 8 | import csv 9 | 10 | from django.contrib import admin 11 | from django.http import HttpResponse 12 | from adzone.models import * 13 | 14 | 15 | class AdvertiserAdmin(admin.ModelAdmin): 16 | search_fields = ['company_name', 'website'] 17 | list_display = ['company_name', 'website', 'user'] 18 | raw_id_fields = ['user'] 19 | 20 | 21 | class AdCategoryAdmin(admin.ModelAdmin): 22 | prepopulated_fields = {'slug': ['title']} 23 | list_display = ['title', 'slug'] 24 | 25 | 26 | class AdZoneAdmin(admin.ModelAdmin): 27 | list_display = ['title', 'slug', 'description'] 28 | 29 | 30 | class AdBaseAdmin(admin.ModelAdmin): 31 | list_display = ['title', 'url', 'advertiser', 'since', 'updated', 'start_showing', 'stop_showing'] 32 | list_filter = ['updated', 'start_showing', 'stop_showing', 'since', 'updated'] 33 | search_fields = ['title', 'url'] 34 | raw_id_fields = ['advertiser'] 35 | 36 | 37 | class AdClickAdmin(admin.ModelAdmin): 38 | search_fields = ['ad', 'source_ip'] 39 | list_display = ['ad', 'click_date', 'source_ip'] 40 | list_filter = ['click_date'] 41 | date_hierarchy = 'click_date' 42 | actions = ['download_clicks'] 43 | 44 | def download_clicks(self, request, queryset): 45 | response = HttpResponse(content_type='text/csv') 46 | response['Content-Disposition'] = 'attachment; filename="clicks.csv"' 47 | writer = csv.writer(response) 48 | writer.writerow(('Title', 49 | 'Advertised URL', 50 | 'Source IP', 51 | 'Timestamp', 52 | 'Advertiser ID', 53 | 'Advertiser name', 54 | 'Zone')) 55 | queryset = queryset.select_related('ad', 'ad__advertiser') 56 | for impression in queryset: 57 | writer.writerow((impression.ad.title, 58 | impression.ad.url, 59 | impression.source_ip, 60 | impression.click_date.isoformat(), 61 | impression.ad.advertiser.pk, 62 | impression.ad.advertiser.company_name, 63 | impression.ad.zone.title)) 64 | return response 65 | download_clicks.short_description = "Download selected Ad Clicks" 66 | 67 | def get_queryset(self, request): 68 | qs = super(AdClickAdmin, self).get_queryset(request) 69 | return qs.select_related('ad').only('ad__title', 70 | 'click_date', 71 | 'source_ip') 72 | 73 | 74 | class AdImpressionAdmin(admin.ModelAdmin): 75 | search_fields = ['ad', 'source_ip'] 76 | list_display = ['ad', 'impression_date', 'source_ip'] 77 | list_filter = ['impression_date'] 78 | date_hierarchy = 'impression_date' 79 | actions = ['download_impressions'] 80 | 81 | def get_queryset(self, request): 82 | qs = super(AdImpressionAdmin, self).get_queryset(request) 83 | return qs.select_related('ad').only('ad__title', 84 | 'impression_date', 85 | 'source_ip') 86 | 87 | def download_impressions(self, request, queryset): 88 | response = HttpResponse(content_type='text/csv') 89 | response['Content-Disposition'] = 'attachment; filename="impressions.csv"' 90 | writer = csv.writer(response) 91 | writer.writerow(('Title', 92 | 'Advertised URL', 93 | 'Source IP', 94 | 'Timestamp', 95 | 'Advertiser ID', 96 | 'Advertiser name', 97 | 'Zone')) 98 | queryset = queryset.select_related('ad', 'ad__advertiser') 99 | for impression in queryset: 100 | writer.writerow((impression.ad.title, 101 | impression.ad.url, 102 | impression.source_ip, 103 | impression.impression_date.isoformat(), 104 | impression.ad.advertiser.pk, 105 | impression.ad.advertiser.company_name, 106 | impression.ad.zone.title)) 107 | return response 108 | download_impressions.short_description = "Download selected Ad Impressions" 109 | 110 | 111 | class TextAdAdmin(AdBaseAdmin): 112 | search_fields = ['title', 'url', 'content'] 113 | 114 | 115 | admin.site.register(Advertiser, AdvertiserAdmin) 116 | admin.site.register(AdCategory, AdCategoryAdmin) 117 | admin.site.register(AdZone, AdZoneAdmin) 118 | admin.site.register(TextAd, TextAdAdmin) 119 | admin.site.register(BannerAd, AdBaseAdmin) 120 | admin.site.register(AdClick, AdClickAdmin) 121 | admin.site.register(AdImpression, AdImpressionAdmin) 122 | -------------------------------------------------------------------------------- /adzone/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # © Copyright 2009 Andre Engelbrecht. All Rights Reserved. 4 | # This script is licensed under the BSD Open Source Licence 5 | # Please see the text file LICENCE for more information 6 | # If this script is distributed, it must be accompanied by the Licence 7 | 8 | import datetime 9 | 10 | from django.db import models 11 | from django.conf import settings 12 | from django.utils.translation import ugettext_lazy as _ 13 | 14 | from adzone.managers import AdManager 15 | 16 | from django.contrib.sites.models import Site 17 | 18 | # Use a datetime a few days before the max to that timezone changes don't 19 | # cause an OverflowError. 20 | MAX_DATETIME = datetime.datetime.max - datetime.timedelta(days=2) 21 | try: 22 | from django.utils.timezone import now, make_aware, utc 23 | except ImportError: 24 | now = datetime.datetime.now 25 | else: 26 | MAX_DATETIME = make_aware(MAX_DATETIME, utc) 27 | 28 | 29 | class Advertiser(models.Model): 30 | """ A Model for our Advertiser. """ 31 | company_name = models.CharField( 32 | verbose_name=_(u'Company Name'), max_length=255) 33 | website = models.URLField(verbose_name=_(u'Company Site')) 34 | user = models.ForeignKey(settings.AUTH_USER_MODEL) 35 | 36 | class Meta: 37 | verbose_name = _(u'Ad Provider') 38 | verbose_name_plural = _(u'Advertisers') 39 | ordering = ('company_name',) 40 | 41 | def __str__(self): 42 | return self.company_name 43 | 44 | def get_website_url(self): 45 | return self.website 46 | 47 | 48 | class AdCategory(models.Model): 49 | """ a Model to hold the different Categories for adverts """ 50 | title = models.CharField(verbose_name=_(u'Title'), max_length=255) 51 | slug = models.SlugField(verbose_name=_(u'Slug'), unique=True) 52 | description = models.TextField(verbose_name=_(u'Description')) 53 | 54 | class Meta: 55 | verbose_name = 'Category' 56 | verbose_name_plural = 'Categories' 57 | ordering = ('title',) 58 | 59 | def __str__(self): 60 | return self.title 61 | 62 | 63 | class AdZone(models.Model): 64 | """ a Model that describes the attributes and behaviours of ad zones """ 65 | title = models.CharField(verbose_name=_(u'Title'), max_length=255) 66 | slug = models.SlugField(verbose_name=_(u'Slug')) 67 | description = models.TextField(verbose_name=_(u'Description')) 68 | 69 | class Meta: 70 | verbose_name = 'Zone' 71 | verbose_name_plural = 'Zones' 72 | ordering = ('title',) 73 | 74 | def __str__(self): 75 | return self.title 76 | 77 | 78 | class AdBase(models.Model): 79 | """ 80 | This is our base model, from which all ads will inherit. 81 | The manager methods for this model will determine which ads to 82 | display return etc. 83 | """ 84 | title = models.CharField(verbose_name=_(u'Title'), max_length=255) 85 | url = models.URLField(verbose_name=_(u'Advertised URL')) 86 | since = models.DateTimeField(verbose_name=_(u'Since'), auto_now_add=True) 87 | updated = models.DateTimeField(verbose_name=_(u'Updated'), auto_now=True) 88 | 89 | start_showing = models.DateTimeField(verbose_name=_(u'Start showing'), 90 | default=now) 91 | stop_showing = models.DateTimeField(verbose_name=_(u'Stop showing'), 92 | default=MAX_DATETIME) 93 | 94 | # Relations 95 | advertiser = models.ForeignKey(Advertiser, verbose_name=_("Ad Provider")) 96 | category = models.ForeignKey(AdCategory, 97 | verbose_name=_("Category"), 98 | blank=True, 99 | null=True) 100 | zone = models.ForeignKey(AdZone, verbose_name=_("Zone")) 101 | 102 | # Our Custom Manager 103 | objects = AdManager() 104 | 105 | sites = models.ManyToManyField(Site, verbose_name=(u"Sites")) 106 | 107 | class Meta: 108 | verbose_name = _('Ad Base') 109 | verbose_name_plural = _('Ad Bases') 110 | 111 | def __str__(self): 112 | return self.title 113 | 114 | @models.permalink 115 | def get_absolute_url(self): 116 | return ('adzone_ad_view', [self.id]) 117 | 118 | 119 | class AdImpression(models.Model): 120 | """ 121 | The AdImpression Model will record every time the ad is loaded on a page 122 | """ 123 | impression_date = models.DateTimeField( 124 | verbose_name=_(u'When'), auto_now_add=True) 125 | source_ip = models.GenericIPAddressField( 126 | verbose_name=_(u'Who'), null=True, blank=True) 127 | ad = models.ForeignKey(AdBase) 128 | 129 | class Meta: 130 | verbose_name = _('Ad Impression') 131 | verbose_name_plural = _('Ad Impressions') 132 | 133 | 134 | class AdClick(models.Model): 135 | """ 136 | The AdClick model will record every click that a add gets 137 | """ 138 | click_date = models.DateTimeField( 139 | verbose_name=_(u'When'), auto_now_add=True) 140 | source_ip = models.GenericIPAddressField( 141 | verbose_name=_(u'Who'), null=True, blank=True) 142 | ad = models.ForeignKey(AdBase) 143 | 144 | class Meta: 145 | verbose_name = _('Ad Click') 146 | verbose_name_plural = _('Ad Clicks') 147 | 148 | 149 | # Example Ad Types 150 | class TextAd(AdBase): 151 | """ A most basic, text based advert """ 152 | content = models.TextField(verbose_name=_(u'Content')) 153 | 154 | 155 | class BannerAd(AdBase): 156 | """ A standard banner Ad """ 157 | content = models.ImageField( 158 | verbose_name=_(u'Content'), upload_to="adzone/bannerads/") 159 | -------------------------------------------------------------------------------- /adzone/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.contrib.auth.models import User 3 | from django.contrib.sites.models import Site 4 | from django.template import Template 5 | from django.template.response import SimpleTemplateResponse 6 | from django.utils import timezone 7 | 8 | from adzone.models import Advertiser, AdCategory, AdZone, AdBase 9 | from adzone.models import AdImpression, AdClick 10 | from adzone.managers import AdManager 11 | from adzone.templatetags.adzone_tags import random_zone_ad, random_category_ad 12 | 13 | 14 | # Helper functions to help setting up the tests 15 | user = lambda: User.objects.create_user('test', 'test@example.com', 'secret') 16 | 17 | 18 | def datenow(): 19 | return timezone.now() 20 | 21 | 22 | def create_objects(): 23 | """ Simple helper to create advertiser, category and zone """ 24 | advertiser = Advertiser.objects.create( 25 | company_name='Advertiser Name 1', 26 | website='http://example.com/', user=user()) 27 | 28 | category = AdCategory.objects.create( 29 | title='Internet Services', 30 | slug='internet-services', 31 | description='All internet based services') 32 | 33 | adzone = AdZone.objects.create( 34 | title='Sidebar', 35 | slug='sidebar', 36 | description='Sidebar Zone Description') 37 | 38 | return advertiser, category, adzone 39 | 40 | 41 | def create_advert(): 42 | """ Simple helper to create a single ad """ 43 | advertiser, category, zone = create_objects() 44 | ad = AdBase.objects.create( 45 | title='Ad Title', 46 | url='www.example.com', 47 | advertiser=advertiser, 48 | category=category, 49 | zone=zone, 50 | ) 51 | ad.sites = [Site.objects.get_current()] 52 | return ad 53 | 54 | 55 | # Now follows the actual tests 56 | class AdvertiserTestCase(TestCase): 57 | 58 | def test_model(self): 59 | Advertiser( 60 | company_name='Advertiser Name 1', 61 | website='http://example.com/', 62 | user=user()) 63 | 64 | def test_get_website_url(self): 65 | advertiser = Advertiser( 66 | company_name='Advertiser Name 1', 67 | website='http://example.com/', 68 | user=user()) 69 | 70 | self.assertEqual( 71 | 'http://example.com/', 72 | advertiser.get_website_url()) 73 | 74 | 75 | class AdCategoryTestCase(TestCase): 76 | 77 | def test_model(self): 78 | AdCategory( 79 | title='Internet Services', 80 | slug='internet-services', 81 | description='All internet based services') 82 | 83 | 84 | class AdZoneTestCase(TestCase): 85 | 86 | def test_model(self): 87 | AdZone( 88 | title='Ad Zone Title', 89 | slug='adzone', 90 | description='Ad Zone Description') 91 | 92 | 93 | class AdBaseTestCase(TestCase): 94 | 95 | urls = 'adzone.urls' 96 | 97 | def test_model(self): 98 | advertiser, category, zone = create_objects() 99 | AdBase( 100 | title='Ad Title', 101 | url='www.example.com', 102 | advertiser=advertiser, 103 | category=category, 104 | zone=zone 105 | ) 106 | 107 | def test_unicode(self): 108 | advert = create_advert() 109 | self.assertEqual('Ad Title', str(advert)) 110 | 111 | def test_absolute_url(self): 112 | advert = create_advert() 113 | self.assertEqual('/view/1/', advert.get_absolute_url()) 114 | 115 | 116 | class AdManagerTestCase(TestCase): 117 | 118 | def setUp(self): 119 | # Create two categories and two adverts 120 | advertiser, category, zone = create_objects() 121 | category2 = AdCategory.objects.create( 122 | title='Category 2', 123 | slug='category-2', 124 | description='Category 2 description' 125 | ) 126 | ad1 = AdBase.objects.create( 127 | title='Ad Title', 128 | url='www.example.com', 129 | advertiser=advertiser, 130 | category=category, 131 | zone=zone 132 | ) 133 | ad2 = AdBase.objects.create( 134 | title='Ad 2 Title', 135 | url='www.example2.com', 136 | advertiser=advertiser, 137 | category=category2, 138 | zone=zone 139 | ) 140 | ad1.sites = [Site.objects.get_current()] 141 | ad2.sites = [Site.objects.get_current()] 142 | 143 | def test_manager_exists(self): 144 | AdManager 145 | 146 | def test_get_random_ad(self): 147 | advert = AdBase.objects.get_random_ad('sidebar') 148 | self.assertIn(advert.id, [1, 2]) 149 | 150 | def test_get_random_ad_by_category(self): 151 | advert = AdBase.objects.get_random_ad('sidebar', 152 | ad_category='category-2') 153 | self.assertIn(advert.id, [2]) 154 | 155 | 156 | class AdImpressionTestCase(TestCase): 157 | 158 | def test_model(self): 159 | advert = create_advert() 160 | AdImpression( 161 | impression_date=datenow(), 162 | source_ip='127.0.0.1', 163 | ad=advert, 164 | ) 165 | 166 | 167 | class AdClickTestCase(TestCase): 168 | 169 | def test_model(self): 170 | advert = create_advert() 171 | AdClick( 172 | click_date=datenow(), 173 | source_ip='127.0.0.1', 174 | ad=advert, 175 | ) 176 | 177 | 178 | class TemplateTagsTestCase(TestCase): 179 | 180 | def test_random_zone_ad_creates_impression(self): 181 | create_advert() 182 | random_zone_ad({'from_ip': '127.0.0.1'}, 'sidebar') 183 | self.assertEqual(AdImpression.objects.all().count(), 1) 184 | 185 | def test_random_zone_ad_renders(self): 186 | template = Template("{% load adzone_tags %}{% random_zone_ad 'sidebar' %}") 187 | response = SimpleTemplateResponse(template) 188 | response.render() 189 | self.assertTrue(response.is_rendered) 190 | 191 | def test_random_category_ad_creates_impression(self): 192 | create_advert() 193 | random_category_ad( 194 | {'from_ip': '127.0.0.1'}, 'sidebar', 'internet-services') 195 | self.assertEqual(AdImpression.objects.all().count(), 1) 196 | 197 | def test_random_category_ad_renders(self): 198 | template = Template("{% load adzone_tags %}{% random_category_ad 'sidebar' 'internet-services' %}") 199 | response = SimpleTemplateResponse(template) 200 | response.render() 201 | self.assertTrue(response.is_rendered) 202 | 203 | 204 | class AdViewTestCase(TestCase): 205 | 206 | urls = 'adzone.urls' 207 | 208 | def test_request_redirects(self): 209 | create_advert() 210 | response = self.client.get('/view/1/') 211 | self.assertEqual(response.status_code, 302) 212 | 213 | def test_request_redirect_chain(self): 214 | create_advert() 215 | response = self.client.get('/view/1/', follow=True) 216 | chain = [('http://www.example.com', 302), ] 217 | self.assertEqual(response.redirect_chain, chain) 218 | 219 | def test_request_creates_click(self): 220 | create_advert() 221 | self.client.get('/view/1/') # dont need response for this test 222 | self.assertEqual(AdClick.objects.filter(ad__id=1).count(), 1) 223 | -------------------------------------------------------------------------------- /adzone/south_migrations/0004_auto__del_field_adbase_enabled.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import datetime 3 | from south.db import db 4 | from south.v2 import SchemaMigration 5 | from django.db import models 6 | 7 | 8 | class Migration(SchemaMigration): 9 | 10 | def forwards(self, orm): 11 | # Deleting field 'AdBase.enabled' 12 | db.delete_column('adzone_adbase', 'enabled') 13 | 14 | 15 | def backwards(self, orm): 16 | # Adding field 'AdBase.enabled' 17 | db.add_column('adzone_adbase', 'enabled', 18 | self.gf('django.db.models.fields.BooleanField')(default=False), 19 | keep_default=False) 20 | 21 | 22 | models = { 23 | 'adzone.adbase': { 24 | 'Meta': {'object_name': 'AdBase'}, 25 | 'advertiser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.Advertiser']"}), 26 | 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdCategory']"}), 27 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 28 | 'since': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 29 | 'start_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 30 | 'stop_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(9999, 12, 29, 0, 0)'}), 31 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 32 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 33 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), 34 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdZone']"}) 35 | }, 36 | 'adzone.adcategory': { 37 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdCategory'}, 38 | 'description': ('django.db.models.fields.TextField', [], {}), 39 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 40 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), 41 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 42 | }, 43 | 'adzone.adclick': { 44 | 'Meta': {'object_name': 'AdClick'}, 45 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 46 | 'click_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 47 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 48 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 49 | }, 50 | 'adzone.adimpression': { 51 | 'Meta': {'object_name': 'AdImpression'}, 52 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 53 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 54 | 'impression_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 55 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 56 | }, 57 | 'adzone.advertiser': { 58 | 'Meta': {'ordering': "('company_name',)", 'object_name': 'Advertiser'}, 59 | 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 60 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 61 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), 62 | 'website': ('django.db.models.fields.URLField', [], {'max_length': '200'}) 63 | }, 64 | 'adzone.adzone': { 65 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdZone'}, 66 | 'description': ('django.db.models.fields.TextField', [], {}), 67 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 68 | 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), 69 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 70 | }, 71 | 'adzone.bannerad': { 72 | 'Meta': {'object_name': 'BannerAd', '_ormbases': ['adzone.AdBase']}, 73 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 74 | 'content': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}) 75 | }, 76 | 'adzone.textad': { 77 | 'Meta': {'object_name': 'TextAd', '_ormbases': ['adzone.AdBase']}, 78 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 79 | 'content': ('django.db.models.fields.TextField', [], {}) 80 | }, 81 | 'auth.group': { 82 | 'Meta': {'object_name': 'Group'}, 83 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 84 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 85 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 86 | }, 87 | 'auth.permission': { 88 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 89 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 90 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 91 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 92 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 93 | }, 94 | 'auth.user': { 95 | 'Meta': {'object_name': 'User'}, 96 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 97 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 98 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 99 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 100 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 101 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 102 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 103 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 104 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 105 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 106 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 107 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 108 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 109 | }, 110 | 'contenttypes.contenttype': { 111 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 112 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 113 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 114 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 115 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 116 | } 117 | } 118 | 119 | complete_apps = ['adzone'] -------------------------------------------------------------------------------- /adzone/south_migrations/0003_copy_enabled.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import datetime 3 | from south.db import db 4 | from south.v2 import DataMigration 5 | from django.db import models 6 | 7 | try: 8 | from django.utils.timezone import now 9 | except ImportError: 10 | now = datetime.datetime.now 11 | 12 | class Migration(DataMigration): 13 | 14 | def forwards(self, orm): 15 | # The AdBase objects currently *all* start showing at "now"-ish 16 | # and stop showing at max_dt. So we just need to update the disabled 17 | # ads to stop showing "now"-ish. 18 | AdBase = orm['adzone.adbase'] 19 | ads_disabled = AdBase.objects.filter(enabled=False) 20 | ads_disabled.update(stop_showing=now()) 21 | 22 | def backwards(self, orm): 23 | "Write your backwards methods here." 24 | AdBase = orm['adzone.adbase'] 25 | ads_enabled = AdBase.objects.filter(start_showing__lte=now(), 26 | stop_showing__gte=now()) 27 | ads_enabled.update(enabled=True) 28 | ads_disabled = (AdBase.objects.filter(start_showing__gte=now()) | 29 | AdBase.objects.filter(stop_showing__lte=now())) 30 | ads_disabled.update(enabled=False) 31 | 32 | models = { 33 | 'adzone.adbase': { 34 | 'Meta': {'object_name': 'AdBase'}, 35 | 'advertiser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.Advertiser']"}), 36 | 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdCategory']"}), 37 | 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 38 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 39 | 'since': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 40 | 'start_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 41 | 'stop_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(9999, 12, 29, 0, 0)'}), 42 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 43 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 44 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), 45 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdZone']"}) 46 | }, 47 | 'adzone.adcategory': { 48 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdCategory'}, 49 | 'description': ('django.db.models.fields.TextField', [], {}), 50 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 51 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), 52 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 53 | }, 54 | 'adzone.adclick': { 55 | 'Meta': {'object_name': 'AdClick'}, 56 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 57 | 'click_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 58 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 59 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 60 | }, 61 | 'adzone.adimpression': { 62 | 'Meta': {'object_name': 'AdImpression'}, 63 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 64 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 65 | 'impression_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 66 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 67 | }, 68 | 'adzone.advertiser': { 69 | 'Meta': {'ordering': "('company_name',)", 'object_name': 'Advertiser'}, 70 | 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 71 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 72 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), 73 | 'website': ('django.db.models.fields.URLField', [], {'max_length': '200'}) 74 | }, 75 | 'adzone.adzone': { 76 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdZone'}, 77 | 'description': ('django.db.models.fields.TextField', [], {}), 78 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 79 | 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), 80 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 81 | }, 82 | 'adzone.bannerad': { 83 | 'Meta': {'object_name': 'BannerAd', '_ormbases': ['adzone.AdBase']}, 84 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 85 | 'content': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}) 86 | }, 87 | 'adzone.textad': { 88 | 'Meta': {'object_name': 'TextAd', '_ormbases': ['adzone.AdBase']}, 89 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 90 | 'content': ('django.db.models.fields.TextField', [], {}) 91 | }, 92 | 'auth.group': { 93 | 'Meta': {'object_name': 'Group'}, 94 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 95 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 96 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 97 | }, 98 | 'auth.permission': { 99 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 100 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 101 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 102 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 103 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 104 | }, 105 | 'auth.user': { 106 | 'Meta': {'object_name': 'User'}, 107 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 108 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 109 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 110 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 111 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 112 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 113 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 114 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 115 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 116 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 117 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 118 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 119 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 120 | }, 121 | 'contenttypes.contenttype': { 122 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 123 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 124 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 125 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 126 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 127 | } 128 | } 129 | 130 | complete_apps = ['adzone'] 131 | symmetrical = True 132 | -------------------------------------------------------------------------------- /src/adzone/migrations/0006_add_all_sites.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from south.utils import datetime_utils as datetime 3 | from south.db import db 4 | from south.v2 import DataMigration 5 | from django.db import models 6 | 7 | class Migration(DataMigration): 8 | 9 | def forwards(self, orm): 10 | "Write your forwards methods here." 11 | # Note: Don't use "from appname.models import ModelName". 12 | # Use orm.ModelName to refer to models in this application, 13 | # and orm['appname.ModelName'] for models in other applications. 14 | Site = orm['sites.Site'] 15 | all_sites = Site.objects.all() 16 | for ad in orm.AdBase.objects.all(): 17 | ad.sites = all_sites 18 | 19 | def backwards(self, orm): 20 | "Write your backwards methods here." 21 | 22 | models = { 23 | 'adzone.adbase': { 24 | 'Meta': {'object_name': 'AdBase'}, 25 | 'advertiser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.Advertiser']"}), 26 | 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdCategory']", 'null': 'True', 'blank': 'True'}), 27 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 28 | 'since': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 29 | 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}), 30 | 'start_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 31 | 'stop_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(9999, 12, 29, 0, 0)'}), 32 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 33 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 34 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), 35 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdZone']"}) 36 | }, 37 | 'adzone.adcategory': { 38 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdCategory'}, 39 | 'description': ('django.db.models.fields.TextField', [], {}), 40 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 41 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), 42 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 43 | }, 44 | 'adzone.adclick': { 45 | 'Meta': {'object_name': 'AdClick'}, 46 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 47 | 'click_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 48 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 49 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 50 | }, 51 | 'adzone.adimpression': { 52 | 'Meta': {'object_name': 'AdImpression'}, 53 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 54 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 55 | 'impression_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 56 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 57 | }, 58 | 'adzone.advertiser': { 59 | 'Meta': {'ordering': "('company_name',)", 'object_name': 'Advertiser'}, 60 | 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 61 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 62 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), 63 | 'website': ('django.db.models.fields.URLField', [], {'max_length': '200'}) 64 | }, 65 | 'adzone.adzone': { 66 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdZone'}, 67 | 'description': ('django.db.models.fields.TextField', [], {}), 68 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 69 | 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), 70 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 71 | }, 72 | 'adzone.bannerad': { 73 | 'Meta': {'object_name': 'BannerAd', '_ormbases': ['adzone.AdBase']}, 74 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 75 | 'content': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}) 76 | }, 77 | 'adzone.textad': { 78 | 'Meta': {'object_name': 'TextAd', '_ormbases': ['adzone.AdBase']}, 79 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 80 | 'content': ('django.db.models.fields.TextField', [], {}) 81 | }, 82 | 'auth.group': { 83 | 'Meta': {'object_name': 'Group'}, 84 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 85 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 86 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 87 | }, 88 | 'auth.permission': { 89 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 90 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 91 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 92 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 93 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 94 | }, 95 | 'auth.user': { 96 | 'Meta': {'object_name': 'User'}, 97 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 98 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 99 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 100 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 101 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 102 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 103 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 104 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 105 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 106 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 107 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 108 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 109 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 110 | }, 111 | 'contenttypes.contenttype': { 112 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 113 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 114 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 115 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 116 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 117 | }, 118 | 'sites.site': { 119 | 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, 120 | 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 121 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 122 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 123 | } 124 | } 125 | 126 | complete_apps = ['adzone'] 127 | symmetrical = True 128 | -------------------------------------------------------------------------------- /adzone/south_migrations/0006_add_all_sites.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from south.utils import datetime_utils as datetime 3 | from south.db import db 4 | from south.v2 import DataMigration 5 | from django.db import models 6 | 7 | class Migration(DataMigration): 8 | 9 | def forwards(self, orm): 10 | "Write your forwards methods here." 11 | # Note: Don't use "from appname.models import ModelName". 12 | # Use orm.ModelName to refer to models in this application, 13 | # and orm['appname.ModelName'] for models in other applications. 14 | Site = orm['sites.Site'] 15 | all_sites = Site.objects.all() 16 | for ad in orm.AdBase.objects.all(): 17 | ad.sites = all_sites 18 | 19 | def backwards(self, orm): 20 | "Write your backwards methods here." 21 | 22 | models = { 23 | 'adzone.adbase': { 24 | 'Meta': {'object_name': 'AdBase'}, 25 | 'advertiser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.Advertiser']"}), 26 | 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdCategory']", 'null': 'True', 'blank': 'True'}), 27 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 28 | 'since': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 29 | 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}), 30 | 'start_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 31 | 'stop_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(9999, 12, 29, 0, 0)'}), 32 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 33 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 34 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), 35 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdZone']"}) 36 | }, 37 | 'adzone.adcategory': { 38 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdCategory'}, 39 | 'description': ('django.db.models.fields.TextField', [], {}), 40 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 41 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), 42 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 43 | }, 44 | 'adzone.adclick': { 45 | 'Meta': {'object_name': 'AdClick'}, 46 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 47 | 'click_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 48 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 49 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 50 | }, 51 | 'adzone.adimpression': { 52 | 'Meta': {'object_name': 'AdImpression'}, 53 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 54 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 55 | 'impression_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 56 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 57 | }, 58 | 'adzone.advertiser': { 59 | 'Meta': {'ordering': "('company_name',)", 'object_name': 'Advertiser'}, 60 | 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 61 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 62 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), 63 | 'website': ('django.db.models.fields.URLField', [], {'max_length': '200'}) 64 | }, 65 | 'adzone.adzone': { 66 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdZone'}, 67 | 'description': ('django.db.models.fields.TextField', [], {}), 68 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 69 | 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), 70 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 71 | }, 72 | 'adzone.bannerad': { 73 | 'Meta': {'object_name': 'BannerAd', '_ormbases': ['adzone.AdBase']}, 74 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 75 | 'content': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}) 76 | }, 77 | 'adzone.textad': { 78 | 'Meta': {'object_name': 'TextAd', '_ormbases': ['adzone.AdBase']}, 79 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 80 | 'content': ('django.db.models.fields.TextField', [], {}) 81 | }, 82 | 'auth.group': { 83 | 'Meta': {'object_name': 'Group'}, 84 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 85 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 86 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 87 | }, 88 | 'auth.permission': { 89 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 90 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 91 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 92 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 93 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 94 | }, 95 | 'auth.user': { 96 | 'Meta': {'object_name': 'User'}, 97 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 98 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 99 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 100 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 101 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 102 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 103 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 104 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 105 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 106 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 107 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 108 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 109 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 110 | }, 111 | 'contenttypes.contenttype': { 112 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 113 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 114 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 115 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 116 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 117 | }, 118 | 'sites.site': { 119 | 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, 120 | 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 121 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 122 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 123 | } 124 | } 125 | 126 | complete_apps = ['adzone'] 127 | symmetrical = True 128 | -------------------------------------------------------------------------------- /adzone/south_migrations/0002_auto__add_field_adbase_start_showing__add_field_adbase_stop_showing.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import datetime 3 | from south.db import db 4 | from south.v2 import SchemaMigration 5 | from django.db import models 6 | 7 | # Use a datetime a few days before the max to that timezone changes don't 8 | # cause an OverflowError. 9 | MAX_DATETIME = datetime.datetime.max - datetime.timedelta(days=2) 10 | try: 11 | from django.utils.timezone import now, make_aware, utc 12 | except ImportError: 13 | now = datetime.datetime.now 14 | else: 15 | MAX_DATETIME = make_aware(MAX_DATETIME, utc) 16 | 17 | 18 | class Migration(SchemaMigration): 19 | 20 | def forwards(self, orm): 21 | # Adding field 'AdBase.start_showing' 22 | db.add_column('adzone_adbase', 'start_showing', 23 | self.gf('django.db.models.fields.DateTimeField')(default=now), 24 | keep_default=False) 25 | 26 | # Adding field 'AdBase.stop_showing' 27 | db.add_column('adzone_adbase', 'stop_showing', 28 | self.gf('django.db.models.fields.DateTimeField')(default=MAX_DATETIME), 29 | keep_default=False) 30 | 31 | 32 | def backwards(self, orm): 33 | # Deleting field 'AdBase.start_showing' 34 | db.delete_column('adzone_adbase', 'start_showing') 35 | 36 | # Deleting field 'AdBase.stop_showing' 37 | db.delete_column('adzone_adbase', 'stop_showing') 38 | 39 | 40 | models = { 41 | 'adzone.adbase': { 42 | 'Meta': {'object_name': 'AdBase'}, 43 | 'advertiser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.Advertiser']"}), 44 | 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdCategory']"}), 45 | 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 46 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 47 | 'since': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 48 | 'start_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 49 | 'stop_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(9999, 12, 29, 0, 0)'}), 50 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 51 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 52 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), 53 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdZone']"}) 54 | }, 55 | 'adzone.adcategory': { 56 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdCategory'}, 57 | 'description': ('django.db.models.fields.TextField', [], {}), 58 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 59 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), 60 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 61 | }, 62 | 'adzone.adclick': { 63 | 'Meta': {'object_name': 'AdClick'}, 64 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 65 | 'click_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 66 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 67 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 68 | }, 69 | 'adzone.adimpression': { 70 | 'Meta': {'object_name': 'AdImpression'}, 71 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 72 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 73 | 'impression_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 74 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 75 | }, 76 | 'adzone.advertiser': { 77 | 'Meta': {'ordering': "('company_name',)", 'object_name': 'Advertiser'}, 78 | 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 79 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 80 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), 81 | 'website': ('django.db.models.fields.URLField', [], {'max_length': '200'}) 82 | }, 83 | 'adzone.adzone': { 84 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdZone'}, 85 | 'description': ('django.db.models.fields.TextField', [], {}), 86 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 87 | 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), 88 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 89 | }, 90 | 'adzone.bannerad': { 91 | 'Meta': {'object_name': 'BannerAd', '_ormbases': ['adzone.AdBase']}, 92 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 93 | 'content': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}) 94 | }, 95 | 'adzone.textad': { 96 | 'Meta': {'object_name': 'TextAd', '_ormbases': ['adzone.AdBase']}, 97 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 98 | 'content': ('django.db.models.fields.TextField', [], {}) 99 | }, 100 | 'auth.group': { 101 | 'Meta': {'object_name': 'Group'}, 102 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 103 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 104 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 105 | }, 106 | 'auth.permission': { 107 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 108 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 109 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 110 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 111 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 112 | }, 113 | 'auth.user': { 114 | 'Meta': {'object_name': 'User'}, 115 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 116 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 117 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 118 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 119 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 120 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 121 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 122 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 123 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 124 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 125 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 126 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 127 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 128 | }, 129 | 'contenttypes.contenttype': { 130 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 131 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 132 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 133 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 134 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 135 | } 136 | } 137 | 138 | complete_apps = ['adzone'] -------------------------------------------------------------------------------- /adzone/south_migrations/0005_auto__chg_field_adbase_category.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from south.utils import datetime_utils as datetime 3 | from south.db import db 4 | from south.v2 import SchemaMigration 5 | from django.db import models 6 | 7 | 8 | class Migration(SchemaMigration): 9 | 10 | def forwards(self, orm): 11 | # Adding M2M table for field sites on 'AdBase' 12 | m2m_table_name = db.shorten_name('adzone_adbase_sites') 13 | db.create_table(m2m_table_name, ( 14 | ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), 15 | ('adbase', models.ForeignKey(orm['adzone.adbase'], null=False)), 16 | ('site', models.ForeignKey(orm['sites.site'], null=False)) 17 | )) 18 | db.create_unique(m2m_table_name, ['adbase_id', 'site_id']) 19 | 20 | 21 | # Changing field 'AdBase.category' 22 | db.alter_column('adzone_adbase', 'category_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.AdCategory'], null=True)) 23 | 24 | def backwards(self, orm): 25 | # Removing M2M table for field sites on 'AdBase' 26 | db.delete_table(db.shorten_name('adzone_adbase_sites')) 27 | 28 | 29 | # User chose to not deal with backwards NULL issues for 'AdBase.category' 30 | raise RuntimeError("Cannot reverse this migration. 'AdBase.category' and its values cannot be restored.") 31 | 32 | # The following code is provided here to aid in writing a correct migration 33 | # Changing field 'AdBase.category' 34 | db.alter_column('adzone_adbase', 'category_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.AdCategory'])) 35 | 36 | models = { 37 | 'adzone.adbase': { 38 | 'Meta': {'object_name': 'AdBase'}, 39 | 'advertiser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.Advertiser']"}), 40 | 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdCategory']", 'null': 'True', 'blank': 'True'}), 41 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 42 | 'since': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 43 | 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}), 44 | 'start_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 45 | 'stop_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(9999, 12, 29, 0, 0)'}), 46 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 47 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 48 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), 49 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdZone']"}) 50 | }, 51 | 'adzone.adcategory': { 52 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdCategory'}, 53 | 'description': ('django.db.models.fields.TextField', [], {}), 54 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 55 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), 56 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 57 | }, 58 | 'adzone.adclick': { 59 | 'Meta': {'object_name': 'AdClick'}, 60 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 61 | 'click_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 62 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 63 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 64 | }, 65 | 'adzone.adimpression': { 66 | 'Meta': {'object_name': 'AdImpression'}, 67 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 68 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 69 | 'impression_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 70 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 71 | }, 72 | 'adzone.advertiser': { 73 | 'Meta': {'ordering': "('company_name',)", 'object_name': 'Advertiser'}, 74 | 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 75 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 76 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), 77 | 'website': ('django.db.models.fields.URLField', [], {'max_length': '200'}) 78 | }, 79 | 'adzone.adzone': { 80 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdZone'}, 81 | 'description': ('django.db.models.fields.TextField', [], {}), 82 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 83 | 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), 84 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 85 | }, 86 | 'adzone.bannerad': { 87 | 'Meta': {'object_name': 'BannerAd', '_ormbases': ['adzone.AdBase']}, 88 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 89 | 'content': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}) 90 | }, 91 | 'adzone.textad': { 92 | 'Meta': {'object_name': 'TextAd', '_ormbases': ['adzone.AdBase']}, 93 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 94 | 'content': ('django.db.models.fields.TextField', [], {}) 95 | }, 96 | 'auth.group': { 97 | 'Meta': {'object_name': 'Group'}, 98 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 99 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 100 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 101 | }, 102 | 'auth.permission': { 103 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 104 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 105 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 106 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 107 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 108 | }, 109 | 'auth.user': { 110 | 'Meta': {'object_name': 'User'}, 111 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 112 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 113 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 114 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 115 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 116 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 117 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 118 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 119 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 120 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 121 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 122 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 123 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 124 | }, 125 | 'contenttypes.contenttype': { 126 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 127 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 128 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 129 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 130 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 131 | }, 132 | 'sites.site': { 133 | 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, 134 | 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 135 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 136 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 137 | } 138 | } 139 | 140 | complete_apps = ['adzone'] -------------------------------------------------------------------------------- /src/adzone/migrations/0005_auto__chg_field_adbase_category.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from south.utils import datetime_utils as datetime 3 | from south.db import db 4 | from south.v2 import SchemaMigration 5 | from django.db import models 6 | 7 | 8 | class Migration(SchemaMigration): 9 | 10 | def forwards(self, orm): 11 | # Adding M2M table for field sites on 'AdBase' 12 | m2m_table_name = db.shorten_name('adzone_adbase_sites') 13 | db.create_table(m2m_table_name, ( 14 | ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), 15 | ('adbase', models.ForeignKey(orm['adzone.adbase'], null=False)), 16 | ('site', models.ForeignKey(orm['sites.site'], null=False)) 17 | )) 18 | db.create_unique(m2m_table_name, ['adbase_id', 'site_id']) 19 | 20 | 21 | # Changing field 'AdBase.category' 22 | db.alter_column('adzone_adbase', 'category_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.AdCategory'], null=True)) 23 | 24 | def backwards(self, orm): 25 | # Removing M2M table for field sites on 'AdBase' 26 | db.delete_table(db.shorten_name('adzone_adbase_sites')) 27 | 28 | 29 | # User chose to not deal with backwards NULL issues for 'AdBase.category' 30 | raise RuntimeError("Cannot reverse this migration. 'AdBase.category' and its values cannot be restored.") 31 | 32 | # The following code is provided here to aid in writing a correct migration 33 | # Changing field 'AdBase.category' 34 | db.alter_column('adzone_adbase', 'category_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.AdCategory'])) 35 | 36 | models = { 37 | 'adzone.adbase': { 38 | 'Meta': {'object_name': 'AdBase'}, 39 | 'advertiser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.Advertiser']"}), 40 | 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdCategory']", 'null': 'True', 'blank': 'True'}), 41 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 42 | 'since': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 43 | 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}), 44 | 'start_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 45 | 'stop_showing': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(9999, 12, 29, 0, 0)'}), 46 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 47 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 48 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), 49 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdZone']"}) 50 | }, 51 | 'adzone.adcategory': { 52 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdCategory'}, 53 | 'description': ('django.db.models.fields.TextField', [], {}), 54 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 55 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), 56 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 57 | }, 58 | 'adzone.adclick': { 59 | 'Meta': {'object_name': 'AdClick'}, 60 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 61 | 'click_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 62 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 63 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 64 | }, 65 | 'adzone.adimpression': { 66 | 'Meta': {'object_name': 'AdImpression'}, 67 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 68 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 69 | 'impression_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 70 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 71 | }, 72 | 'adzone.advertiser': { 73 | 'Meta': {'ordering': "('company_name',)", 'object_name': 'Advertiser'}, 74 | 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 75 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 76 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), 77 | 'website': ('django.db.models.fields.URLField', [], {'max_length': '200'}) 78 | }, 79 | 'adzone.adzone': { 80 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdZone'}, 81 | 'description': ('django.db.models.fields.TextField', [], {}), 82 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 83 | 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), 84 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 85 | }, 86 | 'adzone.bannerad': { 87 | 'Meta': {'object_name': 'BannerAd', '_ormbases': ['adzone.AdBase']}, 88 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 89 | 'content': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}) 90 | }, 91 | 'adzone.textad': { 92 | 'Meta': {'object_name': 'TextAd', '_ormbases': ['adzone.AdBase']}, 93 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 94 | 'content': ('django.db.models.fields.TextField', [], {}) 95 | }, 96 | 'auth.group': { 97 | 'Meta': {'object_name': 'Group'}, 98 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 99 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 100 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 101 | }, 102 | 'auth.permission': { 103 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 104 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 105 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 106 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 107 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 108 | }, 109 | 'auth.user': { 110 | 'Meta': {'object_name': 'User'}, 111 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 112 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 113 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 114 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 115 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 116 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 117 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 118 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 119 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 120 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 121 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 122 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 123 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 124 | }, 125 | 'contenttypes.contenttype': { 126 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 127 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 128 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 129 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 130 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 131 | }, 132 | 'sites.site': { 133 | 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, 134 | 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 135 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 136 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 137 | } 138 | } 139 | 140 | complete_apps = ['adzone'] -------------------------------------------------------------------------------- /adzone/south_migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import datetime 3 | from south.db import db 4 | from south.v2 import SchemaMigration 5 | from django.db import models 6 | 7 | 8 | class Migration(SchemaMigration): 9 | 10 | def forwards(self, orm): 11 | # Adding model 'Advertiser' 12 | db.create_table('adzone_advertiser', ( 13 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 14 | ('company_name', self.gf('django.db.models.fields.CharField')(max_length=255)), 15 | ('website', self.gf('django.db.models.fields.URLField')(max_length=200)), 16 | ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), 17 | )) 18 | db.send_create_signal('adzone', ['Advertiser']) 19 | 20 | # Adding model 'AdCategory' 21 | db.create_table('adzone_adcategory', ( 22 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 23 | ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), 24 | ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50)), 25 | ('description', self.gf('django.db.models.fields.TextField')()), 26 | )) 27 | db.send_create_signal('adzone', ['AdCategory']) 28 | 29 | # Adding model 'AdZone' 30 | db.create_table('adzone_adzone', ( 31 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 32 | ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), 33 | ('slug', self.gf('django.db.models.fields.SlugField')(max_length=50)), 34 | ('description', self.gf('django.db.models.fields.TextField')()), 35 | )) 36 | db.send_create_signal('adzone', ['AdZone']) 37 | 38 | # Adding model 'AdBase' 39 | db.create_table('adzone_adbase', ( 40 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 41 | ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), 42 | ('url', self.gf('django.db.models.fields.URLField')(max_length=200)), 43 | ('enabled', self.gf('django.db.models.fields.BooleanField')(default=False)), 44 | ('since', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), 45 | ('updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), 46 | ('advertiser', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.Advertiser'])), 47 | ('category', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.AdCategory'])), 48 | ('zone', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.AdZone'])), 49 | )) 50 | db.send_create_signal('adzone', ['AdBase']) 51 | 52 | # Adding model 'AdImpression' 53 | db.create_table('adzone_adimpression', ( 54 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 55 | ('impression_date', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), 56 | ('source_ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15, null=True, blank=True)), 57 | ('ad', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.AdBase'])), 58 | )) 59 | db.send_create_signal('adzone', ['AdImpression']) 60 | 61 | # Adding model 'AdClick' 62 | db.create_table('adzone_adclick', ( 63 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 64 | ('click_date', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), 65 | ('source_ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15, null=True, blank=True)), 66 | ('ad', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['adzone.AdBase'])), 67 | )) 68 | db.send_create_signal('adzone', ['AdClick']) 69 | 70 | # Adding model 'TextAd' 71 | db.create_table('adzone_textad', ( 72 | ('adbase_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['adzone.AdBase'], unique=True, primary_key=True)), 73 | ('content', self.gf('django.db.models.fields.TextField')()), 74 | )) 75 | db.send_create_signal('adzone', ['TextAd']) 76 | 77 | # Adding model 'BannerAd' 78 | db.create_table('adzone_bannerad', ( 79 | ('adbase_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['adzone.AdBase'], unique=True, primary_key=True)), 80 | ('content', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), 81 | )) 82 | db.send_create_signal('adzone', ['BannerAd']) 83 | 84 | 85 | def backwards(self, orm): 86 | # Deleting model 'Advertiser' 87 | db.delete_table('adzone_advertiser') 88 | 89 | # Deleting model 'AdCategory' 90 | db.delete_table('adzone_adcategory') 91 | 92 | # Deleting model 'AdZone' 93 | db.delete_table('adzone_adzone') 94 | 95 | # Deleting model 'AdBase' 96 | db.delete_table('adzone_adbase') 97 | 98 | # Deleting model 'AdImpression' 99 | db.delete_table('adzone_adimpression') 100 | 101 | # Deleting model 'AdClick' 102 | db.delete_table('adzone_adclick') 103 | 104 | # Deleting model 'TextAd' 105 | db.delete_table('adzone_textad') 106 | 107 | # Deleting model 'BannerAd' 108 | db.delete_table('adzone_bannerad') 109 | 110 | 111 | models = { 112 | 'adzone.adbase': { 113 | 'Meta': {'object_name': 'AdBase'}, 114 | 'advertiser': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.Advertiser']"}), 115 | 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdCategory']"}), 116 | 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 117 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 118 | 'since': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 119 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 120 | 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 121 | 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}), 122 | 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdZone']"}) 123 | }, 124 | 'adzone.adcategory': { 125 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdCategory'}, 126 | 'description': ('django.db.models.fields.TextField', [], {}), 127 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 128 | 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), 129 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 130 | }, 131 | 'adzone.adclick': { 132 | 'Meta': {'object_name': 'AdClick'}, 133 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 134 | 'click_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 135 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 136 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 137 | }, 138 | 'adzone.adimpression': { 139 | 'Meta': {'object_name': 'AdImpression'}, 140 | 'ad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['adzone.AdBase']"}), 141 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 142 | 'impression_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 143 | 'source_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}) 144 | }, 145 | 'adzone.advertiser': { 146 | 'Meta': {'ordering': "('company_name',)", 'object_name': 'Advertiser'}, 147 | 'company_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), 148 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 149 | 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), 150 | 'website': ('django.db.models.fields.URLField', [], {'max_length': '200'}) 151 | }, 152 | 'adzone.adzone': { 153 | 'Meta': {'ordering': "('title',)", 'object_name': 'AdZone'}, 154 | 'description': ('django.db.models.fields.TextField', [], {}), 155 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 156 | 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), 157 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) 158 | }, 159 | 'adzone.bannerad': { 160 | 'Meta': {'object_name': 'BannerAd', '_ormbases': ['adzone.AdBase']}, 161 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 162 | 'content': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}) 163 | }, 164 | 'adzone.textad': { 165 | 'Meta': {'object_name': 'TextAd', '_ormbases': ['adzone.AdBase']}, 166 | 'adbase_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['adzone.AdBase']", 'unique': 'True', 'primary_key': 'True'}), 167 | 'content': ('django.db.models.fields.TextField', [], {}) 168 | }, 169 | 'auth.group': { 170 | 'Meta': {'object_name': 'Group'}, 171 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 172 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 173 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 174 | }, 175 | 'auth.permission': { 176 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 177 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 178 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 179 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 180 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 181 | }, 182 | 'auth.user': { 183 | 'Meta': {'object_name': 'User'}, 184 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 185 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 186 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 187 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 188 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 189 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 190 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 191 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 192 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 193 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 194 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 195 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 196 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 197 | }, 198 | 'contenttypes.contenttype': { 199 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 200 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 201 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 202 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 203 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 204 | } 205 | } 206 | 207 | complete_apps = ['adzone'] --------------------------------------------------------------------------------