remotes/origin/1203
Nazar Kotjuk 10 years ago
parent 1cea2afa6b
commit c1314265fa
  1. 1
      expobanner/admin.py
  2. 46
      expobanner/models.py
  3. 3
      expobanner/views.py
  4. 4
      place_exposition/models.py
  5. 2
      templates/client/blank.html

@ -70,6 +70,7 @@ class BannerList(AbstractList):
def get_queryset(self): def get_queryset(self):
qs = self.model.objects.filter(group__isnull=False).order_by('-fr') qs = self.model.objects.filter(group__isnull=False).order_by('-fr')
if not self.request.GET.get('show_inactive'): if not self.request.GET.get('show_inactive'):
qs = qs.filter(public=True)
qs = qs.filter(Q(fr__lte=date.today()) & (Q(to__isnull=True) | Q( to__gte=date.today()))) qs = qs.filter(Q(fr__lte=date.today()) & (Q(to__isnull=True) | Q( to__gte=date.today())))
if self.request.GET.get('q'): if self.request.GET.get('q'):
qs = qs.filter(title__icontains=self.request.GET['q']) qs = qs.filter(title__icontains=self.request.GET['q'])

@ -14,6 +14,9 @@ from country.models import Country
class URL(models.Model): class URL(models.Model):
"""
Model for urls or regex urls that can be used in banners representation
"""
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)
@ -39,6 +42,9 @@ class URL(models.Model):
class BannerGroup (models.Model): class BannerGroup (models.Model):
"""
place where banner can be show
"""
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)
@ -68,6 +74,9 @@ class BannerGroup (models.Model):
class Banner(models.Model, StatMixin): class Banner(models.Model, StatMixin):
"""
Uses for store information about banners. Also can be used as tracked link
"""
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)
@ -78,12 +87,10 @@ class Banner(models.Model, StatMixin):
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'),
@ -104,25 +111,29 @@ class Banner(models.Model, StatMixin):
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)
# password for clients
stat_pswd = models.CharField(max_length=16) stat_pswd = models.CharField(max_length=16)
class Meta: class Meta:
ordering = ['-public'] ordering = ['-public']
def get_admin_url(self): def get_admin_url(self):
return '/admin/expobanners/banners/banner/%d/edit/'%self.id return '/admin/expobanners/banners/banner/%d/edit/' % self.id
def key(slef): @property
def key(self):
if hasattr(settings, 'SECRET_KEY'): if hasattr(settings, 'SECRET_KEY'):
key = str(datetime.now()) + settings.SECRET_KEY key = str(datetime.now()) + settings.SECRET_KEY
else: else:
key = str(datetime.now()) key = str(datetime.now())
return hashlib.md5(key).hexdigest() return hashlib.md5(key).hexdigest()
def log(self, request, type): def log(self, request, t):
"""
creating log by request
"""
log = { log = {
'type': type, 'type': t,
'banner': self, 'banner': self,
'group': self.group, 'group': self.group,
'ip': request.META.get('REMOTE_ADDR'), 'ip': request.META.get('REMOTE_ADDR'),
@ -169,6 +180,9 @@ class Banner(models.Model, StatMixin):
class Log(models.Model): class Log(models.Model):
"""
store information about showing and clicking of banners
"""
banner = models.ForeignKey(Banner, related_name='banner_logs') banner = models.ForeignKey(Banner, related_name='banner_logs')
group = models.ForeignKey(BannerGroup, related_name='group_logs', verbose_name=_('Group'), blank=True, null=True) 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) urls = models.ManyToManyField(URL, related_name='url_logs', verbose_name=_('URLs'), blank=True)
@ -192,6 +206,9 @@ class Log(models.Model):
class LogStat(models.Model): class LogStat(models.Model):
"""
store aggregated data of logs
"""
banner = models.ForeignKey(Banner, related_name='banner_stat', verbose_name=_('Banner'), 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) 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) urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True)
@ -211,6 +228,9 @@ class LogStat(models.Model):
# ------------------ # ------------------
class Paid(models.Model, StatMixin): class Paid(models.Model, StatMixin):
"""
store information about paid events
"""
tickets = models.ForeignKey(Banner, related_name='paid_tickets') tickets = models.ForeignKey(Banner, related_name='paid_tickets')
participation = models.ForeignKey(Banner, related_name='paid_participation') participation = models.ForeignKey(Banner, related_name='paid_participation')
official = models.ForeignKey(Banner, related_name='paid_official') official = models.ForeignKey(Banner, related_name='paid_official')
@ -233,6 +253,9 @@ class Paid(models.Model, StatMixin):
class PaidStat(models.Model): class PaidStat(models.Model):
"""
aggregated data of paid logs
"""
paid = models.ForeignKey(Paid) paid = models.ForeignKey(Paid)
date = models.DateField(verbose_name=_('Date')) date = models.DateField(verbose_name=_('Date'))
page_views = models.PositiveIntegerField(default=0) page_views = models.PositiveIntegerField(default=0)
@ -248,6 +271,9 @@ class PaidStat(models.Model):
class Top(models.Model, StatMixin): class Top(models.Model, StatMixin):
"""
store information about events in top
"""
link = models.ForeignKey(Banner) link = models.ForeignKey(Banner)
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа')
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
@ -273,6 +299,9 @@ class Top(models.Model, StatMixin):
class TopStat(models.Model): class TopStat(models.Model):
"""
aggregated data of logs events in top
"""
date = models.DateField() date = models.DateField()
theme = models.ForeignKey('theme.Theme', blank=True, null=True) theme = models.ForeignKey('theme.Theme', blank=True, null=True)
tag = models.ForeignKey('theme.Tag', blank=True, null=True) tag = models.ForeignKey('theme.Tag', blank=True, null=True)
@ -283,6 +312,9 @@ class TopStat(models.Model):
class MainPage(models.Model, StatMixin): class MainPage(models.Model, StatMixin):
"""
events on main page info
"""
link = models.ForeignKey(Banner) link = models.ForeignKey(Banner)
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
public = models.BooleanField(default=True, verbose_name=u'Активная') public = models.BooleanField(default=True, verbose_name=u'Активная')

@ -21,6 +21,9 @@ def view(request, banner_id):
return redirect(banner.img.url) return redirect(banner.img.url)
def get_banners(request): def get_banners(request):
"""
return list of banners filtered by sending data
"""
url = get_referer_view(request, default='/') url = get_referer_view(request, default='/')
# get urls by current url # get urls by current url
urls = URL.cached.all() urls = URL.cached.all()

@ -191,12 +191,12 @@ class PlaceExposition(TranslatableModel, ExpoMixin):
def get_nearest_hotels(self): def get_nearest_hotels(self):
if not self.address: if not self.address:
return None return []
# get coordinates of all hotels in current city # get coordinates of all hotels in current city
qs_hotels_all = self.city.hotels.filter(city=self.city) qs_hotels_all = self.city.hotels.filter(city=self.city)
hotels_coord = [(hotel.latitude, hotel.longitude) for hotel in qs_hotels_all] hotels_coord = [(hotel.latitude, hotel.longitude) for hotel in qs_hotels_all]
# coordinate current place # coordinate current place
place_coord = (self.address['lat'], self.address['lng']) place_coord = (float(self.address['lat']), float(self.address['lng']))
# 4 coordinates of 4 nearest hotels # 4 coordinates of 4 nearest hotels
hotels_coord = sorted(hotels_coord, key=partial(dist, place_coord))[:4] hotels_coord = sorted(hotels_coord, key=partial(dist, place_coord))[:4]
# start generating filter for queryset # start generating filter for queryset

@ -95,7 +95,7 @@ This template include basic anf main styles and js files,
} }
</style> </style>
<meta name="google-site-verification" content="2tSiaGdvrZTPw0mXMndZdk3MleeguLQ192Xb9U4JSyo" />
</head> </head>
<body {% block body_class %}{% endblock %}> <body {% block body_class %}{% endblock %}>
<!--[if lt IE 8]> <!--[if lt IE 8]>

Loading…
Cancel
Save