# -*- 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 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 functions.custom_views import ExpoSearchView from functions.search_forms import ExpositionSearchForm from functions.custom_views import ExpoSearchView class ExpositionBy(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): model = Country title1 = _(u'По странам') title2 = _(u'Выставки мира по странам') catalog = 'country/' def get_queryset(self): 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): model = Theme title1 = _(u'По тематикам') title2 = _(u'Выставки мира по тематикам') catalog = 'theme/' def get_queryset(self): 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 ExpositionByCity(ExpositionBy): model = City title1 = _(u'По городам') title2 = _(u'Выставки мира по городам') catalog = 'city/' def get_queryset(self): 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 = '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 """ if exp: exp.users.add(user) args['success'] = True """ else: args['not_authorized'] = True args['success'] = True return HttpResponse(json.dumps(args), content_type='application/json') #------------------------------------------------------------------------------ class ExpoDetail(DetailView): model = Exposition slug_field = 'url' template_name = 'client/exposition/exposition_detail.html' class ExpositionProgramme(DetailView): model = Exposition slug_field = 'url' template_name = 'client/exposition/programm.html' class ExpositionPrice(DetailView): model = Exposition slug_field = 'url' template_name = 'client/exposition/price.html' class ExpositionStatistic(DetailView): model = Exposition slug_field = 'url' template_name = 'client/exposition/statistic.html' from django.views.generic.edit import FormMixin, ModelFormMixin class ExpositionServiceView(FormMixin, DetailView): model = Exposition slug_field = 'url' service = None 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): context = super(ExpositionServiceView, self).get_context_data(**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 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'] = service context['object'] = self.get_object() return context def form_valid(self, form): order = form.save(commit=False) order.exposition = self.object order.save() messages.success(self.request, _(u'Ваш запрос был успешно отправлен')) return HttpResponseRedirect(self.request.path) 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(ListView): 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: now = datetime.datetime.now().date() qs = self.model.objects.filter(data_begin__gte=now).order_by('data_begin') else: qs = self.model.enable.all() year = self.kwargs.get('year') if year: qs = qs.filter(data_begin__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 = {'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'Декабрь')}} class ExpoCatalog(ListView): model = Exposition paginate_by = settings.CLIENT_PAGINATION template_name = 'exposition/catalog.html' search_form = ExpositionSearchForm filter_object = None year = None month = 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 = qs.filter(data_begin__year=year) # 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'], '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['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 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.filter_object = country qs = self.model.enable.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) qs = self.model.enable.filter(city=city) self.filter_object = city return qs class ExpoThemeCatalog(ExpoCatalog): catalog_url = '/expo/theme/' def get_filtered_qs(self): #this method used in parent get_queryset slug = self.kwargs.get('slug') theme = get_object_or_404(Theme, url=slug) qs = self.model.enable.filter(theme=theme) self.filter_object = theme return qs 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) qs = self.model.enable.filter(tag=tag) self.filter_object = tag return qs class ExpoVisitors(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 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(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 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')