# -*- coding: utf-8 -*- import datetime import json from accounts.models import User from article.models import Article from city.models import City from country.models import Country from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.mail import EmailMessage from django.db.models import Q from django.http import ( Http404, HttpResponse, HttpResponsePermanentRedirect, HttpResponseRedirect ) from django.shortcuts import get_object_or_404 from django.template.loader import render_to_string from django.utils.translation import ugettext as _ from django.utils import translation from django.views.generic import DetailView from django.views.generic.edit import FormMixin from functions.cache_mixin import JitterCacheMixin from functions.custom_views import ExpoSearchView, ListView, ReverseOrderMixin from functions.search_forms import ExpositionSearchForm from functions.views_help import get_side_items from meta.views import MetadataMixin from models import Exposition from service.models import Service from service.order_forms import AdvertiseForm from service.views import order_forms, get_userlog_data from stats_collector.mixin import ( ExpoSectionKindMixin, ExpoSectionMixin, ObjectStatMixin ) from theme.models import Tag, Theme from events.mixin import ExpoFilterMixin, SearchFilterMixin from settings.models import EventDefaultDescription class ExpositionBy(ExpoFilterMixin, ExpoSectionMixin, JitterCacheMixin, MetadataMixin, ListView): template_name = 'exposition/exposition_by.html' title1 = '' title2 = '' """ abstact class """ def get_context_data(self, **kwargs): context = super(ExpositionBy, self).get_context_data(**kwargs) context.update({'title1': self.title1, 'title2': self.title2, 'catalog': self.catalog}) return context class ExpositionByCountry(ExpositionBy): cache_range = [60*30, 60*60] model = Country title1 = _(u'По странам') title2 = _(u'Выставки мира по странам') catalog = 'country/' stat_kind = 'country' def get_context_data(self, **kwargs): context = super(ExpositionByCountry, self).get_context_data(**kwargs) context['can_filter'] = False context['side_popular'] = get_side_items('expo', Country) return context def get_queryset(self): return self.model.objects.expo_countries_with_count() #lang = translation.get_language() #return self.model.objects.select_related('exposition_country')\ # .filter(exposition_country__country__isnull=False, translations__language_code=lang)\ # .order_by('translations__name').distinct() class ExpositionByTheme(ExpositionBy): cache_range = [60*30, 60*60] model = Theme title1 = _(u'По тематикам') title2 = _(u'Выставки мира по тематикам') catalog = 'theme/' stat_kind = 'theme' def get_queryset(self): return self.model.active.expo_themes_with_count() #lang = translation.get_language() #return self.model.objects.select_related('exposition_themes')\ # .filter(exposition_themes__theme__isnull=False, translations__language_code=lang)\ # .order_by('translations__name').distinct() class ExpositionByTag(ExpositionBy): cache_range = [60*30, 60*60] model = Tag title1 = _(u'По тегам') title2 = _(u'Выставки мира по тегам') catalog = 'tag/' stat_kind = 'tag' def get_queryset(self): return self.model.active.expo_themes_with_count() class ExpositionByCity(ExpositionBy): cache_range = [60*30, 60*60] model = City title1 = _(u'По городам') title2 = _(u'Выставки мира по городам') catalog = 'city/' stat_kind = 'city' def get_context_data(self, **kwargs): context = super(ExpositionByCity, self).get_context_data(**kwargs) context['can_filter'] = False context['side_popular'] = get_side_items('expo', City) return context def get_queryset(self): return self.model.used.expo_cities_with_count() #return self.model.used.expo_cities() #lang = translation.get_language() #return self.model.objects.select_related('exposition_city')\ # .filter(exposition_city__city__isnull=False, translations__language_code=lang)\ # .order_by('translations__name').distinct() class ExpositionSearchView(ReverseOrderMixin, SearchFilterMixin, ExpoSearchView): #paginate_by = 10 template_name = 'client/exposition/search.html' search_form = ExpositionSearchForm model = Exposition def exposition_add_calendar(request, id): args = {'success': False} user = request.user if user.is_authenticated(): exp = Exposition.objects.safe_get(id=id) if exp in user.calendar.get_expos(): user.calendar.expositions.remove(exp) args['in'] = False else: user.calendar.expositions.add(exp) args['in'] = True args['success'] = True else: args['not_authorized'] = True args['success'] = True return HttpResponse(json.dumps(args), content_type='application/json') # перенесено в events # def exposition_visit(request, id): # args = {'success': False} # user = request.user # if user.is_authenticated(): # exp = Exposition.objects.safe_get(id=id) # if user in exp.users.all(): # exp.users.remove(user) # args['in'] = False # else: # exp.users.add(user) # args['in'] = True # # args['success'] = True # else: # args['not_authorized'] = True # args['success'] = True # # return HttpResponse(json.dumps(args), content_type='application/json') class ExpoDetail(ObjectStatMixin, JitterCacheMixin, MetadataMixin, DetailView): cache_range = [60*30, 60*60] model = Exposition slug_field = 'url' template_name = 'client/exposition/exposition_detail.html' queryset = Exposition.objects.language()\ .select_related('place', 'city', 'country', 'paid_new')\ .prefetch_related('theme', 'tag') descriptions = {} try: descriptions.update( {'ru': EventDefaultDescription.objects.language('ru').all()[0].expo_description} ) except IndexError: pass try: descriptions.update( {'en': EventDefaultDescription.objects.language('en').all()[0].expo_description} ) except IndexError: pass def get_context_data(self, **kwargs): lang = translation.get_language() context = super(ExpoDetail, self).get_context_data(**kwargs) context['advertising_form'] = AdvertiseForm() obj = self.object if not obj.description: context['default_description'] = unicode(self.descriptions.get(lang)).format(**obj.default_description_context()) context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] context['news'] = Article.objects.news()\ .filter(publish_date__isnull=False, exposition=obj).order_by('-publish_date')[:3] context['recommend_expos'] = self.get_recommend_expos() return context def get_recommend_expos(self): """ Блок Также рекомендуем Здесь выводятся: выставки из топ-размещения в этой тематике; платные выставки из этой тематики; если первых двух нет, то выставки, наиболее похожие по фильтрам - в том же городе, в той же теме и похожими тегами. """ themes = [item.id for item in self.object.theme.all()] return Exposition.objects.language().filter( is_published=True ).filter( Q(top__isnull=False, theme__in=themes) | Q(paid_new__isnull=False, theme__in=themes) | Q(theme__in=themes) ).order_by('-data_begin')[:2] class ExpositionProgramme(JitterCacheMixin, MetadataMixin, DetailView): cache_range = [60*30, 60*60] model = Exposition slug_field = 'url' template_name = 'client/exposition/programm.html' queryset = Exposition.objects.language().select_related('place', 'city', 'country', 'paid_new') def get_context_data(self, **kwargs): context = super(ExpositionProgramme, self).get_context_data(**kwargs) obj = self.object context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] return context class ExpositionPrice(JitterCacheMixin, MetadataMixin, DetailView): cache_range = [60*30, 60*60] model = Exposition slug_field = 'url' template_name = 'client/exposition/price.html' queryset = Exposition.objects.language().select_related('place', 'city', 'country', 'paid_new') def get_context_data(self, **kwargs): context = super(ExpositionPrice, self).get_context_data(**kwargs) obj = self.object context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] return context class ExpositionStatistic(JitterCacheMixin, MetadataMixin, DetailView): cache_range = [60*30, 60*60] model = Exposition slug_field = 'url' template_name = 'client/exposition/statistic.html' queryset = Exposition.objects.language().select_related('place', 'city', 'country', 'paid_new') def get_context_data(self, **kwargs): context = super(ExpositionStatistic, self).get_context_data(**kwargs) obj = self.object context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] return context class ExpositionThankView(JitterCacheMixin, MetadataMixin, DetailView): cache_range = [60*30, 60*60] model = Exposition slug_field = 'url' template_name = 'client/service/thank_u_page.html' def get_context_data(self, **kwargs): context = super(ExpositionThankView, self).get_context_data(**kwargs) obj = self.object context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] return context def visit_redirect(request, slug): obj = get_object_or_404(Exposition, url=slug) redirect = obj.get_permanent_url() + 'price/' return HttpResponsePermanentRedirect(redirect) class ExpositionServiceView(JitterCacheMixin, MetadataMixin, FormMixin, DetailView): cache_range = [60*30, 60*60] model = Exposition slug_field = 'url' service = None success_url = '/service/thanks/' def dispatch(self, request, *args, **kwargs): service_url = self.kwargs.get('service_url') service = get_object_or_404(Service, url=service_url) self.service = service self.template_name = service.template return super(ExpositionServiceView, self).dispatch(request, *args, **kwargs) def post(self, request, *args, **kwargs): self.object = self.get_object() service_url = self.kwargs.get('service_url') service = get_object_or_404(Service, url=service_url) service_form = order_forms.get(service_url) self.form_class = service_form form = self.get_form(service_form) if form.is_valid(): return self.form_valid(form) else: return self.form_invalid(form) def get_context_data(self, **kwargs): kwargs.update({'meta_id': getattr(self.service, 'meta_id','')}) context = super(ExpositionServiceView, self).get_context_data(**kwargs) service_url = self.kwargs.get('service_url') form = order_forms.get(service_url) self.form_class = form if not form: raise Http404 context['form'] = self.get_form(self.form_class) context['service'] = self.service obj = self.get_object() context['object'] = obj context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] return context def form_valid(self, form): userlog = get_userlog_data(self.request) order = form.save(commit=False, userlog=userlog) order.exposition = self.object order.save() return HttpResponseRedirect(self.object.get_permanent_url()+'service/thanks/') def get_initial(self): """ Returns the initial data to use for forms on this view. """ if self.request.user.is_authenticated(): user = self.request.user initial = {'person_inf': user.get_full_name(), 'person': user.email, 'country': user.profile.country.name if user.profile.country else '', 'city':user.profile.city.name if user.profile.city else '', 'phone': user.profile.phone if user.profile.phone else ''} return initial else: return self.initial.copy() class ExpoList_(ExpoFilterMixin, ExpoSectionMixin, MetadataMixin, JitterCacheMixin, ListView): cache_range = [60*30, 60*60] model = Exposition paginate_by = settings.CLIENT_PAGINATION template_name = 'client/exposition/exposition_list.html' catalog_url = '/expo/' year = None month = None def get_queryset(self): MONTHES = settings.MONTHES if self.request.user.is_staff: qs = self.model.objects.upcoming() else: qs = self.model.enable.upcoming() year = self.kwargs.get('year') if year: qs = self.model.enable.filter(data_end__year=year) # info for breadscrumbs self.year = {'text': year, 'link': '%s%s/'%(self.catalog_url, year)} month = self.kwargs.get('month') if month and MONTHES.get(month): qs = qs.filter(data_begin__month=MONTHES[month]['value']) self.month = { 'text': MONTHES[month]['name'], 'link': '%s%s/%s/'%(self.catalog_url, year, month), 'slug': self.kwargs.get('month') } return qs def get_context_data(self, **kwargs): context = super(ExpoList_, self).get_context_data(**kwargs) context['catalog_url'] = self.catalog_url context['year'] = self.year context['month'] = self.month return context class ExpoList(ReverseOrderMixin, ExpoList_): pass class ExpoCatalog_(ExpoFilterMixin, ExpoSectionKindMixin, JitterCacheMixin, MetadataMixin, ListView): model = Exposition paginate_by = settings.CLIENT_PAGINATION template_name = 'client/exposition/catalog.html' filter_object = None year = None month = None country = None city = None def get_filtered_qs(self): # diferent for views pass def get_queryset(self): qs = self.get_filtered_qs() year = self.kwargs.get('year') if year: qs = self.model.enable.filter(data_end__year=year) filter_object = self.filter_object if isinstance(filter_object, Country): qs = qs.filter(country=filter_object) elif isinstance(filter_object, City): qs = qs.filter(city=filter_object) elif isinstance(filter_object, Theme): qs = qs.filter(theme=filter_object) if self.kwargs.get('country'): qs = qs.filter(country=self.kwargs.get('country')) if self.kwargs.get('city'): qs = qs.filter(city=self.kwargs.get('city')) elif isinstance(filter_object, Tag): qs = qs.filter(tag=filter_object) # info for breadscrumbs self.year = {'text': year, 'link': '%s%s/%s/'%(self.catalog_url, self.filter_object.url, year)} month = self.kwargs.get('month') monthes = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')}, 'mar': {'value': 3, 'name': _(u'Март')}, 'apr': {'value': 4, 'name': _(u'Апрель')}, 'may': {'value': 5, 'name': _(u'Май')}, 'jun': {'value': 6, 'name': _(u'Июнь')}, 'jul': {'value': 7, 'name': _(u'Июль')}, 'aug': {'value': 8, 'name': _(u'Август')}, 'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')}, 'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}} if month and monthes.get(month): qs = qs.filter(data_begin__month=monthes[month]['value']) self.month = { 'text': monthes[month]['name'], 'slug': '{m}/{y}'.format(m=monthes[month]['value'], y=year) } if self.country: self.month['link'] = '%s%s/country/%s/%s/%s/' %\ (self.catalog_url, self.filter_object.url, self.country.url, year, month) elif self.city: self.month['link'] = '%s%s/city/%s/%s/%s/' %\ (self.catalog_url, self.filter_object.url, self.city.url, year, month) else: self.month['link'] = '%s%s/%s/%s/' %\ (self.catalog_url, self.filter_object.url, year, month) return qs.order_by('data_begin') def get_context_data(self, **kwargs): context = super(ExpoCatalog_, self).get_context_data(**kwargs) context['filter_object'] = self.filter_object context['year'] = self.year context['month'] = self.month context['catalog_url'] = self.catalog_url if self.kwargs.get('tag'): context['tag_for_filter'] = self.kwargs['tag'] return context class ExpoCatalog(ReverseOrderMixin, ExpoCatalog_): pass class ExpoCountryCatalog(ExpoCatalog): catalog_url = '/expo/country/' stat_kind = 'country' def get_filtered_qs(self): #this method used in parent get_queryset slug = self.kwargs.get('slug') country = get_object_or_404(Country, url=slug) self.kwargs['country'] = country self.filter_object = country qs = self.model.enable.upcoming().filter(country=country) return qs def get_context_data(self, **kwargs): context = super(ExpoCountryCatalog, self).get_context_data(**kwargs) context['country'] = [str(self.kwargs['country'].id)] return context class ExpoCityCatalog(ExpoCatalog): catalog_url = '/expo/city/' stat_kind = 'city' def get_filtered_qs(self): #this method used in parent get_queryset slug = self.kwargs.get('slug') city = get_object_or_404(City, url=slug) self.kwargs['city'] = city qs = self.model.enable.upcoming().filter(city=city) self.filter_object = city return qs def get_context_data(self, **kwargs): context = super(ExpoCityCatalog, self).get_context_data(**kwargs) city = self.kwargs['city'] context['country'] = [str(city.country_id)] context['city'] = [str(city.id)] return context class ExpoThemeCatalog(ExpoCatalog): template_name = 'client/exposition/catalog_theme.html' catalog_url = '/expo/theme/' stat_kind = 'theme' country = None city = None def get_filtered_qs(self): #this method used in parent get_queryset slug = self.kwargs.get('slug') country_slug = self.kwargs.get('country_slug') city_slug = self.kwargs.get('city_slug') theme = get_object_or_404(Theme, url=slug) self.kwargs['theme'] = theme qs = self.model.enable.upcoming().filter(theme=theme) if country_slug: country = get_object_or_404(Country, url=country_slug) self.country = country self.kwargs['country'] = country qs = qs.filter(country=country) if city_slug: city = get_object_or_404(City, url=city_slug) self.city = city self.kwargs['city'] = city qs = qs.filter(city=city) self.filter_object = theme return qs def get_context_data(self, **kwargs): context = super(ExpoThemeCatalog, self).get_context_data(**kwargs) if self.country: context['country'] = self.country if self.city: context['city'] = self.city context['theme_for_filter'] = self.kwargs['theme'] context['themes'] = [str(self.kwargs['theme'].id)] return context class ExpoTagCatalog(ExpoCatalog): catalog_url = '/expo/tag/' stat_kind = 'tag' def get_filtered_qs(self): #this method used in parent get_queryset slug = self.kwargs.get('slug') tag = get_object_or_404(Tag, url=slug) self.kwargs['tag'] = tag qs = self.model.enable.upcoming().filter(tag=tag) self.filter_object = tag return qs def get_context_data(self, **kwargs): context = super(ExpoTagCatalog, self).get_context_data(**kwargs) tag = self.kwargs['tag'] context['theme_for_filter'] = tag.theme context['themes'] = [str(tag.theme.id)] context['tag'] = [str(self.kwargs['tag'].id)] return context class ExpoVisitors(MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION model = Exposition template_name = 'client/exposition/visitors.html' obj = None def get_queryset(self): slug = self.kwargs.get('slug') exposition = get_object_or_404(self.model, url=slug) self.obj = exposition self.object = self.obj return exposition.users.all() def get_context_data(self, **kwargs): context = super(ExpoVisitors, self).get_context_data(**kwargs) obj = self.obj context['object'] = obj context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] return context class ExpoMembers(MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION model = Exposition template_name = 'client/exposition/members.html' obj = None def get_queryset(self): slug = self.kwargs.get('slug') exposition = get_object_or_404(self.model, url=slug) self.obj = exposition self.object = self.obj return exposition.company.all() def get_context_data(self, **kwargs): context = super(ExpoMembers, self).get_context_data(**kwargs) obj = self.obj context['object'] = obj context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] return context class ExpoPhotoView(MetadataMixin, ListView): template_name = 'client/exposition/photo.html' obj = None paginate_by = settings.CLIENT_PAGINATION def get_queryset(self): slug = self.kwargs.get('slug') expo = get_object_or_404(Exposition, url=slug) self.object = expo if expo.photogallery: return expo.photogallery.photos.all() else: raise Http404() def get_context_data(self, **kwargs): context = super(ExpoPhotoView, self).get_context_data(**kwargs) obj = self.object context['object'] = obj context['city'] = str(obj.city_id) context['country'] = str(obj.country_id) context['themes'] = [str(item.id) for item in obj.theme.all()] return context def send_to_organiser(request, slug): exposition = get_object_or_404(Exposition, url=slug) mail_send = 'evm@expomap.ru' data = { 'expo_name': exposition.name, 'name': request.POST.get('person_inf'), 'email': request.POST.get('person'), 'phone': request.POST.get('phone', ''), 'question': request.POST.get('question', ''), } text = _(u"выставка: %(expo_name)s\n Контактное лицо:%(name)s\nEmail: %(email)s\nтелефон:%(phone)s\n вопрос:%(question)s") % data msg = EmailMessage(_(u'Проплаченная выставка'), text, settings.DEFAULT_FROM_EMAIL, [mail_send]) msg.content_subtype = "html" msg.send() redirect_to = '%sservice/thanks/'%exposition.get_permanent_url() return HttpResponse(json.dumps({'success':True, 'redirect_to': redirect_to}), content_type='application/json')