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.
 
 
 
 
 
 

152 lines
4.7 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 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"Ближайшие выставки %s:" % 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"Ближайшие выставки в %s: " % 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"Ближайшие выставки %s: " % 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