parent
ad071cb0c9
commit
958ba883c3
283 changed files with 17580 additions and 7344 deletions
@ -1,10 +1,10 @@ |
||||
from django.conf.urls import url, patterns |
||||
from views import NewPage, PageList, EditPage, DeletePage, PageDetailed |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^new/$', NewPage.as_view(), name='new_page' ), |
||||
url(r'^all/$', PageList.as_view(), name = 'page_list'), |
||||
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'), |
||||
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'), |
||||
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'), |
||||
) |
||||
from django.conf.urls import url, patterns |
||||
from views import NewPage, PageList, EditPage, DeletePage, PageDetailed |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^new/$', NewPage.as_view(), name='new_page' ), |
||||
url(r'^all/$', PageList.as_view(), name = 'page_list'), |
||||
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'), |
||||
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'), |
||||
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'), |
||||
) |
||||
|
||||
@ -1,11 +1,11 @@ |
||||
from django.conf.urls import url, patterns |
||||
from models import LatestExpositions, CountryFeeds, CityFeeds, ThemeFeeds |
||||
|
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^latest/$', LatestExpositions()), |
||||
url(r'^country/(?P<slug>.*)/$', CountryFeeds()), |
||||
url(r'^city/(?P<slug>.*)/$', CityFeeds()), |
||||
url(r'^theme/(?P<slug>.*)/$', ThemeFeeds()), |
||||
|
||||
) |
||||
from django.conf.urls import url, patterns |
||||
from models import LatestExpositions, CountryFeeds, CityFeeds, ThemeFeeds |
||||
|
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^latest/$', LatestExpositions()), |
||||
url(r'^country/(?P<slug>.*)/$', CountryFeeds()), |
||||
url(r'^city/(?P<slug>.*)/$', CityFeeds()), |
||||
url(r'^theme/(?P<slug>.*)/$', ThemeFeeds()), |
||||
|
||||
) |
||||
|
||||
@ -1,77 +1,79 @@ |
||||
# -*- coding: utf-8 -* |
||||
from datetime import date |
||||
from random import choice, shuffle |
||||
from django.db import models |
||||
from django.db.models import Q |
||||
from django.core.cache import cache |
||||
|
||||
|
||||
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 |
||||
|
||||
def create_for_paid(self, expo, url, role): |
||||
try: |
||||
name = str(expo.name) |
||||
except UnicodeEncodeError, UnicodeDecodeError: |
||||
name = expo.url |
||||
|
||||
alt = u'%s_%s'%(name, role) |
||||
return self.create(alt=alt, url=url, paid=True) |
||||
|
||||
class BannerGroupCached(models.Manager): |
||||
def all(self): |
||||
key = 'banner_group_all' |
||||
result = cache.get(key) |
||||
if not result: |
||||
result = list(self.filter(public=True)) |
||||
cache.set(key, result, 90) |
||||
return result |
||||
|
||||
def group_banners(self): |
||||
key = 'banner_group_banners' |
||||
result = cache.get(key) |
||||
if not result: |
||||
groups = self.all() |
||||
today = date.today() |
||||
result = {} |
||||
for group in groups: |
||||
result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\ |
||||
.filter(public=True, fr__lte=today)\ |
||||
.filter(Q(to__gte=today) | Q(to__isnull=True)).extra({})) |
||||
cache.set(key, result, 70) |
||||
|
||||
return result |
||||
|
||||
|
||||
class URLCached(models.Manager): |
||||
def all(self): |
||||
key = 'banner_url_all' |
||||
result = cache.get(key) |
||||
if not result: |
||||
result = list(self.filter(public=True)) |
||||
cache.set(key, result, 150) |
||||
return result |
||||
|
||||
class TopCached(models.Manager): |
||||
def all(self): |
||||
key = 'expo_b_top_all' |
||||
result = cache.get(key) |
||||
if not result: |
||||
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities').all()) |
||||
cache.set(key, result, 80) |
||||
|
||||
# -*- coding: utf-8 -* |
||||
from datetime import date |
||||
from random import choice, shuffle |
||||
from django.db import models |
||||
from django.db.models import Q |
||||
from django.core.cache import cache |
||||
|
||||
|
||||
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 |
||||
|
||||
def create_for_paid(self, expo, url, role): |
||||
try: |
||||
name = str(expo.name) |
||||
except UnicodeEncodeError, UnicodeDecodeError: |
||||
name = expo.url |
||||
|
||||
alt = u'%s_%s'%(name, role) |
||||
return self.create(alt=alt, url=url, paid=True) |
||||
|
||||
class BannerGroupCached(models.Manager): |
||||
def all(self): |
||||
key = 'banner_group_all' |
||||
result = cache.get(key) |
||||
if not result: |
||||
result = list(self.filter(public=True)) |
||||
cache.set(key, result, 90) |
||||
return result |
||||
|
||||
def group_banners(self): |
||||
key = 'banner_group_banners' |
||||
result = cache.get(key) |
||||
if not result: |
||||
groups = self.all() |
||||
today = date.today() |
||||
result = {} |
||||
for group in groups: |
||||
result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\ |
||||
.filter(public=True, fr__lte=today)\ |
||||
.filter(Q(to__gte=today) | Q(to__isnull=True))) |
||||
cache.set(key, result, 70) |
||||
|
||||
return result |
||||
|
||||
|
||||
class URLCached(models.Manager): |
||||
def all(self): |
||||
key = 'banner_url_all' |
||||
result = cache.get(key) |
||||
if not result: |
||||
result = list(self.filter(public=True)) |
||||
cache.set(key, result, 150) |
||||
return result |
||||
|
||||
class TopCached(models.Manager): |
||||
def all(self): |
||||
key = 'expo_b_top_all' |
||||
result = cache.get(key) |
||||
if not result: |
||||
today = date.today() |
||||
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities'). |
||||
filter(fr__lte=today).filter(Q(to__gte=today) | Q(to__isnull=True))) |
||||
cache.set(key, result, 80) |
||||
|
||||
return result |
||||
@ -1,299 +1,328 @@ |
||||
# -*- coding: utf-8 -*- |
||||
import random |
||||
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 django.db.models.signals import post_save |
||||
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached |
||||
from .mixins import StatMixin |
||||
from theme.models import Theme |
||||
from country.models import Country |
||||
|
||||
|
||||
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) |
||||
|
||||
objects = models.Manager() |
||||
cached = URLCached() |
||||
|
||||
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) |
||||
|
||||
objects = models.Manager() |
||||
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, StatMixin): |
||||
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) |
||||
fr = models.DateField(default=date.today()) |
||||
to = models.DateField(blank=True, null=True) |
||||
|
||||
theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика') |
||||
country = models.ManyToManyField(Country, blank=True, null=True, verbose_name=u'Страна') |
||||
|
||||
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)], |
||||
default=1 |
||||
) |
||||
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) |
||||
js = models.BooleanField(verbose_name=_('Javascript?'), 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) |
||||
|
||||
stat_pswd = models.CharField(max_length=16) |
||||
|
||||
class Meta: |
||||
ordering = ['-public'] |
||||
|
||||
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): |
||||
log = { |
||||
'type': type, |
||||
'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) |
||||
|
||||
def get_click_link(self): |
||||
return '/expo-b/click/%d/'%self.id |
||||
|
||||
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, null=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, null=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, StatMixin): |
||||
tickets = models.ForeignKey(Banner, related_name='paid_tickets') |
||||
participation = models.ForeignKey(Banner, related_name='paid_participation') |
||||
official = models.ForeignKey(Banner, related_name='paid_official') |
||||
catalog = models.ForeignKey(Banner, related_name='paid_catalog') |
||||
logo = models.ImageField(upload_to='expo-b/paid', blank=True) |
||||
organiser = models.CharField(max_length=100, blank=True) |
||||
public = models.BooleanField(default=True, verbose_name=u'Активная') |
||||
stat_pswd = models.CharField(max_length=16) |
||||
created = models.DateTimeField(auto_now_add=True) |
||||
modified = models.DateTimeField(auto_now=True) |
||||
|
||||
class Meta: |
||||
ordering = ['-public'] |
||||
|
||||
def get_event(self): |
||||
if self.exposition_set.all().exists(): |
||||
return self.exposition_set.all()[0] |
||||
return None |
||||
|
||||
|
||||
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) |
||||
tickets_clicks = models.PositiveIntegerField(default=0) |
||||
participation_clicks = models.PositiveIntegerField(default=0) |
||||
official_clicks = models.PositiveIntegerField(default=0) |
||||
|
||||
|
||||
class Top(models.Model, StatMixin): |
||||
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') |
||||
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
||||
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики') |
||||
excluded_tags = models.ManyToManyField('theme.Tag', blank=True, null=True, verbose_name=u'Исключить теги') |
||||
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=u'Страны') |
||||
excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города') |
||||
fr = models.DateField(default=date.today(), verbose_name=u'Начало') |
||||
to = models.DateField(blank=True, null=True, verbose_name=u'Конец') |
||||
stat_pswd = models.CharField(max_length=16) |
||||
|
||||
objects = models.Manager() |
||||
cached = TopCached() |
||||
|
||||
class Meta: |
||||
ordering = ['position'] |
||||
|
||||
def get_event(self): |
||||
try: |
||||
return self.exposition_set.all()[0] |
||||
except IndexError: |
||||
return None |
||||
|
||||
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) |
||||
|
||||
def generatePassword(length=5): |
||||
""" |
||||
generate random password |
||||
""" |
||||
SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8', |
||||
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', |
||||
'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', |
||||
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', |
||||
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#'] |
||||
PASSWORD_LENGTH = length |
||||
newPassword = [] |
||||
for i in range(PASSWORD_LENGTH): |
||||
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))]) |
||||
return ''.join(newPassword) |
||||
|
||||
|
||||
def generate_stat_pass(sender, **kwargs): |
||||
obj = kwargs['instance'] |
||||
if not obj.stat_pswd: |
||||
obj.stat_pswd = generatePassword() |
||||
obj.save() |
||||
|
||||
|
||||
|
||||
post_save.connect(generate_stat_pass, sender=Banner) |
||||
post_save.connect(generate_stat_pass, sender=Paid) |
||||
post_save.connect(generate_stat_pass, sender=Top) |
||||
# -*- coding: utf-8 -*- |
||||
import random |
||||
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 django.db.models.signals import post_save |
||||
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached |
||||
from .mixins import StatMixin |
||||
from theme.models import Theme |
||||
from country.models import Country |
||||
|
||||
|
||||
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) |
||||
|
||||
objects = models.Manager() |
||||
cached = URLCached() |
||||
|
||||
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) |
||||
|
||||
objects = models.Manager() |
||||
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, StatMixin): |
||||
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) |
||||
fr = models.DateField(default=date.today()) |
||||
to = models.DateField(blank=True, null=True) |
||||
|
||||
theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика') |
||||
country = models.ManyToManyField(Country, blank=True, null=True, verbose_name=u'Страна') |
||||
|
||||
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)], |
||||
default=1 |
||||
) |
||||
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) |
||||
popup = models.BooleanField(verbose_name=_('Popup?'), default=False) |
||||
paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False) |
||||
link = models.BooleanField(verbose_name=_('Is simple link?'), default=False) |
||||
# for detecting popups |
||||
cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE) |
||||
|
||||
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) |
||||
|
||||
stat_pswd = models.CharField(max_length=16) |
||||
|
||||
class Meta: |
||||
ordering = ['-public'] |
||||
|
||||
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): |
||||
log = { |
||||
'type': type, |
||||
'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) |
||||
|
||||
def get_click_link(self): |
||||
return '/expo-b/click/%d/'%self.id |
||||
|
||||
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, null=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, null=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 Meta: |
||||
ordering = ['-date'] |
||||
|
||||
|
||||
# ------------------ |
||||
class Paid(models.Model, StatMixin): |
||||
tickets = models.ForeignKey(Banner, related_name='paid_tickets') |
||||
participation = models.ForeignKey(Banner, related_name='paid_participation') |
||||
official = models.ForeignKey(Banner, related_name='paid_official') |
||||
catalog = models.ForeignKey(Banner, related_name='paid_catalog') |
||||
logo = models.ImageField(upload_to='expo-b/paid', blank=True) |
||||
organiser = models.CharField(max_length=100, blank=True) |
||||
public = models.BooleanField(default=True, verbose_name=u'Активная') |
||||
stat_pswd = models.CharField(max_length=16) |
||||
created = models.DateTimeField(auto_now_add=True) |
||||
modified = models.DateTimeField(auto_now=True) |
||||
|
||||
class Meta: |
||||
ordering = ['-public'] |
||||
|
||||
def get_event(self): |
||||
try: |
||||
return self.exposition_set.all()[0] |
||||
except IndexError: |
||||
return None |
||||
|
||||
|
||||
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) |
||||
tickets_clicks = models.PositiveIntegerField(default=0) |
||||
participation_clicks = models.PositiveIntegerField(default=0) |
||||
official_clicks = models.PositiveIntegerField(default=0) |
||||
|
||||
class Meta: |
||||
ordering = ['-date'] |
||||
|
||||
|
||||
class Top(models.Model, StatMixin): |
||||
link = models.ForeignKey(Banner) |
||||
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') |
||||
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
||||
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики') |
||||
excluded_tags = models.ManyToManyField('theme.Tag', blank=True, null=True, verbose_name=u'Исключить теги') |
||||
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=u'Страны') |
||||
excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города') |
||||
fr = models.DateField(default=date.today(), verbose_name=u'Начало') |
||||
to = models.DateField(blank=True, null=True, verbose_name=u'Конец') |
||||
stat_pswd = models.CharField(max_length=16) |
||||
|
||||
objects = models.Manager() |
||||
cached = TopCached() |
||||
|
||||
class Meta: |
||||
ordering = ['position'] |
||||
|
||||
def get_event(self): |
||||
try: |
||||
return self.exposition_set.all()[0] |
||||
except IndexError: |
||||
return None |
||||
|
||||
|
||||
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) |
||||
|
||||
|
||||
class MainPage(models.Model, StatMixin): |
||||
link = models.ForeignKey(Banner) |
||||
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
||||
public = models.BooleanField(default=True, verbose_name=u'Активная') |
||||
stat_pswd = models.CharField(max_length=16) |
||||
created = models.DateTimeField(auto_now_add=True) |
||||
modified = models.DateTimeField(auto_now=True) |
||||
|
||||
class Meta: |
||||
ordering = ['-public'] |
||||
|
||||
def get_event(self): |
||||
try: |
||||
return self.exposition_set.all()[0] |
||||
except IndexError: |
||||
return None |
||||
|
||||
|
||||
def generatePassword(length=5): |
||||
""" |
||||
generate random password |
||||
""" |
||||
SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8', |
||||
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', |
||||
'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', |
||||
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', |
||||
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#'] |
||||
PASSWORD_LENGTH = length |
||||
newPassword = [] |
||||
for i in range(PASSWORD_LENGTH): |
||||
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))]) |
||||
return ''.join(newPassword) |
||||
|
||||
|
||||
def generate_stat_pass(sender, **kwargs): |
||||
obj = kwargs['instance'] |
||||
if not obj.stat_pswd: |
||||
obj.stat_pswd = generatePassword() |
||||
obj.save() |
||||
|
||||
|
||||
post_save.connect(generate_stat_pass, sender=Banner) |
||||
post_save.connect(generate_stat_pass, sender=Paid) |
||||
post_save.connect(generate_stat_pass, sender=Top) |
||||
|
||||
@ -1,74 +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> |
||||
|
||||
{% 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 %} |
||||
@ -1,74 +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' |
||||
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' |
||||
|
||||
@ -1,13 +1,13 @@ |
||||
from django.conf.urls import url |
||||
from expobanner.stat_views import * |
||||
from . import views |
||||
|
||||
urlpatterns = [ |
||||
url(r'^click/(?P<banner_id>\d{1,4})/$', views.click, name='banner_click'), |
||||
#url(r'^view/(?P<banner_id>\d+)/$', views.view, name='banner_view'), |
||||
# |
||||
url(r'^get-banners/$', views.get_banners), |
||||
url(r'^get-tops/$', views.get_top), |
||||
url(r'^banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='banner_stat_client'), |
||||
url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='paid_stat_client'), |
||||
] |
||||
from django.conf.urls import url |
||||
from expobanner.stat_views import * |
||||
from . import views |
||||
|
||||
urlpatterns = [ |
||||
url(r'^click/(?P<banner_id>\d{1,4})/$', views.click, name='banner_click'), |
||||
#url(r'^view/(?P<banner_id>\d+)/$', views.view, name='banner_view'), |
||||
# |
||||
url(r'^get-banners/$', views.get_banners), |
||||
url(r'^get-tops/$', views.get_top), |
||||
url(r'^banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='banner_stat_client'), |
||||
url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='paid_stat_client'), |
||||
] |
||||
|
||||
@ -1,84 +1,97 @@ |
||||
# -*- coding: utf-8 -*- |
||||
import json |
||||
import re |
||||
from django.http import HttpResponse |
||||
from django.shortcuts import redirect, get_object_or_404 |
||||
from django.shortcuts import render_to_response |
||||
from django.template import RequestContext |
||||
from .models import Banner, BannerGroup, URL, Top |
||||
from expobanner.utils import get_by_sort, get_banner_by_params, get_client_ip, get_top_events |
||||
|
||||
|
||||
def click(request, banner_id): |
||||
banner = get_object_or_404(Banner, pk=banner_id) |
||||
banner.log(request, 2) |
||||
return redirect(banner.url) |
||||
|
||||
|
||||
def view(request, banner_id): |
||||
banner = get_object_or_404(Banner, pk=banner_id) |
||||
banner.log(request, 1) |
||||
return redirect(banner.img.url) |
||||
|
||||
def get_banners(request): |
||||
#url = request.GET.get('url', '/') |
||||
url = request.META.get('HTTP_REFERER', '/') |
||||
# get urls by current url |
||||
urls = URL.cached.all() |
||||
good_urls = [] |
||||
for u in urls: |
||||
if u.regex: |
||||
url_re = re.compile(u.url) |
||||
if url_re.findall(url): |
||||
good_urls.append(u) |
||||
elif url == u.url: |
||||
good_urls.append(u) |
||||
# fill parameters dict |
||||
params = {'theme': request.GET.getlist('theme', []), |
||||
'tag': request.GET.get('tag'), |
||||
'country': request.GET.get('country'), |
||||
'city': request.GET.get('city'), |
||||
'ip': get_client_ip(request)} |
||||
|
||||
group_banners = BannerGroup.cached.group_banners() |
||||
result = [] |
||||
# get banners for all groups |
||||
for group, banners in group_banners.iteritems(): |
||||
banner = get_banner_by_params(banners, good_urls, params) |
||||
if banner: |
||||
if banner.js or banner.html: |
||||
text = banner.text |
||||
img = '' |
||||
alt = '' |
||||
is_img = False |
||||
else: |
||||
text = '' |
||||
img = banner.img.url |
||||
alt = banner.alt |
||||
is_img = True |
||||
result.append({'id': group, |
||||
'url': banner.get_click_link(), |
||||
'is_html': banner.html, |
||||
'is_flash': banner.flash, |
||||
'is_img': is_img, |
||||
'is_js': banner.js, |
||||
'img': img, |
||||
'alt': alt, |
||||
'text': text |
||||
}) |
||||
# add view log |
||||
banner.log(request, 1) |
||||
|
||||
return HttpResponse(json.dumps(result, indent=4), content_type='application/json') |
||||
|
||||
def get_top(request): |
||||
params = {'theme': request.GET.getlist('theme', []), |
||||
'tag': request.GET.get('tag'), |
||||
'country': request.GET.get('country'), |
||||
'city': request.GET.get('city'), |
||||
'catalog': request.GET.get('catalog')} |
||||
|
||||
tops = Top.cached.all() |
||||
events = get_top_events(tops, params) |
||||
context = {'objects': events} |
||||
# -*- coding: utf-8 -*- |
||||
import json |
||||
import re |
||||
from django.http import HttpResponse |
||||
from django.shortcuts import redirect, get_object_or_404 |
||||
from django.shortcuts import render_to_response |
||||
from django.template import RequestContext |
||||
from .models import Banner, BannerGroup, URL, Top |
||||
from expobanner.utils import get_banner_by_params, get_client_ip, get_top_events, get_referer_view, set_cookie |
||||
|
||||
|
||||
def click(request, banner_id): |
||||
banner = get_object_or_404(Banner, pk=banner_id) |
||||
banner.log(request, 2) |
||||
return redirect(banner.url) |
||||
|
||||
|
||||
def view(request, banner_id): |
||||
banner = get_object_or_404(Banner, pk=banner_id) |
||||
banner.log(request, 1) |
||||
return redirect(banner.img.url) |
||||
|
||||
def get_banners(request): |
||||
url = get_referer_view(request, default='/') |
||||
# get urls by current url |
||||
urls = URL.cached.all() |
||||
good_urls = [] |
||||
for u in urls: |
||||
if u.regex: |
||||
url_re = re.compile(u.url) |
||||
if url_re.findall(url): |
||||
good_urls.append(u) |
||||
elif url == u.url: |
||||
good_urls.append(u) |
||||
# fill parameters dict |
||||
params = {'theme': request.GET.getlist('theme', []), |
||||
'tag': request.GET.get('tag'), |
||||
'country': request.GET.get('country'), |
||||
'city': request.GET.get('city'), |
||||
'ip': get_client_ip(request)} |
||||
|
||||
group_banners = BannerGroup.cached.group_banners() |
||||
result = [] |
||||
cookie = None |
||||
# get banners for all groups |
||||
places = request.GET.getlist('places', []) |
||||
|
||||
for group, banners in group_banners.iteritems(): |
||||
if group not in places: |
||||
# on this page there is no such group |
||||
continue |
||||
banner = get_banner_by_params(banners, good_urls, params, request) |
||||
if banner: |
||||
if banner.html: |
||||
text = banner.text |
||||
img = '' |
||||
alt = '' |
||||
is_img = False |
||||
else: |
||||
text = '' |
||||
try: |
||||
img = banner.img.url |
||||
except ValueError: |
||||
continue |
||||
alt = banner.alt |
||||
is_img = True |
||||
result.append({'id': group, |
||||
'url': banner.get_click_link(), |
||||
'is_html': banner.html, |
||||
'is_flash': banner.flash, |
||||
'is_img': is_img, |
||||
'is_popup': banner.popup, |
||||
'img': img, |
||||
'alt': alt, |
||||
'text': text |
||||
}) |
||||
if banner.popup: |
||||
cookie = banner.cookie |
||||
# add view log |
||||
banner.log(request, 1) |
||||
response = HttpResponse(json.dumps(result, indent=4), content_type='application/json') |
||||
if cookie: |
||||
response = set_cookie(response, cookie, '1') |
||||
|
||||
return response |
||||
|
||||
def get_top(request): |
||||
params = {'theme': request.GET.getlist('theme', []), |
||||
'tag': request.GET.get('tag'), |
||||
'country': request.GET.get('country'), |
||||
'city': request.GET.get('city'), |
||||
'catalog': request.GET.get('catalog')} |
||||
|
||||
tops = Top.cached.all() |
||||
events = get_top_events(tops, params, request) |
||||
context = {'objects': events} |
||||
return render_to_response('client/includes/exposition/expo_top.html', context, context_instance=RequestContext(request)) |
||||
Binary file not shown.
@ -0,0 +1,16 @@ |
||||
2015-07-28 12:23:39,172 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=() |
||||
2015-07-28 12:23:39,175 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=() |
||||
2015-07-28 12:23:39,200 [DEBUG] django.db.backends: (0.002) SHOW TABLES; args=() |
||||
2015-07-28 12:23:39,201 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=() |
||||
2015-07-28 12:23:39,232 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=() |
||||
2015-07-28 12:23:39,233 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=() |
||||
2015-07-28 12:23:39,247 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=() |
||||
2015-07-28 12:23:39,248 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=() |
||||
2015-07-28 12:23:39,284 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=() |
||||
2015-07-28 12:23:39,285 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=() |
||||
2015-07-28 12:23:39,304 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=() |
||||
2015-07-28 12:23:39,305 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=() |
||||
2015-07-28 12:23:39,460 [DEBUG] root: Using default logger |
||||
2015-07-28 12:23:39,460 [DEBUG] root: Using default logger |
||||
2015-07-28 12:24:17,361 [DEBUG] django.db.backends: (0.001) SELECT `accounts_user`.`id`, `accounts_user`.`password`, `accounts_user`.`last_login`, `accounts_user`.`is_superuser`, `accounts_user`.`email`, `accounts_user`.`username`, `accounts_user`.`first_name`, `accounts_user`.`last_name`, `accounts_user`.`rating`, `accounts_user`.`url`, `accounts_user`.`is_active`, `accounts_user`.`is_staff`, `accounts_user`.`is_admin`, `accounts_user`.`date_joined`, `accounts_user`.`date_registered`, `accounts_user`.`date_modified`, `accounts_user`.`organiser_id`, `accounts_user`.`translator_id`, `accounts_user`.`company_id`, `accounts_user`.`position` FROM `accounts_user` WHERE `accounts_user`.`email` = 'vaniakov95@gmail.com' ; args=('vaniakov95@gmail.com',) |
||||
2015-07-28 12:24:25,526 [DEBUG] django.db.backends: (0.000) SELECT `accounts_user`.`id`, `accounts_user`.`password`, `accounts_user`.`last_login`, `accounts_user`.`is_superuser`, `accounts_user`.`email`, `accounts_user`.`username`, `accounts_user`.`first_name`, `accounts_user`.`last_name`, `accounts_user`.`rating`, `accounts_user`.`url`, `accounts_user`.`is_active`, `accounts_user`.`is_staff`, `accounts_user`.`is_admin`, `accounts_user`.`date_joined`, `accounts_user`.`date_registered`, `accounts_user`.`date_modified`, `accounts_user`.`organiser_id`, `accounts_user`.`translator_id`, `accounts_user`.`company_id`, `accounts_user`.`position` FROM `accounts_user` WHERE `accounts_user`.`email` = 'vaniakov95@gmail.com' ; args=('vaniakov95@gmail.com',) |
||||
File diff suppressed because one or more lines are too long
@ -1,16 +1,15 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import patterns, include, url |
||||
from admin import MetaListView, MetaView |
||||
from .views import CreateSeoText, SeoTextList, EditSeoText, DeleteSeoText |
||||
from django.conf.urls import patterns, url |
||||
from views import CreateSeoText, SeoTextList, EditSeoText, DeleteSeoText |
||||
from .admin import MetaListView, MetaView |
||||
|
||||
urlpatterns = patterns('conference.admin', |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^seo/new/$', CreateSeoText.as_view(), name='seo_new'), |
||||
url(r'^seo/all/$', SeoTextList.as_view(), name='seo_all'), |
||||
url(r'^seo/edit/(?P<pk>\d{1,5})/$', EditSeoText.as_view(), name='seo_edit'), |
||||
url(r'^seo/delete/(?P<pk>\d{1,5})/$', DeleteSeoText.as_view(), name='seo_delete'), |
||||
url(r'^all/$', MetaListView.as_view()), |
||||
#url(r'^change/(?P<url>.*)/$', 'conference_change'), |
||||
url(r'^(?P<id>.*)/$', MetaView.as_view()), |
||||
url(r'^(?P<id>\d{1,6})/$', MetaView.as_view()), |
||||
url(r'^$', MetaView.as_view()), |
||||
) |
||||
@ -1,16 +1,16 @@ |
||||
from functools import wraps |
||||
|
||||
from django.template import RequestContext |
||||
from django.shortcuts import render_to_response |
||||
|
||||
|
||||
def render_to(tpl): |
||||
def decorator(func): |
||||
@wraps(func) |
||||
def wrapper(request, *args, **kwargs): |
||||
out = func(request, *args, **kwargs) |
||||
if isinstance(out, dict): |
||||
out = render_to_response(tpl, out, RequestContext(request)) |
||||
return out |
||||
return wrapper |
||||
from functools import wraps |
||||
|
||||
from django.template import RequestContext |
||||
from django.shortcuts import render_to_response |
||||
|
||||
|
||||
def render_to(tpl): |
||||
def decorator(func): |
||||
@wraps(func) |
||||
def wrapper(request, *args, **kwargs): |
||||
out = func(request, *args, **kwargs) |
||||
if isinstance(out, dict): |
||||
out = render_to_response(tpl, out, RequestContext(request)) |
||||
return out |
||||
return wrapper |
||||
return decorator |
||||
@ -0,0 +1,18 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import url, patterns |
||||
from .views import * |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^specialist/new/$', SpecialistCreateView.as_view(), name='specialist_new'), |
||||
url(r'^specialist/all/$', SpecialistListView.as_view(), name='specialist_all'), |
||||
url(r'^specialist/edit/(?P<pk>\d{1,6})/$', SpecialistUpdateView.as_view(), name='specialist_edit'), |
||||
url(r'^specialist/delete/(?P<pk>\d{1,6})/$', SpecialistDeleteView.as_view(), name='specialist_delete'), |
||||
url(r'^catalog/new/$', CatalogCreateView.as_view(), name='catalog_new'), |
||||
url(r'^catalog/all/$', CatalogListView.as_view(), name='catalog_all'), |
||||
url(r'^catalog/edit/(?P<pk>\d{1,6})/$', CatalogUpdateView.as_view(), name='catalog_edit'), |
||||
url(r'^catalog/delete/(?P<pk>\d{1,6})/$', CatalogDeleteView.as_view(), name='catalog_delete'), |
||||
url(r'^catalog/(?P<catalog_pk>\d{1,6})/add_feedback/$', FeedbackCreateView.as_view(), name='feedback_new'), |
||||
#url(r'^catalog/(?P<pk>\d{1,4})/feedbacks/$', FeedbackListView.as_view(), name='feedback_all'), |
||||
url(r'^catalog/(?P<catalog_pk>\d{1,6})/feedback/(?P<id>\d{1,4})/$', FeedbackUpdateView.as_view(), name='feedback_edit'), |
||||
url(r'^feedback/delete/(?P<pk>\d{1,6})/$', FeedbackDeleteView.as_view(), name='feedback_delete'), |
||||
) |
||||
@ -0,0 +1,65 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django import forms |
||||
from hvad.forms import TranslatableModelForm |
||||
from .models import Specialist, SpecialistCatalog, Feedback, City, Country |
||||
from ckeditor.widgets import CKEditorWidget |
||||
from django.utils.translation import get_language |
||||
|
||||
country_choices = [(c.id, c.name) for c in Country.objects.all()] |
||||
lang_code = get_language()[:2] |
||||
|
||||
default_text = u"Планируете посетить выставку в %s?" \ |
||||
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \ |
||||
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \ |
||||
u"%s, мы можем предоставить профессионалов со знанием разных " \ |
||||
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \ |
||||
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \ |
||||
u"специалиста, города и объема работы." |
||||
default_title = u"Переводчики в %s" |
||||
|
||||
|
||||
class SpecialistCatalogForm(TranslatableModelForm): |
||||
|
||||
class Meta: |
||||
model = SpecialistCatalog |
||||
fields = ['price', 'currency', 'logo', 'main_descr', 'place_photo', |
||||
'specialists', 'city', 'country', 'type', 'title', 'benefits', 'big_cities'] |
||||
widgets = { |
||||
'type': forms.Select(choices=(('1', 'Country'), ('2', 'City'))), |
||||
'city': forms.HiddenInput(attrs={'id': 'id_city'}), |
||||
'country': forms.Select(choices=country_choices, attrs={'id': 'id_country'}), |
||||
'main_descr': CKEditorWidget, |
||||
'benefits': CKEditorWidget, |
||||
'big_cities': CKEditorWidget, |
||||
} |
||||
|
||||
def save(self, commit=True): |
||||
place = self.cleaned_data.get('city') or self.cleaned_data.get('country') |
||||
place_inflect = place.inflect or place.name |
||||
if not self.cleaned_data['title']: |
||||
self.cleaned_data['title'] = default_title % place_inflect |
||||
if not self.cleaned_data['main_descr']: |
||||
self.cleaned_data['main_descr'] = default_text % (place_inflect, place_inflect) |
||||
return super(SpecialistCatalogForm, self).save(commit=True) |
||||
|
||||
|
||||
class SpecialistForm(forms.ModelForm): |
||||
|
||||
class Meta: |
||||
model = Specialist |
||||
fields = ['name','country', 'city', 'photo', 'languages'] |
||||
widgets = { |
||||
'city': forms.HiddenInput(attrs={'id': 'id_city'}), |
||||
'country': forms.Select(choices=country_choices, attrs={'id': 'id_country'}) |
||||
} |
||||
|
||||
|
||||
class FeedbackForm(forms.ModelForm): |
||||
|
||||
class Meta: |
||||
model = Feedback |
||||
fields = ['company', 'name', 'text', 'logo', 'catalog'] |
||||
widgets = { |
||||
'text':CKEditorWidget |
||||
} |
||||
|
||||
@ -0,0 +1 @@ |
||||
__author__ = 'dart_vaider' |
||||
@ -0,0 +1 @@ |
||||
__author__ = 'dart_vaider' |
||||
@ -0,0 +1,41 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.core.management.base import BaseCommand |
||||
from django.utils.translation import activate |
||||
from city.models import City |
||||
from specialist_catalog.models import SpecialistCatalog |
||||
|
||||
default_text = u"Планируете посетить выставку %s?" \ |
||||
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \ |
||||
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \ |
||||
u"%s, мы можем предоставить профессионалов со знанием разных " \ |
||||
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \ |
||||
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \ |
||||
u"специалиста, города и объема работы." |
||||
default_title = u"Переводчики %s" |
||||
|
||||
default_benefits = """<ul class="content_list"> |
||||
<li>Эффективная цена</li> |
||||
<li>Опыт и профессионализм специалистов</li> |
||||
<li>Знание разных менталитетов и психологических аспектов проведения переговоров с зарубежными бизнесменами</li> |
||||
<li>Ориентированность в мировых выставочных комплексах</li> |
||||
<li>Гарантии, отчетность по договору, прозрачные безналичные расчеты в России</li> |
||||
</ul>""" |
||||
|
||||
|
||||
|
||||
class Command(BaseCommand): |
||||
def handle(self, *args, **options): |
||||
activate('ru') |
||||
cities = set(City.used.expo_cities()) |
||||
for cty in cities: |
||||
name = cty.inflect or cty.name |
||||
sc = SpecialistCatalog( |
||||
type=2, |
||||
country=cty.country, |
||||
city=cty, |
||||
title=default_title % name, |
||||
main_descr=default_text % (name, name), |
||||
benefits = default_benefits |
||||
) |
||||
sc.save() |
||||
print cty.url, " -> ", cty.country.url |
||||
@ -0,0 +1,42 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.core.management.base import BaseCommand |
||||
from django.utils.translation import activate |
||||
from country.models import Country |
||||
from specialist_catalog.models import SpecialistCatalog |
||||
from django.utils.translation import activate |
||||
|
||||
activate('ru') |
||||
|
||||
default_text = u"Планируете посетить выставку %s?" \ |
||||
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \ |
||||
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \ |
||||
u"%s, мы можем предоставить профессионалов со знанием разных " \ |
||||
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \ |
||||
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \ |
||||
u"специалиста, города и объема работы." |
||||
default_title = u"Переводчики %s" |
||||
default_benefits = """<ul class="content_list"> |
||||
<li>Эффективная цена</li> |
||||
<li>Опыт и профессионализм специалистов</li> |
||||
<li>Знание разных менталитетов и психологических аспектов проведения переговоров с зарубежными бизнесменами</li> |
||||
<li>Ориентированность в мировых выставочных комплексах</li> |
||||
<li>Гарантии, отчетность по договору, прозрачные безналичные расчеты в России</li> |
||||
</ul>""" |
||||
|
||||
|
||||
class Command(BaseCommand): |
||||
def handle(self, *args, **options): |
||||
activate('ru') |
||||
countries = set(Country.objects.expo_countries()) |
||||
|
||||
for cntry in countries: |
||||
name = cntry.inflect or cntry.name |
||||
sc = SpecialistCatalog( |
||||
type='1', |
||||
country=cntry, |
||||
title=default_title % name, |
||||
main_descr=default_text % (name, name), |
||||
benefits = default_benefits |
||||
) |
||||
sc.save() |
||||
print "created for: %s" % cntry.url |
||||
@ -0,0 +1,108 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.db import models |
||||
from django.conf import settings |
||||
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager |
||||
from city.models import City |
||||
from country.models import Country |
||||
from django.core.urlresolvers import reverse_lazy |
||||
from django.utils.translation import get_language |
||||
import copy |
||||
|
||||
# types of catalog |
||||
_country = 1 |
||||
_city = 2 |
||||
|
||||
|
||||
class Specialist(models.Model): |
||||
name = models.CharField(max_length=255, verbose_name=u"Полное имя", blank=False) |
||||
languages = models.CharField(max_length=255, verbose_name=u"Языки") |
||||
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город", blank=True) |
||||
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна") |
||||
photo = models.ImageField(verbose_name=u"Фото", upload_to="specialist_catalog/specialist_photo/", blank=True) |
||||
|
||||
|
||||
def __unicode__(self): |
||||
return u"%s" % self.name |
||||
|
||||
|
||||
class SpecialistCatalog(TranslatableModel): |
||||
price = models.IntegerField(verbose_name=u"Цена", default=200) |
||||
currency = models.CharField(max_length=255, verbose_name=u"Валюта", default=u"EUR") |
||||
logo = models.ImageField(db_column= "logo_preview", verbose_name=u"Логотип", blank=True, upload_to='specialist_catalog/logo_preview/') |
||||
place_photo = models.ImageField(verbose_name=u"Фото для города", blank=True, upload_to='specialist_catalog/place_photo/') |
||||
specialists = models.ManyToManyField(Specialist, verbose_name=u"Специалисты", blank=True) |
||||
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город", blank=True, null=True) |
||||
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна", blank=False) |
||||
type = models.PositiveSmallIntegerField(verbose_name=u"Тип(Страна/Город)", default=2) |
||||
|
||||
objects = TranslationManager() |
||||
|
||||
translations = TranslatedFields( |
||||
title=models.CharField(max_length=255, verbose_name=u"Заголовок"), |
||||
main_descr=models.CharField(max_length=1000, verbose_name=u"Краткое описание"), |
||||
benefits=models.CharField(max_length=2000, verbose_name=u"Преимущества"), |
||||
big_cities=models.TextField(verbose_name=u"Крупные города", blank=True) |
||||
) |
||||
|
||||
def __init__(self, *args, **kwargs): |
||||
super(SpecialistCatalog, self).__init__(*args, **kwargs) |
||||
self.cache_fields = ['title', 'main_descr', 'benefits'] |
||||
self.is_new = True |
||||
|
||||
def get_absolute_url(self): |
||||
global _country, _city |
||||
if self.type == _country: |
||||
return reverse_lazy('spec_catalog_country', kwargs={'slug': self.country.url}) |
||||
return reverse_lazy('spec_catalog_city', kwargs={'slug': self.city.url}) |
||||
|
||||
def save(self, *args, **kwargs): |
||||
super(SpecialistCatalog, self).save(*args, **kwargs) |
||||
self.initial_language = get_language()[:2] or 'ru' |
||||
|
||||
new_values = {field: getattr(self, field) for field in self.cache_fields} |
||||
langs = [code for code, _ in settings.LANGUAGES] |
||||
if self.is_new: |
||||
for lang in langs: |
||||
if lang not in self.get_available_languages(): |
||||
self.translate(lang) |
||||
for key, value in new_values.items(): |
||||
setattr(self, key, value) |
||||
self.save_translations(self) |
||||
else: |
||||
translations = {obj.language_code: obj for obj in list(self.translations.all())} |
||||
for lang in langs: |
||||
if lang is not self.initial_language: |
||||
tr = translations[lang] |
||||
for key, value in new_values.items(): |
||||
#if u'%s' % getattr(tr, key) is u'%s' % self.var_cache[key]: |
||||
setattr(tr, key, value) |
||||
tr.save() |
||||
|
||||
self.lazy_translation_getter(self.initial_language) |
||||
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields} |
||||
self.is_new = False |
||||
return self |
||||
|
||||
def __unicode__(self): |
||||
return self.lazy_translation_getter('title', unicode(self.pk)) |
||||
|
||||
def place(self): |
||||
if self.type == _country: |
||||
return self.country |
||||
elif self.type == _city: |
||||
return self.city |
||||
else: |
||||
return None |
||||
|
||||
|
||||
class Feedback(models.Model): |
||||
company = models.CharField(max_length=255, verbose_name=u"Название компании") |
||||
name = models.CharField(max_length=100, verbose_name=u"Имя") |
||||
text = models.CharField(max_length=5000, verbose_name=u"Текст отзыва") |
||||
logo = models.ImageField(verbose_name=u"Логотип компании", upload_to='specialist_catalog/feedback_logo/', blank=True) |
||||
catalog = models.ForeignKey(SpecialistCatalog, verbose_name=u"Страница", blank=False) |
||||
|
||||
def __unicode__(self): |
||||
return "Feedback from %s" % self.company |
||||
|
||||
|
||||
@ -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,11 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import url, patterns |
||||
from .views import CatalogDetailedView, SpecCatalog |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^city/$', SpecCatalog.as_view(), {'type': 'city'}, name="spec_city"), |
||||
url(r'^country/$', SpecCatalog.as_view(), {'type': 'country'}, name="spec_country"), |
||||
|
||||
url(r'^city/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'city'}, name="spec_catalog_city"), |
||||
url(r'^country/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'country'}, name="spec_catalog_country"), |
||||
) |
||||
@ -0,0 +1,217 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.views.generic import CreateView, UpdateView, DeleteView, FormView, DetailView |
||||
from functions.custom_views import ListView |
||||
from django.views.generic.detail import SingleObjectMixin |
||||
from django.utils.translation import ugettext as _ |
||||
from .forms import * |
||||
from django.core.urlresolvers import reverse_lazy |
||||
from django.conf import settings |
||||
from django.shortcuts import get_object_or_404 |
||||
from service.order_forms import TranslationForm |
||||
from django.http import HttpResponseRedirect, Http404 |
||||
from .models import _city, _country |
||||
|
||||
|
||||
|
||||
|
||||
# =========== ADMIN VIEWS =========== |
||||
|
||||
# Specialist views |
||||
|
||||
|
||||
class SpecialistCreateView(CreateView): |
||||
form_class = SpecialistForm |
||||
model = Specialist |
||||
template_name = 'admin/specialist/specialist_new.html' |
||||
success_url = reverse_lazy("specialist_all") |
||||
|
||||
|
||||
from hvad.utils import get_translation_aware_manager |
||||
|
||||
|
||||
class SpecialistListView(ListView): |
||||
model = Specialist |
||||
template_name = 'admin/specialist/specialist_all.html' |
||||
paginate_by = settings.ADMIN_PAGINATION |
||||
|
||||
def get_queryset(self): |
||||
name = self.request.GET.get('name', None) |
||||
city = self.request.GET.get('city', None) |
||||
qs = get_translation_aware_manager(Specialist).all() |
||||
if name: |
||||
qs = qs.filter(name__icontains=name) |
||||
if city: |
||||
qs = qs.filter(city__name__icontains=city) |
||||
return qs |
||||
|
||||
|
||||
class SpecialistUpdateView(UpdateView): |
||||
form_class = SpecialistForm |
||||
model = Specialist |
||||
template_name = 'admin/specialist/specialist_new.html' |
||||
success_url = reverse_lazy("specialist_all") |
||||
|
||||
def get_form(self, form_class): |
||||
form = super(SpecialistUpdateView, self).get_form(form_class) |
||||
form.fields['city'].widget.attrs['data-init-text'] = self.object.city.name |
||||
return form |
||||
|
||||
|
||||
class SpecialistDeleteView(DeleteView): |
||||
model = Specialist |
||||
template_name = 'admin/specialist/specialist_confirm_delete.html' |
||||
success_url = reverse_lazy("specialist_all") |
||||
|
||||
|
||||
# Catalog views |
||||
|
||||
|
||||
class CatalogCreateView(CreateView): |
||||
form_class = SpecialistCatalogForm |
||||
model = SpecialistCatalog |
||||
template_name = 'admin/specialist/catalog_new.html' |
||||
success_url = reverse_lazy("catalog_all") |
||||
|
||||
|
||||
|
||||
class CatalogListView(ListView): |
||||
model = SpecialistCatalog |
||||
template_name = 'admin/specialist/catalog_all.html' |
||||
paginate_by = settings.ADMIN_PAGINATION |
||||
paginator_class = settings.DEFAULT_PAGINATOR |
||||
def get_queryset(self): |
||||
_GET = self.request.GET |
||||
query, city, country, only_cntry = _GET.get('query'), _GET.get('city'), _GET.get('country'), _GET.get('only_countries') |
||||
qs = self.model.objects.language() |
||||
if only_cntry: |
||||
qs = qs.filter(type=1) |
||||
if query: |
||||
qs = qs.filter(title__icontains=query) |
||||
if city: |
||||
qs = qs.filter(city__translations__name__icontains=city) |
||||
if country: |
||||
qs = qs.filter(country__translations__name__icontains=country) |
||||
return qs |
||||
|
||||
|
||||
class CatalogUpdateView(UpdateView): |
||||
form_class = SpecialistCatalogForm |
||||
model = SpecialistCatalog |
||||
template_name = 'admin/specialist/catalog_new.html' |
||||
success_url = reverse_lazy("catalog_all") |
||||
|
||||
def get_form(self, form_class): |
||||
form = super(CatalogUpdateView, self).get_form(form_class) |
||||
if self.object.type is 2: # city |
||||
form.fields['city'].widget.attrs['data-init-text'] = self.object.city.name |
||||
return form |
||||
|
||||
|
||||
class CatalogDeleteView(DeleteView): |
||||
model = SpecialistCatalog |
||||
template_name = 'admin/specialist/catalog_confirm_delete.html' |
||||
success_url = reverse_lazy("catalog_all") |
||||
|
||||
|
||||
# Feedback views |
||||
|
||||
|
||||
class FeedbackCreateView(CreateView): |
||||
form_class = FeedbackForm |
||||
model = Feedback |
||||
template_name = 'admin/specialist/feedback_new.html' |
||||
success_url = reverse_lazy("catalog_all") |
||||
|
||||
def get_initial(self): |
||||
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('catalog_pk')) |
||||
return {'catalog': catalog} |
||||
|
||||
|
||||
class FeedbackUpdateView(UpdateView): |
||||
form_class = FeedbackForm |
||||
model = Feedback |
||||
template_name = 'admin/specialist/feedback_new.html' |
||||
success_url = reverse_lazy("catalog_all") |
||||
|
||||
def get_initial(self): |
||||
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('catalog_pk')) |
||||
return {'catalog': catalog} |
||||
|
||||
|
||||
class FeedbackDeleteView(DeleteView): |
||||
model = Feedback |
||||
template_name = 'admin/specialist/feedback_confirm_delete.html' |
||||
success_url = reverse_lazy("catalog_all") |
||||
|
||||
|
||||
# ========= CLIENT VIEWS ============ |
||||
|
||||
|
||||
class CatalogDetailedView(SingleObjectMixin, FormView): |
||||
model = SpecialistCatalog |
||||
form_class = TranslationForm |
||||
template_name = "client/specialist_catalog/catalog_detailed.html" |
||||
success_url = reverse_lazy("service_thanks") |
||||
|
||||
def get_catalog_obj(self): |
||||
if self.kwargs.get('type') is "country": |
||||
try: |
||||
return self.model.objects.language().get(type=1, country__url=self.kwargs.get('slug')) |
||||
except self.model.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
try: |
||||
return self.model.objects.language().get(type=2, city__url=self.kwargs.get('slug')) |
||||
except self.model.DoesNotExist: |
||||
raise Http404 |
||||
|
||||
def get_object(self, queryset=None): |
||||
obj = self.get_catalog_obj() |
||||
self.object = obj |
||||
return obj |
||||
|
||||
def get_context_data(self, **kwargs): |
||||
self.get_object() |
||||
context = super(CatalogDetailedView, self).get_context_data(**kwargs) |
||||
context['object'] = self.object |
||||
return context |
||||
|
||||
def form_valid(self, form): |
||||
order = form.save(commit=False) |
||||
order.save() |
||||
return HttpResponseRedirect(self.success_url) |
||||
|
||||
def get_initial(self): |
||||
obj = self.get_object() |
||||
init = {} |
||||
init['country'] = obj.country.name |
||||
if self.kwargs.get('type') is "city": |
||||
init['city'] = obj.city.name |
||||
return init |
||||
|
||||
class SpecCatalog(ListView): |
||||
model = SpecialistCatalog |
||||
template_name = 'client/specialist_catalog/catalog.html' |
||||
|
||||
def get_queryset(self): |
||||
|
||||
if self.kwargs.get('type') == "country": |
||||
ctype = _country |
||||
else: |
||||
ctype = _city |
||||
|
||||
qs = list(self.model.objects.language().select_related('country', 'city').filter(type=ctype)) |
||||
if ctype == _country: |
||||
result = sorted(qs, key=lambda x: x.country.name) |
||||
else: |
||||
result = sorted(qs, key=lambda x: x.city.name) |
||||
|
||||
return result |
||||
|
||||
def get_context_data(self, **kwargs): |
||||
context = super(SpecCatalog, self).get_context_data(**kwargs) |
||||
if self.kwargs.get('type') == "country": |
||||
context['title'] = _(u'Переводчики по странам') |
||||
else: |
||||
context['title'] = _(u'Переводчики по городам') |
||||
return context |
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue