You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.8 KiB
153 lines
4.8 KiB
# -*- coding: utf-8 -*-
|
|
from django.contrib.syndication.views import Feed
|
|
from django.shortcuts import get_object_or_404
|
|
from django.db import models
|
|
from django.utils.translation import ugettext as _
|
|
|
|
from exposition.models import Exposition
|
|
import copy
|
|
from theme.models import Theme
|
|
from country.models import Country
|
|
from city.models import City
|
|
|
|
from hvad.models import TranslatableModel, TranslatedFields
|
|
|
|
# ----------------------- RSS -------------------------- #
|
|
|
|
EXPO_ON_PAGE = 10
|
|
|
|
# nearest expositions at all
|
|
|
|
class LatestExpositions(Feed):
|
|
title = _(u"Ближайшие выставки на expomap.ru")
|
|
link = '/rss/latest/'
|
|
description = _(u'Подписывайтесь на наш RSS-канал')
|
|
|
|
def items(self):
|
|
return Exposition.enable.upcoming()[:EXPO_ON_PAGE]
|
|
|
|
def item_title(self, item):
|
|
return item.name
|
|
|
|
def item_description(self, item):
|
|
return item.main_title
|
|
|
|
def item_link(self, item):
|
|
return '/expo/%s/'%item.url
|
|
|
|
NUM_ITEMS_ON_PAGE = 20
|
|
|
|
|
|
class CountryFeeds(Feed):
|
|
description_template = '/rss/country_feeds/'
|
|
|
|
def get_object(self, request, slug):
|
|
return get_object_or_404(Country, url=slug)
|
|
|
|
def title(self, obj):
|
|
return _(u"Ближайшие выставки %(obj)s:") % {'obj': obj.inflect}
|
|
|
|
def link(self,obj):
|
|
return obj.get_permanent_url()
|
|
|
|
def item_description(self, obj):
|
|
return obj.main_title
|
|
|
|
def items(self, obj):
|
|
return Exposition.enable.upcoming().filter(country=obj)[:NUM_ITEMS_ON_PAGE]
|
|
|
|
|
|
class CityFeeds(Feed):
|
|
description_template = '/rss/city_feeds/'
|
|
|
|
def get_object(self, request, slug):
|
|
return get_object_or_404(City, url=slug)
|
|
|
|
def title(self, obj):
|
|
return _(u"Ближайшие выставки в %(obj)s: ") % {'obj': obj.inflect}
|
|
|
|
def link(self,obj):
|
|
return obj.get_permanent_url()
|
|
|
|
def item_description(self, obj):
|
|
return obj.main_title
|
|
|
|
def items(self, obj):
|
|
return Exposition.enable.upcoming().filter(city = obj)[:NUM_ITEMS_ON_PAGE]
|
|
|
|
|
|
class ThemeFeeds(Feed):
|
|
description_template = '/rss/theme_feeds/'
|
|
|
|
def get_object(self, request, slug):
|
|
return get_object_or_404(Theme, url=slug)
|
|
|
|
def title(self, obj):
|
|
return _(u"Ближайшие выставки %(obj)s: ") % {'obj': obj.inflect}
|
|
|
|
def link(self,obj):
|
|
return obj.url
|
|
|
|
def item_description(self, obj):
|
|
return obj.main_title
|
|
|
|
def items(self, obj):
|
|
return Exposition.enable.upcoming().filter(theme = obj)[:NUM_ITEMS_ON_PAGE]
|
|
|
|
# ------------------------ Page model --------------------------- #
|
|
from django.conf import settings
|
|
from django.core.urlresolvers import reverse
|
|
|
|
class Page(TranslatableModel):
|
|
|
|
url = models.SlugField(unique=True)
|
|
translations = TranslatedFields(
|
|
h1 = models.CharField(max_length=255),
|
|
body = models.TextField(),
|
|
# meta
|
|
title = models.CharField(max_length=255, blank=True),
|
|
descriptions = models.CharField(max_length=255, blank=True),
|
|
keywords = models.CharField(max_length=255, blank=True),
|
|
)
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
modified = models.DateTimeField(auto_now=True)
|
|
|
|
def get_absolute_url(self):
|
|
return reverse('page_view', args=[self.url])
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(Page, self).__init__(*args, **kwargs)
|
|
self.cache_fields = ['h1', 'body','title', 'description', 'keywords']
|
|
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
|
|
self.is_new = True
|
|
|
|
def save(self, *args, **kwargs):
|
|
super(Page,self).save(*args, **kwargs)
|
|
self.initial_language = '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(self, key) is u'' or getattr(self, 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.url
|
|
|