# -*- coding: utf-8 -*- import json import random from django.shortcuts import render_to_response, get_object_or_404, HttpResponse from django.http import HttpResponseRedirect from django.core.context_processors import csrf from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.contrib.auth.decorators import login_required from django.forms.formsets import formset_factory from django.forms.models import modelformset_factory from django.utils.translation import get_language from django.views.decorators.csrf import csrf_exempt from haystack.query import SearchQuerySet from functions.custom_views import objects_list, delete_object from functions.views_help import get_referer from functions.admin_views import AdminView, AdminListView from functions.http import JsonResponse from exposition.admin import get_by_lang from forms import ExpositionForm, PlaceExpositionFormDelete, HallForm, PlaceExpositionFilter from models import PlaceExposition, Hall from city.models import City from file.models import FileModel, TmpFile from file.forms import FileModelForm, FileForm from photologue.admin import upload_photo from place_conference.models import PlaceConference from place_exposition.models import PlaceExposition def exposition_all(request): """ Return list of all place_expositions with pagination """ return objects_list(request, PlaceExposition, 'place_exposition_all.html') @login_required def place_exposition_copy(request, url): place_exposition = PlaceExposition.objects.safe_get(url=url) if not place_exposition: return HttpResponseRedirect(get_referer(request)) else: place_exposition.clone() return HttpResponseRedirect(get_referer(request)) @login_required def exposition_add(request): """ Returns form of place_exposition and formset of pavilions and post it on the server. If forms is posted redirect on the page of all place_expositions. """ #formset of HallForm HallFormSet = formset_factory(HallForm) if request.POST.get('key'): key = request.POST['key'] else: key = random.getrandbits(128) file_form = FileModelForm(initial={'key': key}) if request.POST: form = ExpositionForm(request.POST) #set choices filled by ajax form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] formset = HallFormSet(request.POST) if form.is_valid() and formset.is_valid(): place_exposition = form.save() for item in formset.forms: #saves forms if its valid and not empty if item.is_valid() and item.has_changed(): hall = item.save(commit=False) hall.place_exposition = place_exposition hall.save() return HttpResponseRedirect('/admin/place_exposition/all') else: form = ExpositionForm(initial={'key': key}) formset = HallFormSet() args = {} args.update(csrf(request)) args['languages'] = settings.LANGUAGES args['form'] = form args['formset'] = formset args['file_form'] = file_form args['files'] = TmpFile.objects.filter(key=key) return render_to_response('place_exposition_add.html', args) def exposition_delete(request, url): return delete_object(request, PlaceExposition, PlaceExpositionFormDelete, url, '/admin/place_exposition/all') @login_required def exposition_change(request, url): """ Return form of place_expositions and formset of pavilions and fill it with existing PlaceExposition and Pavilion object data. If form of conference is posted redirect on the page of all conferences. """ try: #check if exposition_id exists else redirect to the list of place of conference place = PlaceExposition.objects.get(url=url) exposition_id = getattr(place, 'id') file_form = FileModelForm(initial={'model': 'place_exposition.PlaceExposition'}) except: return HttpResponseRedirect('/admin/place_exposition/all') if request.POST: #formset of HallForm HallFormSet = formset_factory(HallForm) form = ExpositionForm(request.POST) #set choices filled by ajax form.fields['city'].widget.attrs['data-init-text'] =City.objects.get(id=request.POST['city']).name formset = HallFormSet(request.POST) if form.is_valid() and formset.is_valid(): place_exposition = form.save(exposition_id) #delete old halls Hall.objects.filter(place_exposition=getattr(place, 'id')).delete() for item in formset.forms: #saves new halls if its valid and not empty if item.is_valid() and item.has_changed(): hall = item.save(commit=False) hall.place_exposition = place_exposition hall.save() return HttpResponseRedirect('/admin/place_exposition/all') else: #initial HallFormSet HallFormSet = modelformset_factory(Hall, form=HallForm, exclude=('place_exposition',)) #fill form with data from database data= {'type': place.type, 'address': place.address, 'phone': place.phone, 'fax': place.fax, 'web_page': place.web_page, 'email': place.email, 'foundation_year': place.foundation_year, 'total_area': place.total_area, 'closed_area': place.closed_area, 'open_area': place.open_area, 'total_pavilions': place.total_pavilions, 'total_halls': place.total_halls, 'wifi':place.wifi, 'bank': place.bank, 'children_room': place.children_room, 'disabled_service': place.disabled_service, 'conference_centre': place.conference_centre, 'business_centre': place.business_centre, 'online_registration': place.online_registration, 'cafe': place.cafe, 'terminals': place.terminals, 'parking': place.parking, 'press_centre': place.press_centre, 'mobile_application': place.mobile_application, 'place_exposition_id':place.id} if place.country: data['country'] = place.country.id data['city'] = place.city.id #data from translated fields for code, name in settings.LANGUAGES: obj = PlaceExposition._meta.translations_model.objects.get(language_code = code,master__id=exposition_id) #access to translated fields data['name_%s'%code] = obj.name data['main_title_%s'%code] = obj.main_title data['description_%s'%code] = obj.description data['adress_%s'%code] = obj.adress data['total_year_action_%s'%code] = obj.total_year_action data['title_%s'%code] = obj.title data['keywords_%s'%code] = obj.keywords data['descriptions_%s'%code] = obj.descriptions form = ExpositionForm(initial=data) form.fields['city'].widget.attrs['data-init-text'] = place.city.name #set choices filled by ajax #form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] #get existing halls halls = Hall.objects.filter(place_exposition=getattr(place, 'id')) #fill HallFormSet formset = HallFormSet(queryset=halls) args = {} args.update(csrf(request)) args['languages'] = settings.LANGUAGES args['form'] = form args['formset'] = formset args['file_form'] = file_form #get list of files which connected with specific model object args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(place), object_id=getattr(place, 'id')) args['obj_id'] = exposition_id args['object'] = place return render_to_response('place_exposition_add.html', args) #new---------------------- class PlaceExpositionView(AdminView): form_class = ExpositionForm model = PlaceExposition success_url = '/admin/place_exposition/all/' template_name = 'c_admin/place_exposition/place_exposition.html' def get_form(self, form_class): if self.request.POST: return super(PlaceExpositionView, self).get_form(form_class) obj = self.set_obj() if obj: data = {'type': obj.type, 'address': obj.address, 'phone': obj.phone, 'fax': obj.fax, 'web_page': obj.web_page, 'email': obj.email, 'foundation_year': obj.foundation_year, 'total_area': obj.total_area, 'closed_area': obj.closed_area, 'open_area': obj.open_area, 'total_pavilions': obj.total_pavilions, 'total_halls': obj.total_halls, 'wifi':obj.wifi, 'bank': obj.bank, 'children_room': obj.children_room, 'disabled_service': obj.disabled_service, 'conference_centre': obj.conference_centre, 'business_centre': obj.business_centre, 'online_registration': obj.online_registration, 'cafe': obj.cafe, 'terminals': obj.terminals, 'parking': obj.parking, 'press_centre': obj.press_centre, 'mobile_application': obj.mobile_application, 'place_exposition_id':obj.id, 'logo': obj.logo} data['country'] = obj.country_id data['city'] = obj.city_id for code, name in settings.LANGUAGES: trans_obj = self.model._meta.translations_model.objects.get(language_code = code,master__id=obj.id) #access to translated fields data['name_%s'%code] = trans_obj.name data['main_title_%s'%code] = trans_obj.main_title data['description_%s'%code] = trans_obj.description data['adress_%s'%code] = trans_obj.adress data['total_year_action_%s'%code] = trans_obj.total_year_action data['title_%s'%code] = trans_obj.title data['keywords_%s'%code] = trans_obj.keywords data['descriptions_%s'%code] = trans_obj.descriptions form =form_class(initial=data) form.fields['city'].widget.attrs['data-init-text'] = obj.city.name return form else: return form_class() def get_context_data(self, **kwargs): context = super(PlaceExpositionView, self).get_context_data(**kwargs) obj = self.set_obj() if obj: context['file_form'] = FileForm(initial={'model': 'place_exposition.PlaceExposition'}) files = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(obj),object_id=getattr(obj, 'id')) context['files'] = files context['halls'] = list(Hall.objects.language().filter(place_exposition=self.obj)) context['hall_form'] = HallForm() return context def add_hall(request, place_id): place = get_object_or_404(PlaceExposition, pk=place_id) form = HallForm(request.POST) response = {'success': False} if form.is_valid(): form.save(place) response['success'] = True else: response.update({'errors':form.errors}) return HttpResponse(json.dumps(response), content_type='application/json') def delete_hall(request, hall_id): hall = get_object_or_404(Hall, pk=hall_id) hall.delete() response = {'success': True} return HttpResponse(json.dumps(response), content_type='application/json') class PlaceExpositionListView(AdminListView): template_name = 'c_admin/place_exposition/place_exposition_list.html' form_class = PlaceExpositionFilter model = PlaceExposition @csrf_exempt def upload_place_photo(request, place_id): return upload_photo(request, place_id, PlaceExposition) def edit_hall(request, place_url, hall_id): place = get_object_or_404(PlaceExposition, url=place_url) hall = get_object_or_404(Hall, id=hall_id) if request.POST: form = HallForm(request.POST) if form.is_valid(): form.save(place, hall_id) return HttpResponseRedirect('/admin/place_exposition/%s/'%place.url) else: data = {'capacity': hall.capacity, 'number': hall.number} for code, name in settings.LANGUAGES: trans_obj = Hall._meta.translations_model.objects.get(language_code = code, master__id=hall.id) #access to translated fields data['name_%s'%code] = trans_obj.name form = HallForm(initial=data) context = {'form': form, 'languages': settings.LANGUAGES} context.update(csrf(request)) return render_to_response('c_admin/place_exposition/hall.html', context) def search_place(request): pk_prefixes = {'placeconference': 'c', 'placeexposition': 'e'} term = request.GET.get('term') lang = get_language() if not term: qs = SearchQuerySet().models(PlaceExposition, PlaceConference).order_by('text')[:30] else: qs = SearchQuerySet().models(PlaceExposition, PlaceConference).autocomplete(content_auto=term.capitalize()).order_by('text')[:30] result = [] for item in qs: label = get_by_lang(item, 'name', lang) if label: result.append({'id': pk_prefixes.get(item.model_name) + str(item.pk), 'label': label}) return JsonResponse(json.dumps(result), content_type='application/json', safe=False)