From 3a48602148763011b7bfeefda4489d1303219fdd Mon Sep 17 00:00:00 2001 From: Nazar Kotjuk Date: Tue, 19 Nov 2013 01:12:10 +0200 Subject: [PATCH] change vievs fix bug with deleting files fix bug with LocationField --- article/admin.py | 103 +++++++++- article/admin2.py | 9 + article/urls.py | 2 +- article/views.py | 100 ---------- city/admin.py | 93 ++++++++- city/admin2.py | 9 + city/urls.py | 2 +- city/views.py | 92 --------- company/admin.py | 110 ++++++++++- company/admin2.py | 9 + company/urls.py | 2 +- company/views.py | 109 ----------- conference/admin.py | 145 ++++++++++++++ file/views.py => conference/admin2.py | 0 conference/urls.py | 2 +- conference/views.py | 145 -------------- country/admin.py | 110 ++++++++++- country/admin2.py | 16 ++ country/urls.py | 2 +- country/views.py | 106 ----------- directories/admin.py | 21 +- directories/admin2.py | 7 + directories/views.py | 18 -- exposition/admin.py | 149 ++++++++++++++- exposition/admin2.py | 9 + exposition/urls.py | 2 +- exposition/views.py | 146 -------------- file/admin.py | 13 -- file/admin2.py | 13 ++ file/forms.py | 4 +- functions/custom_fields.py | 26 +-- functions/files.py | 5 +- news/admin.py | 164 +++++++++++++++- news/admin2.py | 9 + news/urls.py | 2 +- news/views.py | 163 ---------------- organiser/admin.py | 118 +++++++++++- organiser/admin2.py | 9 + organiser/urls.py | 4 +- organiser/views.py | 117 ------------ place_conference/admin.py | 172 ++++++++++++++++- place_conference/admin2.py | 10 + place_conference/forms.py | 13 +- place_conference/urls.py | 4 +- place_conference/views.py | 169 ----------------- place_exposition/admin.py | 179 +++++++++++++++++- place_exposition/admin2.py | 9 + place_exposition/urls.py | 4 +- place_exposition/views.py | 176 ----------------- proj/{admin.py => admin2.py} | 0 proj/admin_urls.py | 5 +- proj/views.py | 17 +- seminar/admin.py | 138 ++++++++++++++ seminar/admin2.py | 0 seminar/urls.py | 4 +- seminar/views.py | 138 -------------- service/admin.py | 115 ++++++++++- service/admin2.py | 9 + service/urls.py | 4 +- service/views.py | 114 ----------- static/custom_js/file_delete_ajax.js | 11 -- static/custom_js/file_post_ajax.js | 26 ++- templates/admin/article/article_add.html | 1 - templates/admin/city/city_add.html | 1 - templates/admin/company/company_add.html | 1 - .../admin/conference/conference_add.html | 1 - templates/admin/country/country_add.html | 1 - .../admin/exposition/exposition_add.html | 1 - templates/admin/news/news_add.html | 1 - templates/admin/organiser/organiser_add.html | 1 - .../place_conference_add.html | 1 - .../place_exposition_add.html | 1 - templates/admin/seminar/seminar_add.html | 1 - .../admin/translator/translator_add.html | 1 - templates/admin/webinar/webinar_add.html | 1 - templates/file_list.html | 17 -- theme/admin.py | 120 ++++++++++-- theme/admin2.py | 19 ++ theme/urls.py | 4 +- theme/views.py | 113 ----------- translator/{views.py => admin.py} | 0 translator/urls.py | 2 +- webinar/admin.py | 121 +++++++++++- webinar/admin2.py | 9 + webinar/urls.py | 2 +- webinar/views.py | 120 ------------ 86 files changed, 2005 insertions(+), 2017 deletions(-) create mode 100644 article/admin2.py delete mode 100644 article/views.py create mode 100644 city/admin2.py delete mode 100644 city/views.py create mode 100644 company/admin2.py delete mode 100644 company/views.py rename file/views.py => conference/admin2.py (100%) delete mode 100644 conference/views.py create mode 100644 country/admin2.py delete mode 100644 country/views.py create mode 100644 directories/admin2.py delete mode 100644 directories/views.py create mode 100644 exposition/admin2.py delete mode 100644 exposition/views.py create mode 100644 file/admin2.py create mode 100644 news/admin2.py delete mode 100644 news/views.py create mode 100644 organiser/admin2.py delete mode 100644 organiser/views.py create mode 100644 place_conference/admin2.py delete mode 100644 place_conference/views.py create mode 100644 place_exposition/admin2.py delete mode 100644 place_exposition/views.py rename proj/{admin.py => admin2.py} (100%) create mode 100644 seminar/admin2.py delete mode 100644 seminar/views.py create mode 100644 service/admin2.py delete mode 100644 service/views.py delete mode 100644 static/custom_js/file_delete_ajax.js create mode 100644 theme/admin2.py delete mode 100644 theme/views.py rename translator/{views.py => admin.py} (100%) create mode 100644 webinar/admin2.py delete mode 100644 webinar/views.py diff --git a/article/admin.py b/article/admin.py index 7bd07ef3..a82470ef 100644 --- a/article/admin.py +++ b/article/admin.py @@ -1,9 +1,100 @@ # -*- coding: utf-8 -*- -from hvad.admin import TranslatableAdmin -from django.contrib import admin -from models import Article +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponseRedirect +from django.core.context_processors import csrf +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.contrib.contenttypes.models import ContentType +#models and forms +from forms import ArticleForm, ArticleDeleteForm, Article +from theme.models import Tag +from file.models import FileModel, TmpFile +from file.forms import FileModelForm -class ArticleAdmin(TranslatableAdmin): - pass +#custom views +from functions.custom_views import objects_list, add_object_with_file, delete_object -admin.site.register(Article, ArticleAdmin) \ No newline at end of file + +def article_all(request): + """ + Return list of all articles with pagination + """ + return objects_list(request, Article, 'article_all.html') + +def article_add(request): + """ + Return form of article and post it on the server. + + If form is posted redirect on the page of all articles. + """ + #get organiser from current user + init_data = {'author':request.user.organiser} + #choices field which will be filled by ajax + choices = {'tag': Tag} + return add_object_with_file(request, ArticleForm, 'article_add.html', '/admin/article/all', + choices, init_data) + + +def article_delete(request, url): + return delete_object(request, Article, ArticleDeleteForm, url, '/admin/article/all') + + +@login_required +def article_change(request, url): + """ + Return form and fill it with existing Article object data. + + If form is posted redirect on the page of all articles. + """ + try: + #check if article_id exists else redirect to the list of cities + article = Article.objects.get(url=url) + file_form = FileModelForm(initial={'model': 'article.Article'}) + article_id = getattr(article, 'id') + except: + return HttpResponseRedirect('/admin/article/all') + + if request.POST: + form = ArticleForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + + if form.is_valid(): + form.save(getattr(article, 'id')) + return HttpResponseRedirect('/admin/article/all') + else: + data = {} + #fill form with data from database + data['author'] = article.user + data['theme'] = [item.id for item in article.theme.all()] + data['tag'] = [item.id for item in article.tag.all()] + #hidden field + data['article_id'] = article_id + + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields + data['main_title_%s' % code] = obj.main_title + data['preview_%s' % code] = obj.preview + data['description_%s' % code] = obj.description + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + #fill form + form = ArticleForm(initial=data) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + 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(article), object_id=getattr(article, 'id')) + args['obj_id'] = getattr(article, 'id') + + + return render_to_response('article_add.html', args) diff --git a/article/admin2.py b/article/admin2.py new file mode 100644 index 00000000..7bd07ef3 --- /dev/null +++ b/article/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from hvad.admin import TranslatableAdmin +from django.contrib import admin +from models import Article + +class ArticleAdmin(TranslatableAdmin): + pass + +admin.site.register(Article, ArticleAdmin) \ No newline at end of file diff --git a/article/urls.py b/article/urls.py index 49bec39f..3af9b30b 100644 --- a/article/urls.py +++ b/article/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, url -urlpatterns = patterns('article.views', +urlpatterns = patterns('article.admin', url(r'^add/$', 'article_add'), url(r'^delete/(?P.*)/$', 'article_delete'), url(r'^change/(.*)/$', 'article_change'), diff --git a/article/views.py b/article/views.py deleted file mode 100644 index a82470ef..00000000 --- a/article/views.py +++ /dev/null @@ -1,100 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response, get_object_or_404 -from django.http import HttpResponseRedirect -from django.core.context_processors import csrf -from django.conf import settings -from django.contrib.auth.decorators import login_required -from django.contrib.contenttypes.models import ContentType -#models and forms -from forms import ArticleForm, ArticleDeleteForm, Article -from theme.models import Tag -from file.models import FileModel, TmpFile -from file.forms import FileModelForm - -#custom views -from functions.custom_views import objects_list, add_object_with_file, delete_object - - -def article_all(request): - """ - Return list of all articles with pagination - """ - return objects_list(request, Article, 'article_all.html') - -def article_add(request): - """ - Return form of article and post it on the server. - - If form is posted redirect on the page of all articles. - """ - #get organiser from current user - init_data = {'author':request.user.organiser} - #choices field which will be filled by ajax - choices = {'tag': Tag} - return add_object_with_file(request, ArticleForm, 'article_add.html', '/admin/article/all', - choices, init_data) - - -def article_delete(request, url): - return delete_object(request, Article, ArticleDeleteForm, url, '/admin/article/all') - - -@login_required -def article_change(request, url): - """ - Return form and fill it with existing Article object data. - - If form is posted redirect on the page of all articles. - """ - try: - #check if article_id exists else redirect to the list of cities - article = Article.objects.get(url=url) - file_form = FileModelForm(initial={'model': 'article.Article'}) - article_id = getattr(article, 'id') - except: - return HttpResponseRedirect('/admin/article/all') - - if request.POST: - form = ArticleForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - - if form.is_valid(): - form.save(getattr(article, 'id')) - return HttpResponseRedirect('/admin/article/all') - else: - data = {} - #fill form with data from database - data['author'] = article.user - data['theme'] = [item.id for item in article.theme.all()] - data['tag'] = [item.id for item in article.tag.all()] - #hidden field - data['article_id'] = article_id - - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields - data['main_title_%s' % code] = obj.main_title - data['preview_%s' % code] = obj.preview - data['description_%s' % code] = obj.description - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #fill form - form = ArticleForm(initial=data) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - 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(article), object_id=getattr(article, 'id')) - args['obj_id'] = getattr(article, 'id') - - - return render_to_response('article_add.html', args) diff --git a/city/admin.py b/city/admin.py index b7a71a76..a22feb49 100644 --- a/city/admin.py +++ b/city/admin.py @@ -1,9 +1,92 @@ # -*- coding: utf-8 -*- -from hvad.admin import TranslatableAdmin -from django.contrib import admin +from django.shortcuts import render_to_response, get_object_or_404 +from django.http import HttpResponseRedirect +from django.core.context_processors import csrf +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.contrib.contenttypes.models import ContentType +#models and forms +from forms import CityForm, CityDeleteForm from models import City +from file.models import FileModel +from file.forms import FileModelForm +#custom views +from functions.custom_views import objects_list, add_object_with_file, delete_object -class CityAdmin(TranslatableAdmin): - pass -admin.site.register(City, CityAdmin) \ No newline at end of file +def city_all(request): + """ + return list of all cities with pagination + """ + return objects_list(request, City, 'city_all.html') + + +def city_add(request): + """ + Return form of city and post it on the server. + If form is posted redirect on the page of all cities. + """ + return add_object_with_file(request, CityForm, 'city_add.html', '/admin/city/all') + +def city_delete(request, url): + return delete_object(request, City, CityDeleteForm, url, '/admin/city/all/') + + +@login_required +def city_change(request, url): + """ + Return form and fill it with existing City object data. + + If form is posted redirect on the page of all cities. + """ + try: + #check if city_id exists else redirect to the list of cities + c = City.objects.get(url=url) + city_id = getattr(c, 'id') + file_form = FileModelForm(initial={'model': 'city.City'}) + except: + return HttpResponseRedirect('/admin/city/all') + + if request.POST: + form = CityForm(request.POST) + if form.is_valid(): + form.save(city_id) + return HttpResponseRedirect('/admin/city/all') + else: + #fill form with data from database + data = {'population' : c.population, 'phone_code' : c.phone_code, + 'city_id' : city_id} + + if c.country: + data['country'] = c.country.id + + if c.code_IATA: + data['code_IATA'] = c.code_IATA.id + + #data from translated fields + for code, name in settings.LANGUAGES: + obj = City._meta.translations_model.objects.get(language_code = code,master__id=city_id) #access to translated fields + data['name_%s' % code] = obj.name + data['description_%s' % code] = obj.description + data['famous_places_%s' % code] = obj.famous_places + data['shoping_%s' % code] = obj.shoping + data['transport_%s' % code] = obj.transport + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + #fill form + form = CityForm(initial=data) + + + args = {} + args.update(csrf(request)) + args['languages'] = settings.LANGUAGES + args['form'] = form + 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(c), + object_id=getattr(c, 'id')) + args['obj_id'] = city_id + + return render_to_response('city_add.html', args) \ No newline at end of file diff --git a/city/admin2.py b/city/admin2.py new file mode 100644 index 00000000..b7a71a76 --- /dev/null +++ b/city/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from hvad.admin import TranslatableAdmin +from django.contrib import admin +from models import City + +class CityAdmin(TranslatableAdmin): + pass + +admin.site.register(City, CityAdmin) \ No newline at end of file diff --git a/city/urls.py b/city/urls.py index fae1d4fc..6887e3e0 100644 --- a/city/urls.py +++ b/city/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, url -urlpatterns = patterns('city.views', +urlpatterns = patterns('city.admin', url(r'^add/$', 'city_add'), url(r'^delete/(?P.*)/$', 'city_delete'), url(r'^change/(.*)/$', 'city_change'), diff --git a/city/views.py b/city/views.py deleted file mode 100644 index a22feb49..00000000 --- a/city/views.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response, get_object_or_404 -from django.http import HttpResponseRedirect -from django.core.context_processors import csrf -from django.conf import settings -from django.contrib.auth.decorators import login_required -from django.contrib.contenttypes.models import ContentType -#models and forms -from forms import CityForm, CityDeleteForm -from models import City -from file.models import FileModel -from file.forms import FileModelForm -#custom views -from functions.custom_views import objects_list, add_object_with_file, delete_object - - -def city_all(request): - """ - return list of all cities with pagination - """ - return objects_list(request, City, 'city_all.html') - - -def city_add(request): - """ - Return form of city and post it on the server. - If form is posted redirect on the page of all cities. - """ - return add_object_with_file(request, CityForm, 'city_add.html', '/admin/city/all') - -def city_delete(request, url): - return delete_object(request, City, CityDeleteForm, url, '/admin/city/all/') - - -@login_required -def city_change(request, url): - """ - Return form and fill it with existing City object data. - - If form is posted redirect on the page of all cities. - """ - try: - #check if city_id exists else redirect to the list of cities - c = City.objects.get(url=url) - city_id = getattr(c, 'id') - file_form = FileModelForm(initial={'model': 'city.City'}) - except: - return HttpResponseRedirect('/admin/city/all') - - if request.POST: - form = CityForm(request.POST) - if form.is_valid(): - form.save(city_id) - return HttpResponseRedirect('/admin/city/all') - else: - #fill form with data from database - data = {'population' : c.population, 'phone_code' : c.phone_code, - 'city_id' : city_id} - - if c.country: - data['country'] = c.country.id - - if c.code_IATA: - data['code_IATA'] = c.code_IATA.id - - #data from translated fields - for code, name in settings.LANGUAGES: - obj = City._meta.translations_model.objects.get(language_code = code,master__id=city_id) #access to translated fields - data['name_%s' % code] = obj.name - data['description_%s' % code] = obj.description - data['famous_places_%s' % code] = obj.famous_places - data['shoping_%s' % code] = obj.shoping - data['transport_%s' % code] = obj.transport - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #fill form - form = CityForm(initial=data) - - - args = {} - args.update(csrf(request)) - args['languages'] = settings.LANGUAGES - args['form'] = form - 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(c), - object_id=getattr(c, 'id')) - args['obj_id'] = city_id - - return render_to_response('city_add.html', args) \ No newline at end of file diff --git a/company/admin.py b/company/admin.py index f9d75d09..ad181a14 100644 --- a/company/admin.py +++ b/company/admin.py @@ -1,9 +1,109 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +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 +#models and forms from models import Company +from forms import CompanyForm, CompanyDeleteForm +from theme.models import Tag +from city.models import City +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#custom views +from functions.custom_views import objects_list, add_object_with_file, delete_object + + +def company_all(request): + """ + Return list of all companies with pagination + """ + return objects_list(request, Company, 'company_all.html') + + +def company_add(request): + """ + Return form of company and post it on the server. + If form is posted redirect on the page of all companies. + """ + return add_object_with_file(request, CompanyForm, 'company_add.html', '/admin/company/all/', + {'city': City, 'tag': Tag}) + +def company_delete(request, url): + return delete_object(request, Company, CompanyDeleteForm, url, '/admin/company/all') + + +@login_required +def company_change(request, url): + """ + Return form and fill it with existing Company object data. + + If form is posted redirect on the page of all companies. + """ + company = Company.objects.safe_get(url=url) + # try get company by id if doesnt work by url + if company is None: + company = Company.objects.safe_get(id=url) + #redirect to list of all companies if cannot find user + if company is None: + return HttpResponseRedirect('/admin/company/all/') + + company_id = getattr(company, 'id') + file_form = FileModelForm(initial={'model': 'company.Company'}) + + if request.POST: + form = CompanyForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + + if form.is_valid(): + form.save(company_id) + return HttpResponseRedirect('/admin/company/all/') + else: + #fill form with data from database + data = {'url':company.url, 'staff_number':company.staff_number, 'address': company.address, + 'phone':company.phone, 'fax':company.fax, 'web_page':company.web_page, + 'email':company.email, 'social':company.social, 'foundation': company.foundation, + 'company_id':company.id} + + if company.country: + data['country'] = company.country.id + + if company.city: + data['city'] = company.city.id + + data['theme'] = [item.id for item in company.theme.all()] + data['tag'] = [item.id for item in company.tag.all()] + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Company._meta.translations_model.objects.get(language_code = code,master__id=company_id) #access to translated fields + data['name_%s' % code] = obj.name + data['description_%s' % code] = obj.description + data['specialization_%s' % code] = obj.specialization + data['address_inf_%s' % code] = obj.address_inf + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + #fill form + form = CompanyForm(initial=data) + #set choices filled by ajax + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + 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(company), object_id=getattr(company, 'id')) + args['obj_id'] = company_id + + return render_to_response('company_add.html', args) -class CompanyAdmin(TranslatableAdmin): - pass -admin.site.register(Company, CompanyAdmin) diff --git a/company/admin2.py b/company/admin2.py new file mode 100644 index 00000000..f9d75d09 --- /dev/null +++ b/company/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import Company + +class CompanyAdmin(TranslatableAdmin): + pass + +admin.site.register(Company, CompanyAdmin) diff --git a/company/urls.py b/company/urls.py index a6a9037a..d79f9605 100644 --- a/company/urls.py +++ b/company/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('company.views', +urlpatterns = patterns('company.admin', url(r'^add.*/$', 'company_add'), url(r'^delete/(?P.*)/$', 'company_delete'), url(r'^change/(?P.*).*/$', 'company_change'), diff --git a/company/views.py b/company/views.py deleted file mode 100644 index ad181a14..00000000 --- a/company/views.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -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 -#models and forms -from models import Company -from forms import CompanyForm, CompanyDeleteForm -from theme.models import Tag -from city.models import City -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#custom views -from functions.custom_views import objects_list, add_object_with_file, delete_object - - -def company_all(request): - """ - Return list of all companies with pagination - """ - return objects_list(request, Company, 'company_all.html') - - -def company_add(request): - """ - Return form of company and post it on the server. - If form is posted redirect on the page of all companies. - """ - return add_object_with_file(request, CompanyForm, 'company_add.html', '/admin/company/all/', - {'city': City, 'tag': Tag}) - -def company_delete(request, url): - return delete_object(request, Company, CompanyDeleteForm, url, '/admin/company/all') - - -@login_required -def company_change(request, url): - """ - Return form and fill it with existing Company object data. - - If form is posted redirect on the page of all companies. - """ - company = Company.objects.safe_get(url=url) - # try get company by id if doesnt work by url - if company is None: - company = Company.objects.safe_get(id=url) - #redirect to list of all companies if cannot find user - if company is None: - return HttpResponseRedirect('/admin/company/all/') - - company_id = getattr(company, 'id') - file_form = FileModelForm(initial={'model': 'company.Company'}) - - if request.POST: - form = CompanyForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - - if form.is_valid(): - form.save(company_id) - return HttpResponseRedirect('/admin/company/all/') - else: - #fill form with data from database - data = {'url':company.url, 'staff_number':company.staff_number, 'address': company.address, - 'phone':company.phone, 'fax':company.fax, 'web_page':company.web_page, - 'email':company.email, 'social':company.social, 'foundation': company.foundation, - 'company_id':company.id} - - if company.country: - data['country'] = company.country.id - - if company.city: - data['city'] = company.city.id - - data['theme'] = [item.id for item in company.theme.all()] - data['tag'] = [item.id for item in company.tag.all()] - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Company._meta.translations_model.objects.get(language_code = code,master__id=company_id) #access to translated fields - data['name_%s' % code] = obj.name - data['description_%s' % code] = obj.description - data['specialization_%s' % code] = obj.specialization - data['address_inf_%s' % code] = obj.address_inf - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #fill form - form = CompanyForm(initial=data) - #set choices filled by ajax - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - 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(company), object_id=getattr(company, 'id')) - args['obj_id'] = company_id - - return render_to_response('company_add.html', args) - - diff --git a/conference/admin.py b/conference/admin.py index e69de29b..f9e9fd2a 100644 --- a/conference/admin.py +++ b/conference/admin.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +from django.core.context_processors import csrf +from django.conf import settings +from django.forms.formsets import BaseFormSet, formset_factory +from django.forms.models import modelformset_factory +from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.decorators import login_required +#models and forms +from models import Conference, TimeTable +from forms import ConferenceChangeForm, ConferenceCreateForm, ConferenceDeleteForm, TimeTableForm +from theme.models import Tag +from city.models import City +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#python +import random +#custom views +from functions.custom_views import objects_list, delete_object + + +def conference_all(request): + """ + Return list of all conferences with pagination + """ + return objects_list(request, Conference, 'conference_all.html') + + +@login_required +def conference_add(request): + """ + Returns form of conference and post it on the server. + + If form is posted redirect on the page of all conferences. + """ + #if form would be not valid key must be same + if request.POST.get('key'): + key = request.POST['key'] + else: + key = random.getrandbits(128) + + file_form = FileModelForm(initial={'key': key}) + + if request.POST: + form = ConferenceCreateForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + + if form.is_valid(): + form.save() + return HttpResponseRedirect('/admin/conference/all/') + else: + form = ConferenceCreateForm(initial={'key': key}) + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + args['file_form'] = file_form + args['files'] = TmpFile.objects.filter(key=key) + + return render_to_response('conference_add.html', args) + + +def conference_delete(request, url): + return delete_object(request, Conference, ConferenceDeleteForm, url, '/admin/conference/all') + + +@login_required +def conference_change(request, url): + """ + Return form of conference and fill it with existing Conference object data. + + If form of conference is posted redirect on the page of all conferences. + + """ + try: + #check if conference_id exists else redirect to the list of conferences + conference = Conference.objects.get(url=url) + file_form = FileModelForm(initial={'model': 'city.City'}) + except: + return HttpResponseRedirect('/admin/conference/all/') + + if request.POST: + form = ConferenceChangeForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + + if form.is_valid(): + form.save(getattr(conference, 'id')) + return HttpResponseRedirect('/admin/conference/all/') + else: + #fill form with data from database + data = {'web_page':conference.web_page, 'foundation_year': conference.foundation_year, + 'data_begin':conference.data_begin, 'data_end':conference.data_end, 'currency':conference.currency, + 'tax':conference.tax, 'min_price':conference.min_price, 'max_price':conference.max_price, + 'link':conference.link, 'conference_id':conference.id} + + if conference.country: + data['country'] = conference.country.id + + if conference.city: + data['city'] = conference.city.id + + if conference.place: + data['place'] = conference.place.id + + data['theme'] = [item.id for item in conference.theme.all()] + data['tag'] = [item.id for item in conference.tag.all()] + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Conference._meta.translations_model.objects.get(language_code = code,master__id=getattr(conference, 'id')) #access to translated fields + data['name_%s' % code] = obj.name + data['description_%s' % code] = obj.description + data['main_title_%s' % code] = obj.main_title + data['time_%s' % code] = obj.time + data['main_themes_%s' % code] = obj.main_themes + data['discount_%s' % code] = obj.discount + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + #initial form + form = ConferenceChangeForm(initial=data) + #set choices filled by ajax + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + 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(conference), object_id=getattr(conference, 'id')) + args['obj_id'] = getattr(conference, 'id') + + return render_to_response('conference_add.html', args) + + diff --git a/file/views.py b/conference/admin2.py similarity index 100% rename from file/views.py rename to conference/admin2.py diff --git a/conference/urls.py b/conference/urls.py index 2a4d7813..80e18e54 100644 --- a/conference/urls.py +++ b/conference/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('conference.views', +urlpatterns = patterns('conference.admin', url(r'^add.*/$', 'conference_add'), url(r'^delete/(?P.*)$', 'conference_delete'), url(r'^change/(?P.*)/$', 'conference_change'), diff --git a/conference/views.py b/conference/views.py deleted file mode 100644 index f9e9fd2a..00000000 --- a/conference/views.py +++ /dev/null @@ -1,145 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -from django.core.context_processors import csrf -from django.conf import settings -from django.forms.formsets import BaseFormSet, formset_factory -from django.forms.models import modelformset_factory -from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.decorators import login_required -#models and forms -from models import Conference, TimeTable -from forms import ConferenceChangeForm, ConferenceCreateForm, ConferenceDeleteForm, TimeTableForm -from theme.models import Tag -from city.models import City -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#python -import random -#custom views -from functions.custom_views import objects_list, delete_object - - -def conference_all(request): - """ - Return list of all conferences with pagination - """ - return objects_list(request, Conference, 'conference_all.html') - - -@login_required -def conference_add(request): - """ - Returns form of conference and post it on the server. - - If form is posted redirect on the page of all conferences. - """ - #if form would be not valid key must be same - if request.POST.get('key'): - key = request.POST['key'] - else: - key = random.getrandbits(128) - - file_form = FileModelForm(initial={'key': key}) - - if request.POST: - form = ConferenceCreateForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - - if form.is_valid(): - form.save() - return HttpResponseRedirect('/admin/conference/all/') - else: - form = ConferenceCreateForm(initial={'key': key}) - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['file_form'] = file_form - args['files'] = TmpFile.objects.filter(key=key) - - return render_to_response('conference_add.html', args) - - -def conference_delete(request, url): - return delete_object(request, Conference, ConferenceDeleteForm, url, '/admin/conference/all') - - -@login_required -def conference_change(request, url): - """ - Return form of conference and fill it with existing Conference object data. - - If form of conference is posted redirect on the page of all conferences. - - """ - try: - #check if conference_id exists else redirect to the list of conferences - conference = Conference.objects.get(url=url) - file_form = FileModelForm(initial={'model': 'city.City'}) - except: - return HttpResponseRedirect('/admin/conference/all/') - - if request.POST: - form = ConferenceChangeForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - - if form.is_valid(): - form.save(getattr(conference, 'id')) - return HttpResponseRedirect('/admin/conference/all/') - else: - #fill form with data from database - data = {'web_page':conference.web_page, 'foundation_year': conference.foundation_year, - 'data_begin':conference.data_begin, 'data_end':conference.data_end, 'currency':conference.currency, - 'tax':conference.tax, 'min_price':conference.min_price, 'max_price':conference.max_price, - 'link':conference.link, 'conference_id':conference.id} - - if conference.country: - data['country'] = conference.country.id - - if conference.city: - data['city'] = conference.city.id - - if conference.place: - data['place'] = conference.place.id - - data['theme'] = [item.id for item in conference.theme.all()] - data['tag'] = [item.id for item in conference.tag.all()] - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Conference._meta.translations_model.objects.get(language_code = code,master__id=getattr(conference, 'id')) #access to translated fields - data['name_%s' % code] = obj.name - data['description_%s' % code] = obj.description - data['main_title_%s' % code] = obj.main_title - data['time_%s' % code] = obj.time - data['main_themes_%s' % code] = obj.main_themes - data['discount_%s' % code] = obj.discount - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #initial form - form = ConferenceChangeForm(initial=data) - #set choices filled by ajax - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - 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(conference), object_id=getattr(conference, 'id')) - args['obj_id'] = getattr(conference, 'id') - - return render_to_response('conference_add.html', args) - - diff --git a/country/admin.py b/country/admin.py index 495a1fa8..90b9bca5 100644 --- a/country/admin.py +++ b/country/admin.py @@ -1,16 +1,106 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +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.db.models.loading import get_model +from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage +#models and forms from models import Country -from bitfield import BitField -from bitfield.forms import BitFieldCheckboxSelectMultiple -from bitfield.admin import BitFieldListFilter +from forms import CountryForm, CountryDeleteForm +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#custom views +from functions.custom_views import objects_list, add_object_with_file, delete_object +from django.db.models.deletion import ProtectedError -class CountryAdmin(TranslatableAdmin): - formfield_overrides = { - BitField: {'widget': BitFieldCheckboxSelectMultiple}, - } +def country_all(request): + """ + Return list of all countries with pagination + """ + return objects_list(request, Country, 'country_all.html') -admin.site.register(Country, CountryAdmin) + +def country_add(request): + """ + Return form of country and file and post it on the server. + """ + return add_object_with_file(request, CountryForm, 'country_add.html', '/admin/country/all/') + + +def country_delete(request, url): + return delete_object(request, Country, CountryDeleteForm, url, '/admin/country/all/') + + +@login_required +def country_change(request, url): + """ + Return form of county and file and fill it with existing Country object data. + + If form of country is posted redirect on the page of all countries. + + FileForm posts with ajax with calling ajax_post function + """ + + #check if country_id exists else redirect to the list of countries + try: + c = Country.objects.get(url=url) + country_id = getattr(c, 'id') + #initial hidden input for checking model of object + file_form = FileModelForm(initial={'model': 'country.Country'}) + except: + return HttpResponseRedirect('/admin/country/all') + + if request.POST: + #country_id sending for saving capital field in __init__ + form = CountryForm(request.POST, country_id=country_id) + + if form.is_valid(): + form.save(country_id) + return HttpResponseRedirect('/admin/country/all/') + else: + #fill form with data from database + data = {'population' : c.population, 'teritory' : c.teritory, #data from NOT translated fields + 'timezone' : c.timezone, 'region' : c.region, 'country_id' : country_id, + 'phone_code' : c.phone_code, 'time_delivery' : c.time_delivery} + + if c.capital: + data['capital'] = c.capital.id + + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Country._meta.translations_model.objects.get(language_code = code,master__id=country_id) #access to translated fields + data['name_%s' % code] = obj.name + data['description_%s' % code] = obj.description + data['rules_%s' % code] = obj.rules + data['documents_%s' % code] = obj.documents + data['consulate_%s' % code] = obj.consulate + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + #data from manytomany fields + data['big_cities'] = [item.id for item in c.big_cities.all()] + data['language'] = [item.id for item in c.language.all()] + data['currency'] = [item.id for item in c.currency.all()] + #initial forms + #country_id sending for initialing capital field in __init__ + form = CountryForm(initial=data, country_id = c.id) + + args = {} + + args.update(csrf(request)) + args['languages'] = settings.LANGUAGES + args['form'] = form + 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(c), object_id=getattr(c, 'id')) + + #uses for creating hidden input which will be used for generating ajax url + args['obj_id'] = country_id + + return render_to_response('country_add.html', args) diff --git a/country/admin2.py b/country/admin2.py new file mode 100644 index 00000000..495a1fa8 --- /dev/null +++ b/country/admin2.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import Country +from bitfield import BitField +from bitfield.forms import BitFieldCheckboxSelectMultiple +from bitfield.admin import BitFieldListFilter + + +class CountryAdmin(TranslatableAdmin): + formfield_overrides = { + BitField: {'widget': BitFieldCheckboxSelectMultiple}, + } + + +admin.site.register(Country, CountryAdmin) diff --git a/country/urls.py b/country/urls.py index dd9dfc0a..e6d441ef 100644 --- a/country/urls.py +++ b/country/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('country.views', +urlpatterns = patterns('country.admin', url(r'^add.*/$', 'country_add'), url(r'^delete/(?P.*)/$', 'country_delete'), url(r'^change/(?P.*)/$', 'country_change'), diff --git a/country/views.py b/country/views.py deleted file mode 100644 index 90b9bca5..00000000 --- a/country/views.py +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -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.db.models.loading import get_model -from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage -#models and forms -from models import Country -from forms import CountryForm, CountryDeleteForm -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#custom views -from functions.custom_views import objects_list, add_object_with_file, delete_object - -from django.db.models.deletion import ProtectedError - - -def country_all(request): - """ - Return list of all countries with pagination - """ - return objects_list(request, Country, 'country_all.html') - - -def country_add(request): - """ - Return form of country and file and post it on the server. - """ - return add_object_with_file(request, CountryForm, 'country_add.html', '/admin/country/all/') - - -def country_delete(request, url): - return delete_object(request, Country, CountryDeleteForm, url, '/admin/country/all/') - - -@login_required -def country_change(request, url): - """ - Return form of county and file and fill it with existing Country object data. - - If form of country is posted redirect on the page of all countries. - - FileForm posts with ajax with calling ajax_post function - """ - - #check if country_id exists else redirect to the list of countries - try: - c = Country.objects.get(url=url) - country_id = getattr(c, 'id') - #initial hidden input for checking model of object - file_form = FileModelForm(initial={'model': 'country.Country'}) - except: - return HttpResponseRedirect('/admin/country/all') - - if request.POST: - #country_id sending for saving capital field in __init__ - form = CountryForm(request.POST, country_id=country_id) - - if form.is_valid(): - form.save(country_id) - return HttpResponseRedirect('/admin/country/all/') - else: - #fill form with data from database - data = {'population' : c.population, 'teritory' : c.teritory, #data from NOT translated fields - 'timezone' : c.timezone, 'region' : c.region, 'country_id' : country_id, - 'phone_code' : c.phone_code, 'time_delivery' : c.time_delivery} - - if c.capital: - data['capital'] = c.capital.id - - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Country._meta.translations_model.objects.get(language_code = code,master__id=country_id) #access to translated fields - data['name_%s' % code] = obj.name - data['description_%s' % code] = obj.description - data['rules_%s' % code] = obj.rules - data['documents_%s' % code] = obj.documents - data['consulate_%s' % code] = obj.consulate - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #data from manytomany fields - data['big_cities'] = [item.id for item in c.big_cities.all()] - data['language'] = [item.id for item in c.language.all()] - data['currency'] = [item.id for item in c.currency.all()] - #initial forms - #country_id sending for initialing capital field in __init__ - form = CountryForm(initial=data, country_id = c.id) - - args = {} - - args.update(csrf(request)) - args['languages'] = settings.LANGUAGES - args['form'] = form - 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(c), object_id=getattr(c, 'id')) - - #uses for creating hidden input which will be used for generating ajax url - args['obj_id'] = country_id - - return render_to_response('country_add.html', args) diff --git a/directories/admin.py b/directories/admin.py index a44ddf95..29a0bc6a 100644 --- a/directories/admin.py +++ b/directories/admin.py @@ -1,7 +1,18 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from models import Language, Currency, Iata +from forms import LanguageForm, CurrencyForm, IataForm +#custom views +from functions.custom_views import add_object -admin.site.register(Language) -admin.site.register(Currency) -admin.site.register(Iata) + +def language_add(request): + """ + Return LanguageForm and post it on the server + """ + return add_object(request, LanguageForm, 'directories_add.html', '/admin/language/add') + + +def currency_add(request): + """ + Return CurrencyForm and post it on the server + """ + return add_object(request, CurrencyForm, 'directories_add.html', '/admin/currency/add') \ No newline at end of file diff --git a/directories/admin2.py b/directories/admin2.py new file mode 100644 index 00000000..a44ddf95 --- /dev/null +++ b/directories/admin2.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from models import Language, Currency, Iata + +admin.site.register(Language) +admin.site.register(Currency) +admin.site.register(Iata) diff --git a/directories/views.py b/directories/views.py deleted file mode 100644 index 29a0bc6a..00000000 --- a/directories/views.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -from forms import LanguageForm, CurrencyForm, IataForm -#custom views -from functions.custom_views import add_object - - -def language_add(request): - """ - Return LanguageForm and post it on the server - """ - return add_object(request, LanguageForm, 'directories_add.html', '/admin/language/add') - - -def currency_add(request): - """ - Return CurrencyForm and post it on the server - """ - return add_object(request, CurrencyForm, 'directories_add.html', '/admin/currency/add') \ No newline at end of file diff --git a/exposition/admin.py b/exposition/admin.py index 2ab2f297..834d8d41 100644 --- a/exposition/admin.py +++ b/exposition/admin.py @@ -1,9 +1,146 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin -from models import Exposition +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +from django.core.context_processors import csrf +from django.conf import settings +from django.forms.formsets import BaseFormSet, formset_factory +from django.forms.models import modelformset_factory +from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.decorators import login_required +#models and forms +from models import Exposition, TimeTable +from forms import ExpositionChangeForm, ExpositionCreateForm, ExpositionDeleteForm, TimeTableForm +from theme.models import Tag +from city.models import City +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#python +import random +#custom views +from functions.custom_views import objects_list, delete_object -class ExpositionAdmin(TranslatableAdmin): - pass -admin.site.register(Exposition, ExpositionAdmin) +def exposition_all(request): + """ + Return list of all expositions with pagination + """ + return objects_list(request, Exposition, 'exposition_all.html') + + +@login_required +def exposition_add(request): + """ + Returns form of exposition and post it on the server. + + If form is posted redirect on the page of all expositions. + """ + #if form would be not valid key must be same + if request.POST.get('key'): + key = request.POST['key'] + else: + key = random.getrandbits(128) + + file_form = FileModelForm(initial={'key': key}) + + if request.POST: + form = ExpositionCreateForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + + if form.is_valid(): + form.save() + return HttpResponseRedirect('/admin/exposition/all/') + else: + form = ExpositionCreateForm(initial={'key': key}) + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['file_form'] = file_form + args['files'] = TmpFile.objects.filter(key=key) + args['languages'] = settings.LANGUAGES + return render_to_response('exposition_add.html', args) + + +def exposition_delete(request, url): + return delete_object(request, Exposition, ExpositionDeleteForm, url, '/admin/exposition/all') + + +@login_required +def exposition_change(request, url): + """ + Return form of exposition and fill it with existing Exposition object data. + + If form of exposition is posted redirect on the page of all expositions. + + """ + try: + #check if exposition_id exists else redirect to the list of expositions + exposition = Exposition.objects.get(url=url) + file_form = FileModelForm(initial={'model': 'exposition.Exposition'}) + except: + return HttpResponseRedirect('/admin/exposition/all/') + + if request.POST: + form = ExpositionChangeForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + + if form.is_valid(): + form.save(getattr(exposition, 'id')) + return HttpResponseRedirect('/admin/exposition/all/') + else: + #fill form with data from database + data = {'web_page':exposition.web_page, 'foundation_year': exposition.foundation_year, + 'data_begin':exposition.data_begin, 'data_end':exposition.data_end, 'periodic':exposition.periodic, + 'audience':exposition.audience, 'min_area':exposition.min_area, 'currency':exposition.currency, + 'tax':exposition.tax, 'min_closed_area':exposition.min_closed_area, + 'max_closed_area':exposition.max_closed_area, 'min_closed_equipped_area':exposition.min_closed_equipped_area, + 'max_closed_equipped_area':exposition.max_closed_equipped_area, + 'min_open_area':exposition.min_open_area, 'max_open_area':exposition.max_open_area, + 'registration_payment':exposition.registration_payment, 'exposition_id':exposition.id} + + if exposition.country: + data['country'] = exposition.country.id + + if exposition.city: + data['city'] = exposition.city.id + + if exposition.place: + data['place'] = exposition.place.id + + data['theme'] = [item.id for item in exposition.theme.all()] + data['tag'] = [item.id for item in exposition.tag.all()] + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Exposition._meta.translations_model.objects.get(language_code = code,master__id=getattr(exposition, 'id')) #access to translated fields + data['name_%s' % code] = obj.name + data['description_%s' % code] = obj.description + data['main_title_%s' % code] = obj.main_title + data['time_%s' % code] = obj.time + data['products_%s' % code] = obj.products + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + #initial form + form = ExpositionChangeForm(initial=data) + #set choices filled by ajax + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + 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(exposition), + object_id=getattr(exposition, 'id')) + args['obj_id'] = getattr(exposition, 'id') + + return render_to_response('exposition_add.html', args) diff --git a/exposition/admin2.py b/exposition/admin2.py new file mode 100644 index 00000000..2ab2f297 --- /dev/null +++ b/exposition/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import Exposition + +class ExpositionAdmin(TranslatableAdmin): + pass + +admin.site.register(Exposition, ExpositionAdmin) diff --git a/exposition/urls.py b/exposition/urls.py index 375e09d8..693e2299 100644 --- a/exposition/urls.py +++ b/exposition/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('exposition.views', +urlpatterns = patterns('exposition.admin', url(r'^add.*/$', 'exposition_add'), url(r'^delete/(?P.*)/$', 'exposition_delete'), url(r'^change/(?P.*)/$', 'exposition_change'), diff --git a/exposition/views.py b/exposition/views.py deleted file mode 100644 index 834d8d41..00000000 --- a/exposition/views.py +++ /dev/null @@ -1,146 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -from django.core.context_processors import csrf -from django.conf import settings -from django.forms.formsets import BaseFormSet, formset_factory -from django.forms.models import modelformset_factory -from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.decorators import login_required -#models and forms -from models import Exposition, TimeTable -from forms import ExpositionChangeForm, ExpositionCreateForm, ExpositionDeleteForm, TimeTableForm -from theme.models import Tag -from city.models import City -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#python -import random -#custom views -from functions.custom_views import objects_list, delete_object - - -def exposition_all(request): - """ - Return list of all expositions with pagination - """ - return objects_list(request, Exposition, 'exposition_all.html') - - -@login_required -def exposition_add(request): - """ - Returns form of exposition and post it on the server. - - If form is posted redirect on the page of all expositions. - """ - #if form would be not valid key must be same - if request.POST.get('key'): - key = request.POST['key'] - else: - key = random.getrandbits(128) - - file_form = FileModelForm(initial={'key': key}) - - if request.POST: - form = ExpositionCreateForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - - if form.is_valid(): - form.save() - return HttpResponseRedirect('/admin/exposition/all/') - else: - form = ExpositionCreateForm(initial={'key': key}) - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['file_form'] = file_form - args['files'] = TmpFile.objects.filter(key=key) - args['languages'] = settings.LANGUAGES - return render_to_response('exposition_add.html', args) - - -def exposition_delete(request, url): - return delete_object(request, Exposition, ExpositionDeleteForm, url, '/admin/exposition/all') - - -@login_required -def exposition_change(request, url): - """ - Return form of exposition and fill it with existing Exposition object data. - - If form of exposition is posted redirect on the page of all expositions. - - """ - try: - #check if exposition_id exists else redirect to the list of expositions - exposition = Exposition.objects.get(url=url) - file_form = FileModelForm(initial={'model': 'exposition.Exposition'}) - except: - return HttpResponseRedirect('/admin/exposition/all/') - - if request.POST: - form = ExpositionChangeForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - - if form.is_valid(): - form.save(getattr(exposition, 'id')) - return HttpResponseRedirect('/admin/exposition/all/') - else: - #fill form with data from database - data = {'web_page':exposition.web_page, 'foundation_year': exposition.foundation_year, - 'data_begin':exposition.data_begin, 'data_end':exposition.data_end, 'periodic':exposition.periodic, - 'audience':exposition.audience, 'min_area':exposition.min_area, 'currency':exposition.currency, - 'tax':exposition.tax, 'min_closed_area':exposition.min_closed_area, - 'max_closed_area':exposition.max_closed_area, 'min_closed_equipped_area':exposition.min_closed_equipped_area, - 'max_closed_equipped_area':exposition.max_closed_equipped_area, - 'min_open_area':exposition.min_open_area, 'max_open_area':exposition.max_open_area, - 'registration_payment':exposition.registration_payment, 'exposition_id':exposition.id} - - if exposition.country: - data['country'] = exposition.country.id - - if exposition.city: - data['city'] = exposition.city.id - - if exposition.place: - data['place'] = exposition.place.id - - data['theme'] = [item.id for item in exposition.theme.all()] - data['tag'] = [item.id for item in exposition.tag.all()] - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Exposition._meta.translations_model.objects.get(language_code = code,master__id=getattr(exposition, 'id')) #access to translated fields - data['name_%s' % code] = obj.name - data['description_%s' % code] = obj.description - data['main_title_%s' % code] = obj.main_title - data['time_%s' % code] = obj.time - data['products_%s' % code] = obj.products - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #initial form - form = ExpositionChangeForm(initial=data) - #set choices filled by ajax - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - 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(exposition), - object_id=getattr(exposition, 'id')) - args['obj_id'] = getattr(exposition, 'id') - - return render_to_response('exposition_add.html', args) diff --git a/file/admin.py b/file/admin.py index 7fbd7ab0..e69de29b 100644 --- a/file/admin.py +++ b/file/admin.py @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin -from models import FileModel, TmpFile - -class FileModelAdmin(TranslatableAdmin): - pass - -class TmpFileAdmin(TranslatableAdmin): - pass - -admin.site.register(FileModel, FileModelAdmin) -admin.site.register(TmpFile, TmpFileAdmin) \ No newline at end of file diff --git a/file/admin2.py b/file/admin2.py new file mode 100644 index 00000000..7fbd7ab0 --- /dev/null +++ b/file/admin2.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import FileModel, TmpFile + +class FileModelAdmin(TranslatableAdmin): + pass + +class TmpFileAdmin(TranslatableAdmin): + pass + +admin.site.register(FileModel, FileModelAdmin) +admin.site.register(TmpFile, TmpFileAdmin) \ No newline at end of file diff --git a/file/forms.py b/file/forms.py index 0a8e8b0e..94ed0059 100644 --- a/file/forms.py +++ b/file/forms.py @@ -96,4 +96,6 @@ class FileModelForm(forms.Form): else: object = FileModel._meta.translations_model.objects.get(language_code = code,master__id=getattr(file_obj,'id')) populate(object, data, code) - object.save() \ No newline at end of file + object.save() + + return file_obj \ No newline at end of file diff --git a/functions/custom_fields.py b/functions/custom_fields.py index 339969b7..b147865c 100644 --- a/functions/custom_fields.py +++ b/functions/custom_fields.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.db import models from django.core.serializers.json import DjangoJSONEncoder +from django.core import exceptions from django import forms from django.utils.safestring import mark_safe from django.conf import settings @@ -48,16 +49,19 @@ class JSONField(models.TextField): def to_python(self, value): """Convert our string value to JSON after we load it from the DB""" - if value == "": - return None + if not isinstance(value, basestring): + return value try: - if isinstance(value, basestring): - return json.loads(value) - except ValueError: - pass + return json.loads(value) + except ValueError, e: + # If string could not parse as JSON it's means that it's Python + # string saved to JSONField. + return value - return value + def get_db_prep_value(self, value, connection, prepared=True): + """Convert our JSON object to a string before we save""" + return json.dumps(value) def get_db_prep_save(self, value, connection): """Convert our JSON object to a string before we save""" @@ -71,7 +75,6 @@ class JSONField(models.TextField): return value - DEFAULT_WIDTH = 590 DEFAULT_HEIGHT = 200 @@ -95,12 +98,11 @@ class LocationWidget(forms.TextInput): lat, lng, address = DEFAULT_LAT, DEFAULT_LNG, DEFAULT_ADDRESS value = {'lat': lat, 'lng': lng, 'address': address} else: - try: - lat, lng, address = float(value['lat']), float(value['lng']), value['address'] - except: + if isinstance(value, basestring): a = json.loads(value) lat, lng, address = float(a['lat']), float(a['lng']), a['address'] - + else: + lat, lng, address = float(value['lat']), float(value['lng']), value['address'] curLocation = json.dumps(value, cls=DjangoJSONEncoder) diff --git a/functions/files.py b/functions/files.py index e36ba19e..41500352 100644 --- a/functions/files.py +++ b/functions/files.py @@ -3,7 +3,7 @@ from django.contrib.contenttypes.models import ContentType from django.conf import settings #models from file.models import FileModel, TmpFile -from my_fields import IMG_TYPES +from custom_fields import IMG_TYPES import shutil, os @@ -91,5 +91,4 @@ def check_tmp_files(object, key=None): file_obj.description = trans_object.description file_obj.save() - - TmpFile.objects.filter(key=key).delete() \ No newline at end of file + list.delete() \ No newline at end of file diff --git a/news/admin.py b/news/admin.py index 3095456d..00456332 100644 --- a/news/admin.py +++ b/news/admin.py @@ -1,9 +1,163 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +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.db.models.loading import get_model +import json +#model and forms from models import News +from news.forms import NewsForm +from exposition.models import Exposition +from conference.models import Conference +from theme.models import Tag +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#python +import random +#custom views +from functions.custom_views import objects_list -class NewsAdmin(TranslatableAdmin): - pass -admin.site.register(News, NewsAdmin) +def news_all(request): + """ + Return list of all news with pagination + """ + return objects_list(request, News, 'news_all.html') + + +@login_required +def news_add(request): + """ + Return form of company and post it on the server. + If form is posted redirect on the page of all companies. + """ + #if form would be not valid key must be same + if request.POST.get('key'): + key = request.POST['key'] + else: + key = random.getrandbits(128) + + file_form = FileModelForm(initial={'key': key}) + + if request.POST: + form = NewsForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + + if request.POST['event'] == 'exposition.Exposition': + form.fields['event_id'].choices = [(item.id, item.name) for item in Exposition.objects.all()] + if request.POST['event'] == 'conference.Conference': + form.fields['event_id'].choices = [(item.id, item.name) for item in Conference.objects.all()] + + if form.is_valid(): + form.save() + return HttpResponseRedirect('/admin/news/all/') + else: + form = NewsForm(initial={'key': key}) + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + args['file_form'] = file_form + args['files'] = TmpFile.objects.filter(key=key) + + return render_to_response('news_add.html', args) + +@login_required +def news_change(request, url): + """ + Return form and fill it with existing News object data. + + If form is posted redirect on the page of all news. + """ + try: + #check if url exists else redirect to the list of seminars + news = News.objects.get(url=url) + news_id = getattr(news, 'id') + file_form = FileModelForm(initial={'model': 'news.News'}) + except: + return HttpResponseRedirect('/admin/news/all') + + if request.POST: + form = NewsForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + + if request.POST['event'] == 'exposition.Exposition': + form.fields['event_id'].choices = [(item.id, item.name) for item in Exposition.objects.all()] + if request.POST['event'] == 'conference.Conference': + form.fields['event_id'].choices = [(item.id, item.name) for item in Conference.objects.all()] + + if form.is_valid(): + form.save(news_id) + return HttpResponseRedirect('/admin/news/all') + else: + #fill form with data from database + data = {'date':news.date, 'type':news.type, 'paid': news.paid} + + if news.user: + data['user'] = news.user.id + # + if news.content_type: + data['event'] = 'conference.Conference' if news.content_type.model=='conference'\ + else 'exposition.Exposition' + #if news.content_type.model=='conference': + # data['event'] = 'conference.Conference' + #elif news.content_type.model=='exposition': + # data['event'] = 'exposition.Exposition' + + data['event_id'] = news.object_id + + data['theme'] = [item.id for item in news.theme.all()] + data['tag'] = [item.id for item in news.tag.all()] + #data from translated fields + for code, name in settings.LANGUAGES: + obj = News._meta.translations_model.objects.get(language_code = code,master__id=news_id) #access to translated fields + data['main_title_%s' % code] = obj.main_title + data['preview_%s' % code] = obj.preview + data['description_%s' % code] = obj.description + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + + form = NewsForm(initial=data) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] + if data.get('event'): + if data['event'] == 'conference.Conference': + events = [(item.id, item.name) for item in Conference.objects.all()] + elif data['event'] == 'exposition.Exposition': + events = [(item.id, item.name) for item in Exposition.objects.all()] + form.fields['event_id'].choices = events + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + 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(news), object_id=getattr(news, 'id')) + args['obj_id'] = news_id + + return render_to_response('news_add.html', args) + + +def get_event_id(request): + """ + get events(expostions or conferences) + """ + + if request.GET['model'] != 'None': + Model = get_model(request.GET['model'].split('.')[0], request.GET['model'].split('.')[1]) + events= Model.objects.all() + #events = json.dumps([(item.id, item.name) for item in data]) + return render_to_response('select.html', {'objects': events}) + else: + return HttpResponse() diff --git a/news/admin2.py b/news/admin2.py new file mode 100644 index 00000000..3095456d --- /dev/null +++ b/news/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import News + +class NewsAdmin(TranslatableAdmin): + pass + +admin.site.register(News, NewsAdmin) diff --git a/news/urls.py b/news/urls.py index 678ef3eb..acc98274 100644 --- a/news/urls.py +++ b/news/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('news.views', +urlpatterns = patterns('news.admin', url(r'^add.*/$', 'news_add'), url(r'^change/(.*)/$', 'news_change'), url(r'^all/$', 'news_all'), diff --git a/news/views.py b/news/views.py deleted file mode 100644 index 00456332..00000000 --- a/news/views.py +++ /dev/null @@ -1,163 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -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.db.models.loading import get_model -import json -#model and forms -from models import News -from news.forms import NewsForm -from exposition.models import Exposition -from conference.models import Conference -from theme.models import Tag -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#python -import random -#custom views -from functions.custom_views import objects_list - - -def news_all(request): - """ - Return list of all news with pagination - """ - return objects_list(request, News, 'news_all.html') - - -@login_required -def news_add(request): - """ - Return form of company and post it on the server. - If form is posted redirect on the page of all companies. - """ - #if form would be not valid key must be same - if request.POST.get('key'): - key = request.POST['key'] - else: - key = random.getrandbits(128) - - file_form = FileModelForm(initial={'key': key}) - - if request.POST: - form = NewsForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - - if request.POST['event'] == 'exposition.Exposition': - form.fields['event_id'].choices = [(item.id, item.name) for item in Exposition.objects.all()] - if request.POST['event'] == 'conference.Conference': - form.fields['event_id'].choices = [(item.id, item.name) for item in Conference.objects.all()] - - if form.is_valid(): - form.save() - return HttpResponseRedirect('/admin/news/all/') - else: - form = NewsForm(initial={'key': key}) - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['file_form'] = file_form - args['files'] = TmpFile.objects.filter(key=key) - - return render_to_response('news_add.html', args) - -@login_required -def news_change(request, url): - """ - Return form and fill it with existing News object data. - - If form is posted redirect on the page of all news. - """ - try: - #check if url exists else redirect to the list of seminars - news = News.objects.get(url=url) - news_id = getattr(news, 'id') - file_form = FileModelForm(initial={'model': 'news.News'}) - except: - return HttpResponseRedirect('/admin/news/all') - - if request.POST: - form = NewsForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - - if request.POST['event'] == 'exposition.Exposition': - form.fields['event_id'].choices = [(item.id, item.name) for item in Exposition.objects.all()] - if request.POST['event'] == 'conference.Conference': - form.fields['event_id'].choices = [(item.id, item.name) for item in Conference.objects.all()] - - if form.is_valid(): - form.save(news_id) - return HttpResponseRedirect('/admin/news/all') - else: - #fill form with data from database - data = {'date':news.date, 'type':news.type, 'paid': news.paid} - - if news.user: - data['user'] = news.user.id - # - if news.content_type: - data['event'] = 'conference.Conference' if news.content_type.model=='conference'\ - else 'exposition.Exposition' - #if news.content_type.model=='conference': - # data['event'] = 'conference.Conference' - #elif news.content_type.model=='exposition': - # data['event'] = 'exposition.Exposition' - - data['event_id'] = news.object_id - - data['theme'] = [item.id for item in news.theme.all()] - data['tag'] = [item.id for item in news.tag.all()] - #data from translated fields - for code, name in settings.LANGUAGES: - obj = News._meta.translations_model.objects.get(language_code = code,master__id=news_id) #access to translated fields - data['main_title_%s' % code] = obj.main_title - data['preview_%s' % code] = obj.preview - data['description_%s' % code] = obj.description - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - - form = NewsForm(initial=data) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - if data.get('event'): - if data['event'] == 'conference.Conference': - events = [(item.id, item.name) for item in Conference.objects.all()] - elif data['event'] == 'exposition.Exposition': - events = [(item.id, item.name) for item in Exposition.objects.all()] - form.fields['event_id'].choices = events - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - 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(news), object_id=getattr(news, 'id')) - args['obj_id'] = news_id - - return render_to_response('news_add.html', args) - - -def get_event_id(request): - """ - get events(expostions or conferences) - """ - - if request.GET['model'] != 'None': - Model = get_model(request.GET['model'].split('.')[0], request.GET['model'].split('.')[1]) - events= Model.objects.all() - #events = json.dumps([(item.id, item.name) for item in data]) - return render_to_response('select.html', {'objects': events}) - else: - return HttpResponse() diff --git a/organiser/admin.py b/organiser/admin.py index a56fe3ab..bd68d759 100644 --- a/organiser/admin.py +++ b/organiser/admin.py @@ -1,9 +1,117 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +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 +#models and forms from models import Organiser +from accounts.models import User +from city.models import City +from theme.models import Tag +from forms import OrganiserForm +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#python +import random +#custom functions +from functions.custom_views import objects_list, add_object_with_file -class OrganiserAdmin(TranslatableAdmin): - pass -admin.site.register(Organiser, OrganiserAdmin) +def organiser_all(request): + """ + Return list of all organisers with pagination + """ + return objects_list(request, Organiser, 'organiser_all.html') + + + + +def organiser_add(request): + """ + Return form of organiser and post it on the server. + If form is posted redirect on the page of all organiser. + """ + return add_object_with_file(request, OrganiserForm, 'organiser_add.html', '/admin/organiser/all/', + choices={'city': City, 'tag': Tag}) + + +def organiser_change(request, url): + """ + Return form and fill it with existing Organiser object data. + + If form is posted redirect on the page of all organisers. + """ + organiser = Organiser.objects.safe_get(url=url) + # try get user by id if doesnt work by url + if organiser is None: + organiser = Organiser.objects.safe_get(id=url) + #redirect to list of all organisers if cannot find organiser + if organiser is None: + return HttpResponseRedirect('/admin/organiser/all/') + #get id + organiser_id = getattr(organiser, 'id') + #init FileModelForm + file_form = FileModelForm(initial={'model': 'organiser.Organiser'}) + + if request.POST: + form = OrganiserForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + + if form.is_valid(): + form.save(id=organiser_id) + return HttpResponseRedirect('/admin/organiser/all/') + else: + #fill form with data from database + data = {'staff_number':organiser.staff_number, 'address': organiser.address, + 'events_number':organiser.events_number, 'phone':organiser.phone, + 'fax':organiser.fax, 'web_page':organiser.web_page, 'url':organiser.url, + 'email':organiser.email, 'social':organiser.social, 'foundation': organiser.foundation} + + data['user'] = User.objects.safe_get(organiser=organiser) + + if organiser.country: + data['country'] = organiser.country.id + + if organiser.city: + data['city'] = organiser.city.id + + data['theme'] = [item.id for item in organiser.theme.all()] + data['tag'] = [item.id for item in organiser.tag.all()] + data['place_exposition'] = [item.id for item in organiser.place_exposition.all()] + data['place_conference'] = [item.id for item in organiser.place_conference.all()] + #data from translated fields + + for code, name in settings.LANGUAGES: + obj = Organiser._meta.translations_model.objects.get(language_code = code,master__id=organiser_id) #access to translated fields + data['name_%s' % code] = obj.name + data['description_%s' % code] = obj.description + data['specialization_%s' % code] = obj.specialization + data['address_inf_%s' % code] = obj.address_inf + data['representation_%s' % code] = obj.representation + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + + #fill form + form = OrganiserForm(initial=data) + #set choices filled by ajax + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data.get('country'))] + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data.get('theme'))] + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + 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(organiser), + object_id=getattr(organiser, 'id')) + args['obj_id'] = organiser_id + + return render_to_response('organiser_add.html', args) \ No newline at end of file diff --git a/organiser/admin2.py b/organiser/admin2.py new file mode 100644 index 00000000..a56fe3ab --- /dev/null +++ b/organiser/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import Organiser + +class OrganiserAdmin(TranslatableAdmin): + pass + +admin.site.register(Organiser, OrganiserAdmin) diff --git a/organiser/urls.py b/organiser/urls.py index ed8d98ef..0815d171 100644 --- a/organiser/urls.py +++ b/organiser/urls.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('organiser.views', +urlpatterns = patterns('organiser.admin', url(r'^add.*/$', 'organiser_add'), url(r'^change/(?P.*).*/$', 'organiser_change'), url(r'^all/$', 'organiser_all'), -) \ No newline at end of file +) diff --git a/organiser/views.py b/organiser/views.py deleted file mode 100644 index bd68d759..00000000 --- a/organiser/views.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -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 -#models and forms -from models import Organiser -from accounts.models import User -from city.models import City -from theme.models import Tag -from forms import OrganiserForm -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#python -import random -#custom functions -from functions.custom_views import objects_list, add_object_with_file - - -def organiser_all(request): - """ - Return list of all organisers with pagination - """ - return objects_list(request, Organiser, 'organiser_all.html') - - - - -def organiser_add(request): - """ - Return form of organiser and post it on the server. - If form is posted redirect on the page of all organiser. - """ - return add_object_with_file(request, OrganiserForm, 'organiser_add.html', '/admin/organiser/all/', - choices={'city': City, 'tag': Tag}) - - -def organiser_change(request, url): - """ - Return form and fill it with existing Organiser object data. - - If form is posted redirect on the page of all organisers. - """ - organiser = Organiser.objects.safe_get(url=url) - # try get user by id if doesnt work by url - if organiser is None: - organiser = Organiser.objects.safe_get(id=url) - #redirect to list of all organisers if cannot find organiser - if organiser is None: - return HttpResponseRedirect('/admin/organiser/all/') - #get id - organiser_id = getattr(organiser, 'id') - #init FileModelForm - file_form = FileModelForm(initial={'model': 'organiser.Organiser'}) - - if request.POST: - form = OrganiserForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - - if form.is_valid(): - form.save(id=organiser_id) - return HttpResponseRedirect('/admin/organiser/all/') - else: - #fill form with data from database - data = {'staff_number':organiser.staff_number, 'address': organiser.address, - 'events_number':organiser.events_number, 'phone':organiser.phone, - 'fax':organiser.fax, 'web_page':organiser.web_page, 'url':organiser.url, - 'email':organiser.email, 'social':organiser.social, 'foundation': organiser.foundation} - - data['user'] = User.objects.safe_get(organiser=organiser) - - if organiser.country: - data['country'] = organiser.country.id - - if organiser.city: - data['city'] = organiser.city.id - - data['theme'] = [item.id for item in organiser.theme.all()] - data['tag'] = [item.id for item in organiser.tag.all()] - data['place_exposition'] = [item.id for item in organiser.place_exposition.all()] - data['place_conference'] = [item.id for item in organiser.place_conference.all()] - #data from translated fields - - for code, name in settings.LANGUAGES: - obj = Organiser._meta.translations_model.objects.get(language_code = code,master__id=organiser_id) #access to translated fields - data['name_%s' % code] = obj.name - data['description_%s' % code] = obj.description - data['specialization_%s' % code] = obj.specialization - data['address_inf_%s' % code] = obj.address_inf - data['representation_%s' % code] = obj.representation - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - - #fill form - form = OrganiserForm(initial=data) - #set choices filled by ajax - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data.get('country'))] - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data.get('theme'))] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - 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(organiser), - object_id=getattr(organiser, 'id')) - args['obj_id'] = organiser_id - - return render_to_response('organiser_add.html', args) \ No newline at end of file diff --git a/place_conference/admin.py b/place_conference/admin.py index cc28aeaa..136788da 100644 --- a/place_conference/admin.py +++ b/place_conference/admin.py @@ -1,10 +1,170 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin -from models import PlaceConference +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +from django.core.context_processors import csrf +from django.conf import settings +from django.forms.formsets import formset_factory +from django.forms.models import modelformset_factory -class PlaceConferenceAdmin(TranslatableAdmin): - pass +from django.contrib.auth.decorators import login_required +from django.contrib.contenttypes.models import ContentType +#models and forms +from forms import * +from models import PlaceConference, Hall +from city.models import City +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#python +import random +#custom views +from functions.custom_views import objects_list, delete_object -admin.site.register(PlaceConference, PlaceConferenceAdmin) +def conference_all(request): + """ + Return list of all place_conferences with pagination + """ + return objects_list(request, PlaceConference, 'place_conference_all.html') + + +# http://stackoverflow.com/questions/2406537/django-formsets-make-first-required/4951032#4951032 +@login_required +def conference_add(request): + """ + Returns form of place_conference and formset of halls and post it on the server. + + If forms is posted redirect on the page of all place_conferences. + """ + + #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 = ConferenceForm(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_conference = 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_conference = place_conference + hall.save() + + return HttpResponseRedirect ('/admin/place_conference/all') + else: + form = ConferenceForm(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_conference_add.html', args) + + +def conference_delete(request, url): + return delete_object(request, PlaceConference, PlaceConferenceFormDelete, url, '/admin/place_conference/all') + + +@login_required +def conference_change(request, url): + """ + Return form of place_conference and formset of halls and fill it with existing PlaceConference and Hall object data. + + If form of conference is posted redirect on the page of all conferences. + + """ + try: + #check if conference_id exists else redirect to the list of place of conference + place = PlaceConference.objects.get(url=url) + file_form = FileModelForm(initial={'model': 'place_conference.PlaceConference'}) + except: + return HttpResponseRedirect('/admin/place_conference/all') + + if request.POST: + #formset of HallForm + HallFormSet = formset_factory(HallForm) + form = ConferenceForm(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_conference = form.save(getattr(place, 'id')) + #delete old halls + Hall.objects.filter(place_conference=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_conference = place_conference + hall.save() + + return HttpResponseRedirect('/admin/place_conference/all') + else: + #initial HallFormSet + HallFormSet = modelformset_factory(Hall, form=HallForm, exclude=('place_conference',)) + #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, + 'total_capacity': place.total_capacity, 'amount_halls': place.amount_halls, + 'exposition_hall': place.exposition_hall, 'exp_hall_area': place.exp_hall_area, + 'wifi': place.wifi, 'multimedia_equipment': place.multimedia_equipment, 'conference_call':place.conference_call, + 'translate_equipment': place.translate_equipment, 'banquet_hall': place.banquet_hall, + 'catering': place.catering, 'hotel': place.hotel, 'place_conference_id':place.id} + + if place.country: + data['country'] = place.country.id + if place.city: + data['city'] = place.city.id + #data from translated fields + for code, name in settings.LANGUAGES: + obj = PlaceConference._meta.translations_model.objects.get(language_code = code,master__id=getattr(place, 'id')) #access to translated fields + data['name_%s'%code] = obj.name + data['description_%s'%code] = obj.description + data['adress_%s'%code] = obj.adress + data['hall_capacity_%s'%code] = obj.hall_capacity + data['title_%s'%code] = obj.title + data['keywords_%s'%code] = obj.keywords + data['descriptions_%s'%code] = obj.descriptions + + form = ConferenceForm(initial=data) + #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_conference=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'] = getattr(place, 'id') + + + return render_to_response('place_conference_add.html', args) \ No newline at end of file diff --git a/place_conference/admin2.py b/place_conference/admin2.py new file mode 100644 index 00000000..cc28aeaa --- /dev/null +++ b/place_conference/admin2.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import PlaceConference + +class PlaceConferenceAdmin(TranslatableAdmin): + pass + +admin.site.register(PlaceConference, PlaceConferenceAdmin) + diff --git a/place_conference/forms.py b/place_conference/forms.py index 816508f4..a859cc8f 100644 --- a/place_conference/forms.py +++ b/place_conference/forms.py @@ -133,7 +133,6 @@ class ConferenceForm(forms.Form): place_conference.banquet_hall = data['banquet_hall'] place_conference.catering = data['catering'] place_conference.hotel = data['hotel'] - if data.get('country'): place_conference.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset if data.get('city'): @@ -165,8 +164,20 @@ class ConferenceForm(forms.Form): msg = 'Место проведения с таким названием уже существует' self._errors['name_ru'] = ErrorList([msg]) del self.cleaned_data['name_ru'] + ''' + if not place_conference and self._errors: + msg = 'Повторите адрес' + self._errors['address'] = ErrorList([msg]) + del self.cleaned_data['address'] + ''' return self.cleaned_data + ''' + def clean_address(self): + address = self.cleaned_data.get('address') + raise forms.ValidationError('1') + ''' + def clean_web_page(self): """ diff --git a/place_conference/urls.py b/place_conference/urls.py index 32d042a3..cf3e7737 100644 --- a/place_conference/urls.py +++ b/place_conference/urls.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('place_conference.views', +urlpatterns = patterns('place_conference.admin', url(r'^add.*/$', 'conference_add'), url(r'^delete/(?P.*)/$', 'conference_delete'), url(r'^change/(?P.*)/$', 'conference_change'), url(r'^all/$', 'conference_all'), -) \ No newline at end of file +) diff --git a/place_conference/views.py b/place_conference/views.py deleted file mode 100644 index a6462138..00000000 --- a/place_conference/views.py +++ /dev/null @@ -1,169 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect -from django.core.context_processors import csrf -from django.conf import settings -from django.forms.formsets import formset_factory -from django.forms.models import modelformset_factory - -from django.contrib.auth.decorators import login_required -from django.contrib.contenttypes.models import ContentType -#models and forms -from forms import * -from models import PlaceConference, Hall -from city.models import City -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#python -import random -#custom views -from functions.custom_views import objects_list, delete_object - - -def conference_all(request): - """ - Return list of all place_conferences with pagination - """ - return objects_list(request, PlaceConference, 'place_conference_all.html') - - -# http://stackoverflow.com/questions/2406537/django-formsets-make-first-required/4951032#4951032 -@login_required -def conference_add(request): - """ - Returns form of place_conference and formset of halls and post it on the server. - - If forms is posted redirect on the page of all place_conferences. - """ - - #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 = ConferenceForm(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_conference = 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_conference = place_conference - hall.save() - - return HttpResponseRedirect ('/admin/place_conference/all') - else: - form = ConferenceForm(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_conference_add.html', args) - - -def conference_delete(request, url): - return delete_object(request, PlaceConference, PlaceConferenceFormDelete, url, '/admin/place_conference/all') - - -@login_required -def conference_change(request, url): - """ - Return form of place_conference and formset of halls and fill it with existing PlaceConference and Hall object data. - - If form of conference is posted redirect on the page of all conferences. - - """ - try: - #check if conference_id exists else redirect to the list of place of conference - place = PlaceConference.objects.get(url=url) - file_form = FileModelForm(initial={'model': 'place_conference.PlaceConference'}) - except: - return HttpResponseRedirect('/admin/place_conference/all') - - if request.POST: - #formset of HallForm - HallFormSet = formset_factory(HallForm) - form = ConferenceForm(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_conference = form.save(getattr(place, 'id')) - #delete old halls - Hall.objects.filter(place_conference=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_conference = place_conference - hall.save() - - return HttpResponseRedirect('/admin/place_conference/all') - else: - #initial HallFormSet - HallFormSet = modelformset_factory(Hall, form=HallForm, exclude=('place_conference',)) - #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, - 'total_capacity': place.total_capacity, 'amount_halls': place.amount_halls, - 'exposition_hall': place.exposition_hall, 'exp_hall_area': place.exp_hall_area, - 'wifi': place.wifi, 'multimedia_equipment': place.multimedia_equipment, 'conference_call':place.conference_call, - 'translate_equipment': place.translate_equipment, 'banquet_hall': place.banquet_hall, - 'catering': place.catering, 'hotel': place.hotel, 'place_conference_id':place.id} - - if place.country: - data['country'] = place.country.id - if place.city: - data['city'] = place.city.id - #data from translated fields - for code, name in settings.LANGUAGES: - obj = PlaceConference._meta.translations_model.objects.get(language_code = code,master__id=getattr(place, 'id')) #access to translated fields - data['name_%s'%code] = obj.name - data['description_%s'%code] = obj.description - data['adress_%s'%code] = obj.adress - data['hall_capacity_%s'%code] = obj.hall_capacity - data['title_%s'%code] = obj.title - data['keywords_%s'%code] = obj.keywords - data['descriptions_%s'%code] = obj.descriptions - - form = ConferenceForm(initial=data) - #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_conference=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'] = getattr(place, 'id') - - - return render_to_response('place_conference_add.html', args) \ No newline at end of file diff --git a/place_exposition/admin.py b/place_exposition/admin.py index e5de8cfd..a26b1782 100644 --- a/place_exposition/admin.py +++ b/place_exposition/admin.py @@ -1,9 +1,176 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin -from models import PlaceExposition +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect +from django.core.context_processors import csrf +from django.conf import settings +from django.forms.formsets import formset_factory +from django.forms.models import modelformset_factory +from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.decorators import login_required +from django.forms.formsets import BaseFormSet, formset_factory +from django.forms.models import modelformset_factory +#models and forms +from forms import ExpositionForm, PlaceExpositionFormDelete, HallForm +from models import PlaceExposition, Hall +from city.models import City +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#python +import random +#custom fields +from functions.custom_views import objects_list, delete_object -class PlaceExpositionAdmin(TranslatableAdmin): - pass -admin.site.register(PlaceExposition, PlaceExpositionAdmin) +def exposition_all(request): + """ + Return list of all place_expositions with pagination + """ + return objects_list(request, PlaceExposition, 'place_exposition_all.html') + + +@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'].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(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 + if place.city: + 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['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) + #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 + + + return render_to_response('place_exposition_add.html', args) \ No newline at end of file diff --git a/place_exposition/admin2.py b/place_exposition/admin2.py new file mode 100644 index 00000000..e5de8cfd --- /dev/null +++ b/place_exposition/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import PlaceExposition + +class PlaceExpositionAdmin(TranslatableAdmin): + pass + +admin.site.register(PlaceExposition, PlaceExpositionAdmin) diff --git a/place_exposition/urls.py b/place_exposition/urls.py index ba07684d..707db784 100644 --- a/place_exposition/urls.py +++ b/place_exposition/urls.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('place_exposition.views', +urlpatterns = patterns('place_exposition.admin', url(r'^add.*/$', 'exposition_add'), url(r'^delete/(?P.*)/$', 'exposition_delete'), url(r'^change/(?P.*)/$', 'exposition_change'), url(r'^all/$', 'exposition_all'), -) \ No newline at end of file +) diff --git a/place_exposition/views.py b/place_exposition/views.py deleted file mode 100644 index a26b1782..00000000 --- a/place_exposition/views.py +++ /dev/null @@ -1,176 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect -from django.core.context_processors import csrf -from django.conf import settings -from django.forms.formsets import formset_factory -from django.forms.models import modelformset_factory -from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.decorators import login_required -from django.forms.formsets import BaseFormSet, formset_factory -from django.forms.models import modelformset_factory -#models and forms -from forms import ExpositionForm, PlaceExpositionFormDelete, HallForm -from models import PlaceExposition, Hall -from city.models import City -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#python -import random -#custom fields -from functions.custom_views import objects_list, delete_object - - -def exposition_all(request): - """ - Return list of all place_expositions with pagination - """ - return objects_list(request, PlaceExposition, 'place_exposition_all.html') - - -@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'].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(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 - if place.city: - 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['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) - #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 - - - return render_to_response('place_exposition_add.html', args) \ No newline at end of file diff --git a/proj/admin.py b/proj/admin2.py similarity index 100% rename from proj/admin.py rename to proj/admin2.py diff --git a/proj/admin_urls.py b/proj/admin_urls.py index c2fe61e6..b703201e 100644 --- a/proj/admin_urls.py +++ b/proj/admin_urls.py @@ -12,7 +12,6 @@ urlpatterns = patterns('', url(r'^conference/', include('conference.urls')), url(r'^country/', include('country.urls')), url(r'^exposition/', include('exposition.urls')), - url(r'^file/', include('file.urls')), url(r'^news/', include('news.urls')), url(r'^organiser/', include('organiser.urls')), url(r'^place_conference/', include('place_conference.urls')), @@ -23,8 +22,8 @@ urlpatterns = patterns('', url(r'^translator/', include('translator.urls')), url(r'^webinar/', include('webinar.urls')), url(r'^settings/$', 'proj.views.settings'), - url(r'^language/add/', 'directories.views.language_add'), - url(r'^currency/add/', 'directories.views.currency_add'), + url(r'^language/add/', 'directories.admin.language_add'), + url(r'^currency/add/', 'directories.admin.currency_add'), # url(r'^test/', 'proj.views.test'), #ajax requests diff --git a/proj/views.py b/proj/views.py index 4e049ead..e1d8cdc3 100644 --- a/proj/views.py +++ b/proj/views.py @@ -78,7 +78,7 @@ def ajax_tag(request): return HttpResponse('error') - +from django.core import serializers @login_required def ajax_post_file(request, obj_id=None): """ @@ -97,7 +97,9 @@ def ajax_post_file(request, obj_id=None): Model = get_model(request.POST['model'].split('.')[0], request.POST['model'].split('.')[1]) #initial model object obj = Model.objects.get(id=obj_id) - file_form.save(request.FILES, obj) + file = file_form.save(request.FILES, obj) + data = serializers.serialize('json', [file]) + #return HttpResponse(data) files = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(obj),object_id=getattr(obj, 'id')) else: file_form.save(request.FILES) @@ -115,16 +117,11 @@ def ajax_post_file(request, obj_id=None): @login_required def ajax_delete_file(request): """ - delete file and returns list of files which left + delete file """ if request.GET: file = FileModel.objects.get(id = request.GET['id']) - #data for filtering files which left - model, id = file.content_type, file.object_id file.delete() - # - files = FileModel.objects.filter(content_type=model, object_id=id) - - return render_to_response('file_list.html', {'files' : files}) + return HttpResponse('success') else: - return HttpResponse('123') + return HttpResponse('error') diff --git a/seminar/admin.py b/seminar/admin.py index e69de29b..f8725736 100644 --- a/seminar/admin.py +++ b/seminar/admin.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +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 models import Seminar +from forms import SeminarCreateForm, SeminarChangeForm, SeminarDeleteForm +from theme.models import Tag +from city.models import City +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#python +import random +#custom views +from functions.custom_views import objects_list, delete_object + + +def seminar_all(request): + """ + Return list of all seminars with pagination + """ + return objects_list(request, Seminar, 'seminar_all.html') + + +@login_required +def seminar_add(request): + """ + Returns form of seminar and post it on the server. + + If form is posted redirect on the page of all seminars. + """ + #if form would be not valid key must be same + if request.POST.get('key'): + key = request.POST['key'] + else: + key = random.getrandbits(128) + + file_form = FileModelForm(initial={'key': key}) + + if request.POST: + form = SeminarCreateForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + + if form.is_valid(): + form.save() + return HttpResponseRedirect('/admin/seminar/all') + else: + form = SeminarCreateForm(initial={'key': key}) + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + args['file_form'] = file_form + args['files'] = TmpFile.objects.filter(key=key) + + return render_to_response('seminar_add.html', args) + + +def seminar_delete(request, url): + return delete_object(request, Seminar, SeminarDeleteForm, url, '/admin/seminar/all') + + +@login_required +def seminar_change(request, url): + """ + Return form of seminar and fill it with existing Seminar object data. + + If form of seminar is posted redirect on the page of all seminars. + + """ + try: + #check if seminar_id exists else redirect to the list of seminars + seminar = Seminar.objects.get(url=url) + file_form = FileModelForm(initial={'model': 'seminar.Seminar'}) + except: + return HttpResponseRedirect('/admin/seminar/all') + + if request.POST: + form = SeminarChangeForm(request.POST) + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + #set choices filled by ajax + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] + if form.is_valid(): + form.save(getattr(seminar, 'id')) + return HttpResponseRedirect('/admin/seminar/all') + else: + #fill form with data from database + data = {'web_page':seminar.web_page, 'foundation_year': seminar.foundation_year, + 'data_begin':seminar.data_begin, 'data_end':seminar.data_end, 'currency':seminar.currency, + 'tax':seminar.tax, 'min_price':seminar.min_price, 'link':seminar.link, + 'max_price':seminar.max_price, 'address':seminar.address, 'seminar_id':seminar.id} + + if seminar.country: + data['country'] = seminar.country.id + + if seminar.city: + data['city'] = seminar.city.id + + data['theme'] = [item.id for item in seminar.theme.all()] + data['tag'] = [item.id for item in seminar.tag.all()] + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Seminar._meta.translations_model.objects.get(language_code = code,master__id=getattr(seminar, 'id')) #access to translated fields + data['name_%s' % code] = obj.name + data['programm_%s' % code] = obj.programm + data['main_title_%s' % code] = obj.main_title + data['discount_%s' % code] = obj.discount + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + #initial form + form = SeminarChangeForm(initial=data) + #set choices filled by ajax + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + 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(seminar), + object_id=getattr(seminar, 'id')) + args['obj_id'] = getattr(seminar, 'id') + + return render_to_response('seminar_add.html', args) \ No newline at end of file diff --git a/seminar/admin2.py b/seminar/admin2.py new file mode 100644 index 00000000..e69de29b diff --git a/seminar/urls.py b/seminar/urls.py index 0170dcfa..64a4dee3 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('seminar.views', +urlpatterns = patterns('seminar.admin', url(r'^add.*/$', 'seminar_add'), url(r'^delete/(?P.*)/$', 'seminar_delete'), url(r'^change/(?P.*)/$', 'seminar_change'), url(r'^all/$', 'seminar_all'), -) \ No newline at end of file +) diff --git a/seminar/views.py b/seminar/views.py deleted file mode 100644 index f8725736..00000000 --- a/seminar/views.py +++ /dev/null @@ -1,138 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -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 models import Seminar -from forms import SeminarCreateForm, SeminarChangeForm, SeminarDeleteForm -from theme.models import Tag -from city.models import City -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#python -import random -#custom views -from functions.custom_views import objects_list, delete_object - - -def seminar_all(request): - """ - Return list of all seminars with pagination - """ - return objects_list(request, Seminar, 'seminar_all.html') - - -@login_required -def seminar_add(request): - """ - Returns form of seminar and post it on the server. - - If form is posted redirect on the page of all seminars. - """ - #if form would be not valid key must be same - if request.POST.get('key'): - key = request.POST['key'] - else: - key = random.getrandbits(128) - - file_form = FileModelForm(initial={'key': key}) - - if request.POST: - form = SeminarCreateForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - - if form.is_valid(): - form.save() - return HttpResponseRedirect('/admin/seminar/all') - else: - form = SeminarCreateForm(initial={'key': key}) - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['file_form'] = file_form - args['files'] = TmpFile.objects.filter(key=key) - - return render_to_response('seminar_add.html', args) - - -def seminar_delete(request, url): - return delete_object(request, Seminar, SeminarDeleteForm, url, '/admin/seminar/all') - - -@login_required -def seminar_change(request, url): - """ - Return form of seminar and fill it with existing Seminar object data. - - If form of seminar is posted redirect on the page of all seminars. - - """ - try: - #check if seminar_id exists else redirect to the list of seminars - seminar = Seminar.objects.get(url=url) - file_form = FileModelForm(initial={'model': 'seminar.Seminar'}) - except: - return HttpResponseRedirect('/admin/seminar/all') - - if request.POST: - form = SeminarChangeForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])] - if form.is_valid(): - form.save(getattr(seminar, 'id')) - return HttpResponseRedirect('/admin/seminar/all') - else: - #fill form with data from database - data = {'web_page':seminar.web_page, 'foundation_year': seminar.foundation_year, - 'data_begin':seminar.data_begin, 'data_end':seminar.data_end, 'currency':seminar.currency, - 'tax':seminar.tax, 'min_price':seminar.min_price, 'link':seminar.link, - 'max_price':seminar.max_price, 'address':seminar.address, 'seminar_id':seminar.id} - - if seminar.country: - data['country'] = seminar.country.id - - if seminar.city: - data['city'] = seminar.city.id - - data['theme'] = [item.id for item in seminar.theme.all()] - data['tag'] = [item.id for item in seminar.tag.all()] - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Seminar._meta.translations_model.objects.get(language_code = code,master__id=getattr(seminar, 'id')) #access to translated fields - data['name_%s' % code] = obj.name - data['programm_%s' % code] = obj.programm - data['main_title_%s' % code] = obj.main_title - data['discount_%s' % code] = obj.discount - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #initial form - form = SeminarChangeForm(initial=data) - #set choices filled by ajax - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - 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(seminar), - object_id=getattr(seminar, 'id')) - args['obj_id'] = getattr(seminar, 'id') - - return render_to_response('seminar_add.html', args) \ No newline at end of file diff --git a/service/admin.py b/service/admin.py index 5fd9f69f..b0284144 100644 --- a/service/admin.py +++ b/service/admin.py @@ -1,9 +1,114 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +from django.core.context_processors import csrf +from django.conf import settings +from django.contrib.auth.decorators import login_required +#models and forms from models import Service +from forms import ServiceForm, ServiceDeleteForm +from country.models import Country +from city.models import City +#custom views +from functions.custom_views import objects_list, delete_object -class ServiceAdmin(TranslatableAdmin): - pass -admin.site.register(Service, ServiceAdmin) \ No newline at end of file +def service_all(request): + """ + return list of all services with pagination + """ + return objects_list(request, Service, 'service_all.html') + +def service_delete(request, url): + return delete_object(request, Service, ServiceDeleteForm, url, '/admin/service/all') + + +@login_required +def service_change(request, url): + try: + service = Service.objects.get(url=url) + service_id = getattr(service, 'id') + except: + return HttpResponseRedirect('/admin/service/all') + if request.POST: + form = ServiceForm(request.POST) + form.fields['city'].choices = [(item.id, item.name) for item in City.objects.all()] + + if form.is_valid(): + form.save(service_id) + + return HttpResponseRedirect('/admin/service/all') + else: + data = {} + try: + data['price'] = service.price.split(' ')[0] + data['currency'] = service.price.split(' ')[1] + except:pass + #countries sorted by this service + services_in_countries = Country.objects.filter(services=getattr(Country.services, str(service_id))) + + data['europa'] = services_in_countries + data['asia'] = services_in_countries + data['africa'] = services_in_countries + data['america'] = services_in_countries + #hidden field + data['service_id'] = service_id + + data['url'] = service.url + + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Service._meta.translations_model.objects.get(language_code = code,master__id=service_id) #access to translated fields + data['name_%s'%code] = obj.name + data['description_%s'%code] = obj.description + data['main_title_%s'%code] = obj.main_title + data['advantage_%s'%code] = obj.advantage + data['title_%s'%code] = obj.title + data['keywords_%s'%code] = obj.keywords + data['descriptions_%s'%code] = obj.descriptions + + + form = ServiceForm(initial=data) + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + args['service_id'] = service_id + return render_to_response('service_add.html', args) + + +@login_required +def service_add(request): + if request.POST: + form = ServiceForm(request.POST) + if form.is_valid(): + form.save() + return HttpResponseRedirect('/admin/service/all') + else: + form = ServiceForm() + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + + return render_to_response('service_add.html', args) + +def get_country(request): + if request.GET: + country_region = request.GET['region'] + countries = Country.objects.filter(region=country_region) + return render_to_response('checkbox_option.html', {'options': countries}) + else: + return HttpResponse('error') + +def get_city(request): + if request.GET: + country_id = request.GET['id'] + cities = City.objects.filter(country=country_id) + return render_to_response('checkbox_option.html', {'options': cities}) + else: + return HttpResponse('error') diff --git a/service/admin2.py b/service/admin2.py new file mode 100644 index 00000000..5fd9f69f --- /dev/null +++ b/service/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import Service + +class ServiceAdmin(TranslatableAdmin): + pass + +admin.site.register(Service, ServiceAdmin) \ No newline at end of file diff --git a/service/urls.py b/service/urls.py index f041a3f1..f7837533 100644 --- a/service/urls.py +++ b/service/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('service.views', +urlpatterns = patterns('service.admin', url(r'^add.*/$', 'service_add'), url(r'^delete/(?P.*)/$', 'service_delete'), url(r'^change/(?P.*)/$', 'service_change'), @@ -10,4 +10,4 @@ urlpatterns = patterns('service.views', url(r'^get_city/$', 'get_city'), url(r'^get_country/$', 'get_country'), -) \ No newline at end of file +) diff --git a/service/views.py b/service/views.py deleted file mode 100644 index b0284144..00000000 --- a/service/views.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -from django.core.context_processors import csrf -from django.conf import settings -from django.contrib.auth.decorators import login_required -#models and forms -from models import Service -from forms import ServiceForm, ServiceDeleteForm -from country.models import Country -from city.models import City -#custom views -from functions.custom_views import objects_list, delete_object - - -def service_all(request): - """ - return list of all services with pagination - """ - return objects_list(request, Service, 'service_all.html') - -def service_delete(request, url): - return delete_object(request, Service, ServiceDeleteForm, url, '/admin/service/all') - - -@login_required -def service_change(request, url): - try: - service = Service.objects.get(url=url) - service_id = getattr(service, 'id') - except: - return HttpResponseRedirect('/admin/service/all') - if request.POST: - form = ServiceForm(request.POST) - form.fields['city'].choices = [(item.id, item.name) for item in City.objects.all()] - - if form.is_valid(): - form.save(service_id) - - return HttpResponseRedirect('/admin/service/all') - else: - data = {} - try: - data['price'] = service.price.split(' ')[0] - data['currency'] = service.price.split(' ')[1] - except:pass - #countries sorted by this service - services_in_countries = Country.objects.filter(services=getattr(Country.services, str(service_id))) - - data['europa'] = services_in_countries - data['asia'] = services_in_countries - data['africa'] = services_in_countries - data['america'] = services_in_countries - #hidden field - data['service_id'] = service_id - - data['url'] = service.url - - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Service._meta.translations_model.objects.get(language_code = code,master__id=service_id) #access to translated fields - data['name_%s'%code] = obj.name - data['description_%s'%code] = obj.description - data['main_title_%s'%code] = obj.main_title - data['advantage_%s'%code] = obj.advantage - data['title_%s'%code] = obj.title - data['keywords_%s'%code] = obj.keywords - data['descriptions_%s'%code] = obj.descriptions - - - form = ServiceForm(initial=data) - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['service_id'] = service_id - return render_to_response('service_add.html', args) - - -@login_required -def service_add(request): - if request.POST: - form = ServiceForm(request.POST) - if form.is_valid(): - form.save() - return HttpResponseRedirect('/admin/service/all') - else: - form = ServiceForm() - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - - return render_to_response('service_add.html', args) - -def get_country(request): - if request.GET: - country_region = request.GET['region'] - countries = Country.objects.filter(region=country_region) - return render_to_response('checkbox_option.html', {'options': countries}) - else: - return HttpResponse('error') - -def get_city(request): - if request.GET: - country_id = request.GET['id'] - cities = City.objects.filter(country=country_id) - return render_to_response('checkbox_option.html', {'options': cities}) - else: - return HttpResponse('error') diff --git a/static/custom_js/file_delete_ajax.js b/static/custom_js/file_delete_ajax.js deleted file mode 100644 index df670996..00000000 --- a/static/custom_js/file_delete_ajax.js +++ /dev/null @@ -1,11 +0,0 @@ -$(document).ready(function(){ - $('.delete_file').click(function(){ - var url = '/admin/ajax_delete_file/'; - $.get( - url, {'id': $(this).attr("value")}, function(j){ - $('#file_list').html(j); - });//end get - return false; - });//end delete - });//end ready - diff --git a/static/custom_js/file_post_ajax.js b/static/custom_js/file_post_ajax.js index ea6305f4..560f32c7 100644 --- a/static/custom_js/file_post_ajax.js +++ b/static/custom_js/file_post_ajax.js @@ -1,4 +1,19 @@ $(document).ready(function(){ + $('.delete_file').click(function(){ + var url = '/admin/ajax_delete_file/'; + $this = $(this); + $.get( + url, {'id': $(this).attr("value")}, function(j){ + if (j = 'success'){ + $this.parent().parent().remove(); + } + else{ + console.log('error'); + } + });//end get + return false; + });//end delete + $('#file_form').submit(function(){ var fileData = new FormData($(this)[0]);//file (request.FILES) var formData = $(this).serialize();// another data (request.POST) @@ -37,18 +52,21 @@ $(document).ready(function(){ });//end ready function postSuccess(data, textStatus, jqXHR){ + + //console.log(data); + //$('#close').click(); + if (data.indexOf(" {# ajax #} - {% endblock %} diff --git a/templates/admin/city/city_add.html b/templates/admin/city/city_add.html index 3df89b78..20d14d9f 100644 --- a/templates/admin/city/city_add.html +++ b/templates/admin/city/city_add.html @@ -11,7 +11,6 @@ {# ajax #} - {% endblock %} diff --git a/templates/admin/company/company_add.html b/templates/admin/company/company_add.html index 5b8f31a4..d991c963 100644 --- a/templates/admin/company/company_add.html +++ b/templates/admin/company/company_add.html @@ -18,7 +18,6 @@ {# ajax #} - diff --git a/templates/admin/conference/conference_add.html b/templates/admin/conference/conference_add.html index 62221ddf..07dfd84f 100644 --- a/templates/admin/conference/conference_add.html +++ b/templates/admin/conference/conference_add.html @@ -31,7 +31,6 @@ {# ajax #} - diff --git a/templates/admin/country/country_add.html b/templates/admin/country/country_add.html index 372a69a4..e795f004 100644 --- a/templates/admin/country/country_add.html +++ b/templates/admin/country/country_add.html @@ -12,7 +12,6 @@ {# ajax #} - {% endblock %} diff --git a/templates/admin/exposition/exposition_add.html b/templates/admin/exposition/exposition_add.html index 4d544231..044c64e9 100644 --- a/templates/admin/exposition/exposition_add.html +++ b/templates/admin/exposition/exposition_add.html @@ -19,7 +19,6 @@ {# ajax #} - diff --git a/templates/admin/news/news_add.html b/templates/admin/news/news_add.html index 82fe3f0e..89514c25 100644 --- a/templates/admin/news/news_add.html +++ b/templates/admin/news/news_add.html @@ -29,7 +29,6 @@ {# ajax #} - {% endblock %} diff --git a/templates/admin/organiser/organiser_add.html b/templates/admin/organiser/organiser_add.html index d86eb72b..2f8c2bf4 100644 --- a/templates/admin/organiser/organiser_add.html +++ b/templates/admin/organiser/organiser_add.html @@ -17,7 +17,6 @@ {# ajax #} - diff --git a/templates/admin/place_conference/place_conference_add.html b/templates/admin/place_conference/place_conference_add.html index 54cd9b16..788c6ccc 100644 --- a/templates/admin/place_conference/place_conference_add.html +++ b/templates/admin/place_conference/place_conference_add.html @@ -16,7 +16,6 @@ {# ajax #} - diff --git a/templates/admin/place_exposition/place_exposition_add.html b/templates/admin/place_exposition/place_exposition_add.html index 77507041..9af31e33 100644 --- a/templates/admin/place_exposition/place_exposition_add.html +++ b/templates/admin/place_exposition/place_exposition_add.html @@ -15,7 +15,6 @@ {# ajax #} - diff --git a/templates/admin/seminar/seminar_add.html b/templates/admin/seminar/seminar_add.html index 5ce27776..e9e884cb 100644 --- a/templates/admin/seminar/seminar_add.html +++ b/templates/admin/seminar/seminar_add.html @@ -32,7 +32,6 @@ {# ajax #} - diff --git a/templates/admin/translator/translator_add.html b/templates/admin/translator/translator_add.html index 31a46913..b07c12d9 100644 --- a/templates/admin/translator/translator_add.html +++ b/templates/admin/translator/translator_add.html @@ -12,7 +12,6 @@ {# ajax #} - {# datetimepicker #} diff --git a/templates/admin/webinar/webinar_add.html b/templates/admin/webinar/webinar_add.html index 784c19d7..7df92581 100644 --- a/templates/admin/webinar/webinar_add.html +++ b/templates/admin/webinar/webinar_add.html @@ -11,7 +11,6 @@ {# ajax #} - diff --git a/templates/file_list.html b/templates/file_list.html index 1826b5f6..a2040b41 100644 --- a/templates/file_list.html +++ b/templates/file_list.html @@ -4,19 +4,6 @@ Uses in ajax call Returns table with files properties {% endcomment %} - - - - - - - - - - - - - {% for file in files %} @@ -32,7 +19,3 @@ Returns table with files properties {% endfor %} - - -
idФайлИмяНазначение
- diff --git a/theme/admin.py b/theme/admin.py index 08fb17ef..69c301fb 100644 --- a/theme/admin.py +++ b/theme/admin.py @@ -1,19 +1,113 @@ # -*- coding: utf-8 -*- -from hvad.admin import TranslatableAdmin -from django.contrib import admin -from models import Tag, Theme -from bitfield import BitField -from bitfield.forms import BitFieldCheckboxSelectMultiple +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +from django.core.context_processors import csrf +from django.conf import settings +from django.forms.formsets import BaseFormSet, formset_factory +from django.forms.models import modelformset_factory +from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.decorators import login_required +#forms and models +from forms import ThemeForm, TagForm, ThemeDeleteForm, TagDeleteForm +from models import Theme, Tag +#custom views +from functions.custom_views import objects_list, add_object, delete_object -class TagAdmin(TranslatableAdmin): - pass +def theme_all(request): + return objects_list(request, Theme, 'theme_all.html') -class ThemeAdmin(TranslatableAdmin): - formfield_overrides = { - BitField: {'widget': BitFieldCheckboxSelectMultiple}, -} +def tag_all(request): + return objects_list(request, Tag, 'tag_all.html') -admin.site.register(Tag, TagAdmin) -admin.site.register(Theme, ThemeAdmin) \ No newline at end of file + +def theme_add(request): + return add_object(request, ThemeForm, 'theme_add.html', '/admin/theme/theme/all') + +def tag_add(request): + return add_object(request, TagForm, 'tag_add.html', '/admin/theme/tag/all') + +def theme_delete(request, theme_id): + return delete_object(request, Theme, ThemeDeleteForm, theme_id, '/admin/theme/theme/all') + +def tag_delete(request, tag_id): + return delete_object(request, Tag, TagDeleteForm, tag_id, '/admin/theme/tag/all') + + +@login_required +def theme_change(request, theme_id=None): + try: + theme = Theme.objects.get(id=theme_id) + except: + return HttpResponseRedirect('/admin/theme/theme/all') + if request.POST: + form = ThemeForm(request.POST) + if form.is_valid(): + form.save(theme_id) + return HttpResponseRedirect('/admin/theme/theme/all') + else: + data = {} + #bitfeild + data['types'] = [item for item, bool in theme.types if bool==True] + + + + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Theme._meta.translations_model.objects.get(language_code = code,master__id=theme_id) #access to translated fields + data['name_%s'%code] = obj.name + data['description_%s'%code] = obj.description + data['main_title_%s'%code] = obj.main_title + data['title_%s'%code] = obj.title + data['keywords_%s'%code] = obj.keywords + data['descriptions_%s'%code] = obj.descriptions + + + + form = ThemeForm(data) + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + args['theme_id'] = theme_id + + return render_to_response('theme_add.html', args) + +@login_required +def tag_change(request, tag_id=None): + try: + tag = Tag.objects.get(id=tag_id) + except: + return HttpResponseRedirect('/admin/theme/tag/all') + if request.POST: + form = TagForm(request.POST) + if form.is_valid(): + form.save(tag_id) + return HttpResponseRedirect('/admin/theme/tag/all') + else: + data = {} + if tag.theme: + data['theme'] = tag.theme.id + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Tag._meta.translations_model.objects.get(language_code = code,master__id=tag_id) #access to translated fields + data['name_%s'%code] = obj.name + data['description_%s'%code] = obj.description + data['main_title_%s'%code] = obj.main_title + data['title_%s'%code] = obj.title + data['keywords_%s'%code] = obj.keywords + data['descriptions_%s'%code] = obj.descriptions + + form = TagForm(data) + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + args['tag_id'] = tag_id + + return render_to_response('tag_add.html', args) \ No newline at end of file diff --git a/theme/admin2.py b/theme/admin2.py new file mode 100644 index 00000000..08fb17ef --- /dev/null +++ b/theme/admin2.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from hvad.admin import TranslatableAdmin +from django.contrib import admin +from models import Tag, Theme +from bitfield import BitField +from bitfield.forms import BitFieldCheckboxSelectMultiple + + +class TagAdmin(TranslatableAdmin): + pass + +class ThemeAdmin(TranslatableAdmin): + formfield_overrides = { + BitField: {'widget': BitFieldCheckboxSelectMultiple}, +} + + +admin.site.register(Tag, TagAdmin) +admin.site.register(Theme, ThemeAdmin) \ No newline at end of file diff --git a/theme/urls.py b/theme/urls.py index 2e789bc8..c71ffbec 100644 --- a/theme/urls.py +++ b/theme/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('theme.views', +urlpatterns = patterns('theme.admin', url(r'^theme/add.*/$', 'theme_add'), url(r'^tag/add.*/$', 'tag_add'), url(r'^theme/delete/(?P\d+)/$', 'theme_delete'), @@ -10,4 +10,4 @@ urlpatterns = patterns('theme.views', url(r'^tag/change/(?P\d+).*/$', 'tag_change'), url(r'^theme/all/$', 'theme_all'), url(r'^tag/all/$', 'tag_all'), -) \ No newline at end of file +) diff --git a/theme/views.py b/theme/views.py deleted file mode 100644 index 69c301fb..00000000 --- a/theme/views.py +++ /dev/null @@ -1,113 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -from django.core.context_processors import csrf -from django.conf import settings -from django.forms.formsets import BaseFormSet, formset_factory -from django.forms.models import modelformset_factory -from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.decorators import login_required -#forms and models -from forms import ThemeForm, TagForm, ThemeDeleteForm, TagDeleteForm -from models import Theme, Tag -#custom views -from functions.custom_views import objects_list, add_object, delete_object - - -def theme_all(request): - return objects_list(request, Theme, 'theme_all.html') - - -def tag_all(request): - return objects_list(request, Tag, 'tag_all.html') - - -def theme_add(request): - return add_object(request, ThemeForm, 'theme_add.html', '/admin/theme/theme/all') - -def tag_add(request): - return add_object(request, TagForm, 'tag_add.html', '/admin/theme/tag/all') - -def theme_delete(request, theme_id): - return delete_object(request, Theme, ThemeDeleteForm, theme_id, '/admin/theme/theme/all') - -def tag_delete(request, tag_id): - return delete_object(request, Tag, TagDeleteForm, tag_id, '/admin/theme/tag/all') - - -@login_required -def theme_change(request, theme_id=None): - try: - theme = Theme.objects.get(id=theme_id) - except: - return HttpResponseRedirect('/admin/theme/theme/all') - if request.POST: - form = ThemeForm(request.POST) - if form.is_valid(): - form.save(theme_id) - return HttpResponseRedirect('/admin/theme/theme/all') - else: - data = {} - #bitfeild - data['types'] = [item for item, bool in theme.types if bool==True] - - - - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Theme._meta.translations_model.objects.get(language_code = code,master__id=theme_id) #access to translated fields - data['name_%s'%code] = obj.name - data['description_%s'%code] = obj.description - data['main_title_%s'%code] = obj.main_title - data['title_%s'%code] = obj.title - data['keywords_%s'%code] = obj.keywords - data['descriptions_%s'%code] = obj.descriptions - - - - form = ThemeForm(data) - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['theme_id'] = theme_id - - return render_to_response('theme_add.html', args) - -@login_required -def tag_change(request, tag_id=None): - try: - tag = Tag.objects.get(id=tag_id) - except: - return HttpResponseRedirect('/admin/theme/tag/all') - if request.POST: - form = TagForm(request.POST) - if form.is_valid(): - form.save(tag_id) - return HttpResponseRedirect('/admin/theme/tag/all') - else: - data = {} - if tag.theme: - data['theme'] = tag.theme.id - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Tag._meta.translations_model.objects.get(language_code = code,master__id=tag_id) #access to translated fields - data['name_%s'%code] = obj.name - data['description_%s'%code] = obj.description - data['main_title_%s'%code] = obj.main_title - data['title_%s'%code] = obj.title - data['keywords_%s'%code] = obj.keywords - data['descriptions_%s'%code] = obj.descriptions - - form = TagForm(data) - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['tag_id'] = tag_id - - return render_to_response('tag_add.html', args) \ No newline at end of file diff --git a/translator/views.py b/translator/admin.py similarity index 100% rename from translator/views.py rename to translator/admin.py diff --git a/translator/urls.py b/translator/urls.py index 38200c85..edac4e16 100644 --- a/translator/urls.py +++ b/translator/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, url -urlpatterns = patterns('translator.views', +urlpatterns = patterns('translator.admin', url(r'^add.*/$', 'translator_add'), url(r'^delete/(?P.*)/$', 'translator_delete'), url(r'^change/(?P.*)/$', 'translator_change'), diff --git a/webinar/admin.py b/webinar/admin.py index 4056b4e4..fe5bb12a 100644 --- a/webinar/admin.py +++ b/webinar/admin.py @@ -1,9 +1,120 @@ # -*- coding: utf-8 -*- -from django.contrib import admin -from hvad.admin import TranslatableAdmin +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect, HttpResponse +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 theme.models import Tag from models import Webinar +from forms import WebinarChangeForm, WebinarCreateForm, WebinarDeleteForm +from file.models import FileModel, TmpFile +from file.forms import FileModelForm +#python +import random +#custom views +from functions.custom_views import objects_list, delete_object -class WebinarAdmin(TranslatableAdmin): - pass -admin.site.register(Webinar, WebinarAdmin) +def webinar_all(request): + """ + Return list of all webinars with pagination + """ + return objects_list(request, Webinar, 'webinar_all.html') + + +@login_required +def webinar_add(request): + """ + Returns form of webinar and post it on the server. + + If form is posted redirect on the page of all webinars. + """ + #if form would be not valid key must be same + if request.POST.get('key'): + key = request.POST['key'] + else: + key = random.getrandbits(128) + + file_form = FileModelForm(initial={'key': key}) + + if request.POST: + form = WebinarCreateForm(request.POST) + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + if form.is_valid(): + form.save() + return HttpResponseRedirect('/admin/webinar/all/') + else: + form = WebinarCreateForm(initial={'key': key}) + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + args['file_form'] = file_form + args['files'] = TmpFile.objects.filter(key=key) + + return render_to_response('webinar_add.html', args) + + +def webinar_delete(request, url): + return delete_object(request, Webinar, WebinarDeleteForm, url, '/admin/webinar/delete') + + +@login_required +def webinar_change(request, url): + """ + Return form of Webinar and fill it with existing Webinar object data. + + If form of webinar is posted redirect on the page of all webinars. + + """ + try: + #check if webinar_id exists else redirect to the list of webinars + webinar = Webinar.objects.get(url=url) + file_form = FileModelForm(initial={'model': 'webinar.Webinar'}) + except: + return HttpResponseRedirect('/admin/webinar/all/') + if request.POST: + form = WebinarChangeForm(request.POST) + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] + if form.is_valid(): + form.save(getattr(webinar, 'id')) + return HttpResponseRedirect('/admin/webinar/all/') + else: + #fill form with data from database + data = {'web_page':webinar.web_page, 'data_begin':webinar.data_begin, 'currency':webinar.currency, + 'tax':webinar.tax, 'min_price':webinar.min_price, 'link':webinar.link, + 'max_price':webinar.max_price, 'webinar_id':webinar.id} + + data['theme'] = [item.id for item in webinar.theme.all()] + data['tag'] = [item.id for item in webinar.tag.all()] + #data from translated fields + for code, name in settings.LANGUAGES: + obj = Webinar._meta.translations_model.objects.get(language_code = code,master__id=getattr(webinar, 'id')) #access to translated fields + data['name_%s' % code] = obj.name + data['programm_%s' % code] = obj.programm + data['main_title_%s' % code] = obj.main_title + data['discount_%s' % code] = obj.discount + data['title_%s' % code] = obj.title + data['keywords_%s' % code] = obj.keywords + data['descriptions_%s' % code] = obj.descriptions + #initial form + form = WebinarChangeForm(initial=data) + form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] + + args = {} + args.update(csrf(request)) + + args['form'] = form + args['languages'] = settings.LANGUAGES + 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(webinar), + object_id=getattr(webinar, 'id')) + args['obj_id'] = getattr(webinar, 'id') + + return render_to_response('webinar_add.html', args) \ No newline at end of file diff --git a/webinar/admin2.py b/webinar/admin2.py new file mode 100644 index 00000000..4056b4e4 --- /dev/null +++ b/webinar/admin2.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin +from hvad.admin import TranslatableAdmin +from models import Webinar + +class WebinarAdmin(TranslatableAdmin): + pass + +admin.site.register(Webinar, WebinarAdmin) diff --git a/webinar/urls.py b/webinar/urls.py index 63dcf9be..cff07e42 100644 --- a/webinar/urls.py +++ b/webinar/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, include, url -urlpatterns = patterns('webinar.views', +urlpatterns = patterns('webinar.admin', url(r'^add.*/$', 'webinar_add'), url(r'^delete/(?P.*)/$', 'webinar_delete'), url(r'^change/(?P.*)/$', 'webinar_change'), diff --git a/webinar/views.py b/webinar/views.py deleted file mode 100644 index fe5bb12a..00000000 --- a/webinar/views.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse -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 theme.models import Tag -from models import Webinar -from forms import WebinarChangeForm, WebinarCreateForm, WebinarDeleteForm -from file.models import FileModel, TmpFile -from file.forms import FileModelForm -#python -import random -#custom views -from functions.custom_views import objects_list, delete_object - - -def webinar_all(request): - """ - Return list of all webinars with pagination - """ - return objects_list(request, Webinar, 'webinar_all.html') - - -@login_required -def webinar_add(request): - """ - Returns form of webinar and post it on the server. - - If form is posted redirect on the page of all webinars. - """ - #if form would be not valid key must be same - if request.POST.get('key'): - key = request.POST['key'] - else: - key = random.getrandbits(128) - - file_form = FileModelForm(initial={'key': key}) - - if request.POST: - form = WebinarCreateForm(request.POST) - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - if form.is_valid(): - form.save() - return HttpResponseRedirect('/admin/webinar/all/') - else: - form = WebinarCreateForm(initial={'key': key}) - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['file_form'] = file_form - args['files'] = TmpFile.objects.filter(key=key) - - return render_to_response('webinar_add.html', args) - - -def webinar_delete(request, url): - return delete_object(request, Webinar, WebinarDeleteForm, url, '/admin/webinar/delete') - - -@login_required -def webinar_change(request, url): - """ - Return form of Webinar and fill it with existing Webinar object data. - - If form of webinar is posted redirect on the page of all webinars. - - """ - try: - #check if webinar_id exists else redirect to the list of webinars - webinar = Webinar.objects.get(url=url) - file_form = FileModelForm(initial={'model': 'webinar.Webinar'}) - except: - return HttpResponseRedirect('/admin/webinar/all/') - if request.POST: - form = WebinarChangeForm(request.POST) - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - if form.is_valid(): - form.save(getattr(webinar, 'id')) - return HttpResponseRedirect('/admin/webinar/all/') - else: - #fill form with data from database - data = {'web_page':webinar.web_page, 'data_begin':webinar.data_begin, 'currency':webinar.currency, - 'tax':webinar.tax, 'min_price':webinar.min_price, 'link':webinar.link, - 'max_price':webinar.max_price, 'webinar_id':webinar.id} - - data['theme'] = [item.id for item in webinar.theme.all()] - data['tag'] = [item.id for item in webinar.tag.all()] - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Webinar._meta.translations_model.objects.get(language_code = code,master__id=getattr(webinar, 'id')) #access to translated fields - data['name_%s' % code] = obj.name - data['programm_%s' % code] = obj.programm - data['main_title_%s' % code] = obj.main_title - data['discount_%s' % code] = obj.discount - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #initial form - form = WebinarChangeForm(initial=data) - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - 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(webinar), - object_id=getattr(webinar, 'id')) - args['obj_id'] = getattr(webinar, 'id') - - return render_to_response('webinar_add.html', args) \ No newline at end of file