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 django.conf.urls import url, patterns |
||||||
from views import NewPage, PageList, EditPage, DeletePage, PageDetailed |
from views import NewPage, PageList, EditPage, DeletePage, PageDetailed |
||||||
|
|
||||||
urlpatterns = patterns('', |
urlpatterns = patterns('', |
||||||
url(r'^new/$', NewPage.as_view(), name='new_page' ), |
url(r'^new/$', NewPage.as_view(), name='new_page' ), |
||||||
url(r'^all/$', PageList.as_view(), name = 'page_list'), |
url(r'^all/$', PageList.as_view(), name = 'page_list'), |
||||||
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'), |
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'), |
||||||
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'), |
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'), |
||||||
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'), |
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'), |
||||||
) |
) |
||||||
|
|||||||
@ -1,11 +1,11 @@ |
|||||||
from django.conf.urls import url, patterns |
from django.conf.urls import url, patterns |
||||||
from models import LatestExpositions, CountryFeeds, CityFeeds, ThemeFeeds |
from models import LatestExpositions, CountryFeeds, CityFeeds, ThemeFeeds |
||||||
|
|
||||||
|
|
||||||
urlpatterns = patterns('', |
urlpatterns = patterns('', |
||||||
url(r'^latest/$', LatestExpositions()), |
url(r'^latest/$', LatestExpositions()), |
||||||
url(r'^country/(?P<slug>.*)/$', CountryFeeds()), |
url(r'^country/(?P<slug>.*)/$', CountryFeeds()), |
||||||
url(r'^city/(?P<slug>.*)/$', CityFeeds()), |
url(r'^city/(?P<slug>.*)/$', CityFeeds()), |
||||||
url(r'^theme/(?P<slug>.*)/$', ThemeFeeds()), |
url(r'^theme/(?P<slug>.*)/$', ThemeFeeds()), |
||||||
|
|
||||||
) |
) |
||||||
|
|||||||
@ -1,77 +1,79 @@ |
|||||||
# -*- coding: utf-8 -* |
# -*- coding: utf-8 -* |
||||||
from datetime import date |
from datetime import date |
||||||
from random import choice, shuffle |
from random import choice, shuffle |
||||||
from django.db import models |
from django.db import models |
||||||
from django.db.models import Q |
from django.db.models import Q |
||||||
from django.core.cache import cache |
from django.core.cache import cache |
||||||
|
|
||||||
|
|
||||||
class BiasedManager(models.Manager): |
class BiasedManager(models.Manager): |
||||||
def by_time(self, **kwargs): |
def by_time(self, **kwargs): |
||||||
all = super(BiasedManager, self).get_query_set().filter(**kwargs) |
all = super(BiasedManager, self).get_query_set().filter(**kwargs) |
||||||
result = [] |
result = [] |
||||||
for i in all: |
for i in all: |
||||||
for j in range(i.often): |
for j in range(i.often): |
||||||
result.append(i) |
result.append(i) |
||||||
return result |
return result |
||||||
|
|
||||||
def one(self, **kwargs): |
def one(self, **kwargs): |
||||||
return choice(self.by_time(**kwargs)) |
return choice(self.by_time(**kwargs)) |
||||||
|
|
||||||
def by_often(self, **kwargs): |
def by_often(self, **kwargs): |
||||||
result = self.by_time(**kwargs) |
result = self.by_time(**kwargs) |
||||||
shuffle(result) |
shuffle(result) |
||||||
return result |
return result |
||||||
|
|
||||||
def create_for_paid(self, expo, url, role): |
def create_for_paid(self, expo, url, role): |
||||||
try: |
try: |
||||||
name = str(expo.name) |
name = str(expo.name) |
||||||
except UnicodeEncodeError, UnicodeDecodeError: |
except UnicodeEncodeError, UnicodeDecodeError: |
||||||
name = expo.url |
name = expo.url |
||||||
|
|
||||||
alt = u'%s_%s'%(name, role) |
alt = u'%s_%s'%(name, role) |
||||||
return self.create(alt=alt, url=url, paid=True) |
return self.create(alt=alt, url=url, paid=True) |
||||||
|
|
||||||
class BannerGroupCached(models.Manager): |
class BannerGroupCached(models.Manager): |
||||||
def all(self): |
def all(self): |
||||||
key = 'banner_group_all' |
key = 'banner_group_all' |
||||||
result = cache.get(key) |
result = cache.get(key) |
||||||
if not result: |
if not result: |
||||||
result = list(self.filter(public=True)) |
result = list(self.filter(public=True)) |
||||||
cache.set(key, result, 90) |
cache.set(key, result, 90) |
||||||
return result |
return result |
||||||
|
|
||||||
def group_banners(self): |
def group_banners(self): |
||||||
key = 'banner_group_banners' |
key = 'banner_group_banners' |
||||||
result = cache.get(key) |
result = cache.get(key) |
||||||
if not result: |
if not result: |
||||||
groups = self.all() |
groups = self.all() |
||||||
today = date.today() |
today = date.today() |
||||||
result = {} |
result = {} |
||||||
for group in groups: |
for group in groups: |
||||||
result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\ |
result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\ |
||||||
.filter(public=True, fr__lte=today)\ |
.filter(public=True, fr__lte=today)\ |
||||||
.filter(Q(to__gte=today) | Q(to__isnull=True)).extra({})) |
.filter(Q(to__gte=today) | Q(to__isnull=True))) |
||||||
cache.set(key, result, 70) |
cache.set(key, result, 70) |
||||||
|
|
||||||
return result |
return result |
||||||
|
|
||||||
|
|
||||||
class URLCached(models.Manager): |
class URLCached(models.Manager): |
||||||
def all(self): |
def all(self): |
||||||
key = 'banner_url_all' |
key = 'banner_url_all' |
||||||
result = cache.get(key) |
result = cache.get(key) |
||||||
if not result: |
if not result: |
||||||
result = list(self.filter(public=True)) |
result = list(self.filter(public=True)) |
||||||
cache.set(key, result, 150) |
cache.set(key, result, 150) |
||||||
return result |
return result |
||||||
|
|
||||||
class TopCached(models.Manager): |
class TopCached(models.Manager): |
||||||
def all(self): |
def all(self): |
||||||
key = 'expo_b_top_all' |
key = 'expo_b_top_all' |
||||||
result = cache.get(key) |
result = cache.get(key) |
||||||
if not result: |
if not result: |
||||||
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities').all()) |
today = date.today() |
||||||
cache.set(key, result, 80) |
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 |
return result |
||||||
@ -1,299 +1,328 @@ |
|||||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||||
import random |
import random |
||||||
import hashlib |
import hashlib |
||||||
from datetime import datetime, date |
from datetime import datetime, date |
||||||
from django.db import models |
from django.db import models |
||||||
from django.utils.translation import ugettext_lazy as _ |
from django.utils.translation import ugettext_lazy as _ |
||||||
from django.conf import settings |
from django.conf import settings |
||||||
from django.contrib.sites.models import Site |
from django.contrib.sites.models import Site |
||||||
from django.db.models.signals import post_save |
from django.db.models.signals import post_save |
||||||
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached |
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached |
||||||
from .mixins import StatMixin |
from .mixins import StatMixin |
||||||
from theme.models import Theme |
from theme.models import Theme |
||||||
from country.models import Country |
from country.models import Country |
||||||
|
|
||||||
|
|
||||||
class URL(models.Model): |
class URL(models.Model): |
||||||
title = models.CharField(verbose_name=u'Заголовок', max_length=256) |
title = models.CharField(verbose_name=u'Заголовок', max_length=256) |
||||||
url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048) |
url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048) |
||||||
regex = models.BooleanField(verbose_name=u'RegEx', default=False) |
regex = models.BooleanField(verbose_name=u'RegEx', default=False) |
||||||
sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True) |
sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True) |
||||||
|
|
||||||
public = models.BooleanField(verbose_name=u'Активный', default=True) |
public = models.BooleanField(verbose_name=u'Активный', default=True) |
||||||
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
||||||
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
||||||
|
|
||||||
objects = models.Manager() |
objects = models.Manager() |
||||||
cached = URLCached() |
cached = URLCached() |
||||||
|
|
||||||
def __unicode__(self): |
def __unicode__(self): |
||||||
return self.title |
return self.title |
||||||
|
|
||||||
class Meta: |
class Meta: |
||||||
ordering = ['-created_at'] |
ordering = ['-created_at'] |
||||||
verbose_name = _('URL') |
verbose_name = _('URL') |
||||||
verbose_name_plural = _('URLs') |
verbose_name_plural = _('URLs') |
||||||
|
|
||||||
def get_admin_url(self): |
def get_admin_url(self): |
||||||
return '/admin/expobanners/banners/url/%d/edit/'%self.id |
return '/admin/expobanners/banners/url/%d/edit/'%self.id |
||||||
|
|
||||||
|
|
||||||
class BannerGroup (models.Model): |
class BannerGroup (models.Model): |
||||||
name = models.CharField(verbose_name=u'Имя', max_length=255) |
name = models.CharField(verbose_name=u'Имя', max_length=255) |
||||||
slug = models.SlugField(verbose_name=u'URL', unique=True) |
slug = models.SlugField(verbose_name=u'URL', unique=True) |
||||||
width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0) |
width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0) |
||||||
height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0) |
height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0) |
||||||
speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000) |
speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000) |
||||||
|
|
||||||
public = models.BooleanField(verbose_name=u'Активная', default=True) |
public = models.BooleanField(verbose_name=u'Активная', default=True) |
||||||
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
||||||
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
||||||
|
|
||||||
objects = models.Manager() |
objects = models.Manager() |
||||||
cached = BannerGroupCached() |
cached = BannerGroupCached() |
||||||
|
|
||||||
def size(self): |
def size(self): |
||||||
return '%sx%s' % (self.width, self.height) |
return '%sx%s' % (self.width, self.height) |
||||||
|
|
||||||
def __unicode__(self): |
def __unicode__(self): |
||||||
return '%s - [%s x %s]' % (self.name, self.width, self.height) |
return '%s - [%s x %s]' % (self.name, self.width, self.height) |
||||||
|
|
||||||
class Meta: |
class Meta: |
||||||
ordering = ['name'] |
ordering = ['name'] |
||||||
verbose_name = _('Banner Group') |
verbose_name = _('Banner Group') |
||||||
verbose_name_plural = _('Banner Groups') |
verbose_name_plural = _('Banner Groups') |
||||||
|
|
||||||
def get_admin_url(self): |
def get_admin_url(self): |
||||||
return '/admin/expobanners/banners/group/%d/edit/'%self.id |
return '/admin/expobanners/banners/group/%d/edit/'%self.id |
||||||
|
|
||||||
|
|
||||||
class Banner(models.Model, StatMixin): |
class Banner(models.Model, StatMixin): |
||||||
objects = BiasedManager() |
objects = BiasedManager() |
||||||
|
|
||||||
title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True) |
title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True) |
||||||
alt = models.CharField(verbose_name=_('Alt'), max_length=255) |
alt = models.CharField(verbose_name=_('Alt'), max_length=255) |
||||||
|
|
||||||
text = models.TextField(verbose_name=u'Текст', blank=True, null=True) |
text = models.TextField(verbose_name=u'Текст', blank=True, null=True) |
||||||
img = models.FileField(verbose_name=u'Картинка', upload_to='expo_upload', 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) |
url = models.CharField(verbose_name=u'URL', max_length=1024) |
||||||
fr = models.DateField(default=date.today()) |
fr = models.DateField(default=date.today()) |
||||||
to = models.DateField(blank=True, null=True) |
to = models.DateField(blank=True, null=True) |
||||||
|
|
||||||
theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика') |
theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика') |
||||||
country = models.ManyToManyField(Country, 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) |
sort = models.PositiveSmallIntegerField(verbose_name=u'Сорт', default=500) |
||||||
|
|
||||||
group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True) |
group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True) |
||||||
often = models.PositiveSmallIntegerField( |
often = models.PositiveSmallIntegerField( |
||||||
verbose_name=_('Often'), |
verbose_name=_('Often'), |
||||||
help_text=_('A ten will display 10 times more often that a one.'), |
help_text=_('A ten will display 10 times more often that a one.'), |
||||||
choices=[[i, i] for i in range(11)], |
choices=[[i, i] for i in range(11)], |
||||||
default=1 |
default=1 |
||||||
) |
) |
||||||
urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True) |
urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True) |
||||||
|
|
||||||
html = models.BooleanField(verbose_name=_('HTML?'), default=False) |
html = models.BooleanField(verbose_name=_('HTML?'), default=False) |
||||||
flash = models.BooleanField(verbose_name=_('Flash?'), default=False) |
flash = models.BooleanField(verbose_name=_('Flash?'), default=False) |
||||||
js = models.BooleanField(verbose_name=_('Javascript?'), default=False) |
popup = models.BooleanField(verbose_name=_('Popup?'), default=False) |
||||||
paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False) |
paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False) |
||||||
|
link = models.BooleanField(verbose_name=_('Is simple link?'), default=False) |
||||||
public = models.BooleanField(verbose_name=u'Активный', default=True) |
# for detecting popups |
||||||
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE) |
||||||
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
|
||||||
|
public = models.BooleanField(verbose_name=u'Активный', default=True) |
||||||
stat_pswd = models.CharField(max_length=16) |
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
||||||
|
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
||||||
class Meta: |
|
||||||
ordering = ['-public'] |
stat_pswd = models.CharField(max_length=16) |
||||||
|
|
||||||
def get_admin_url(self): |
class Meta: |
||||||
return '/admin/expobanners/banners/banner/%d/edit/'%self.id |
ordering = ['-public'] |
||||||
|
|
||||||
|
def get_admin_url(self): |
||||||
def key(slef): |
return '/admin/expobanners/banners/banner/%d/edit/'%self.id |
||||||
if hasattr(settings, 'SECRET_KEY'): |
|
||||||
key = str(datetime.now()) + settings.SECRET_KEY |
def key(slef): |
||||||
else: |
if hasattr(settings, 'SECRET_KEY'): |
||||||
key = str(datetime.now()) |
key = str(datetime.now()) + settings.SECRET_KEY |
||||||
return hashlib.md5(key).hexdigest() |
else: |
||||||
|
key = str(datetime.now()) |
||||||
def log(self, request, type): |
return hashlib.md5(key).hexdigest() |
||||||
log = { |
|
||||||
'type': type, |
def log(self, request, type): |
||||||
'banner': self, |
log = { |
||||||
'group': self.group, |
'type': type, |
||||||
'ip': request.META.get('REMOTE_ADDR'), |
'banner': self, |
||||||
'user_agent': request.META.get('HTTP_USER_AGENT'), |
'group': self.group, |
||||||
'page': request.META.get('HTTP_REFERER'), |
'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) |
if request.user.is_authenticated(): |
||||||
|
log['user'] = request.user |
||||||
@models.permalink |
return Log.objects.create(**log) |
||||||
def image(self): |
|
||||||
return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()}) |
@models.permalink |
||||||
|
def image(self): |
||||||
def impressions(self): |
return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()}) |
||||||
return Log.objects.filter(banner=self.pk, type=0).count() |
|
||||||
|
def impressions(self): |
||||||
def views(self): |
return Log.objects.filter(banner=self.pk, type=0).count() |
||||||
return Log.objects.filter(banner=self.pk, type=1).count() |
|
||||||
|
def views(self): |
||||||
def clicks(self): |
return Log.objects.filter(banner=self.pk, type=1).count() |
||||||
return Log.objects.filter(banner=self.pk, type=2).count() |
|
||||||
|
def clicks(self): |
||||||
def __unicode__(self): |
return Log.objects.filter(banner=self.pk, type=2).count() |
||||||
return self.title or self.alt |
|
||||||
|
def __unicode__(self): |
||||||
def get_absolute_url(self): |
return self.title or self.alt |
||||||
if self.url == '#': |
|
||||||
return self.url |
def get_absolute_url(self): |
||||||
else: |
if self.url == '#': |
||||||
@models.permalink |
return self.url |
||||||
def get_absolute_url(self): |
else: |
||||||
return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()}) |
@models.permalink |
||||||
return get_absolute_url(self) |
def get_absolute_url(self): |
||||||
|
return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()}) |
||||||
def get_click_link(self): |
return get_absolute_url(self) |
||||||
return '/expo-b/click/%d/'%self.id |
|
||||||
|
def get_click_link(self): |
||||||
class Meta: |
return '/expo-b/click/%d/'%self.id |
||||||
ordering = ['sort'] |
|
||||||
verbose_name = _('Banner') |
class Meta: |
||||||
verbose_name_plural = _('Banners') |
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) |
class Log(models.Model): |
||||||
urls = models.ManyToManyField(URL, related_name='url_logs', verbose_name=_('URLs'), blank=True) |
banner = models.ForeignKey(Banner, related_name='banner_logs') |
||||||
|
group = models.ForeignKey(BannerGroup, related_name='group_logs', verbose_name=_('Group'), blank=True, null=True) |
||||||
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='users', verbose_name=_('User')) |
urls = models.ManyToManyField(URL, related_name='url_logs', verbose_name=_('URLs'), blank=True) |
||||||
datetime = models.DateTimeField(verbose_name=_('Clicked At'), auto_now_add=True) |
|
||||||
ip = models.IPAddressField(verbose_name=_('IP'), null=True, blank=True) |
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='users', verbose_name=_('User')) |
||||||
user_agent = models.CharField(verbose_name=_('User Agent'), max_length=1024, null=True, blank=True) |
datetime = models.DateTimeField(verbose_name=_('Clicked At'), auto_now_add=True) |
||||||
page = models.URLField(verbose_name=_('Page'), null=True, blank=True) |
ip = models.IPAddressField(verbose_name=_('IP'), null=True, blank=True) |
||||||
key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True) |
user_agent = models.CharField(verbose_name=_('User Agent'), max_length=1024, null=True, blank=True) |
||||||
TYPE_CHOICES = ( |
page = models.URLField(verbose_name=_('Page'), null=True, blank=True) |
||||||
(0, 'impressions'), |
key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True) |
||||||
(1, 'view'), |
TYPE_CHOICES = ( |
||||||
(2, 'click') |
(0, 'impressions'), |
||||||
) |
(1, 'view'), |
||||||
|
(2, 'click') |
||||||
type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES) |
) |
||||||
|
|
||||||
def __unicode__(self): |
type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES) |
||||||
return '%s - (%s)' % (self.banner, self.datetime) |
|
||||||
|
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) |
class LogStat(models.Model): |
||||||
urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True) |
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) |
||||||
date = models.DateField(verbose_name=_('Data')) |
urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True) |
||||||
view = models.PositiveIntegerField(verbose_name=_('Views')) |
|
||||||
click = models.PositiveIntegerField(verbose_name=_('Clicks')) |
date = models.DateField(verbose_name=_('Data')) |
||||||
unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True) |
view = models.PositiveIntegerField(verbose_name=_('Views')) |
||||||
unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks')) |
click = models.PositiveIntegerField(verbose_name=_('Clicks')) |
||||||
|
unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True) |
||||||
def __unicode__(self): |
unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks')) |
||||||
return '%s - (%s)' % (self.banner, self.date) |
|
||||||
|
def __unicode__(self): |
||||||
|
return '%s - (%s)' % (self.banner, self.date) |
||||||
# ------------------ |
|
||||||
class Paid(models.Model, StatMixin): |
class Meta: |
||||||
tickets = models.ForeignKey(Banner, related_name='paid_tickets') |
ordering = ['-date'] |
||||||
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) |
class Paid(models.Model, StatMixin): |
||||||
organiser = models.CharField(max_length=100, blank=True) |
tickets = models.ForeignKey(Banner, related_name='paid_tickets') |
||||||
public = models.BooleanField(default=True, verbose_name=u'Активная') |
participation = models.ForeignKey(Banner, related_name='paid_participation') |
||||||
stat_pswd = models.CharField(max_length=16) |
official = models.ForeignKey(Banner, related_name='paid_official') |
||||||
created = models.DateTimeField(auto_now_add=True) |
catalog = models.ForeignKey(Banner, related_name='paid_catalog') |
||||||
modified = models.DateTimeField(auto_now=True) |
logo = models.ImageField(upload_to='expo-b/paid', blank=True) |
||||||
|
organiser = models.CharField(max_length=100, blank=True) |
||||||
class Meta: |
public = models.BooleanField(default=True, verbose_name=u'Активная') |
||||||
ordering = ['-public'] |
stat_pswd = models.CharField(max_length=16) |
||||||
|
created = models.DateTimeField(auto_now_add=True) |
||||||
def get_event(self): |
modified = models.DateTimeField(auto_now=True) |
||||||
if self.exposition_set.all().exists(): |
|
||||||
return self.exposition_set.all()[0] |
class Meta: |
||||||
return None |
ordering = ['-public'] |
||||||
|
|
||||||
|
def get_event(self): |
||||||
class PaidStat(models.Model): |
try: |
||||||
paid = models.ForeignKey(Paid) |
return self.exposition_set.all()[0] |
||||||
date = models.DateField(verbose_name=_('Date')) |
except IndexError: |
||||||
page_views = models.PositiveIntegerField(default=0) |
return None |
||||||
price_views = models.PositiveIntegerField(default=0) |
|
||||||
catalog_views = models.PositiveIntegerField(default=0) |
|
||||||
catalog_clicks = models.PositiveIntegerField(default=0) |
class PaidStat(models.Model): |
||||||
tickets_clicks = models.PositiveIntegerField(default=0) |
paid = models.ForeignKey(Paid) |
||||||
participation_clicks = models.PositiveIntegerField(default=0) |
date = models.DateField(verbose_name=_('Date')) |
||||||
official_clicks = models.PositiveIntegerField(default=0) |
page_views = models.PositiveIntegerField(default=0) |
||||||
|
price_views = models.PositiveIntegerField(default=0) |
||||||
|
catalog_views = models.PositiveIntegerField(default=0) |
||||||
class Top(models.Model, StatMixin): |
catalog_clicks = models.PositiveIntegerField(default=0) |
||||||
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') |
tickets_clicks = models.PositiveIntegerField(default=0) |
||||||
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
participation_clicks = models.PositiveIntegerField(default=0) |
||||||
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики') |
official_clicks = models.PositiveIntegerField(default=0) |
||||||
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'Страны') |
class Meta: |
||||||
excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города') |
ordering = ['-date'] |
||||||
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) |
class Top(models.Model, StatMixin): |
||||||
|
link = models.ForeignKey(Banner) |
||||||
objects = models.Manager() |
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') |
||||||
cached = TopCached() |
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
||||||
|
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики') |
||||||
class Meta: |
excluded_tags = models.ManyToManyField('theme.Tag', blank=True, null=True, verbose_name=u'Исключить теги') |
||||||
ordering = ['position'] |
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'Исключить города') |
||||||
def get_event(self): |
fr = models.DateField(default=date.today(), verbose_name=u'Начало') |
||||||
try: |
to = models.DateField(blank=True, null=True, verbose_name=u'Конец') |
||||||
return self.exposition_set.all()[0] |
stat_pswd = models.CharField(max_length=16) |
||||||
except IndexError: |
|
||||||
return None |
objects = models.Manager() |
||||||
|
cached = TopCached() |
||||||
class TopStat(models.Model): |
|
||||||
date = models.DateField() |
class Meta: |
||||||
theme = models.ForeignKey('theme.Theme', blank=True, null=True) |
ordering = ['position'] |
||||||
tag = models.ForeignKey('theme.Tag', blank=True, null=True) |
|
||||||
country = models.ForeignKey('country.Country', blank=True, null=True) |
def get_event(self): |
||||||
city = models.ForeignKey('city.City', blank=True, null=True) |
try: |
||||||
views = models.PositiveIntegerField(default=0) |
return self.exposition_set.all()[0] |
||||||
clicks = models.PositiveIntegerField(default=0) |
except IndexError: |
||||||
|
return None |
||||||
def generatePassword(length=5): |
|
||||||
""" |
|
||||||
generate random password |
class TopStat(models.Model): |
||||||
""" |
date = models.DateField() |
||||||
SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8', |
theme = models.ForeignKey('theme.Theme', blank=True, null=True) |
||||||
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', |
tag = models.ForeignKey('theme.Tag', blank=True, null=True) |
||||||
'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', |
country = models.ForeignKey('country.Country', blank=True, null=True) |
||||||
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', |
city = models.ForeignKey('city.City', blank=True, null=True) |
||||||
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#'] |
views = models.PositiveIntegerField(default=0) |
||||||
PASSWORD_LENGTH = length |
clicks = models.PositiveIntegerField(default=0) |
||||||
newPassword = [] |
|
||||||
for i in range(PASSWORD_LENGTH): |
|
||||||
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))]) |
class MainPage(models.Model, StatMixin): |
||||||
return ''.join(newPassword) |
link = models.ForeignKey(Banner) |
||||||
|
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
||||||
|
public = models.BooleanField(default=True, verbose_name=u'Активная') |
||||||
def generate_stat_pass(sender, **kwargs): |
stat_pswd = models.CharField(max_length=16) |
||||||
obj = kwargs['instance'] |
created = models.DateTimeField(auto_now_add=True) |
||||||
if not obj.stat_pswd: |
modified = models.DateTimeField(auto_now=True) |
||||||
obj.stat_pswd = generatePassword() |
|
||||||
obj.save() |
class Meta: |
||||||
|
ordering = ['-public'] |
||||||
|
|
||||||
|
def get_event(self): |
||||||
post_save.connect(generate_stat_pass, sender=Banner) |
try: |
||||||
post_save.connect(generate_stat_pass, sender=Paid) |
return self.exposition_set.all()[0] |
||||||
post_save.connect(generate_stat_pass, sender=Top) |
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 %} |
{% load thumbnail %} |
||||||
|
|
||||||
{% if banners %} |
{% if banners %} |
||||||
|
|
||||||
<div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}"> |
<div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}"> |
||||||
<ul class='b-slider-list'> |
<ul class='b-slider-list'> |
||||||
{% for banner in banners %} |
{% for banner in banners %} |
||||||
<li data-url='{{ banner.get_absolute_url }}' |
<li data-url='{{ banner.get_absolute_url }}' |
||||||
class=' |
class=' |
||||||
b-slider-item |
b-slider-item |
||||||
m-slider-item-{{ forloop.counter }} |
m-slider-item-{{ forloop.counter }} |
||||||
{% if forloop.counter == 1 %} |
{% if forloop.counter == 1 %} |
||||||
m-slider-current |
m-slider-current |
||||||
{% endif %} |
{% endif %} |
||||||
' |
' |
||||||
data-slide='{{ forloop.counter }}' |
data-slide='{{ forloop.counter }}' |
||||||
> |
> |
||||||
|
|
||||||
<a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'> |
<a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'> |
||||||
{% thumbnail banner.img group.size crop="top" as im %} |
{% 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 }}'> |
<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 %} |
{% endthumbnail %} |
||||||
|
|
||||||
<div class="b-slider-item__info_cover"> |
<div class="b-slider-item__info_cover"> |
||||||
<span class='b-slider-item__title'>{{ banner.title|safe }}</span> |
<span class='b-slider-item__title'>{{ banner.title|safe }}</span> |
||||||
<span class='b-slider-item__text'>{{ banner.text|safe }}</span> |
<span class='b-slider-item__text'>{{ banner.text|safe }}</span> |
||||||
</div> |
</div> |
||||||
</a> |
</a> |
||||||
</li> |
</li> |
||||||
{% endfor %} |
{% endfor %} |
||||||
</ul> |
</ul> |
||||||
|
|
||||||
<ul class="b-slider-nav"> |
<ul class="b-slider-nav"> |
||||||
{% for banner in banners %} |
{% for banner in banners %} |
||||||
<li class="b-slider-nav-button |
<li class="b-slider-nav-button |
||||||
{% if forloop.counter == 1 %} |
{% if forloop.counter == 1 %} |
||||||
m-slider-nav-current_button |
m-slider-nav-current_button |
||||||
{% endif %} |
{% endif %} |
||||||
" data-slide='{{ forloop.counter }}'> |
" data-slide='{{ forloop.counter }}'> |
||||||
{{ forloop.counter }} |
{{ forloop.counter }} |
||||||
</li> |
</li> |
||||||
{% endfor %} |
{% endfor %} |
||||||
</ul> |
</ul> |
||||||
|
|
||||||
<span data-direction="prev" class='b-slider-nav-prev'>〈 </span> |
<span data-direction="prev" class='b-slider-nav-prev'>〈 </span> |
||||||
<span data-direction="next" class='b-slider-nav-next'> 〉</span> |
<span data-direction="next" class='b-slider-nav-next'> 〉</span> |
||||||
|
|
||||||
</div> |
</div> |
||||||
|
|
||||||
<script> |
<script> |
||||||
(function() { |
(function() { |
||||||
$('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}}); |
$('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}}); |
||||||
})(); |
})(); |
||||||
</script> |
</script> |
||||||
|
|
||||||
<style> |
<style> |
||||||
.m-{{ group.slug }} { |
.m-{{ group.slug }} { |
||||||
width: {{ group.width }}px; |
width: {{ group.width }}px; |
||||||
height: {{ group.height }}px; |
height: {{ group.height }}px; |
||||||
} |
} |
||||||
|
|
||||||
.m-{{ group.slug }} .b-slider-nav-prev, |
.m-{{ group.slug }} .b-slider-nav-prev, |
||||||
.m-{{ group.slug }} .b-slider-nav-next { |
.m-{{ group.slug }} .b-slider-nav-next { |
||||||
line-height: {{ group.height }}px; |
line-height: {{ group.height }}px; |
||||||
} |
} |
||||||
|
|
||||||
.m-{{ group.slug }} .b-slider-item, |
.m-{{ group.slug }} .b-slider-item, |
||||||
.m-{{ group.slug }} .b-slider-list { |
.m-{{ group.slug }} .b-slider-list { |
||||||
width: {{ group.width }}px; |
width: {{ group.width }}px; |
||||||
height: {{ group.height }}px; |
height: {{ group.height }}px; |
||||||
} |
} |
||||||
</style> |
</style> |
||||||
|
|
||||||
{% endif %} |
{% endif %} |
||||||
@ -1,74 +1,74 @@ |
|||||||
from ..models import Banner |
from ..models import Banner |
||||||
from ..models import BannerGroup |
from ..models import BannerGroup |
||||||
from ..models import URL |
from ..models import URL |
||||||
|
|
||||||
from django import template |
from django import template |
||||||
|
|
||||||
# For render tag |
# For render tag |
||||||
from django.template import Context |
from django.template import Context |
||||||
from django.template import Template |
from django.template import Template |
||||||
|
|
||||||
import re |
import re |
||||||
|
|
||||||
register = template.Library() |
register = template.Library() |
||||||
|
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True) |
@register.simple_tag(takes_context=True) |
||||||
def banner_group(context, group, tpl='group.html'): |
def banner_group(context, group, tpl='group.html'): |
||||||
try: |
try: |
||||||
page_url = context['request'].path_info |
page_url = context['request'].path_info |
||||||
site = context['request'].site |
site = context['request'].site |
||||||
group = BannerGroup.objects.get(slug=group) |
group = BannerGroup.objects.get(slug=group) |
||||||
good_urls = [] |
good_urls = [] |
||||||
for url in URL.objects.filter(public=True, sites__in=[site]): |
for url in URL.objects.filter(public=True, sites__in=[site]): |
||||||
if url.regex: |
if url.regex: |
||||||
url_re = re.compile(url.url) |
url_re = re.compile(url.url) |
||||||
if url_re.findall(page_url): |
if url_re.findall(page_url): |
||||||
good_urls.append(url) |
good_urls.append(url) |
||||||
elif page_url == url.url: |
elif page_url == url.url: |
||||||
good_urls.append(url) |
good_urls.append(url) |
||||||
banners = Banner.objects.filter(public=True, group=group, urls__in=good_urls) |
banners = Banner.objects.filter(public=True, group=group, urls__in=good_urls) |
||||||
except: |
except: |
||||||
banners = False |
banners = False |
||||||
group = False |
group = False |
||||||
if(banners and group): |
if(banners and group): |
||||||
context['banners'] = banners |
context['banners'] = banners |
||||||
context['group'] = group |
context['group'] = group |
||||||
|
|
||||||
t = template.loader.get_template(tpl) |
t = template.loader.get_template(tpl) |
||||||
return t.render(template.Context(context)) |
return t.render(template.Context(context)) |
||||||
|
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True) |
@register.simple_tag(takes_context=True) |
||||||
def banner_one(context, banner_id, tpl='banner.html'): |
def banner_one(context, banner_id, tpl='banner.html'): |
||||||
try: |
try: |
||||||
page_url = context['request'].path_info |
page_url = context['request'].path_info |
||||||
site = context['request'].site |
site = context['request'].site |
||||||
good_urls = [] |
good_urls = [] |
||||||
for url in URL.objects.filter(public=True, sites__in=[site]): |
for url in URL.objects.filter(public=True, sites__in=[site]): |
||||||
if url.regex: |
if url.regex: |
||||||
url_re = re.compile(url.url) |
url_re = re.compile(url.url) |
||||||
if url_re.findall(page_url): |
if url_re.findall(page_url): |
||||||
good_urls.append(url) |
good_urls.append(url) |
||||||
elif page_url == url.url: |
elif page_url == url.url: |
||||||
good_urls.append(url) |
good_urls.append(url) |
||||||
|
|
||||||
banner = Banner.objects.get(id=banner_id, public=True, urls__in=good_urls) |
banner = Banner.objects.get(id=banner_id, public=True, urls__in=good_urls) |
||||||
except: |
except: |
||||||
banner = False |
banner = False |
||||||
|
|
||||||
context['banner'] = banner |
context['banner'] = banner |
||||||
|
|
||||||
t = template.loader.get_template(tpl) |
t = template.loader.get_template(tpl) |
||||||
return t.render(template.Context(context)) |
return t.render(template.Context(context)) |
||||||
|
|
||||||
|
|
||||||
# block render |
# block render |
||||||
@register.simple_tag(takes_context=True) |
@register.simple_tag(takes_context=True) |
||||||
def render(context, content): |
def render(context, content): |
||||||
try: |
try: |
||||||
tpl = Template(content) |
tpl = Template(content) |
||||||
content = Context(context) |
content = Context(context) |
||||||
return tpl.render(content) |
return tpl.render(content) |
||||||
except: |
except: |
||||||
return 'Render Error' |
return 'Render Error' |
||||||
|
|||||||
@ -1,13 +1,13 @@ |
|||||||
from django.conf.urls import url |
from django.conf.urls import url |
||||||
from expobanner.stat_views import * |
from expobanner.stat_views import * |
||||||
from . import views |
from . import views |
||||||
|
|
||||||
urlpatterns = [ |
urlpatterns = [ |
||||||
url(r'^click/(?P<banner_id>\d{1,4})/$', views.click, name='banner_click'), |
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'^view/(?P<banner_id>\d+)/$', views.view, name='banner_view'), |
||||||
# |
# |
||||||
url(r'^get-banners/$', views.get_banners), |
url(r'^get-banners/$', views.get_banners), |
||||||
url(r'^get-tops/$', views.get_top), |
url(r'^get-tops/$', views.get_top), |
||||||
url(r'^banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='banner_stat_client'), |
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'), |
url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='paid_stat_client'), |
||||||
] |
] |
||||||
|
|||||||
@ -1,84 +1,97 @@ |
|||||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||||
import json |
import json |
||||||
import re |
import re |
||||||
from django.http import HttpResponse |
from django.http import HttpResponse |
||||||
from django.shortcuts import redirect, get_object_or_404 |
from django.shortcuts import redirect, get_object_or_404 |
||||||
from django.shortcuts import render_to_response |
from django.shortcuts import render_to_response |
||||||
from django.template import RequestContext |
from django.template import RequestContext |
||||||
from .models import Banner, BannerGroup, URL, Top |
from .models import Banner, BannerGroup, URL, Top |
||||||
from expobanner.utils import get_by_sort, get_banner_by_params, get_client_ip, get_top_events |
from expobanner.utils import get_banner_by_params, get_client_ip, get_top_events, get_referer_view, set_cookie |
||||||
|
|
||||||
|
|
||||||
def click(request, banner_id): |
def click(request, banner_id): |
||||||
banner = get_object_or_404(Banner, pk=banner_id) |
banner = get_object_or_404(Banner, pk=banner_id) |
||||||
banner.log(request, 2) |
banner.log(request, 2) |
||||||
return redirect(banner.url) |
return redirect(banner.url) |
||||||
|
|
||||||
|
|
||||||
def view(request, banner_id): |
def view(request, banner_id): |
||||||
banner = get_object_or_404(Banner, pk=banner_id) |
banner = get_object_or_404(Banner, pk=banner_id) |
||||||
banner.log(request, 1) |
banner.log(request, 1) |
||||||
return redirect(banner.img.url) |
return redirect(banner.img.url) |
||||||
|
|
||||||
def get_banners(request): |
def get_banners(request): |
||||||
#url = request.GET.get('url', '/') |
url = get_referer_view(request, default='/') |
||||||
url = request.META.get('HTTP_REFERER', '/') |
# get urls by current url |
||||||
# get urls by current url |
urls = URL.cached.all() |
||||||
urls = URL.cached.all() |
good_urls = [] |
||||||
good_urls = [] |
for u in urls: |
||||||
for u in urls: |
if u.regex: |
||||||
if u.regex: |
url_re = re.compile(u.url) |
||||||
url_re = re.compile(u.url) |
if url_re.findall(url): |
||||||
if url_re.findall(url): |
good_urls.append(u) |
||||||
good_urls.append(u) |
elif url == u.url: |
||||||
elif url == u.url: |
good_urls.append(u) |
||||||
good_urls.append(u) |
# fill parameters dict |
||||||
# fill parameters dict |
params = {'theme': request.GET.getlist('theme', []), |
||||||
params = {'theme': request.GET.getlist('theme', []), |
'tag': request.GET.get('tag'), |
||||||
'tag': request.GET.get('tag'), |
'country': request.GET.get('country'), |
||||||
'country': request.GET.get('country'), |
'city': request.GET.get('city'), |
||||||
'city': request.GET.get('city'), |
'ip': get_client_ip(request)} |
||||||
'ip': get_client_ip(request)} |
|
||||||
|
group_banners = BannerGroup.cached.group_banners() |
||||||
group_banners = BannerGroup.cached.group_banners() |
result = [] |
||||||
result = [] |
cookie = None |
||||||
# get banners for all groups |
# get banners for all groups |
||||||
for group, banners in group_banners.iteritems(): |
places = request.GET.getlist('places', []) |
||||||
banner = get_banner_by_params(banners, good_urls, params) |
|
||||||
if banner: |
for group, banners in group_banners.iteritems(): |
||||||
if banner.js or banner.html: |
if group not in places: |
||||||
text = banner.text |
# on this page there is no such group |
||||||
img = '' |
continue |
||||||
alt = '' |
banner = get_banner_by_params(banners, good_urls, params, request) |
||||||
is_img = False |
if banner: |
||||||
else: |
if banner.html: |
||||||
text = '' |
text = banner.text |
||||||
img = banner.img.url |
img = '' |
||||||
alt = banner.alt |
alt = '' |
||||||
is_img = True |
is_img = False |
||||||
result.append({'id': group, |
else: |
||||||
'url': banner.get_click_link(), |
text = '' |
||||||
'is_html': banner.html, |
try: |
||||||
'is_flash': banner.flash, |
img = banner.img.url |
||||||
'is_img': is_img, |
except ValueError: |
||||||
'is_js': banner.js, |
continue |
||||||
'img': img, |
alt = banner.alt |
||||||
'alt': alt, |
is_img = True |
||||||
'text': text |
result.append({'id': group, |
||||||
}) |
'url': banner.get_click_link(), |
||||||
# add view log |
'is_html': banner.html, |
||||||
banner.log(request, 1) |
'is_flash': banner.flash, |
||||||
|
'is_img': is_img, |
||||||
return HttpResponse(json.dumps(result, indent=4), content_type='application/json') |
'is_popup': banner.popup, |
||||||
|
'img': img, |
||||||
def get_top(request): |
'alt': alt, |
||||||
params = {'theme': request.GET.getlist('theme', []), |
'text': text |
||||||
'tag': request.GET.get('tag'), |
}) |
||||||
'country': request.GET.get('country'), |
if banner.popup: |
||||||
'city': request.GET.get('city'), |
cookie = banner.cookie |
||||||
'catalog': request.GET.get('catalog')} |
# add view log |
||||||
|
banner.log(request, 1) |
||||||
tops = Top.cached.all() |
response = HttpResponse(json.dumps(result, indent=4), content_type='application/json') |
||||||
events = get_top_events(tops, params) |
if cookie: |
||||||
context = {'objects': events} |
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)) |
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 -*- |
# -*- coding: utf-8 -*- |
||||||
from django.conf.urls import patterns, include, url |
from django.conf.urls import patterns, url |
||||||
from admin import MetaListView, MetaView |
from views import CreateSeoText, SeoTextList, EditSeoText, DeleteSeoText |
||||||
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/new/$', CreateSeoText.as_view(), name='seo_new'), |
||||||
url(r'^seo/all/$', SeoTextList.as_view(), name='seo_all'), |
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/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'^seo/delete/(?P<pk>\d{1,5})/$', DeleteSeoText.as_view(), name='seo_delete'), |
||||||
url(r'^all/$', MetaListView.as_view()), |
url(r'^all/$', MetaListView.as_view()), |
||||||
#url(r'^change/(?P<url>.*)/$', 'conference_change'), |
url(r'^(?P<id>\d{1,6})/$', MetaView.as_view()), |
||||||
url(r'^(?P<id>.*)/$', MetaView.as_view()), |
|
||||||
url(r'^$', MetaView.as_view()), |
url(r'^$', MetaView.as_view()), |
||||||
) |
) |
||||||
@ -1,16 +1,16 @@ |
|||||||
from functools import wraps |
from functools import wraps |
||||||
|
|
||||||
from django.template import RequestContext |
from django.template import RequestContext |
||||||
from django.shortcuts import render_to_response |
from django.shortcuts import render_to_response |
||||||
|
|
||||||
|
|
||||||
def render_to(tpl): |
def render_to(tpl): |
||||||
def decorator(func): |
def decorator(func): |
||||||
@wraps(func) |
@wraps(func) |
||||||
def wrapper(request, *args, **kwargs): |
def wrapper(request, *args, **kwargs): |
||||||
out = func(request, *args, **kwargs) |
out = func(request, *args, **kwargs) |
||||||
if isinstance(out, dict): |
if isinstance(out, dict): |
||||||
out = render_to_response(tpl, out, RequestContext(request)) |
out = render_to_response(tpl, out, RequestContext(request)) |
||||||
return out |
return out |
||||||
return wrapper |
return wrapper |
||||||
return decorator |
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