parent
50beeb8ded
commit
9c47521052
18 changed files with 756 additions and 0 deletions
@ -0,0 +1,21 @@ |
|||||||
|
# -*- coding: utf-8 -* |
||||||
|
from random import choice, shuffle |
||||||
|
from django.db import models |
||||||
|
|
||||||
|
|
||||||
|
class BiasedManager(models.Manager): |
||||||
|
def by_time(self, **kwargs): |
||||||
|
all = super(BiasedManager, self).get_query_set().filter(**kwargs) |
||||||
|
result = [] |
||||||
|
for i in all: |
||||||
|
for j in range(i.often): |
||||||
|
result.append(i) |
||||||
|
return result |
||||||
|
|
||||||
|
def one(self, **kwargs): |
||||||
|
return choice(self.by_time(**kwargs)) |
||||||
|
|
||||||
|
def by_often(self, **kwargs): |
||||||
|
result = self.by_time(**kwargs) |
||||||
|
shuffle(result) |
||||||
|
return result |
||||||
@ -0,0 +1,170 @@ |
|||||||
|
import hashlib |
||||||
|
from datetime import datetime |
||||||
|
|
||||||
|
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 |
||||||
|
|
||||||
|
|
||||||
|
class URL(models.Model): |
||||||
|
title = models.CharField(verbose_name=_('Title'), max_length=256) |
||||||
|
url = models.CharField(verbose_name=_('URL or URL RegEx'), max_length=2048) |
||||||
|
regex = models.BooleanField(verbose_name=_('RegEx'), default=False) |
||||||
|
sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True) |
||||||
|
|
||||||
|
public = models.BooleanField(verbose_name=_('Public'), 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') |
||||||
|
|
||||||
|
|
||||||
|
class BannerGroup (models.Model): |
||||||
|
name = models.CharField(verbose_name=_('Name'), max_length=255) |
||||||
|
slug = models.SlugField(verbose_name=_('Slug'), unique=True) |
||||||
|
width = models.PositiveSmallIntegerField(verbose_name=_('Width'), default=0) |
||||||
|
height = models.PositiveSmallIntegerField(verbose_name=_('Height'), default=0) |
||||||
|
speed = models.PositiveSmallIntegerField(verbose_name=_('Speed'), default=2000) |
||||||
|
|
||||||
|
public = models.BooleanField(verbose_name=_('Public'), 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 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') |
||||||
|
|
||||||
|
|
||||||
|
class Banner(models.Model): |
||||||
|
objects = BiasedManager() |
||||||
|
|
||||||
|
title = models.CharField(verbose_name=_('Title'), max_length=255, blank=True) |
||||||
|
alt = models.CharField(verbose_name=_('Alt'), max_length=255) |
||||||
|
|
||||||
|
text = models.TextField(verbose_name=_('Text'), blank=True, null=True) |
||||||
|
img = models.FileField(verbose_name=_('Image'), upload_to='expo_upload', blank=True, null=True) |
||||||
|
url = models.CharField(verbose_name=_('URL'), max_length=1024) |
||||||
|
|
||||||
|
sort = models.PositiveSmallIntegerField(verbose_name=_('Sort'), default=500) |
||||||
|
|
||||||
|
group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=_('Group')) |
||||||
|
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=_('Is HTML?'), default=False) |
||||||
|
flash = models.BooleanField(verbose_name=_('Is Flash?'), default=False) |
||||||
|
|
||||||
|
|
||||||
|
public = models.BooleanField(verbose_name=_('Public'), 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 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) |
||||||
@ -0,0 +1,159 @@ |
|||||||
|
/* |
||||||
|
************************** |
||||||
|
* =COMMON |
||||||
|
************************** |
||||||
|
*/ |
||||||
|
.b-slider { |
||||||
|
position: relative; |
||||||
|
display: block; |
||||||
|
overflow: hidden; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
width: 725px; |
||||||
|
height: 360px; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-list { |
||||||
|
position: absolute; |
||||||
|
display: block; |
||||||
|
overflow: hidden; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
width: 725px; |
||||||
|
height: 360px; |
||||||
|
list-style: none; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-item { |
||||||
|
position: absolute; |
||||||
|
z-index: 50; |
||||||
|
float: left; |
||||||
|
overflow: hidden; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
width: 725px; |
||||||
|
height: 360px; |
||||||
|
} |
||||||
|
|
||||||
|
.m-slider-current { |
||||||
|
z-index: 100; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-item__img, |
||||||
|
.b-slider-item__title, |
||||||
|
.b-slider-item__text { |
||||||
|
position: absolute; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-item__img { |
||||||
|
top: 0; |
||||||
|
left: 0; |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-item__link { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-item__title { |
||||||
|
bottom: 10px; |
||||||
|
left: 10px; |
||||||
|
width: 500px; |
||||||
|
color: #333; |
||||||
|
text-transform: uppercase; |
||||||
|
text-shadow: 0 0 3px #fff, 0 0 2px #fff, 0 0 1px #fff; |
||||||
|
letter-spacing: -5px; |
||||||
|
font-size: 65px; |
||||||
|
font-family: Calibri; |
||||||
|
line-height: 0.8em; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-item__text { |
||||||
|
position: absolute; |
||||||
|
top: 150px; |
||||||
|
left: 300px; |
||||||
|
display: inline-block; |
||||||
|
display: none; |
||||||
|
margin: -10px; |
||||||
|
padding: 10px; |
||||||
|
max-width: 300px; |
||||||
|
border-radius: 10px; |
||||||
|
background: rgba(255, 255, 255, 0.5); |
||||||
|
box-shadow: 0 0 5px #fff; |
||||||
|
color: #555; |
||||||
|
line-height: 1.5em; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* |
||||||
|
************************** |
||||||
|
* =NAV |
||||||
|
************************** |
||||||
|
*/ |
||||||
|
.b-slider-nav { |
||||||
|
position: absolute; |
||||||
|
width: 100%; |
||||||
|
top: 10px; |
||||||
|
height: 30px; |
||||||
|
left: 0; |
||||||
|
z-index: 500; |
||||||
|
display: block; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
list-style-type: none; |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-nav-button { |
||||||
|
display: inline-block; |
||||||
|
margin: 5px; |
||||||
|
width: 16px; |
||||||
|
height: 16px; |
||||||
|
border-radius: 8px; |
||||||
|
background: #ddd; |
||||||
|
color: transparent; |
||||||
|
text-align: center; |
||||||
|
font-weight: bold; |
||||||
|
font-size: 8px; |
||||||
|
line-height: 16px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-nav-button:hover { |
||||||
|
background: #eee; |
||||||
|
} |
||||||
|
|
||||||
|
.m-slider-nav-current_button { |
||||||
|
background: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-nav-prev, |
||||||
|
.b-slider-nav-next { |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
z-index: 500; |
||||||
|
padding-right: 20px; |
||||||
|
padding-left: 20px; |
||||||
|
color: #000; |
||||||
|
text-shadow: 0 0 3px #fff, 0 0 2px #fff, 0 0 1px #fff; |
||||||
|
font-size: 50px; |
||||||
|
font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; |
||||||
|
line-height: 360px; |
||||||
|
opacity: 0.5; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-nav-prev:hover, |
||||||
|
.b-slider-nav-next:hover { |
||||||
|
opacity: 0.8; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-nav-prev { |
||||||
|
left: 0; |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
|
||||||
|
.b-slider-nav-next { |
||||||
|
right: 0; |
||||||
|
padding-right: 0; |
||||||
|
} |
||||||
@ -0,0 +1,10 @@ |
|||||||
|
|
||||||
|
$(document).ready(function() { |
||||||
|
$('.b-banner-click').on('click', function(){ |
||||||
|
$.get($(this).data('url')); |
||||||
|
}); |
||||||
|
|
||||||
|
$(".b-banner").on('load', function() { |
||||||
|
$.get($(this).data('view')); |
||||||
|
}); |
||||||
|
}); |
||||||
@ -0,0 +1,71 @@ |
|||||||
|
$.fn.bannersSlider = function(options) { |
||||||
|
$this = this; |
||||||
|
var settings = $.extend( { |
||||||
|
'auto_play': false, |
||||||
|
'effect': 'fade', |
||||||
|
'speed' : 3000 |
||||||
|
}, options); |
||||||
|
|
||||||
|
$this.current = 1; |
||||||
|
$this.old = 1; |
||||||
|
$this.len = $this.find('.b-slider-list li').length; |
||||||
|
|
||||||
|
$this.find('.b-slider-item').hide(); |
||||||
|
$this.find('.m-slider-item-1').show(); |
||||||
|
|
||||||
|
$this.fadeTo = function(new_num) { |
||||||
|
old_num = $this.old; |
||||||
|
if (new_num != old_num) { |
||||||
|
$this.find('.m-slider-item-' + new_num).hide(); |
||||||
|
$this.find('.m-slider-item-' + new_num).fadeIn(1000); |
||||||
|
$this.find('.m-slider-current').fadeOut(1000); |
||||||
|
$this.find('.m-slider-current').removeClass('m-slider-current'); |
||||||
|
$this.find('.m-slider-item-' + new_num).addClass('m-slider-current'); |
||||||
|
|
||||||
|
$this.find('.b-slider-nav-button').removeClass('m-slider-nav-current_button'); |
||||||
|
|
||||||
|
$this.find('.b-slider-nav-button[data-slide=' + new_num + ']').addClass('m-slider-nav-current_button'); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
$this.prev = function() { |
||||||
|
prev = ($this.current != 1) ? $this.current - 1 : $this.len; |
||||||
|
$this.old = $this.current; |
||||||
|
$this.current = prev; |
||||||
|
|
||||||
|
$this.fadeTo(prev); |
||||||
|
}; |
||||||
|
|
||||||
|
$this.next = function() { |
||||||
|
next = ($this.current != $this.len) ? $this.current + 1 : 1; |
||||||
|
$this.old = $this.current; |
||||||
|
$this.current = next; |
||||||
|
|
||||||
|
$this.fadeTo(next); |
||||||
|
}; |
||||||
|
|
||||||
|
$this.children('.b-slider-nav-prev').on('click', function(){ |
||||||
|
$this.prev(); |
||||||
|
}); |
||||||
|
|
||||||
|
$this.children('.b-slider-nav-next').on('click', function(){ |
||||||
|
$this.next(); |
||||||
|
}); |
||||||
|
|
||||||
|
$this.find('.b-slider-nav-button').on('click', function(){ |
||||||
|
to_slide = $(this).data('slide'); |
||||||
|
|
||||||
|
$this.old = $this.current; |
||||||
|
$this.current = to_slide; |
||||||
|
|
||||||
|
$this.fadeTo(to_slide); |
||||||
|
}); |
||||||
|
|
||||||
|
if (settings.auto_play) { |
||||||
|
setInterval(function() { |
||||||
|
$this.next(); |
||||||
|
}, settings.speed); |
||||||
|
} |
||||||
|
|
||||||
|
return $this; |
||||||
|
}; |
||||||
@ -0,0 +1,55 @@ |
|||||||
|
{% if banner.html %} |
||||||
|
{% load banner %} |
||||||
|
<div id='banner_{{ banner.id }}' class='b-banner b-banner-{{ group.slug }} m-banner__html'> |
||||||
|
{% render banner.text %} |
||||||
|
</div> |
||||||
|
{% elif banner.flash %} |
||||||
|
<div id='banner_{{ banner.id }}' class='b-banner b-banner-{{ group.slug }} m-banner__flash'> |
||||||
|
<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' |
||||||
|
codebase='http://fpdownload.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0' |
||||||
|
width='{{ banner.group.width }}' height='{{ banner.group.height }}'> |
||||||
|
<param name='movie' value='{{ banner.img.url }}' /> |
||||||
|
<param name='quality' value='high'> |
||||||
|
<param name='play' value='true'> |
||||||
|
<param name='loop' value='true'> |
||||||
|
<param name='wmode' value='transparent'> |
||||||
|
<embed src='{{ banner.img.url }}' |
||||||
|
quality='high' |
||||||
|
bgcolor='#d0f' |
||||||
|
width='{{ banner.group.width }}' |
||||||
|
height='{{ banner.group.height }}' |
||||||
|
name='banner_{{ banner.id }}' |
||||||
|
type='application/x-shockwave-flash' |
||||||
|
play='true' |
||||||
|
loop='true' |
||||||
|
wmode='transparent' |
||||||
|
pluginspage='http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' |
||||||
|
> |
||||||
|
</embed> |
||||||
|
</object> |
||||||
|
</div> |
||||||
|
|
||||||
|
<script> |
||||||
|
$('#banner_{{ banner.id }}').mousedown(function() { |
||||||
|
// alert('mouse down'); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
{% else %} |
||||||
|
<a href='{{ banner.url }}' id='banner_{{ banner.id }}' class='b-banner b-banner-{{ group.slug }}'> |
||||||
|
<img src='{{ banner.img.url }}' alt='{{ banner.alt }}' title='{{ banner.title }}'> |
||||||
|
</a> |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
<style> |
||||||
|
.b-banner { |
||||||
|
display: block; |
||||||
|
padding: 0; |
||||||
|
margin: 0; |
||||||
|
/*border: 1px solid silver;*/ |
||||||
|
} |
||||||
|
|
||||||
|
.b-banner-{{ group.slug }} { |
||||||
|
width: {{ banner.group.width }}px; |
||||||
|
height: {{ banner.group.height }}px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
{% load banner %} |
||||||
|
|
||||||
|
<div class="b-banner-group"> |
||||||
|
{% for banner in banners %} |
||||||
|
{% banner_one banner.id %} |
||||||
|
{% endfor %} |
||||||
|
</div> |
||||||
|
|
||||||
|
<style type="text/css"> |
||||||
|
.b-banner-group { |
||||||
|
display: block; |
||||||
|
overflow: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.b-banner { |
||||||
|
display: block; |
||||||
|
padding: 0; |
||||||
|
margin: 0; |
||||||
|
/*border: 1px solid silver;*/ |
||||||
|
} |
||||||
|
|
||||||
|
.b-banner-{{ group.slug }} { |
||||||
|
width: {{ banner.group.width }}px; |
||||||
|
height: {{ banner.group.height }}px; |
||||||
|
float: left; |
||||||
|
} |
||||||
|
|
||||||
|
.b-banner-{{ group.slug }} img { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,30 @@ |
|||||||
|
{% load banner %} |
||||||
|
|
||||||
|
<div class="b-banner-group"> |
||||||
|
{% for banner in banners %} |
||||||
|
{% banner_one banner.id %} |
||||||
|
{% endfor %} |
||||||
|
<script> |
||||||
|
var arr = []; |
||||||
|
{% for banner in banners %} |
||||||
|
arr[{{ forloop.counter }}] = {'id': {{ banner.id }}, 'often': {{ banner.often }}}; |
||||||
|
{% endfor %} |
||||||
|
|
||||||
|
var length = arr.length - 1; |
||||||
|
|
||||||
|
var i = 1; |
||||||
|
var speed = {{ group.speed }}; |
||||||
|
|
||||||
|
$('.b-banner-{{ group.slug }}').hide(); |
||||||
|
$('#banner_' + arr[i]['id']).show(); |
||||||
|
total_speed = speed * arr[i]['often']; |
||||||
|
setInterval(function () { |
||||||
|
if (i < length) i++; else i = 1; |
||||||
|
|
||||||
|
total_speed = speed * arr[i]['often']; |
||||||
|
console.log (total_speed, arr[i]); |
||||||
|
$('.b-banner-{{ group.slug }}').hide(); |
||||||
|
$('#banner_' + arr[i]['id']).show(); |
||||||
|
}, speed); |
||||||
|
</script> |
||||||
|
</div> |
||||||
@ -0,0 +1,74 @@ |
|||||||
|
{% load thumbnail %} |
||||||
|
|
||||||
|
{% if banners %} |
||||||
|
|
||||||
|
<div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}"> |
||||||
|
<ul class='b-slider-list'> |
||||||
|
{% for banner in banners %} |
||||||
|
<li data-url='{{ banner.get_absolute_url }}' |
||||||
|
class=' |
||||||
|
b-slider-item |
||||||
|
m-slider-item-{{ forloop.counter }} |
||||||
|
{% if forloop.counter == 1 %} |
||||||
|
m-slider-current |
||||||
|
{% endif %} |
||||||
|
' |
||||||
|
data-slide='{{ forloop.counter }}' |
||||||
|
> |
||||||
|
|
||||||
|
<a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'> |
||||||
|
{% thumbnail banner.img group.size crop="top" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" alt="{{ banner.alt }}" title="{{ banner.title }}" class='b-slider-item__img' data-view='{{ banner.image }}'> |
||||||
|
{% endthumbnail %} |
||||||
|
|
||||||
|
<div class="b-slider-item__info_cover"> |
||||||
|
<span class='b-slider-item__title'>{{ banner.title|safe }}</span> |
||||||
|
<span class='b-slider-item__text'>{{ banner.text|safe }}</span> |
||||||
|
</div> |
||||||
|
</a> |
||||||
|
</li> |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
|
||||||
|
<ul class="b-slider-nav"> |
||||||
|
{% for banner in banners %} |
||||||
|
<li class="b-slider-nav-button |
||||||
|
{% if forloop.counter == 1 %} |
||||||
|
m-slider-nav-current_button |
||||||
|
{% endif %} |
||||||
|
" data-slide='{{ forloop.counter }}'> |
||||||
|
{{ forloop.counter }} |
||||||
|
</li> |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
|
||||||
|
<span data-direction="prev" class='b-slider-nav-prev'>〈 </span> |
||||||
|
<span data-direction="next" class='b-slider-nav-next'> 〉</span> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
<script> |
||||||
|
(function() { |
||||||
|
$('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}}); |
||||||
|
})(); |
||||||
|
</script> |
||||||
|
|
||||||
|
<style> |
||||||
|
.m-{{ group.slug }} { |
||||||
|
width: {{ group.width }}px; |
||||||
|
height: {{ group.height }}px; |
||||||
|
} |
||||||
|
|
||||||
|
.m-{{ group.slug }} .b-slider-nav-prev, |
||||||
|
.m-{{ group.slug }} .b-slider-nav-next { |
||||||
|
line-height: {{ group.height }}px; |
||||||
|
} |
||||||
|
|
||||||
|
.m-{{ group.slug }} .b-slider-item, |
||||||
|
.m-{{ group.slug }} .b-slider-list { |
||||||
|
width: {{ group.width }}px; |
||||||
|
height: {{ group.height }}px; |
||||||
|
} |
||||||
|
</style> |
||||||
|
|
||||||
|
{% endif %} |
||||||
@ -0,0 +1,74 @@ |
|||||||
|
from ..models import Banner |
||||||
|
from ..models import BannerGroup |
||||||
|
from ..models import URL |
||||||
|
|
||||||
|
from django import template |
||||||
|
|
||||||
|
# For render tag |
||||||
|
from django.template import Context |
||||||
|
from django.template import Template |
||||||
|
|
||||||
|
import re |
||||||
|
|
||||||
|
register = template.Library() |
||||||
|
|
||||||
|
|
||||||
|
@register.simple_tag(takes_context=True) |
||||||
|
def banner_group(context, group, tpl='group.html'): |
||||||
|
try: |
||||||
|
page_url = context['request'].path_info |
||||||
|
site = context['request'].site |
||||||
|
group = BannerGroup.objects.get(slug=group) |
||||||
|
good_urls = [] |
||||||
|
for url in URL.objects.filter(public=True, sites__in=[site]): |
||||||
|
if url.regex: |
||||||
|
url_re = re.compile(url.url) |
||||||
|
if url_re.findall(page_url): |
||||||
|
good_urls.append(url) |
||||||
|
elif page_url == url.url: |
||||||
|
good_urls.append(url) |
||||||
|
banners = Banner.objects.filter(public=True, group=group, urls__in=good_urls) |
||||||
|
except: |
||||||
|
banners = False |
||||||
|
group = False |
||||||
|
if(banners and group): |
||||||
|
context['banners'] = banners |
||||||
|
context['group'] = group |
||||||
|
|
||||||
|
t = template.loader.get_template(tpl) |
||||||
|
return t.render(template.Context(context)) |
||||||
|
|
||||||
|
|
||||||
|
@register.simple_tag(takes_context=True) |
||||||
|
def banner_one(context, banner_id, tpl='banner.html'): |
||||||
|
try: |
||||||
|
page_url = context['request'].path_info |
||||||
|
site = context['request'].site |
||||||
|
good_urls = [] |
||||||
|
for url in URL.objects.filter(public=True, sites__in=[site]): |
||||||
|
if url.regex: |
||||||
|
url_re = re.compile(url.url) |
||||||
|
if url_re.findall(page_url): |
||||||
|
good_urls.append(url) |
||||||
|
elif page_url == url.url: |
||||||
|
good_urls.append(url) |
||||||
|
|
||||||
|
banner = Banner.objects.get(id=banner_id, public=True, urls__in=good_urls) |
||||||
|
except: |
||||||
|
banner = False |
||||||
|
|
||||||
|
context['banner'] = banner |
||||||
|
|
||||||
|
t = template.loader.get_template(tpl) |
||||||
|
return t.render(template.Context(context)) |
||||||
|
|
||||||
|
|
||||||
|
# block render |
||||||
|
@register.simple_tag(takes_context=True) |
||||||
|
def render(context, content): |
||||||
|
try: |
||||||
|
tpl = Template(content) |
||||||
|
content = Context(context) |
||||||
|
return tpl.render(content) |
||||||
|
except: |
||||||
|
return 'Render Error' |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
""" |
||||||
|
This file demonstrates writing tests using the unittest module. These will pass |
||||||
|
when you run "manage.py test". |
||||||
|
|
||||||
|
Replace this with more appropriate tests for your application. |
||||||
|
""" |
||||||
|
|
||||||
|
from django.test import TestCase |
||||||
|
|
||||||
|
|
||||||
|
class SimpleTest(TestCase): |
||||||
|
def test_basic_addition(self): |
||||||
|
""" |
||||||
|
Tests that 1 + 1 always equals 2. |
||||||
|
""" |
||||||
|
self.assertEqual(1 + 1, 2) |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
from django.conf.urls import url |
||||||
|
|
||||||
|
from . import views |
||||||
|
|
||||||
|
urlpatterns = [ |
||||||
|
url(r'^click/(?P<banner_id>\d{1,4})/(?P<key>[-\w]+)/$', views.click, name='banner_click'), |
||||||
|
url(r'^view/(?P<banner_id>\d+)/(?P<key>[-\w]+)/$', views.view, name='banner_view'), |
||||||
|
] |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
from django.shortcuts import redirect, get_object_or_404 |
||||||
|
from .models import Banner |
||||||
|
|
||||||
|
|
||||||
|
def click(request, banner_id, key): |
||||||
|
banner = get_object_or_404(Banner, pk=banner_id) |
||||||
|
banner.log(request, 2, key) |
||||||
|
return redirect(banner.url) |
||||||
|
|
||||||
|
|
||||||
|
def view(request, banner_id, key): |
||||||
|
banner = get_object_or_404(Banner, pk=banner_id) |
||||||
|
banner.log(request, 1, key) |
||||||
|
return redirect(banner.img.url) |
||||||
@ -0,0 +1,7 @@ |
|||||||
|
/** |
||||||
|
* Created by kotzilla on 17/07/15. |
||||||
|
*/ |
||||||
|
$(function () { |
||||||
|
|
||||||
|
console.log('banners'); |
||||||
|
}); |
||||||
Loading…
Reference in new issue