# -*- coding: utf-8 -*- import json import datetime from django.conf import settings from django.http import HttpResponse, Http404, HttpResponseRedirect, HttpResponsePermanentRedirect from django.contrib import messages from django.shortcuts import get_object_or_404 from django.contrib.contenttypes.models import ContentType from django.views.generic import ListView, DetailView from django.views.generic.edit import FormMixin from django.utils.translation import ugettext as _ from django.utils import translation from note.models import Note from models import Conference from accounts.models import User from country.models import Country from city.models import City from theme.models import Theme, Tag from service.order_forms import AdvertiseForm from functions.search_forms import ExpositionSearchForm from meta.views import MetadataMixin from functions.cache_mixin import JitterCacheMixin, CacheMixin MONTHES = settings.MONTHES class ConferenceBy(JitterCacheMixin, MetadataMixin, ListView): cache_range = settings.CACHE_RANGE template_name = 'conference/conference_by.html' title1 = '' title2 = '' """ abstact class """ def get_context_data(self, **kwargs): context = super(ConferenceBy, self).get_context_data(**kwargs) context.update({'title1': self.title1, 'title2': self.title2, 'catalog': self.catalog}) return context class ConferenceByCountry(ConferenceBy): model = Country title1 = _(u'По странам') title2 = _(u'Коференции мира по странам') catalog = 'country/' def get_queryset(self): return self.model.objects.conference_countries_with_count() #lang = translation.get_language() #return self.model.objects.select_related('conference_country')\ # .filter(conference_country__country__isnull=False, translations__language_code=lang)\ # .order_by('translations__name').distinct() class ConferenceByTag(ConferenceBy): model = Tag title1 = _(u'По тегам') title2 = _(u'Коференции мира по тегам') catalog = 'tag/' def get_queryset(self): return self.model.active.conference_themes_with_count() class ConferenceByTheme(ConferenceBy): model = Theme title1 = _(u'По тематикам') title2 = _(u'Коференции мира по тематикам') catalog = 'theme/' def get_queryset(self): return self.model.active.conference_themes_with_count() #lang = translation.get_language() #return self.model.objects.select_related('conference_themes')\ # .filter(conference_themes__theme__isnull=False, translations__language_code=lang)\ # .order_by('translations__name').distinct() class ConferenceByCity(ConferenceBy): model = City title1 = _(u'По городам') title2 = _(u'Коференции мира по городам') catalog = 'city/' def get_queryset(self): return self.model.used.conference_cities_with_count() #lang = translation.get_language() #return self.model.objects.select_related('conference_city')\ # .filter(conference_city__city__isnull=False, translations__language_code=lang)\ # .order_by('translations__name').distinct() class ConferenceCatalog(JitterCacheMixin, MetadataMixin, ListView): cache_range = settings.CACHE_RANGE model = Conference paginate_by = settings.CLIENT_PAGINATION template_name = 'client/conference/catalog.html' search_form = ExpositionSearchForm 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']) 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(ConferenceCatalog, 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 ConferenceCountryCatalog(ConferenceCatalog): catalog_url = '/conference/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 ConferenceCityCatalog(ConferenceCatalog): catalog_url = '/conference/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 ConferenceThemeCatalog(ConferenceCatalog): template_name = 'conference/catalog_theme.html' catalog_url = '/conference/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 qs = qs.filter(country=country) if city_slug: city = get_object_or_404(City, url=city_slug) self.city = city qs = qs.filter(city=city) self.filter_object = theme return qs def get_context_data(self, **kwargs): context = super(ConferenceThemeCatalog, self).get_context_data(**kwargs) if self.country: context['country'] = self.country if self.city: context['city'] = self.city return context class ConferenceTagCatalog(ConferenceCatalog): catalog_url = '/conference/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 class ConferenceVisitors(MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION model = Conference #template_name = 'event_visitors.html' template_name = 'client/conference/visitors.html' obj = None search_form = ExpositionSearchForm def get_queryset(self): slug = self.kwargs.get('slug') conference = get_object_or_404(self.model, url=slug) self.obj = conference return conference.users.all() def get_context_data(self, **kwargs): context = super(ConferenceVisitors, self).get_context_data(**kwargs) context['object'] = self.obj context['search_form'] = self.search_form return context class ConferenceMembers(MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION model = Conference #template_name = 'event_visitors.html' template_name = 'client/conference/members.html' obj = None search_form = ExpositionSearchForm def get_queryset(self): slug = self.kwargs.get('slug') conference = get_object_or_404(self.model, url=slug) self.obj = conference return conference.company.all() def get_context_data(self, **kwargs): context = super(ConferenceMembers, self).get_context_data(**kwargs) context['object'] = self.obj context['search_form'] = self.search_form return context from service.models import Service from service.views import order_forms class ConferenceThankView(MetadataMixin, DetailView): model = Conference slug_field = 'url' template_name = 'client/service/thank_u_page.html' def visit_redirect(request, slug): obj = get_object_or_404(Conference, url=slug) redirect = obj.get_permanent_url() return HttpResponsePermanentRedirect(redirect) class ConferenceServiceView(FormMixin, DetailView): model = Conference slug_field = 'url' service = None success_url = '/service/thanks/' 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(ConferenceServiceView, 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.conference = self.object order.save() messages.success(self.request, _(u'Ваш запрос был успешно отправлен')) 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 ConferenceDetail(JitterCacheMixin, DetailView): cache_range = settings.CACHE_RANGE model = Conference slug_field = 'url' template_name = 'client/conference/conference_detail.html' def dispatch(self, request, *args, **kwargs): slug = self.kwargs.get(self.slug_url_kwarg, None) try: city = City.objects.get(old_url=slug) return HttpResponseRedirect('/conference/city/%s/'%city.url) except City.DoesNotExist: return super(ConferenceDetail, self).dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super(ConferenceDetail, self).get_context_data(**kwargs) context['advertising_form'] = AdvertiseForm() return context class ConferenceList(MetadataMixin, JitterCacheMixin, ListView): cache_range = settings.CACHE_RANGE model = Conference paginate_by = settings.CLIENT_PAGINATION template_name = 'client/conference/conference_list.html' search_form = ExpositionSearchForm catalog_url = '/conference/' 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(ConferenceList, 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 def conference_add_calendar(request, id): args = {'success': False} user = request.user if user.is_authenticated(): conf = Conference.objects.safe_get(id=id) if conf in user.calendar.get_confs(): user.calendar.conferences.remove(conf) args['in'] = False else: user.calendar.conferences.add(conf) args['in'] = True args['success'] = True else: args['not_authorized'] = True args['success'] = True return HttpResponse(json.dumps(args), content_type='application/json') def conference_visit(request, id): args = {'success': False} user = request.user if user.is_authenticated(): conf = Conference.objects.safe_get(id=id) if user in conf.users.all(): conf.users.remove(user) args['in'] = False else: conf.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') def add_note(request, slug): args = {'success': False} if request.user.is_authenticated(): if request.GET: text = request.GET['note_text'] try: conf = Conference.objects.get(url=slug) except Conference.DoesNotExist: raise Http404 ct = ContentType.objects.get_for_model(conf) object_id = conf.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.conferences.add(conf) args['success'] = True args['text'] = text else: args['not_authorized'] = True args['success'] = True return HttpResponse(json.dumps(args), content_type='application/json')