# -*- 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 DetailView from functions.custom_views import ListView from django.views.generic.edit import FormMixin from django.utils.translation import ugettext as _ from django.utils import translation from service.models import Service from service.views import order_forms 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 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' 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['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 def get_context_data(self, **kwargs): context = super(ConferenceCountryCatalog, self).get_context_data(**kwargs) context['country'] = str(self.kwargs['country'].id) return context 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 def get_context_data(self, **kwargs): context = super(ConferenceCityCatalog, self).get_context_data(**kwargs) context['city'] = str(self.kwargs['city'].id) return context 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 context['theme_for_filter'] = self.kwargs['theme'] context['themes'] = [str(self.kwargs['theme'].id)] 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 def get_context_data(self, **kwargs): context = super(ConferenceTagCatalog, 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 ConferenceVisitors(MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION model = Conference template_name = 'client/conference/visitors.html' obj = None 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) 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 ConferenceMembers(MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION model = Conference template_name = 'client/conference/members.html' obj = None 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) 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 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 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): 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() 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 ConferenceList(MetadataMixin, JitterCacheMixin, ListView): cache_range = settings.CACHE_RANGE model = Conference paginate_by = settings.CLIENT_PAGINATION template_name = 'client/conference/conference_list.html' 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['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')