# -*- coding: utf-8 -*- import hashlib from datetime import datetime, date from django.db import models from django.utils.translation import ugettext_lazy as _ from django.conf import settings from django.contrib.sites.models import Site from .managers import BiasedManager, BannerGroupCached class URL(models.Model): title = models.CharField(verbose_name=u'Заголовок', max_length=256) url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048) regex = models.BooleanField(verbose_name=u'RegEx', default=False) sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True) public = models.BooleanField(verbose_name=u'Активный', default=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) def __unicode__(self): return self.title class Meta: ordering = ['-created_at'] verbose_name = _('URL') verbose_name_plural = _('URLs') def get_admin_url(self): return '/admin/expobanners/banners/url/%d/edit/'%self.id class BannerGroup (models.Model): name = models.CharField(verbose_name=u'Имя', max_length=255) slug = models.SlugField(verbose_name=u'URL', unique=True) width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0) height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0) speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000) public = models.BooleanField(verbose_name=u'Активная', default=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) cached = BannerGroupCached() def size(self): return '%sx%s' % (self.width, self.height) def __unicode__(self): return '%s - [%s x %s]' % (self.name, self.width, self.height) class Meta: ordering = ['name'] verbose_name = _('Banner Group') verbose_name_plural = _('Banner Groups') def get_admin_url(self): return '/admin/expobanners/banners/group/%d/edit/'%self.id class Banner(models.Model): objects = BiasedManager() title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True) alt = models.CharField(verbose_name=_('Alt'), max_length=255) text = models.TextField(verbose_name=u'Текст', blank=True, null=True) img = models.FileField(verbose_name=u'Картинка', upload_to='expo_upload', blank=True, null=True) url = models.CharField(verbose_name=u'URL', max_length=1024) sort = models.PositiveSmallIntegerField(verbose_name=u'Сорт', default=500) group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True) often = models.PositiveSmallIntegerField( verbose_name=_('Often'), help_text=_('A ten will display 10 times more often that a one.'), choices=[[i, i] for i in range(11)] ) urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True) html = models.BooleanField(verbose_name=_('HTML?'), default=False) flash = models.BooleanField(verbose_name=_('Flash?'), default=False) paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False) public = models.BooleanField(verbose_name=u'Активный', default=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) theme = models.ForeignKey('theme.Theme', blank=True, null=True, verbose_name=u'Тематика') tag = models.ForeignKey('theme.Tag', blank=True, null=True, verbose_name=u'Тег') country = models.ForeignKey('country.Country', blank=True, null=True, verbose_name=u'Страна') city = models.ForeignKey('city.City', blank=True, null=True, verbose_name=u'Город') def get_admin_url(self): return '/admin/expobanners/banners/banner/%d/edit/'%self.id def key(slef): if hasattr(settings, 'SECRET_KEY'): key = str(datetime.now()) + settings.SECRET_KEY else: key = str(datetime.now()) return hashlib.md5(key).hexdigest() def log(self, request, type, key): log = { 'type': type, 'key': key, 'banner': self, 'group': self.group, 'ip': request.META.get('REMOTE_ADDR'), 'user_agent': request.META.get('HTTP_USER_AGENT'), 'page': request.META.get('HTTP_REFERER'), } if request.user.is_authenticated(): log['user'] = request.user return Log.objects.create(**log) @models.permalink def image(self): return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()}) def impressions(self): return Log.objects.filter(banner=self.pk, type=0).count() def views(self): return Log.objects.filter(banner=self.pk, type=1).count() def clicks(self): return Log.objects.filter(banner=self.pk, type=2).count() def __unicode__(self): return self.title or self.alt def get_absolute_url(self): if self.url == '#': return self.url else: @models.permalink def get_absolute_url(self): return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()}) return get_absolute_url(self) class Meta: ordering = ['sort'] verbose_name = _('Banner') verbose_name_plural = _('Banners') class Log(models.Model): banner = models.ForeignKey(Banner, related_name='banner_logs') group = models.ForeignKey(BannerGroup, related_name='group_logs', verbose_name=_('Group'), blank=True) urls = models.ManyToManyField(URL, related_name='url_logs', verbose_name=_('URLs'), blank=True) user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='users', verbose_name=_('User')) datetime = models.DateTimeField(verbose_name=_('Clicked At'), auto_now_add=True) ip = models.IPAddressField(verbose_name=_('IP'), null=True, blank=True) user_agent = models.CharField(verbose_name=_('User Agent'), max_length=1024, null=True, blank=True) page = models.URLField(verbose_name=_('Page'), null=True, blank=True) key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True) TYPE_CHOICES = ( (0, 'impressions'), (1, 'view'), (2, 'click') ) type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES) def __unicode__(self): return '%s - (%s)' % (self.banner, self.datetime) class LogStat(models.Model): banner = models.ForeignKey(Banner, related_name='banner_stat', verbose_name=_('Banner'), blank=True) group = models.ForeignKey(BannerGroup, related_name='group_stat', verbose_name=_('Group'), blank=True) urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True) date = models.DateField(verbose_name=_('Data')) view = models.PositiveIntegerField(verbose_name=_('Views')) click = models.PositiveIntegerField(verbose_name=_('Clicks')) unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True) unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks')) def __unicode__(self): return '%s - (%s)' % (self.banner, self.date) # ------------------ class Paid(models.Model): tickets = models.ForeignKey(Banner, related_name='paid_tickets') participation = models.ForeignKey(Banner, related_name='paid_participation') official = models.ForeignKey(Banner, related_name='paid_official') logo = models.ImageField(upload_to='/')# !!!!! organiser = models.CharField(max_length=100) active = models.BooleanField(default=True) stat_pswd = models.CharField(max_length=16) created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) class PaidStat(models.Model): paid = models.ForeignKey(Paid) date = models.DateField(verbose_name=_('Date')) page_views = models.PositiveIntegerField(default=0) price_views = models.PositiveIntegerField(default=0) catalog_views = models.PositiveIntegerField(default=0) catalog_clicks = models.PositiveIntegerField(default=0) class Top(models.Model): catalog = models.CharField(max_length=16) position = models.PositiveIntegerField(blank=True, null=True) theme = models.ManyToManyField('theme.Theme', blank=True, null=True) excluded_tags = models.ManyToManyField('theme.Tag', blank=True, null=True) country = models.ManyToManyField('country.Country', blank=True, null=True) excluded_cities = models.ManyToManyField('city.City', blank=True, null=True) fr = models.DateField(default=date.today()) to = models.DateField(blank=True, null=True) stat_pswd = models.CharField(max_length=16) class Meta: ordering = ['position'] class TopStat(models.Model): date = models.DateField() theme = models.ForeignKey('theme.Theme', blank=True, null=True) tag = models.ForeignKey('theme.Tag', blank=True, null=True) country = models.ForeignKey('country.Country', blank=True, null=True) city = models.ForeignKey('city.City', blank=True, null=True) views = models.PositiveIntegerField(default=0) clicks = models.PositiveIntegerField(default=0)