remotes/origin/1203
Nazar Kotyuk 12 years ago
parent 615a5c22ce
commit bda826a60c
  1. 27
      accounts/forms.py
  2. 70
      accounts/views.py
  3. 7
      country/admin.py
  4. 16
      country/admin2.py
  5. 6
      country/forms.py
  6. 12
      country/models.py
  7. 53
      functions/__init__.py
  8. 77
      functions/signal_additional_func.py
  9. 26
      functions/signal_handlers.py
  10. 1
      place_conference/forms.py
  11. 1
      place_exposition/forms.py
  12. 84
      proj/admin.py
  13. 9
      proj/admin2.py
  14. 72
      proj/admin_urls.py
  15. 36
      proj/forms.py
  16. 52
      proj/models.py
  17. 14
      proj/settings.py
  18. 50
      proj/urls.py
  19. 9
      proj/views.py
  20. 21
      registration/forms.py
  21. 17
      settings/models.py
  22. 20
      static/client/css/main.css
  23. 56
      static/client/js/main.js
  24. 13
      templates/client/blank.html
  25. 15
      templates/client/profile.html

@ -120,33 +120,36 @@ class ChangePasswordForm(forms.Form):
old_password = forms.CharField(label=_(u'Old password'), required=True, old_password = forms.CharField(label=_(u'Old password'), required=True,
widget=forms.PasswordInput(render_value=False, widget=forms.PasswordInput(render_value=False,
attrs={'placeholder': _(u'Введите старый пароль')})) attrs={'placeholder': _(u'Введите старый пароль')}))
new_password = forms.CharField(label=_(u'New password'), new_password = forms.CharField(label=_(u'New password'), required=True,
widget=forms.PasswordInput(render_value=False, widget=forms.PasswordInput(render_value=False,
attrs={'placeholder': _(u'Придумайте новый пароль')})) attrs={'placeholder': _(u'Придумайте новый пароль')}))
new_password_confirm = forms.CharField(label=_(u'Confirm password'), new_password_confirm = forms.CharField(label=_(u'Confirm password'), required=True,
widget=forms.PasswordInput(render_value=False, widget=forms.PasswordInput(render_value=False,
attrs={'placeholder': _(u'Повторите новый пароль')})) attrs={'placeholder': _(u'Повторите новый пароль')}))
def clean(self): def clean(self):
data = self.cleaned_data data = super(ChangePasswordForm, self).clean()
password1 = data.get('new_password') password1 = data.get('new_password')
password2 = data.get('new_password_confirm') password2 = data.get('new_password_confirm')
if not password1 or not password2:
return data
# self._errors['new_password'] = ErrorList([_(u'Different passwords!')])
# return data
if password1 and password2 and password1 != password2: if password1 and password2 and password1 != password2:
# check if passwords exists and equal # check if passwords exists and equal
self._errors['password'] = ErrorList([_(u'Different passwords!')]) self._errors['new_password'] = ErrorList([_(u'Пароли не совпадают!')])
self._errors['password_confirm'] = ErrorList([_(u'Different passwords!')]) self._errors['new_password_confirm'] = ErrorList([_(u'Пароли не совпадают!')])
del data['password'] del data['new_password_confirm']
del data['password_confirm'] del data['new_password']
return data return data
if not password1.isdigit() and any(char.isdigit() for char in password1) and len(password1)>5: if not password1.isdigit() and any(char.isdigit() for char in password1) and len(password1)>5:
# password must contain digits and letters and length > 5 # password must contain digits and letters and length > 5
return data return data
else: else:
self._errors['new_password'] = ErrorList([_(u'Password must contain symbols and digits')]) self._errors['new_password'] = ErrorList([_(u'Пароль должен содержать цифры и буквы')])
self._errors['new_password_confirm'] = ErrorList([_(u'Password must contain symbols and digits')]) self._errors['new_password_confirm'] = ErrorList([_(u'Пароль должен содержать цифры и буквы')])
del data['password'] del data['new_password']
del data['password_confirm'] del data['new_password_confirm']
return data return data
class EmailAnnouncementForm(forms.Form): class EmailAnnouncementForm(forms.Form):

@ -5,6 +5,7 @@ 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 import random
from django.utils.translation import ugettext as _
#models and forms #models and forms
from models import User from models import User
from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm
@ -12,6 +13,7 @@ from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnounce
from functions.custom_views import objects_list from functions.custom_views import objects_list
from hashlib import md5 from hashlib import md5
import json
@login_required @login_required
@ -162,73 +164,19 @@ def change_password(request):
if form.is_valid(): if form.is_valid():
user = request.user user = request.user
if(user.check_password(form.cleaned_data.get('old_password'))): if(user.check_password(form.cleaned_data.get('old_password'))):
user.set_password(form.cleaned_data.get('new_password')) #user.set_password(form.cleaned_data.get('new_password'))
user.save() #user.save()
success['success'] = True success['success'] = True
success['message'] = _(u'Password has been changed') success['message'] = _(u'Пароль именен')
return HttpResponse(json.dumps(success), content_type='application/json') return HttpResponse(json.dumps(success), content_type='application/json')
else: else:
errors = {'old_password': _(u'Invalid password')} errors = {'errors': [_(u'Не правильный пароль')]}
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:
success.update(form.errors) errors = [err[0] for err in form.errors.values()]
errors = {'errors': 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')
#--------------------------------------------------------------
'''
from django.views.decorators.debug import sensitive_post_parameters
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
from django.utils.http import base36_to_int, is_safe_url
from django.shortcuts import resolve_url
from django.conf import settings
from django.conf.global_settings import LOGIN_REDIRECT_URL
from django.contrib.auth.forms import AuthenticationForm
@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm,
current_app=None, extra_context=None):
"""
Displays the login form and handles the login action.
"""
redirect_to = request.REQUEST.get(redirect_field_name, '')
if request.method == "POST":
form = authentication_form(data=request.POST)
if form.is_valid():
# Ensure the user-originating redirection url is safe.
if not is_safe_url(url=redirect_to, host=request.get_host()):
redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
# Okay, security check complete. Log the user in.
auth_login(request, form.get_user())
if request.session.test_cookie_worked():
request.session.delete_test_cookie()
return HttpResponseRedirect(redirect_to)
else:
form = authentication_form(request)
request.session.set_test_cookie()
current_site = get_current_site(request)
context = {
'form': form,
redirect_field_name: redirect_to,
'site': current_site,
'site_name': current_site.name,
}
if extra_context is not None:
context.update(extra_context)
return TemplateResponse(request, template_name, context,
current_app=current_app)
'''

@ -15,28 +15,21 @@ from file.forms import FileModelForm
#custom views #custom views
from functions.custom_views import objects_list, add_object_with_file, delete_object from functions.custom_views import objects_list, add_object_with_file, delete_object
from django.db.models.deletion import ProtectedError
def country_all(request): def country_all(request):
""" """
Return list of all countries with pagination Return list of all countries with pagination
""" """
return objects_list(request, Country, 'country_all.html') return objects_list(request, Country, 'country_all.html')
def country_add(request): def country_add(request):
""" """
Return form of country and file and post it on the server. 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/') return add_object_with_file(request, CountryForm, 'country_add.html', '/admin/country/all/')
def country_delete(request, url): def country_delete(request, url):
return delete_object(request, Country, CountryDeleteForm, url, '/admin/country/all/') return delete_object(request, Country, CountryDeleteForm, url, '/admin/country/all/')
@login_required
def country_change(request, url): def country_change(request, url):
""" """
Return form of county and file and fill it with existing Country object data. Return form of county and file and fill it with existing Country object data.

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

@ -91,11 +91,11 @@ class CountryForm(forms.Form):
self.fields['documents_%s' % code] = forms.CharField(label='Документы', required=False, widget=CKEditorWidget()) self.fields['documents_%s' % code] = forms.CharField(label='Документы', required=False, widget=CKEditorWidget())
self.fields['consulate_%s' % code] = forms.CharField(label='Консульство', required=False, widget=CKEditorWidget()) self.fields['consulate_%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=required, 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'}))
# check if exists cities connected with country # check if exists cities connected with country

@ -74,10 +74,13 @@ from models import Country
from django.dispatch import receiver from django.dispatch import receiver
from django.conf import settings from django.conf import settings
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
from functions.translate import get_translated_fields 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) @receiver(post_save, sender=Country)
def country_post_save_handler(sender, **kwargs): def country_post_save_handler(sender, **kwargs):
""" """
@ -103,15 +106,16 @@ def country_post_save_handler(sender, **kwargs):
for code in missing_languages: for code in missing_languages:
# translate # translate
obj.translate(code) obj.translate(code)
# go through all fields and set value # set values equal to first translation
for field in fields: for field in fields:
setattr(obj, field, getattr(translation, field)) setattr(obj, field, getattr(translation, field))
obj.save() obj.save()
if isinstance(obj, CountryTranslation): if isinstance(obj, CountryTranslation):
# object is Translation # object is Translation
print('success')
if obj.language_code == 'ru': if obj.language_code == 'ru':
country = Country.objects.get(id=obj.master_id) country = Country.objects.get(id=obj.master_id)
country.url = translit_with_separator(obj.name) country.url = translit_with_separator(obj.name)
country.save() country.save()
'''

@ -0,0 +1,53 @@
#https://djangosnippets.org/snippets/2607/
def required(wrapping_functions,patterns_rslt):
'''
Used to require 1..n decorators in any view returned by a url tree
Usage:
urlpatterns = required(func,patterns(...))
urlpatterns = required((func,func,func),patterns(...))
Note:
Use functools.partial to pass keyword params to the required
decorators. If you need to pass args you will have to write a
wrapper function.
Example:
from functools import partial
urlpatterns = required(
partial(login_required,login_url='/accounts/login/'),
patterns(...)
)
'''
if not hasattr(wrapping_functions,'__iter__'):
wrapping_functions = (wrapping_functions,)
return [
_wrap_instance__resolve(wrapping_functions,instance)
for instance in patterns_rslt
]
def _wrap_instance__resolve(wrapping_functions,instance):
if not hasattr(instance,'resolve'): return instance
resolve = getattr(instance,'resolve')
def _wrap_func_in_returned_resolver_match(*args,**kwargs):
rslt = resolve(*args,**kwargs)
if not hasattr(rslt,'func'):return rslt
f = getattr(rslt,'func')
for _f in reversed(wrapping_functions):
# @decorate the function from inner to outter
f = _f(f)
setattr(rslt,'func',f)
return rslt
setattr(instance,'resolve',_wrap_func_in_returned_resolver_match)
return instance
#-----------------------------

@ -6,58 +6,55 @@ from django.conf import settings
from functions.translate import get_translated_fields from functions.translate import get_translated_fields
def fill_missing_languages(obj): def fill_missing_languages(obj):
"""
looking for missing languages
and fill translated fields with first available language
uses in post_save signal
"""
# what languages must be
all_langs = [code for code, lang in settings.LANGUAGES] all_langs = [code for code, lang in settings.LANGUAGES]
# what languages are
obj_langs = obj.get_available_languages() obj_langs = obj.get_available_languages()
missing_languages = list(set(all_langs) - set(obj_langs)) missing_languages = list(set(all_langs) - set(obj_langs))
if missing_languages: # get first Translation object
# get first Translation object (require) translation = obj.translations.all()[0]
translation = obj.translations.all()[0]
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() fields = get_translated_fields(obj)
#from city.models import City
#city = City.objects.get(id=37)
#city.save()
def fill_meta_information(obj):
s_list = settings_dict.get(obj.__class__.__name__)
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))
if s_list: obj.save()
for code, lang in settings.LANGUAGES:
fields_with_setting = {setting.get('field_name'): Setting.objects.get(key=setting['key']).get_value(code) \
for setting in s_list if setting.get('type') =='transl'}
tr = obj._meta.translations_model.objects.get(language_code=code, master__id=getattr(obj, 'id'))
do_save = False
for field, value in fields_with_setting.iteritems():
if getattr(tr, field) == '':
setattr(tr, field, value)
do_save = True
if do_save:
tr.save()
print 'save'
#return fields_with_setting
def fill_meta_information(obj):
"""
looking for available settings for this object
and fill empty field with settings rules
""" """
# return list of settings for this object
s_list = settings_dict.get(obj.__class__.__name__) s_list = settings_dict.get(obj.__class__.__name__)
return s_list
for s in s_list: for s in s_list:
# get Setting model object
setting = Setting.objects.get(key=s.get('key')) setting = Setting.objects.get(key=s.get('key'))
field = s.get('field_name')
if setting.type != 'transl': if setting.type != 'transl':
setattr(obj, s.get('field_name'), setting.get_value()) # simple field
if getattr(obj, field)=="":
setattr(obj, field, setting.get_value())
obj.save()
else: else:
# translated field
for code, lang in settings.LANGUAGES: for code, lang in settings.LANGUAGES:
# get translation object
tr = obj._meta.translations_model.objects.get(language_code=code, master__id=getattr(obj, 'id')) tr = obj._meta.translations_model.objects.get(language_code=code, master__id=getattr(obj, 'id'))
setattr(tr, s.get('field_name'), setting.get_value(code))
tr.save() if getattr(tr, field)=="":
""" setattr(tr, field, setting.get_value(code))
tr.save()

@ -0,0 +1,26 @@
from form_check import translit_with_separator
from signal_additional_func import fill_missing_languages, fill_meta_information
def post_save_handler(sender, **kwargs):
"""
receiver function
take object
fill missing languages
fill settings if its exist for this object
"""
obj = kwargs['instance']
fill_missing_languages(obj)
fill_meta_information(obj)
def post_save_translation_handler(sender, **kwargs):
"""
receiver function
take object and change url
"""
obj = kwargs['instance']
if obj.language_code == 'ru':
obj.master.url = translit_with_separator(obj.name)
obj.master.save()

@ -9,7 +9,6 @@ from django.forms.util import ErrorList
from models import PlaceConference, Hall, CONFERENCE_TYPE 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
from proj.models import Settings
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import populate_all, fill_trans_fields_all
from functions.files import check_tmp_files from functions.files import check_tmp_files

@ -9,7 +9,6 @@ from django.forms.util import ErrorList
from models import PlaceExposition, EXPOSITION_TYPE, Hall 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
from proj.models import Settings
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import populate_all, fill_trans_fields_all
from functions.files import check_tmp_files from functions.files import check_tmp_files

@ -0,0 +1,84 @@
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import login_required
from django.contrib.admin.views.decorators import staff_member_required
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 admin_home(request):
return render_to_response('base.html')
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})
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')
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)
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')

@ -1,9 +0,0 @@
# -*- coding: utf-8 -*-
from hvad.admin import TranslatableAdmin
from django.contrib import admin
from models import Settings
class SettingsAdmin(TranslatableAdmin):
pass
admin.site.register(Settings, SettingsAdmin)

@ -1,40 +1,40 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from functions import required
from django.contrib.admin.views.decorators import staff_member_required
urlpatterns = required(
urlpatterns = patterns('', staff_member_required,
url(r'^$', 'proj.views.home', name='home'), patterns('',
url(r'^import-event/$', 'import_xls.views.import_event'), url(r'^$', 'proj.admin.admin_home'),
url(r'^export-event/$', 'import_xls.views.export_event'), url(r'^import-event/$', 'import_xls.views.import_event'),
url(r'^accounts/', include('registration.backends.default.urls')), url(r'^export-event/$', 'import_xls.views.export_event'),
url(r'^accounts/', include('accounts.urls')), url(r'^accounts/', include('accounts.urls')),
url(r'^article/', include('article.urls')), url(r'^article/', include('article.urls')),
url(r'^city/', include('city.urls')), url(r'^city/', include('city.urls')),
url(r'^company/', include('company.urls')), url(r'^company/', include('company.urls')),
url(r'^conference/', include('conference.urls')), url(r'^conference/', include('conference.urls')),
url(r'^country/', include('country.urls')), url(r'^country/', include('country.urls')),
url(r'^exposition/', include('exposition.urls')), url(r'^exposition/', include('exposition.urls')),
url(r'^news/', include('news.urls')), url(r'^news/', include('news.urls')),
url(r'^organiser/', include('organiser.urls')), url(r'^organiser/', include('organiser.urls')),
url(r'^place_conference/', include('place_conference.urls')), url(r'^place_conference/', include('place_conference.urls')),
url(r'^place_exposition/', include('place_exposition.urls')), url(r'^place_exposition/', include('place_exposition.urls')),
url(r'^seminar/', include('seminar.urls')), url(r'^seminar/', include('seminar.urls')),
url(r'^service/', include('service.urls')), url(r'^service/', include('service.urls')),
url(r'^theme/', include('theme.urls')), url(r'^theme/', include('theme.urls')),
url(r'^translator/', include('translator.urls')), url(r'^translator/', include('translator.urls')),
url(r'^webinar/', include('webinar.urls')), url(r'^webinar/', include('webinar.urls')),
#url(r'^settings/$', 'proj.views.settings'), url(r'^settings/$', include('settings.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
# url(r'^ajax_post_file/(?P<obj_id>\d+)/$', 'proj.admin.ajax_post_file'),#must be before /ajax_post_file/
url(r'^test/', 'proj.views.test'), url(r'^ajax_post_file/', 'proj.admin.ajax_post_file'),
#ajax requests url(r'^ajax_delete_file/', 'proj.admin.ajax_delete_file'),
url(r'^ajax_post_file/(?P<obj_id>\d+)/$', 'proj.views.ajax_post_file'),#must be before /ajax_post_file/ url(r'^ajax_city/', 'proj.admin.ajax_city'),
url(r'^ajax_post_file/', 'proj.views.ajax_post_file'), url(r'^ajax_tag/', 'proj.admin.ajax_tag'),
url(r'^ajax_delete_file/', 'proj.views.ajax_delete_file'), #
url(r'^ajax_city/', 'proj.views.ajax_city'), url(r'^ckeditor/', include('ckeditor.urls')),
url(r'^ajax_tag/', 'proj.views.ajax_tag'), )
#
url(r'^ckeditor/', include('ckeditor.urls')),
) )

@ -1,36 +0,0 @@
# -*- coding: utf-8 -*-
from django import forms
from models import Settings
from settings import LANGUAGES
from functions.translate import fill_trans_fields, populate, ZERO_LANGUAGE, populate_all, fill_trans_fields_all
class SettingsForm(forms.Form):
"""
Create Settings form for creating settings
__init__ uses for dynamic creates fields
save function saves data in Settings object. If it doesnt exist create new object
"""
def __init__(self, *args, **kwargs):
super(SettingsForm, self).__init__(*args, **kwargs)
# creates translated form fields, example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
obj = Settings.objects.get(key='hall_template')
if len(LANGUAGES) in range(10):
for lid, (code, name) in enumerate(LANGUAGES):
# using enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['hall_capacity_tmpl_%s' % code] = forms.CharField(label=getattr(obj, 'name'), initial=obj.get_value(code),
required=required,widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self):
"""
changes Settings model
"""
data = self.cleaned_data
capacity_tmpl = Settings.objects.get(key='hall_template')
for code, name in LANGUAGES:
capacity_tmpl.set_value(data['hall_capacity_tmpl_%s'%code], code)

@ -1,52 +0,0 @@
# -*- coding: utf-8 -*-
from django.db import models
from hvad.models import TranslatableModel, TranslatedFields
from settings import LANGUAGES
#
from functions.custom_fields import EnumField
VALUES = ('int', 'text', 'transl', 'date')
class Settings(TranslatableModel):
"""
Create Settings model, which stores different settings of project
Uses hvad.TranslatableModel which is child of django.db.models class
"""
key = models.CharField(max_length=50)
type = EnumField(values=VALUES)
int = models.IntegerField(blank=True, null=True)
text = models.CharField(max_length=255, blank=True)
date = models.DateTimeField(blank=True, null=True)
translations = TranslatedFields(
transl = models.CharField(max_length=255, blank=True),
name = models.CharField(max_length=50),
)
def __unicode__(self):
return self.key
def get_value(self, code=None):
"""
returns value of setting
value can be - int, text, date or translated field
"""
if self.type == 'transl':
obj = Settings._meta.translations_model.objects.get(language_code = code,master__id=getattr(self, 'id'))
return getattr(obj, self.type)
else:
return getattr(self,self.type)
def set_value(self, value, code=None):
"""
sets value of setting
"""
if self.type == 'transl':
obj = Settings._meta.translations_model.objects.get(language_code = code,master__id=getattr(self, 'id'))
setattr(obj, self.type, value)
obj.save()
else:
setattr(self, self.type, value)

@ -176,20 +176,15 @@ TEMPLATE_DIRS = (
os.path.join(SITE_ROOT, 'templates/admin/theme'), os.path.join(SITE_ROOT, 'templates/admin/theme'),
os.path.join(SITE_ROOT, 'templates/admin/translator'), os.path.join(SITE_ROOT, 'templates/admin/translator'),
os.path.join(SITE_ROOT, 'templates/admin/webinar'), os.path.join(SITE_ROOT, 'templates/admin/webinar'),
#'/home/kotzilla/Documents/qwer/proj/templates/admin/proj',
os.path.join(SITE_ROOT, 'templates/client'), os.path.join(SITE_ROOT, 'templates/client'),
'/home/kotzilla/Documents/qwer/proj/templates/admin/forms/',
) )
AUTH_USER_MODEL = 'accounts.User' AUTH_USER_MODEL = 'accounts.User'
#AUTH_PROFILE_MODULE = 'accounts.UserProfile'
#for admin. for project will be another
#LOGIN_URL = '/admin/accounts/login_admin'
#LOGIN_REDIRECT_URL = '/admin'
#registration info #registration info
ACCOUNT_ACTIVATION_DAYS=2 ACCOUNT_ACTIVATION_DAYS=2
# mail settings
EMAIL_USE_TLS = True EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'kotzillla@gmail.com' EMAIL_HOST_USER = 'kotzillla@gmail.com'
@ -218,10 +213,6 @@ INSTALLED_APPS = (
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'django.contrib.humanize', 'django.contrib.humanize',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
#custom modules #custom modules
'accounts', 'accounts',
'article', 'article',
@ -236,7 +227,6 @@ INSTALLED_APPS = (
'organiser', 'organiser',
'place_conference', 'place_conference',
'place_exposition', 'place_exposition',
'proj',
'registration', 'registration',
'review', 'review',
'seminar', 'seminar',

@ -1,62 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
from django.contrib.auth.views import login, logout
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^$', 'proj.views.home', name='home'), url(r'^$', 'proj.views.home', name='home'),
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'),
# admin part
url(r'^admin/', include('proj.admin_urls')), url(r'^admin/', include('proj.admin_urls')),
url(r'^accounts/', include('registration.backends.default.urls')),
) )
# ajax urls # ajax urls
urlpatterns += patterns('', urlpatterns += patterns('',
url(r'^register/', 'registration.backends.default.views.RegisterAjaxView'), url(r'^register/', 'registration.backends.default.views.RegisterAjaxView'),
url(r'^profile/change-password/', 'accounts.views.change_password'),
) )
'''
urlpatterns = patterns('',
url(r'^$', 'proj.views.home', name='home'),
url(r'^accounts/', include('registration.backends.default.urls')),
url(r'^accounts/', include('accounts.urls')),
url(r'^article/', include('article.urls')),
url(r'^city/', include('city.urls')),
url(r'^company/', include('company.urls')),
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')),
url(r'^place_exposition/', include('place_exposition.urls')),
url(r'^seminar/', include('seminar.urls')),
url(r'^service/', include('service.urls')),
url(r'^theme/', include('theme.urls')),
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'^test/', 'proj.views.test'),
#ajax requests
url(r'^ajax_post_file/(?P<obj_id>\d+)/$', 'proj.views.ajax_post_file'),#must be before /ajax_post_file/
url(r'^ajax_post_file/', 'proj.views.ajax_post_file'),
url(r'^ajax_delete_file/', 'proj.views.ajax_delete_file'),
url(r'^ajax_city/', 'proj.views.ajax_city'),
url(r'^ajax_tag/', 'proj.views.ajax_tag'),
#
url(r'^ckeditor/', include('ckeditor.urls')),
#--------------------------
url(r'^admin/', include(admin.site.urls)),
)
'''

@ -10,15 +10,13 @@ from django.template import RequestContext
from file.models import TmpFile, FileModel from file.models import TmpFile, FileModel
from file.forms import FileModelForm from file.forms import FileModelForm
from city.models import City from city.models import City
from theme.models import Tag from theme.models import Tag
from django.db.models.loading import get_model from django.db.models.loading import get_model
from registration.forms import RegistrationFormUniqueEmail, LoginForm
def home(request): def home(request):
#reg_form = RegistrationFormUniqueEmail() #reg_form = RegistrationFormUniqueEmail()
#login_form = LoginForm() #login_form = LoginForm()
@ -28,9 +26,8 @@ def home(request):
return render_to_response('index.html', args, context_instance=RequestContext(request)) return render_to_response('index.html', args, context_instance=RequestContext(request))
def test(request): def admin_home(request):
return render_to_response('test.html') return render_to_response('base.html')
@login_required @login_required

@ -20,7 +20,8 @@ except ImportError:
#from django.contrib.auth.models import User #from django.contrib.auth.models import User
from django import forms from django import forms
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext as _
from django.forms.util import ErrorList
class RegistrationForm(forms.Form): class RegistrationForm(forms.Form):
@ -54,19 +55,6 @@ class RegistrationForm(forms.Form):
label=_("Password")) label=_("Password"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':_(u'Повторите пароль')}), password2 = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':_(u'Повторите пароль')}),
label=_("Password (again)")) label=_("Password (again)"))
'''
def clean_username(self):
"""
Validate that the username is alphanumeric and is not already
in use.
"""
existing = User.objects.filter(username__iexact=self.cleaned_data['username'])
if existing.exists():
raise forms.ValidationError(_("A user with that username already exists."))
else:
return self.cleaned_data['username']
'''
def clean(self): def clean(self):
""" """
@ -78,7 +66,10 @@ class RegistrationForm(forms.Form):
""" """
if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
if self.cleaned_data['password1'] != self.cleaned_data['password2']: if self.cleaned_data['password1'] != self.cleaned_data['password2']:
raise forms.ValidationError(_("The two password fields didn't match.")) msg = u'Пароли не совпадают'
self._errors["password1"] = ErrorList([msg])
self._errors["password2"] = ErrorList([msg])
return self.cleaned_data return self.cleaned_data

@ -1,14 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from hvad.models import TranslatableModel, TranslatedFields from hvad.models import TranslatableModel, TranslatedFields
from django.conf import settings
#
from functions.custom_fields import EnumField from functions.custom_fields import EnumField
class Setting(TranslatableModel): class Setting(TranslatableModel):
""" """
Create Settings model, which stores different settings of project Create Settings model, which stores different settings of project
@ -59,12 +54,12 @@ class Setting(TranslatableModel):
# dictionaty of models settings # dictionaty of models settings
# every model have list of settings # every model have list of settings
# key: setting in db, field_name: field in model # key: setting in db, field_name: field in model
settings_dict = dict(City=[{'key': 'city_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'title Городов'}, settings_dict = dict(#City=[{'key': 'city_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'title Городов'},
{'key': 'city_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'keywords'}, # {'key': 'city_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'keywords'},
{'key': 'city_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}], # {'key': 'city_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}],
#Country=[{'key': 'country_title', 'type': 'transl', 'verbose_name': 'title'}, Country=[{'key': 'country_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'title'},
# {'key': 'country_keywords', 'type': 'transl', 'verbose_name': 'keywords'}, {'key': 'country_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'keywords'},
# {'key': 'country_descriptions', 'type': 'transl', 'verbose_name': 'description'}] {'key': 'country_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}]
) )
#from settings.models import settings, Setting #from settings.models import settings, Setting

@ -7403,7 +7403,25 @@ dl.add-info dd ul li {
padding-bottom: 5px; padding-bottom: 5px;
} }
.ch-pwd .mf-line .mf-field { .mf-line .mf-error{
color: #ff083c;
font-size: 15px;
padding-right: 10px;
padding-bottom: 5px;
width: 65%;
}
.mf-line .mf-success{
display: none;
color: #31ff13;
font-size: 15px;
padding-right: 10px;
padding-bottom: 5px;
width: 65%;
}
.ch-pwd .mf-line .mf-field{
width: 47%; width: 47%;
} }

@ -29,6 +29,7 @@ function addError(inputId, msg){
} }
!function ($) { !function ($) {
var $win = $(window); var $win = $(window);
@ -54,8 +55,9 @@ function addError(inputId, msg){
$('#reg_form').on('submit', function(event){ $('#reg_form').on('submit', function(event){
event.preventDefault(); event.preventDefault();
var formData = $(this).serialize(); var formData = $(this).serialize();
var url = 'register/';
$.post('register/', formData, function(data){ $.post(url, formData, function(data){
if(data.success){ if(data.success){
//register success //register success
@ -68,12 +70,12 @@ function addError(inputId, msg){
} }
else{ else{
//hide help messages // hide help messages
$("#reg_form .msg-help:visible").hide(); $("#reg_form .msg-help:visible").hide();
//delete previous errors // delete previous errors
$("#reg_form .msg-error").parent().remove(); $("#reg_form .msg-error").parent().remove();
//generate new errors // generate new errors
var form_inputs = ['first_name', 'last_name', 'email', 'password1', 'password2'] var form_inputs = ['first_name', 'last_name', 'email', 'password1', 'password2']
for(var i= 0; i < form_inputs.length; i++){ for(var i= 0; i < form_inputs.length; i++){
if(form_inputs[i] in data){ if(form_inputs[i] in data){
@ -84,26 +86,37 @@ function addError(inputId, msg){
} }
}); });
}); });
/* submiting login form /* submiting change password form */
$('#log_form').on('submit', function(event){ $('#paswd_change').on('submit', function(event){
event.preventDefault(); event.preventDefault();
var formData = $(this).serialize(); var formData = $(this).serialize();
var url = 'login/'; var url = 'change-password/';
$.ajax({ var $form = $(this);
url: url, $.post(url, formData, function(data){
type: 'post', if (data.success){
data: formData, console.log(data);
success: function(data){ $('#paswd_change .mf-success').fadeIn(300);
if(data.success){ setTimeout(function(){
console.log('success'); $('#paswd_change .mf-success').fadeOut(300);
}, 3000);
//$form.find('mf-success').show();
} }
else{ else{
console.log(data); // remove previous error
$('#paswd_change .mf-error').parent().remove();
// add new error
var $element = $("<div>").attr("class", "mf-line").append(
$("<div>").attr("class", "mf-error").append(data.errors[0]))
$form.find('.mf-buttons-line').before($element);
} }
} });
}); });
$('.reg').on('click', function(event){
event.preventDefault();
$('.register').click();
}); });
*/
/* Нестандартное оформление для поля select */ /* Нестандартное оформление для поля select */
$.fn.customSelect = function () { $.fn.customSelect = function () {
@ -634,9 +647,12 @@ function addError(inputId, msg){
var $fLine = $input.closest(".pwf-line"); var $fLine = $input.closest(".pwf-line");
var $help = $fLine.find('div.msg-help'); var $help = $fLine.find('div.msg-help');
var $error = $fLine.find('div.msg-error'); var $error = $fLine.find('div.msg-error');
var $error2 = $(this).parent().parent().parent().find('.mf-error');
$error.parent().remove();
$error2.parent().remove();
if ($help.is(':hidden')) { if ($help.is(':hidden')) {
$help.fadeIn(300); $help.fadeIn(300);
$error.parent().remove();
} }
}); });

@ -40,7 +40,7 @@
<header class="layout"> <header class="layout">
<div class="header-wrap layout-wrap"> <div class="header-wrap layout-wrap">
<div class="logo"> <div class="logo">
<h2><a href="#"><strong>Expomap</strong> <b>{% trans 'Выставки, конференции, семинары' %}</b></a></h2> <h2><a href="/"><strong>Expomap</strong> <b>{% trans 'Выставки, конференции, семинары' %}</b></a></h2>
</div> </div>
<div class="header-body mcl"> <div class="header-body mcl">
@ -57,6 +57,9 @@
<ul class="lang-switch"> <ul class="lang-switch">
<li>рус</li> <li>рус</li>
<li><a href="#">eng</a></li> <li><a href="#">eng</a></li>
{% if user.is_staff %}
<li><a href="/admin">admin</a></li>
{% endif %}
</ul> </ul>
</div> </div>
@ -67,13 +70,14 @@
<li><a href="#"><img src="{% static 'client/img/soc-medias/sm-icon-lin.png" title="LinkedIn" alt="LinkedIn' %} " /></a></li> <li><a href="#"><img src="{% static 'client/img/soc-medias/sm-icon-lin.png" title="LinkedIn" alt="LinkedIn' %} " /></a></li>
<li><a href="#"><img src="{% static 'client/img/soc-medias/sm-icon-vk.png" title="В контакте" alt="В контакте' %} " /></a></li> <li><a href="#"><img src="{% static 'client/img/soc-medias/sm-icon-vk.png" title="В контакте" alt="В контакте' %} " /></a></li>
<li><a href="#"><img src="{% static 'client/img/soc-medias/sm-icon-twit.png" title="Twitter" alt="Twitter' %} " /></a></li> <li><a href="#"><img src="{% static 'client/img/soc-medias/sm-icon-twit.png" title="Twitter" alt="Twitter' %} " /></a></li>
</ul> </ul>
{% if user.is_authenticated %} {% if user.is_authenticated %}
<div class="cabinet-links"> <div class="cabinet-links">
<div class="cl-body clearfix"> <div class="cl-body clearfix">
<div class="clb-profile"><a class="icon-user" href="profile/">личный кабинет</a></div> <div class="clb-profile"><a class="icon-user" href="/profile/">личный кабинет</a></div>
<div class="clb-messages"><a class="icon-msg" href="#">3</a></div> <div class="clb-messages"><a class="icon-msg" href="#">3</a></div>
<div class="clb-settings"> <div class="clb-settings">
<a class="cl-btn icon-gear" href="#">настройки</a> <a class="cl-btn icon-gear" href="#">настройки</a>
@ -84,8 +88,7 @@
</div> </div>
</div> </div>
<div class="logout"><a href="/logout/">Выход</a></div>
<div class="logout"><a href="logout/">Выход</a></div>
</div> </div>
{% else %} {% else %}

@ -1,7 +1,9 @@
{% extends 'blank.html' %} {% extends 'blank.html' %}
{% load i18n %} {% load i18n %}
{% block title %}
{% trans 'Личный кабинет' %}
{% endblock %}
{% block catalog %} {% block catalog %}
<section class="layout main-part"> <section class="layout main-part">
<div class="layout-wrap"> <div class="layout-wrap">
@ -138,7 +140,7 @@
<div class="set-sect ch-pwd"> <div class="set-sect ch-pwd">
<header>{% trans 'смена пароля' %}</header> <header>{% trans 'смена пароля' %}</header>
<div class="set-sect-body"> <div class="set-sect-body">
<form id="paswd_change" method="post" action="#">{% csrf_token %} <form id="paswd_change" class="pw-form" method="post" action="#">{% csrf_token %}
<div class="mf-line"> <div class="mf-line">
<div class="mf-field"> <div class="mf-field">
{{ change_password_form.old_password }} {{ change_password_form.old_password }}
@ -153,8 +155,17 @@
<div class="mf-field"> <div class="mf-field">
{{ change_password_form.new_password_confirm }} {{ change_password_form.new_password_confirm }}
</div> </div>
</div> </div>
<div class="mf-line">
<div class="mf-success">
{% trans 'Пароль изменен!' %}
</div>
</div>
<div class="mf-buttons-line"> <div class="mf-buttons-line">
<button type="submit" class="icon-save">{% trans 'сохранить' %}</button> <button type="submit" class="icon-save">{% trans 'сохранить' %}</button>
</div> </div>

Loading…
Cancel
Save