commit 13.02.2014

remotes/origin/1203
Nazar Kotyuk 12 years ago
parent bda826a60c
commit 0298dfcbdb
  1. 196
      accounts/admin.py
  2. 12
      accounts/admin_urls.py
  3. 1
      accounts/signals.py
  4. 15
      accounts/urls.py
  5. 143
      accounts/views.py
  6. 9
      article/admin2.py
  7. 0
      article/admin_urls.py
  8. 20
      article/forms.py
  9. 6
      article/signals.py
  10. 9
      city/admin2.py
  11. 0
      city/admin_urls.py
  12. 29
      city/forms.py
  13. 8
      city/signals.py
  14. 9
      company/admin2.py
  15. 0
      company/admin_urls.py
  16. 17
      company/forms.py
  17. 6
      company/signals.py
  18. 0
      conference/admin2.py
  19. 0
      conference/admin_urls.py
  20. 4
      conference/forms.py
  21. 44
      conference/models.py
  22. 6
      conference/signals.py
  23. 0
      country/admin_urls.py
  24. 21
      country/forms.py
  25. 67
      country/models.py
  26. 8
      country/signals.py
  27. 7
      directories/admin2.py
  28. 9
      exposition/admin2.py
  29. 0
      exposition/admin_urls.py
  30. 3
      exposition/forms.py
  31. 47
      exposition/models.py
  32. 6
      exposition/signals.py
  33. 6
      file/urls.py
  34. 5
      functions/form_check.py
  35. 39
      functions/signal_additional_func.py
  36. 9
      functions/signal_handlers.py
  37. 11
      functions/translate.py
  38. 9
      news/admin2.py
  39. 0
      news/admin_urls.py
  40. 20
      news/forms.py
  41. 6
      news/signals.py
  42. 9
      organiser/admin2.py
  43. 0
      organiser/admin_urls.py
  44. 14
      organiser/forms.py
  45. 6
      organiser/signals.py
  46. 10
      place_conference/admin2.py
  47. 0
      place_conference/admin_urls.py
  48. 21
      place_conference/forms.py
  49. 6
      place_conference/signals.py
  50. 9
      place_exposition/admin2.py
  51. 0
      place_exposition/admin_urls.py
  52. 17
      place_exposition/forms.py
  53. 6
      place_exposition/signals.py
  54. 33
      proj/admin_urls.py
  55. 2
      proj/settings.py
  56. 1
      proj/urls.py
  57. 95
      proj/views.py
  58. 2
      registration/backends/default/urls.py
  59. 17
      registration/backends/default/views.py
  60. 0
      seminar/admin2.py
  61. 0
      seminar/admin_urls.py
  62. 2
      seminar/forms.py
  63. 45
      seminar/models.py
  64. 8
      seminar/signals.py
  65. 9
      service/admin2.py
  66. 0
      service/admin_urls.py
  67. 14
      service/forms.py
  68. 6
      service/signals.py
  69. 0
      settings/admin_urls.py
  70. 1
      settings/views.py
  71. 19
      theme/admin2.py
  72. 0
      theme/admin_urls.py
  73. 9
      theme/signals.py
  74. 0
      translator/admin_urls.py
  75. 13
      translator/forms.py
  76. 6
      translator/signals.py
  77. 9
      webinar/admin2.py
  78. 0
      webinar/admin_urls.py
  79. 4
      webinar/forms.py
  80. 6
      webinar/signals.py

@ -1,34 +1,182 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.shortcuts import render_to_response
from django.contrib.auth.models import Group from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.auth.admin import UserAdmin from django.template import RequestContext
from django.core.context_processors import csrf
from django.contrib.auth.decorators import login_required
import random
from django.utils.translation import ugettext as _
#models and forms
from models import User from models import User
from forms import UserCreationForm, UserChangeForm from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm
#custom views
from functions.custom_views import objects_list
from hashlib import md5
import json
@login_required
def profile(request):
args = {'change_password_form': ChangePasswordForm(),
'email_announcement_form': EmailAnnouncementForm()}
args.update(csrf(request))
return render_to_response('profile.html', args, context_instance=RequestContext(request))
def user_all(request):
"""
Return list of all users with pagination
"""
return objects_list(request, User, 'user_all.html')
def user_change(request, url):
"""
Return form of user and post it on the server.
If form is posted redirect on the page of all users.
"""
user = User.objects.safe_get(id=url)
# try get user by url if doesnt work by id
if user is None:
user = User.objects.safe_get(url=url)
#redirect to list of all users if cannot find user
if user is None:
return HttpResponseRedirect('/admin/accounts/all')
if request.POST:
form = UserForm(request.POST, instance=user)
if form.is_valid():
form.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form = UserForm(instance=user)
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('user_change.html', args)
def create_admin(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_admin = False
user.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('create_admin.html', args)
def create_md5(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
user = User()
user.email = request.POST['email']
user.first_name = request.POST['first_name']
user.last_name = request.POST['last_name']
user.password = md5(request.POST['password2']).hexdigest()
user.is_admin = True
user.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('create_admin.html', args)
from django.core.mail import EmailMessage
def registration(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
email = EmailMessage('Subject', 'Body', to=['%s'%user.email])
email.send()
return HttpResponseRedirect('/admin/accounts/registration')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
class UserAdmin(UserAdmin): return render_to_response('registration.html', args)
form = UserChangeForm def generatePassword():
add_form = UserCreationForm """
generate random password from 8 symbols
"""
SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8',
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A',
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#']
PASSWORD_LENGTH = 8
newPassword = []
for i in range(PASSWORD_LENGTH):
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))])
return ''.join(newPassword)
list_display = ('email', 'first_name', 'last_name', 'is_admin',) from django.conf import settings
list_filter = ('is_admin',)
fieldsets = ( def reset_password_email(request):
(None, {'fields': ('email', 'first_name', 'last_name', 'password')}), """
(None, {'fields': ('url', 'country', 'city', 'position', generate random password
'about', 'phone', 'avatar', 'web_page', set this password to user and send on email
'social', 'title', 'descriptions', 'keywords', """
'is_admin', 'is_active')}), if request.GET:
user = User.objects.get(email=request.GET['email'])
new_pass = generatePassword()
user.email_user('Reset password', 'Your new password: "%s" '%new_pass, settings.DEFAULT_FROM_EMAIL, )
user.set_password(u'%s'%new_pass)
user.save()
return HttpResponse('success')
) return HttpResponse('error')
add_fieldsets = (
(None, {'classes': ('wide',), 'fields': ('email','first_name', 'last_name', 'password1', 'password2')}),
)
ordering = ('email',)
filter_horizontal = ()
admin.site.register(User, UserAdmin) @login_required
admin.site.unregister(Group) def change_password(request):
"""
Change current user password if new password is valid
"""
success = {'success': False}
if request.POST:
form = ChangePasswordForm(request.POST)
if form.is_valid():
user = request.user
if(user.check_password(form.cleaned_data.get('old_password'))):
#user.set_password(form.cleaned_data.get('new_password'))
#user.save()
success['success'] = True
success['message'] = _(u'Пароль именен')
return HttpResponse(json.dumps(success), content_type='application/json')
else:
errors = {'errors': [_(u'Не правильный пароль')]}
success.update(errors)
return HttpResponse(json.dumps(success), content_type='application/json')
else:
errors = [err[0] for err in form.errors.values()]
errors = {'errors': errors}
success.update(errors)
return HttpResponse(json.dumps(success), content_type='application/json')
else:
return HttpResponse(json.dumps(success), content_type='application/json')

@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = patterns('',
url(r'^registration/$', 'accounts.admin.registration'),
url(r'^create_admin/$', 'accounts.admin.create_admin'),
url(r'^create_md5user/$', 'accounts.admin.create_md5'),
url(r'^change/(.*)/$', 'accounts.admin.user_change'),
# url(r'^change/(?P<user_id>\d+).*/$', 'accounts.views.user_change'),
url(r'^all/$', 'accounts.admin.user_all'),
url(r'^reset_password_email/$', 'accounts.admin.reset_password_email'),
)

@ -1,15 +0,0 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.contrib.auth.views import login, logout
urlpatterns = patterns('',
url(r'^login_admin/', login, {'template_name': 'admin/login.html' }),
url(r'^logout_admin', logout, {'next_page': '/admin/accounts/login_admin/'}),
url(r'^registration/$', 'accounts.views.registration'),
url(r'^create_admin/$', 'accounts.views.create_admin'),
url(r'^create_md5user/$', 'accounts.views.create_md5'),
url(r'^change/(.*)/$', 'accounts.views.user_change'),
# url(r'^change/(?P<user_id>\d+).*/$', 'accounts.views.user_change'),
url(r'^all/$', 'accounts.views.user_all'),
url(r'^reset_password_email/$', 'accounts.views.reset_password_email'),
)

@ -4,15 +4,10 @@ from django.http import HttpResponseRedirect, HttpResponse
from django.template import RequestContext from django.template import RequestContext
from django.core.context_processors import csrf from django.core.context_processors import csrf
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
import random
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
#models and forms # forms
from models import User from forms import ChangePasswordForm, EmailAnnouncementForm
from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm # python
#custom views
from functions.custom_views import objects_list
from hashlib import md5
import json import json
@ -23,136 +18,6 @@ def profile(request):
args.update(csrf(request)) args.update(csrf(request))
return render_to_response('profile.html', args, context_instance=RequestContext(request)) return render_to_response('profile.html', args, context_instance=RequestContext(request))
def user_all(request):
"""
Return list of all users with pagination
"""
return objects_list(request, User, 'user_all.html')
def user_change(request, url):
"""
Return form of user and post it on the server.
If form is posted redirect on the page of all users.
"""
user = User.objects.safe_get(id=url)
# try get user by url if doesnt work by id
if user is None:
user = User.objects.safe_get(url=url)
#redirect to list of all users if cannot find user
if user is None:
return HttpResponseRedirect('/admin/accounts/all')
if request.POST:
form = UserForm(request.POST, instance=user)
if form.is_valid():
form.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form = UserForm(instance=user)
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('user_change.html', args)
def create_admin(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_admin = False
user.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('create_admin.html', args)
def create_md5(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
user = User()
user.email = request.POST['email']
user.first_name = request.POST['first_name']
user.last_name = request.POST['last_name']
user.password = md5(request.POST['password2']).hexdigest()
user.is_admin = True
user.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('create_admin.html', args)
from django.core.mail import EmailMessage
def registration(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
email = EmailMessage('Subject', 'Body', to=['%s'%user.email])
email.send()
return HttpResponseRedirect('/admin/accounts/registration')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('registration.html', args)
def generatePassword():
"""
generate random password from 8 symbols
"""
SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8',
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A',
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#']
PASSWORD_LENGTH = 8
newPassword = []
for i in range(PASSWORD_LENGTH):
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))])
return ''.join(newPassword)
from django.conf import settings
def reset_password_email(request):
"""
generate random password
set this password to user and send on email
"""
if request.GET:
user = User.objects.get(email=request.GET['email'])
new_pass = generatePassword()
user.email_user('Reset password', 'Your new password: "%s" '%new_pass, settings.DEFAULT_FROM_EMAIL, )
user.set_password(u'%s'%new_pass)
user.save()
return HttpResponse('success')
return HttpResponse('error')
@login_required @login_required
def change_password(request): def change_password(request):
""" """
@ -179,4 +44,4 @@ def change_password(request):
success.update(errors) success.update(errors)
return HttpResponse(json.dumps(success), content_type='application/json') return HttpResponse(json.dumps(success), content_type='application/json')
else: else:
return HttpResponse(json.dumps(success), content_type='application/json') return HttpResponse(json.dumps(success), content_type='application/json')

@ -1,9 +0,0 @@
# -*- 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)

@ -5,7 +5,7 @@ from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms.util import ErrorList from django.forms.util import ErrorList
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import fill_with_signal
from functions.files import check_tmp_files from functions.files import check_tmp_files
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
#models #models
@ -77,27 +77,19 @@ class ArticleForm(forms.Form):
article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset
#create slug field from russian language #create slug field from russian language
article.url = translit_with_separator(data['main_title_ru']).lower() article.url = translit_with_separator(data['main_title_ru'].strip()).lower()
# uses because in the next loop data will be overwritten
article.save()
# fill translated fields and save object
fill_with_signal(Article, article, data)
# fill manytomany fields
for item in data['theme']: for item in data['theme']:
article.theme.add(item.id)#.id cause select uses queryset article.theme.add(item.id)#.id cause select uses queryset
for item in data['tag']: for item in data['tag']:
article.tag.add(item) article.tag.add(item)
# uses because in the next loop data will be overwritten
article.save()
#populate fields with zero language
zero_fields = {}
fill_trans_fields_all(Article, article, data, id, zero_fields) article.save()
#autopopulate
#populate empty fields and fields which was already populated
article_id = getattr(article, 'id')
populate_all(Article, data, article_id, zero_fields)
#save files #save files
check_tmp_files(article, data['key']) check_tmp_files(article, data['key'])

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Article
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Article)

@ -1,9 +0,0 @@
# -*- 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)

@ -9,7 +9,7 @@ from models import City
from country.models import Country from country.models import Country
from directories.models import Iata from directories.models import Iata
#functions #functions
from functions.translate import fill_trans_fields_all, populate_all, fill_with_signal from functions.translate import fill_with_signal
from functions.form_check import is_positive_integer, translit_with_separator from functions.form_check import is_positive_integer, translit_with_separator
from functions.files import check_tmp_files from functions.files import check_tmp_files
@ -56,17 +56,13 @@ class CityForm(forms.Form):
self.fields['shoping_%s' % code] = forms.CharField(label='Шопинг', required=False, widget=CKEditorWidget()) self.fields['shoping_%s' % code] = forms.CharField(label='Шопинг', required=False, widget=CKEditorWidget())
self.fields['transport_%s' % code] = forms.CharField(label='Транспорт', required=False, widget=CKEditorWidget()) self.fields['transport_%s' % code] = forms.CharField(label='Транспорт', required=False, widget=CKEditorWidget())
#meta data #meta data
self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=required, max_length=255, self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'})) widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255, self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'})) widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=required, max_length=255, self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'})) widget=forms.TextInput(attrs={'style':'width: 550px'}))
#creates select inputs ind fill it
#countries = ((item.id, item.name) for item in Country.objects.all())
#self.fields['country'] = forms.ChoiceField(label='Страна', choices=countries, required=False)
def save(self, id=None): def save(self, id=None):
""" """
@ -77,24 +73,27 @@ class CityForm(forms.Form):
""" """
data = self.cleaned_data data = self.cleaned_data
#create new City object or get exists #create new City object or get exists
if not id: if id:
city = City()
else:
city = City.objects.get(id=id) city = City.objects.get(id=id)
city.phone_code = data['phone_code'] else:
city.population = data['population'] city = City()
city.phone_code = data.get('phone_code')
city.population = data.get('population')
if data.get('code_IATA'): if data.get('code_IATA'):
city.code_IATA = Iata.objects.get(id=data['code_IATA'].id)#.id cause select uses queryset city.code_IATA = Iata.objects.get(id=data['code_IATA'].id)# .id cause select uses queryset
if data.get('country'): if data.get('country'):
city.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset city.country = Country.objects.get(id=data['country'].id)# .id cause select uses queryset
# url generate for city: "country_name-city_name" # url generate for city: "country_name-city_name"
city.url = '%s-'%translit_with_separator(city.country.name) + translit_with_separator(data['name_ru']).lower() city.url = '%s-'%translit_with_separator(city.country.name) + translit_with_separator(data['name_ru']).lower()
# fill translated fields and save object # fill translated fields and save object
fill_with_signal(City, city, data) fill_with_signal(City, city, data)
#save files # save files
check_tmp_files(city, data['key']) check_tmp_files(city, data['key'])

@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import City
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=City)

@ -1,9 +0,0 @@
# -*- 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)

@ -10,7 +10,7 @@ from country.models import Country
from theme.models import Theme from theme.models import Theme
from city.models import City from city.models import City
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import fill_with_signal
from functions.form_check import is_positive_integer, translit_with_separator from functions.form_check import is_positive_integer, translit_with_separator
from functions.files import check_tmp_files from functions.files import check_tmp_files
from functions.custom_fields import LocationWidget from functions.custom_fields import LocationWidget
@ -98,7 +98,7 @@ class CompanyForm(forms.Form):
company.tag.clear() company.tag.clear()
#simple fields #simple fields
company.url = translit_with_separator(data['url']).lower() company.url = translit_with_separator(data['url'].strip()).lower()
company.staff_number = data['staff_number'] company.staff_number = data['staff_number']
company.address = data['address'] company.address = data['address']
company.phone = data['phone'] company.phone = data['phone']
@ -114,8 +114,8 @@ class CompanyForm(forms.Form):
if data.get('city'): if data.get('city'):
company.city = City.objects.get(id=data['city']) company.city = City.objects.get(id=data['city'])
# uses because in the next loop data will be overwritten # fill translated fields and save object
company.save() fill_with_signal(Company, company, data)
#fill manytomany fields #fill manytomany fields
for item in data['theme']: for item in data['theme']:
@ -127,15 +127,6 @@ class CompanyForm(forms.Form):
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
company.save() company.save()
#will be saved populated fields
zero_fields = {}
#fills all translated fields with data
#if saves new object, will fill city object. otherwise existing object of City model
fill_trans_fields_all(Company, company, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
company_id = getattr(company, 'id')
populate_all(Company, data, company_id, zero_fields)
#save files #save files
check_tmp_files(company, data['key']) check_tmp_files(company, data['key'])

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Company
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Company)

@ -112,7 +112,7 @@ class ConferenceCreateForm(forms.Form):
conference.tag.clear() conference.tag.clear()
#simple fields #simple fields
conference.url = translit_with_separator(data['name_ru']).lower() conference.url = translit_with_separator(data['name_ru'].strip()).lower()
conference.data_begin = data['data_begin'] conference.data_begin = data['data_begin']
conference.data_end = data['data_end'] conference.data_end = data['data_end']
conference.link = data['link'] conference.link = data['link']
@ -133,7 +133,9 @@ class ConferenceCreateForm(forms.Form):
if data.get('place'): if data.get('place'):
conference.place = PlaceConference.objects.get(id=data['place'].id)#.id cause select uses queryset conference.place = PlaceConference.objects.get(id=data['place'].id)#.id cause select uses queryset
# fill translated fields and save object
fill_with_signal(Conference, conference, data) fill_with_signal(Conference, conference, data)
#fill manytomany fields #fill manytomany fields
for item in data['theme']: for item in data['theme']:
conference.theme.add(item.id)#.id cause select uses queryset conference.theme.add(item.id)#.id cause select uses queryset

@ -158,46 +158,4 @@ class TimeTable(TranslatableModel):
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(verbose_name='Название', max_length=255) name = models.CharField(verbose_name='Название', max_length=255)
) )
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings
from functions.form_check import translit_with_separator
from functions.translate import get_translated_fields
@receiver(post_save)
def conference_post_save_handler(sender, **kwargs):
"""
objects saves two times:
- first time Conference object
- second time ConferenceTranslation object
object must have at least one Translation
"""
obj = kwargs['instance']
if isinstance(obj, Conference):
# object is Exposition
if kwargs['created'] and obj.url == '':
# if url doesn't set in new object set it
obj.url = translit_with_separator(obj.name)
# what languages must be
all_langs = [code for code, lang in settings.LANGUAGES]
# what languages are
obj_langs = obj.get_available_languages()
#
missing_languages = list(set(all_langs) - set(obj_langs))
# get first Translation object
translation = obj.translations.all()[0]
# translated fields
fields = get_translated_fields(obj)
for code in missing_languages:
# translate
obj.translate(code)
# go through all fields and set value
for field in fields:
setattr(obj, field, getattr(translation, field))
obj.save()

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Conference
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Conference)

@ -12,10 +12,6 @@ from functions.translate import fill_with_signal
from functions.files import check_tmp_files from functions.files import check_tmp_files
from functions.form_check import is_positive_integer, translit_with_separator from functions.form_check import is_positive_integer, translit_with_separator
from functions.translate import get_translated_fields
tz = [ tz = [
(99, ''), (99, ''),
(-12.0, '(GMT -12:00) Eniwetok, Kwajalein'), (-11.0,'(GMT -11:00) Midway Island, Samoa'), (-12.0, '(GMT -12:00) Eniwetok, Kwajalein'), (-11.0,'(GMT -11:00) Midway Island, Samoa'),
@ -131,7 +127,7 @@ class CountryForm(forms.Form):
country.currency.clear() country.currency.clear()
country.url = translit_with_separator(data['name_ru']).lower() country.url = translit_with_separator(data['name_ru'].strip()).lower()
country.population = data['population'] country.population = data['population']
country.teritory = data['teritory'] country.teritory = data['teritory']
country.timezone = data['timezone'] country.timezone = data['timezone']
@ -141,10 +137,12 @@ class CountryForm(forms.Form):
if data.get('capital'): if data.get('capital'):
country.capital = City.objects.get(id=data['capital']) country.capital = City.objects.get(id=data['capital'])
# fill translated fields and save object # fill translated fields and save object
fill_with_signal(Country, country, data) fill_with_signal(Country, country, data)
#fill manytomany fields
# fill manytomany fields
for item in data['language']: for item in data['language']:
country.language.add(item.id)#.id cause select uses queryset country.language.add(item.id)#.id cause select uses queryset
@ -155,21 +153,22 @@ class CountryForm(forms.Form):
country.currency.add(item.id)#.id cause select uses queryset country.currency.add(item.id)#.id cause select uses queryset
country.save() country.save()
#save files # save files
check_tmp_files(country, data['key']) check_tmp_files(country, data['key'])
def clean(self): def clean(self):
id = self.cleaned_data.get('country_id') data = self.cleaned_data
name_ru = self.cleaned_data.get('name_ru') id = data.get('country_id')
name_ru = data.get('name_ru')
country = Country.objects.filter(url=translit_with_separator(name_ru)) country = Country.objects.filter(url=translit_with_separator(name_ru))
if country and str(country[0].id) != id: if country and str(country[0].id) != id:
msg = 'Страна с таким названием уже существует' msg = 'Страна с таким названием уже существует'
self._errors['name_ru'] = ErrorList([msg]) self._errors['name_ru'] = ErrorList([msg])
del self.cleaned_data['name_ru'] del data['name_ru']
return self.cleaned_data return data
def clean_phone_code(self): def clean_phone_code(self):
""" """

@ -2,18 +2,16 @@
from django.db import models from django.db import models
from hvad.models import TranslatableModel, TranslatedFields from hvad.models import TranslatableModel, TranslatedFields
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
#models # models
from directories.models import Language, Currency from directories.models import Language, Currency
from city.models import City from city.models import City
from service.models import Service from service.models import Service
#func # func
from functions.custom_fields import EnumField from functions.custom_fields import EnumField
from bitfield import BitField from bitfield import BitField
from functions.db import db_table_exists from functions.db import db_table_exists
from django.conf import settings # check if table exist and create flags if true
#check if table exist and create flags if true
flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else []
@ -31,7 +29,7 @@ class Country(TranslatableModel):
REGIONS =('europa', 'asia', 'america', 'africa') REGIONS =('europa', 'asia', 'america', 'africa')
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
#relations # relations
big_cities = models.ManyToManyField(City, blank=True, null=True, related_name='cities') big_cities = models.ManyToManyField(City, blank=True, null=True, related_name='cities')
capital = models.ForeignKey(City,blank=True, null=True, on_delete=models.PROTECT, related_name='capital') capital = models.ForeignKey(City,blank=True, null=True, on_delete=models.PROTECT, related_name='capital')
language = models.ManyToManyField(Language, blank=True, null=True) language = models.ManyToManyField(Language, blank=True, null=True)
@ -45,10 +43,10 @@ class Country(TranslatableModel):
time_delivery = models.PositiveSmallIntegerField(blank=True, null=True) time_delivery = models.PositiveSmallIntegerField(blank=True, null=True)
# #
region = EnumField(values=REGIONS) region = EnumField(values=REGIONS)
#fields saves information about creating and changing model # fields saves information about creating and changing model
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
#connection with FileModel by ContentType # connection with FileModel by ContentType
files = generic.GenericRelation('file.FileModel',content_type_field='content_type', object_id_field='object_id') files = generic.GenericRelation('file.FileModel',content_type_field='content_type', object_id_field='object_id')
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(
@ -67,55 +65,4 @@ class Country(TranslatableModel):
) )
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk)) return self.lazy_translation_getter('name', unicode(self.pk))
from django.db.models.signals import post_save
from models import Country
from django.dispatch import receiver
from django.conf import settings
from functions.form_check import translit_with_separator
from functions.translate import get_translated_fields
from functions.signal_handlers import post_save_handler, post_save_translation_handler
post_save.connect(post_save_handler, sender=Country)
post_save.connect(post_save_translation_handler, sender=CountryTranslation)
'''
@receiver(post_save, sender=Country)
def country_post_save_handler(sender, **kwargs):
"""
objects saves two times:
- first time Country object
- second time CountryTranslation object
object must have at least one Translation
"""
obj = kwargs['instance']
if isinstance(obj, Country):
# object is Country
# what languages must be
all_langs = [code for code, lang in settings.LANGUAGES]
# what languages are
obj_langs = obj.get_available_languages()
#
missing_languages = list(set(all_langs) - set(obj_langs))
# get first Translation object
translation = obj.translations.all()[0]
#
fields = get_translated_fields(obj)
for code in missing_languages:
# translate
obj.translate(code)
# set values equal to first translation
for field in fields:
setattr(obj, field, getattr(translation, field))
obj.save()
if isinstance(obj, CountryTranslation):
# object is Translation
if obj.language_code == 'ru':
country = Country.objects.get(id=obj.master_id)
country.url = translit_with_separator(obj.name)
country.save()
'''

@ -1 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from functions.signal_handlers import post_save_handler
from models import Country
post_save.connect(post_save_handler, sender=Country)

@ -1,7 +0,0 @@
# -*- 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)

@ -1,9 +0,0 @@
# -*- 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)

@ -118,7 +118,7 @@ class ExpositionCreateForm(forms.Form):
exposition.tag.clear() exposition.tag.clear()
#simple fields #simple fields
exposition.url = translit_with_separator(data['name_ru']).lower() exposition.url = translit_with_separator(data['name_ru'].strip()).lower()
exposition.data_begin = data['data_begin'] exposition.data_begin = data['data_begin']
exposition.data_end = data['data_end'] exposition.data_end = data['data_end']
exposition.periodic = data['periodic'] exposition.periodic = data['periodic']
@ -146,6 +146,7 @@ class ExpositionCreateForm(forms.Form):
if data.get('place'): if data.get('place'):
exposition.place = PlaceExposition.objects.get(id=data['place'].id)#.id cause select uses queryset exposition.place = PlaceExposition.objects.get(id=data['place'].id)#.id cause select uses queryset
# fill translated fields and save object
fill_with_signal(Exposition, exposition, data) fill_with_signal(Exposition, exposition, data)
#fill manytomany fields #fill manytomany fields

@ -171,49 +171,4 @@ class TimeTable(TranslatableModel):
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(verbose_name='Название', max_length=255) name = models.CharField(verbose_name='Название', max_length=255)
) )
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings
from functions.form_check import translit_with_separator
from functions.translate import get_translated_fields
@receiver(post_save)
def exposition_post_save_handler(sender, **kwargs):
"""
objects saves two times:
- first time Exposition object
- second time ExpositionTranslation object
object must have at least one Translation
"""
obj = kwargs['instance']
if isinstance(obj, Exposition):
# object is Exposition
if kwargs['created'] and obj.url == '':
# if url doesn't set in new object set it
obj.url = translit_with_separator(obj.name)
# what languages must be
all_langs = [code for code, lang in settings.LANGUAGES]
# what languages are
obj_langs = obj.get_available_languages()
#
missing_languages = list(set(all_langs) - set(obj_langs))
# get first Translation object
translation = obj.translations.all()[0]
# translated fields
fields = get_translated_fields(obj)
for code in missing_languages:
# translate
obj.translate(code)
# go through all fields and set value
for field in fields:
setattr(obj, field, getattr(translation, field))
obj.save()

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Exposition
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Exposition)

@ -1,6 +0,0 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = patterns('',
)

@ -30,7 +30,4 @@ def translit_with_separator(string, separator='-'):
#delete dublicating separators #delete dublicating separators
st = re.sub('%s+'%separator, separator, st) st = re.sub('%s+'%separator, separator, st)
return st return st
#def check_url(url, id, Model, field='url', msg='Такой урл уже занят'):
# try:

@ -39,22 +39,23 @@ def fill_meta_information(obj):
""" """
# return list of settings for this object # return list of settings for this object
s_list = settings_dict.get(obj.__class__.__name__) s_list = settings_dict.get(obj.__class__.__name__)
if s_list:
for s in s_list:
# get Setting model object for s in s_list:
setting = Setting.objects.get(key=s.get('key')) # get Setting model object
field = s.get('field_name') setting = Setting.objects.get(key=s.get('key'))
if setting.type != 'transl': field = s.get('field_name')
# simple field if setting.type != 'transl':
if getattr(obj, field)=="": # simple field
setattr(obj, field, setting.get_value()) if getattr(obj, field)=="":
obj.save() setattr(obj, field, setting.get_value())
else: obj.save()
# translated field else:
for code, lang in settings.LANGUAGES: # translated field
# get translation object for code, lang in settings.LANGUAGES:
tr = obj._meta.translations_model.objects.get(language_code=code, master__id=getattr(obj, 'id')) # get translation object
tr = obj._meta.translations_model.objects.get(language_code=code, master__id=getattr(obj, 'id'))
if getattr(tr, field)=="":
setattr(tr, field, setting.get_value(code)) if getattr(tr, field)=="":
tr.save() setattr(tr, field, setting.get_value(code))
tr.save()

@ -14,7 +14,7 @@ def post_save_handler(sender, **kwargs):
fill_missing_languages(obj) fill_missing_languages(obj)
fill_meta_information(obj) fill_meta_information(obj)
from country.models import Country
def post_save_translation_handler(sender, **kwargs): def post_save_translation_handler(sender, **kwargs):
""" """
receiver function receiver function
@ -22,5 +22,8 @@ def post_save_translation_handler(sender, **kwargs):
""" """
obj = kwargs['instance'] obj = kwargs['instance']
if obj.language_code == 'ru': if obj.language_code == 'ru':
obj.master.url = translit_with_separator(obj.name) c = Country.objects.all()[0]
obj.master.save() c.url = 'tttt'
c.save()
#obj.master.url = translit_with_separator(obj.name)
#obj.master.save()

@ -92,6 +92,9 @@ def populate_all(Model, data={}, id=None, zero_fields={}):
def fill_with_signal(model, obj, data): def fill_with_signal(model, obj, data):
"""
function useful when post_save signal what filling languages exist for this model
"""
all_langs = [code for code, lang in settings.LANGUAGES] all_langs = [code for code, lang in settings.LANGUAGES]
# fields in translations model that doesn't need # fields in translations model that doesn't need
bad_fields = ['id', 'language_code', 'master_id'] bad_fields = ['id', 'language_code', 'master_id']
@ -105,13 +108,13 @@ def fill_with_signal(model, obj, data):
obj.translate(all_langs[0]) obj.translate(all_langs[0])
# go through all fields and set value # go through all fields and set value
for field in fields: for field in fields:
setattr(obj, field, data.get('%s_%s'%(field, all_langs[0]))) setattr(obj, field, data.get('%s_%s'%(field, all_langs[0])).strip())
obj.save() obj.save()
else: else:
trans_obj = model._meta.translations_model.objects.get(language_code = all_langs[0], trans_obj = model._meta.translations_model.objects.get(language_code = all_langs[0],
master__id=getattr(obj, 'id')) master__id=getattr(obj, 'id'))
for field in fields: for field in fields:
setattr(trans_obj, field, data.get('%s_%s'%(field, all_langs[0]))) setattr(trans_obj, field, data.get('%s_%s'%(field, all_langs[0])).strip())
trans_obj.save() trans_obj.save()
@ -123,7 +126,7 @@ def fill_with_signal(model, obj, data):
# start from second language # start from second language
trans_obj = model._meta.translations_model.objects.get(language_code = code,master__id=getattr(obj, 'id')) trans_obj = model._meta.translations_model.objects.get(language_code = code,master__id=getattr(obj, 'id'))
for field in fields: for field in fields:
val = data.get('%s_%s'%(field, code)) val = data.get('%s_%s'%(field, code)).strip()
if val == '': if val == '':
# get value from require translation # get value from require translation
setattr(trans_obj, field, getattr(require_transl, field)) setattr(trans_obj, field, getattr(require_transl, field))
@ -132,8 +135,6 @@ def fill_with_signal(model, obj, data):
trans_obj.save() trans_obj.save()
def get_translated_fields(obj, exclude_fields=[]): def get_translated_fields(obj, exclude_fields=[]):
""" """
get translated fields get translated fields

@ -1,9 +0,0 @@
# -*- 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)

@ -10,8 +10,7 @@ from theme.models import Theme
from accounts.models import User from accounts.models import User
from django.db.models.loading import get_model from django.db.models.loading import get_model
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import fill_with_signal
from functions.form_check import is_positive_integer
from functions.files import check_tmp_files from functions.files import check_tmp_files
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
@ -41,7 +40,6 @@ class NewsForm(forms.Form):
#field for comparing tmp files #field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
create dynamical translated fields fields create dynamical translated fields fields
@ -88,7 +86,7 @@ class NewsForm(forms.Form):
news.content_type = ContentType.objects.get_for_model(obj)# news.content_type = ContentType.objects.get_for_model(obj)#
news.object_id = data['event_id'] news.object_id = data['event_id']
#simple fields #simple fields
news.url = translit_with_separator(data['main_title_ru']) news.url = translit_with_separator(data['main_title_ru'].strip())
news.date = data['date'] news.date = data['date']
news.type = data['type'] news.type = data['type']
news.paid = data['paid'] news.paid = data['paid']
@ -96,8 +94,9 @@ class NewsForm(forms.Form):
if data.get('user'): if data.get('user'):
news.user = data['user'] news.user = data['user']
# uses because in the next loop data will be overwritten # fill translated fields and save object
news.save() fill_with_signal(News, news, data)
#fill manytomany fields #fill manytomany fields
for item in data['theme']: for item in data['theme']:
news.theme.add(item.id)#.id cause select uses queryset news.theme.add(item.id)#.id cause select uses queryset
@ -108,15 +107,6 @@ class NewsForm(forms.Form):
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
news.save() news.save()
#will be saved populated fields
zero_fields = {}
#fills all translated fields with data
#if saves new object, will fill city object. otherwise existing object of City model
fill_trans_fields_all(News, news, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
news_id = getattr(news, 'id')
populate_all(News, data, news_id, zero_fields)
#save files #save files
check_tmp_files(news, data['key']) check_tmp_files(news, data['key'])

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import News
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=News)

@ -1,9 +0,0 @@
# -*- 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)

@ -12,7 +12,7 @@ from accounts.models import User
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference from place_conference.models import PlaceConference
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import fill_with_signal
from functions.form_check import is_positive_integer, translit_with_separator from functions.form_check import is_positive_integer, translit_with_separator
from functions.files import check_tmp_files from functions.files import check_tmp_files
from functions.custom_fields import LocationWidget from functions.custom_fields import LocationWidget
@ -124,8 +124,7 @@ class OrganiserForm(forms.Form):
if data.get('city'): if data.get('city'):
organiser.city = City.objects.get(id=data['city']) organiser.city = City.objects.get(id=data['city'])
# uses because in the next loop data will be overwritten fill_with_signal(Organiser, organiser, data)
organiser.save()
#fill manytomany fields #fill manytomany fields
@ -144,15 +143,6 @@ class OrganiserForm(forms.Form):
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
organiser.save() organiser.save()
#will be saved populated fields
zero_fields = {}
#fills all translated fields with data
#if saves new object, will fill city object. otherwise existing object of City model
fill_trans_fields_all(Organiser, organiser, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
organiser_id = getattr(organiser, 'id')
populate_all(Organiser, data, organiser_id, zero_fields)
#save files #save files
check_tmp_files(organiser, data['key']) check_tmp_files(organiser, data['key'])

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Organiser
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Organiser)

@ -1,10 +0,0 @@
# -*- 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)

@ -10,7 +10,7 @@ from models import PlaceConference, Hall, CONFERENCE_TYPE
from country.models import Country from country.models import Country
from city.models import City from city.models import City
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import fill_with_signal
from functions.files import check_tmp_files from functions.files import check_tmp_files
from functions.form_check import is_positive_integer, translit_with_separator from functions.form_check import is_positive_integer, translit_with_separator
from functions.custom_fields import LocationWidget from functions.custom_fields import LocationWidget
@ -114,7 +114,7 @@ class ConferenceForm(forms.Form):
place_conference = PlaceConference.objects.get(id=id) place_conference = PlaceConference.objects.get(id=id)
#simple fields #simple fields
place_conference.url = translit_with_separator(data['name_ru']).lower() place_conference.url = translit_with_separator(data['name_ru'].strip()).lower()
place_conference.type = data['type'] place_conference.type = data['type']
place_conference.address = data['address'] place_conference.address = data['address']
place_conference.phone = data['phone'] place_conference.phone = data['phone']
@ -132,27 +132,18 @@ class ConferenceForm(forms.Form):
place_conference.banquet_hall = data['banquet_hall'] place_conference.banquet_hall = data['banquet_hall']
place_conference.catering = data['catering'] place_conference.catering = data['catering']
place_conference.hotel = data['hotel'] place_conference.hotel = data['hotel']
if data.get('country'): if data.get('country'):
place_conference.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset place_conference.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset
if data.get('city'): if data.get('city'):
place_conference.city = City.objects.get(id=data['city']) place_conference.city = City.objects.get(id=data['city'])
# uses because in the next loop data will be overwritten fill_with_signal(PlaceConference, place_conference, data)
place_conference.save()
#will be saved populated fields
zero_fields = {}
#fills all translated fields with data
#if saves new object, will fill city object. otherwise existing object of City model
fill_trans_fields_all(PlaceConference, place_conference, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
place_conference_id = getattr(place_conference, 'id')
populate_all(PlaceConference, data, place_conference_id, zero_fields)
#save files #save files
check_tmp_files(place_conference, data['key']) check_tmp_files(place_conference, data['key'])
return PlaceConference.objects.get(id=place_conference.id)
return PlaceConference.objects.get(id=place_conference_id)
def clean(self): def clean(self):
id = self.cleaned_data.get('place_conference_id') id = self.cleaned_data.get('place_conference_id')

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import PlaceConference
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=PlaceConference)

@ -1,9 +0,0 @@
# -*- 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)

@ -10,7 +10,7 @@ from models import PlaceExposition, EXPOSITION_TYPE, Hall
from country.models import Country from country.models import Country
from city.models import City from city.models import City
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import fill_with_signal
from functions.files import check_tmp_files from functions.files import check_tmp_files
from functions.form_check import is_positive_integer, translit_with_separator from functions.form_check import is_positive_integer, translit_with_separator
from functions.custom_fields import LocationWidget from functions.custom_fields import LocationWidget
@ -145,21 +145,12 @@ class ExpositionForm(forms.Form):
if data.get('city'): if data.get('city'):
place_exposition.city = City.objects.get(id=data['city']) place_exposition.city = City.objects.get(id=data['city'])
# uses because in the next loop data will be overwritten fill_with_signal(PlaceExposition, place_exposition, data)
place_exposition.save()
#will be saved populated fields
zero_fields = {}
#fills all translated fields with data
#if saves new object, will fill city object. otherwise existing object of City model
fill_trans_fields_all(PlaceExposition, place_exposition, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
place_exposition_id = getattr(place_exposition, 'id')
populate_all(PlaceExposition, data, place_exposition_id, zero_fields)
#save files #save files
check_tmp_files(place_exposition, data['key']) check_tmp_files(place_exposition, data['key'])
return PlaceExposition.objects.get(id=place_exposition_id) return PlaceExposition.objects.get(id=place_exposition.id)
def clean(self): def clean(self):
id = self.cleaned_data.get('place_exposition_id') id = self.cleaned_data.get('place_exposition_id')

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import PlaceExposition
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=PlaceExposition)

@ -9,23 +9,22 @@ urlpatterns = required(
url(r'^$', 'proj.admin.admin_home'), url(r'^$', 'proj.admin.admin_home'),
url(r'^import-event/$', 'import_xls.views.import_event'), url(r'^import-event/$', 'import_xls.views.import_event'),
url(r'^export-event/$', 'import_xls.views.export_event'), url(r'^export-event/$', 'import_xls.views.export_event'),
url(r'^accounts/', include('accounts.urls')), url(r'^article/', include('article.admin_urls')),
url(r'^article/', include('article.urls')), url(r'^city/', include('city.admin_urls')),
url(r'^city/', include('city.urls')), url(r'^company/', include('company.admin_urls')),
url(r'^company/', include('company.urls')), url(r'^conference/', include('conference.admin_urls')),
url(r'^conference/', include('conference.urls')), url(r'^country/', include('country.admin_urls')),
url(r'^country/', include('country.urls')), url(r'^exposition/', include('exposition.admin_urls')),
url(r'^exposition/', include('exposition.urls')), url(r'^news/', include('news.admin_urls')),
url(r'^news/', include('news.urls')), url(r'^organiser/', include('organiser.admin_urls')),
url(r'^organiser/', include('organiser.urls')), url(r'^place_conference/', include('place_conference.admin_urls')),
url(r'^place_conference/', include('place_conference.urls')), url(r'^place_exposition/', include('place_exposition.admin_urls')),
url(r'^place_exposition/', include('place_exposition.urls')), url(r'^seminar/', include('seminar.admin_urls')),
url(r'^seminar/', include('seminar.urls')), url(r'^service/', include('service.admin_urls')),
url(r'^service/', include('service.urls')), url(r'^theme/', include('theme.admin_urls')),
url(r'^theme/', include('theme.urls')), url(r'^translator/', include('translator.admin_urls')),
url(r'^translator/', include('translator.urls')), url(r'^webinar/', include('webinar.admin_urls')),
url(r'^webinar/', include('webinar.urls')), url(r'^settings/$', include('settings.admin_urls')),
url(r'^settings/$', include('settings.urls')),
url(r'^language/add/', 'directories.admin.language_add'), url(r'^language/add/', 'directories.admin.language_add'),
url(r'^currency/add/', 'directories.admin.currency_add'), url(r'^currency/add/', 'directories.admin.currency_add'),
# ajax requests # ajax requests

@ -240,7 +240,7 @@ INSTALLED_APPS = (
'ckeditor', 'ckeditor',
'bitfield', 'bitfield',
'social_auth', 'social_auth',
#'south', 'south',
#'debug_toolbar', #'debug_toolbar',
) )

@ -7,6 +7,7 @@ urlpatterns = patterns('',
url(r'^login/', 'registration.backends.default.views.LoginView'), url(r'^login/', 'registration.backends.default.views.LoginView'),
url(r'^logout/', 'registration.backends.default.views.LogoutView'), url(r'^logout/', 'registration.backends.default.views.LogoutView'),
url(r'^profile/$', 'accounts.views.profile'), url(r'^profile/$', 'accounts.views.profile'),
url(r'^accounts/', include('registration.backends.default.urls')),
# admin part # admin part
url(r'^admin/', include('proj.admin_urls')), url(r'^admin/', include('proj.admin_urls')),
) )

@ -1,22 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.core.context_processors import csrf from django.core.context_processors import csrf
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.contenttypes.models import ContentType
#from forms import SettingsForm
#from models import Settings
from django.contrib.auth.decorators import login_required
from django.template import RequestContext from django.template import RequestContext
from file.models import TmpFile, FileModel
from file.forms import FileModelForm
from city.models import City
from theme.models import Tag
from django.db.models.loading import get_model
def home(request): def home(request):
#reg_form = RegistrationFormUniqueEmail() #reg_form = RegistrationFormUniqueEmail()
#login_form = LoginForm() #login_form = LoginForm()
@ -24,84 +11,4 @@ def home(request):
args = {} args = {}
args.update(csrf(request)) args.update(csrf(request))
return render_to_response('index.html', args, context_instance=RequestContext(request)) return render_to_response('index.html', args, context_instance=RequestContext(request))
def admin_home(request):
return render_to_response('base.html')
@login_required
def ajax_city(request):
"""
returns html <option> tags filled with cities filtered by country value from request
"""
objects = City.objects.filter(country=request.GET['id'])
return render_to_response('select.html', {'objects': objects})
@login_required
def ajax_tag(request):
"""
return array of tags (id, name) filtered by theme values from request
"""
if request.GET:
ids = request.GET.get('id')
if ids:
#get id values in list
data = ids.replace('theme=', '').split('&')
#generate list of tags
tags = ['[%d, "%s"]'%(int(item.id), item.name) for item in Tag.objects.filter(theme__in=data)]
return HttpResponse('[%s]'%', '.join(tags), content_type='application/json')
else:
#request empty - send empty array
return HttpResponse('[]', content_type='application/json')
from django.core import serializers
@login_required
def ajax_post_file(request, obj_id=None):
"""
Takes file and file data and save it
If obj_id = None creates TmpFile
Returns 'file_list.html' template with existing files if id != None.
N/A file_list.html' template with Tmp files filtered by key
"""
if request.POST:
file_form = FileModelForm(request.POST, request.FILES)
if file_form.is_valid():
#if obj_id is not exist create TMPfile objects else FileModel objects
if obj_id != None:
#takes data from hidden input "model" and initial Model
Model = get_model(request.POST['model'].split('.')[0], request.POST['model'].split('.')[1])
#initial model object
obj = Model.objects.get(id=obj_id)
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)
files = TmpFile.objects.filter(key=request.POST['key'])
return render_to_response('file_list.html', {'files' : files})
args = {}
args['languages'] = settings.LANGUAGES
args['file_form'] = file_form
return render_to_response('ajax_error_form.html', args)
@login_required
def ajax_delete_file(request):
"""
delete file
"""
if request.GET:
file = FileModel.objects.get(id = request.GET['id'])
file.delete()
return HttpResponse('success')
else:
return HttpResponse('error')

@ -37,6 +37,7 @@ urlpatterns = patterns('',
url(r'^activate/(?P<activation_key>\w+)/$', url(r'^activate/(?P<activation_key>\w+)/$',
ActivationView.as_view(), ActivationView.as_view(),
name='registration_activate'), name='registration_activate'),
"""
url(r'^register/$', url(r'^register/$',
RegistrationView.as_view(), RegistrationView.as_view(),
name='registration_register'), name='registration_register'),
@ -47,4 +48,5 @@ urlpatterns = patterns('',
TemplateView.as_view(template_name='registration/registration_closed.html'), TemplateView.as_view(template_name='registration/registration_closed.html'),
name='registration_disallowed'), name='registration_disallowed'),
(r'', include('registration.auth_urls')), (r'', include('registration.auth_urls')),
"""
) )

@ -144,7 +144,7 @@ from django.http import HttpResponse, HttpResponseRedirect
from accounts.models import User from accounts.models import User
from registration.forms import RegistrationFormUniqueEmail, LoginForm from registration.forms import RegistrationFormUniqueEmail
from django.contrib.auth import login, logout from django.contrib.auth import login, logout
from django.views.decorators.debug import sensitive_post_parameters from django.views.decorators.debug import sensitive_post_parameters
@ -185,21 +185,6 @@ def RegisterAjaxView(request):
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
@sensitive_post_parameters('password')
def LoginAjaxView(request):
if request.POST:
form = AuthenticationForm(data=request.POST)
if form.is_valid():
login(request, form.get_user())
return HttpResponseRedirect('/')
else:
return HttpResponse('bla')
else:
form = LoginForm()
return HttpResponseRedirect('/')
def LogoutView(request): def LogoutView(request):
logout(request) logout(request)

@ -104,7 +104,7 @@ class SeminarCreateForm(forms.Form):
seminar.tag.clear() seminar.tag.clear()
#simple fields #simple fields
seminar.url = translit_with_separator(data['name_ru']).lower() seminar.url = translit_with_separator(data['name_ru'].strip()).lower()
seminar.data_begin = data['data_begin'] seminar.data_begin = data['data_begin']
seminar.data_end = data['data_end'] seminar.data_end = data['data_end']
seminar.link = data['link'] seminar.link = data['link']

@ -139,47 +139,4 @@ class Seminar(TranslatableModel):
duplicate.save() duplicate.save()
return duplicate return duplicate
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings
from functions.form_check import translit_with_separator
from functions.translate import get_translated_fields
@receiver(post_save)
def seminar_post_save_handler(sender, **kwargs):
"""
objects saves two times:
- first time Seminar object
- second time SeminarTranslation object
object must have at least one Translation
"""
obj = kwargs['instance']
if isinstance(obj, Seminar):
# object is Exposition
if kwargs['created'] and obj.url == '':
# if url doesn't set in new object set it
obj.url = translit_with_separator(obj.name)
# what languages must be
all_langs = [code for code, lang in settings.LANGUAGES]
# what languages are
obj_langs = obj.get_available_languages()
#
missing_languages = list(set(all_langs) - set(obj_langs))
# get first Translation object
translation = obj.translations.all()[0]
# translated fields
fields = get_translated_fields(obj)
for code in missing_languages:
# translate
obj.translate(code)
# go through all fields and set value
for field in fields:
setattr(obj, field, getattr(translation, field))
obj.save()

@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Seminar
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Seminar)

@ -1,9 +0,0 @@
# -*- 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)

@ -4,7 +4,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from django.forms.util import ErrorList from django.forms.util import ErrorList
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import fill_with_signal
#models #models
from models import Service from models import Service
from country.models import Country, City from country.models import Country, City
@ -74,17 +74,7 @@ class ServiceForm(forms.Form):
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
service.save() service.save()
#populate fields with zero language fill_with_signal(Service, service, data)
zero_fields = {}
fill_trans_fields_all(Service, service, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
service_id = getattr(service, 'id')
populate_all(Service, data, service_id, zero_fields)
countries = [item.id for item in data['europa']] countries = [item.id for item in data['europa']]
countries += [item.id for item in data['asia']] countries += [item.id for item in data['asia']]

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Service
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Service)

@ -1 +0,0 @@
# Create your views here.

@ -1,19 +0,0 @@
# -*- 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)

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Theme, Tag
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Theme)
post_save.connect(post_save_handler, sender=Tag)

@ -8,7 +8,7 @@ from city.models import City
# #
from accounts.models import User from accounts.models import User
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import fill_with_signal
from functions.files import check_tmp_files from functions.files import check_tmp_files
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
@ -72,15 +72,8 @@ class TranslatorForm(forms.Form):
translator.birth = data['birth'] translator.birth = data['birth']
translator.gender = data['gender'] translator.gender = data['gender']
#will be saved populated fields fill_with_signal(Translator, translator, data)
zero_fields = {}
#fills all translated fields with data
#if saves new object, will fill city object. otherwise existing object of City model
fill_trans_fields_all(Translator, translator, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
translator_id = getattr(translator, 'id')
populate_all(Translator, data, translator_id, zero_fields)
#save files #save files
check_tmp_files(translator, data['key']) check_tmp_files(translator, data['key'])

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Translator
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Translator)

@ -1,9 +0,0 @@
# -*- 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)

@ -99,7 +99,7 @@ class WebinarCreateForm(forms.Form):
webinar.tag.clear() webinar.tag.clear()
#simple fields #simple fields
webinar.url = translit_with_separator(data['name_ru']).lower() webinar.url = translit_with_separator(data['name_ru'].strip()).lower()
webinar.data_begin = data['data_begin'] webinar.data_begin = data['data_begin']
webinar.link = data['link'] webinar.link = data['link']
webinar.web_page= data['web_page'] webinar.web_page= data['web_page']
@ -108,7 +108,9 @@ class WebinarCreateForm(forms.Form):
webinar.tax = data['tax'] webinar.tax = data['tax']
webinar.min_price = data['min_price'] webinar.min_price = data['min_price']
webinar.max_price = data['max_price'] webinar.max_price = data['max_price']
fill_with_signal(Webinar, webinar, data) fill_with_signal(Webinar, webinar, data)
#fill manytomany fields #fill manytomany fields
for item in data['theme']: for item in data['theme']:
webinar.theme.add(item) webinar.theme.add(item)

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Webinar
from functions.signal_handlers import post_save_handler
post_save.connect(post_save_handler, sender=Webinar)
Loading…
Cancel
Save