# -*- coding: utf-8 -*- import json import datetime from django.http import HttpResponseRedirect, HttpResponse from django.contrib import messages from django.contrib.contenttypes.models import ContentType from django.conf import settings from django.views.generic import ListView, DetailView from django.utils.translation import ugettext as _ from django.shortcuts import get_object_or_404, render_to_response from django.http import Http404 from django.utils import translation #models from accounts.models import User from models import Exposition from service.views import order_forms from service.models import Service from country.models import Country from city.models import City from theme.models import Theme, Tag from note.models import Note from service.order_forms import AdvertiseForm from functions.search_forms import ExpositionSearchForm from functions.custom_views import ExpoSearchView from meta.views import MetadataMixin from functions.cache_mixin import JitterCacheMixin, CacheMixin class ExpositionBy(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 = settings.CACHE_RANGE model = Country title1 = _(u'По странам') title2 = _(u'Выставки мира по странам') catalog = 'country/' 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 = settings.CACHE_RANGE model = Theme title1 = _(u'По тематикам') title2 = _(u'Выставки мира по тематикам') catalog = '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 = settings.CACHE_RANGE model = Tag title1 = _(u'По тегам') title2 = _(u'Выставки мира по тегам') catalog = 'tag/' def get_queryset(self): return self.model.active.expo_themes_with_count() class ExpositionByCity(ExpositionBy): cache_range = settings.CACHE_RANGE model = City title1 = _(u'По городам') title2 = _(u'Выставки мира по городам') catalog = 'city/' 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(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') 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(JitterCacheMixin, MetadataMixin, DetailView): cache_range = settings.CACHE_RANGE model = Exposition slug_field = 'url' template_name = 'client/exposition/exposition_detail.html' def get_context_data(self, **kwargs): context = super(ExpoDetail, self).get_context_data(**kwargs) context['advertising_form'] = AdvertiseForm() return context class ExpositionProgramme(MetadataMixin, DetailView): model = Exposition slug_field = 'url' template_name = 'client/exposition/programm.html' class ExpositionPrice(MetadataMixin, DetailView): model = Exposition slug_field = 'url' template_name = 'client/exposition/price.html' class ExpositionStatistic(MetadataMixin, DetailView): model = Exposition slug_field = 'url' template_name = 'client/exposition/statistic.html' from django.views.generic.edit import FormMixin, ModelFormMixin class ExpositionThankView(MetadataMixin, DetailView): model = Exposition slug_field = 'url' template_name = 'client/service/thank_u_page.html' class ExpositionServiceView(MetadataMixin, FormMixin, DetailView): 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 context['object'] = self.get_object() return context def form_valid(self, form): order = form.save(commit=False) 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(MetadataMixin, JitterCacheMixin, ListView): cache_range = settings.CACHE_RANGE model = Exposition paginate_by = settings.CLIENT_PAGINATION template_name = 'client/exposition/exposition_list.html' search_form = ExpositionSearchForm catalog_url = '/expo/' year = None month = None def get_queryset(self): 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)} return qs def get_context_data(self, **kwargs): context = super(ExpoList, self).get_context_data(**kwargs) context['month'] = self.month context['catalog_url'] = self.catalog_url context['search_form'] = self.search_form context['year'] = self.year context['month'] = self.month return context MONTHES = settings.MONTHES class ExpoCatalog(MetadataMixin, ListView): model = Exposition paginate_by = settings.CLIENT_PAGINATION template_name = 'exposition/catalog.html' search_form = ExpositionSearchForm filter_object = None year = None month = None country = None city = None paid = 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']) if self.country: self.month = {'text': monthes[month]['name'], 'link': '%s%s/country/%s/%s/%s/'% (self.catalog_url, self.filter_object.url, self.country.url, year, month)} elif self.city: self.month = {'text': monthes[month]['name'], 'link': '%s%s/city/%s/%s/%s/'% (self.catalog_url, self.filter_object.url, self.city.url, year, month)} else: self.month = {'text': monthes[month]['name'], '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) if self.paid: context['paid'] = self.paid context['search_form'] = self.search_form 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 ExpoCountryCatalog(ExpoCatalog): catalog_url = '/expo/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 class ExpoCityCatalog(ExpoCatalog): catalog_url = '/expo/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 class ExpoThemeCatalog(ExpoCatalog): template_name = 'client/exposition/catalog_theme.html' catalog_url = '/expo/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).exclude(paid__isnull=False) paid= list(self.model.enable.filter(theme=theme).filter(paid__isnull=False)) if paid: self.paid = paid 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'] return context class ExpoTagCatalog(ExpoCatalog): catalog_url = '/expo/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).exclude(paid__isnull=False) paid= list(self.model.enable.filter(tag=tag).filter(paid__isnull=False)) if paid: self.paid = paid self.filter_object = tag return qs class ExpoVisitors(MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION model = Exposition #template_name = 'event_visitors.html' template_name = 'client/exposition/visitors.html' obj = None search_form = ExpositionSearchForm 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) context['object'] = self.obj context['search_form'] = self.search_form return context class ExpoMembers(MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION model = Exposition #template_name = 'event_visitors.html' template_name = 'client/exposition/members.html' obj = None search_form = ExpositionSearchForm 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) context['object'] = self.obj context['search_form'] = self.search_form return context def add_note(request, slug): args = {'success': False} if request.user.is_authenticated(): if request.GET: text = request.GET['note_text'] try: e = Exposition.objects.get(url=slug) except Exposition.DoesNotExist: raise Http404 ct = ContentType.objects.get_for_model(e) object_id = e.id user = User.objects.get(id=request.user.id) if Note.objects.filter(user=user, content_type=ct, object_id=object_id).exists(): Note.objects.filter(user=user, content_type=ct, object_id=object_id).update(text=text) else: Note.objects.create(content_type=ct, object_id=object_id, user=user, text=text) user.calendar.expositions.add(e) args['success'] = True args['text'] = text else: args['not_authorized'] = True args['success'] = True return HttpResponse(json.dumps(args), content_type='application/json') from django.core.mail import send_mail from django.core.mail import EmailMessage def send_to_organiser(request, slug): exposition = get_object_or_404(Exposition, url=slug) mail_send = exposition.paid.organiser name = request.POST.get('person_inf') email = request.POST.get('person') phone = request.POST.get('phone', '') question = request.POST.get('question', '') text = u"выставка: %s\n Контактное лицо:%s\nEmail: %s\nтелефон:%s\n вопрос:%s"%(exposition.name, name, email, phone, question) 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')