remotes/origin/1203
Nazar Kotyuk 12 years ago
parent 615a5c22ce
commit bda826a60c
  1. 27
      accounts/forms.py
  2. 70
      accounts/views.py
  3. 9
      country/admin.py
  4. 16
      country/admin2.py
  5. 6
      country/forms.py
  6. 14
      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. 52
      proj/urls.py
  19. 9
      proj/views.py
  20. 23
      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,
widget=forms.PasswordInput(render_value=False,
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,
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,
attrs={'placeholder': _(u'Повторите новый пароль')}))
def clean(self):
data = self.cleaned_data
data = super(ChangePasswordForm, self).clean()
password1 = data.get('new_password')
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:
# check if passwords exists and equal
self._errors['password'] = ErrorList([_(u'Different passwords!')])
self._errors['password_confirm'] = ErrorList([_(u'Different passwords!')])
del data['password']
del data['password_confirm']
self._errors['new_password'] = ErrorList([_(u'Пароли не совпадают!')])
self._errors['new_password_confirm'] = ErrorList([_(u'Пароли не совпадают!')])
del data['new_password_confirm']
del data['new_password']
return data
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
return data
else:
self._errors['new_password'] = ErrorList([_(u'Password must contain symbols and digits')])
self._errors['new_password_confirm'] = ErrorList([_(u'Password must contain symbols and digits')])
del data['password']
del data['password_confirm']
self._errors['new_password'] = ErrorList([_(u'Пароль должен содержать цифры и буквы')])
self._errors['new_password_confirm'] = ErrorList([_(u'Пароль должен содержать цифры и буквы')])
del data['new_password']
del data['new_password_confirm']
return data
class EmailAnnouncementForm(forms.Form):

@ -5,6 +5,7 @@ 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 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 hashlib import md5
import json
@login_required
@ -162,73 +164,19 @@ def change_password(request):
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()
#user.set_password(form.cleaned_data.get('new_password'))
#user.save()
success['success'] = True
success['message'] = _(u'Password has been changed')
success['message'] = _(u'Пароль именен')
return HttpResponse(json.dumps(success), content_type='application/json')
else:
errors = {'old_password': _(u'Invalid password')}
errors = {'errors': [_(u'Не правильный пароль')]}
success.update(errors)
return HttpResponse(json.dumps(success), content_type='application/json')
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')
else:
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
from functions.custom_views import objects_list, add_object_with_file, delete_object
from django.db.models.deletion import ProtectedError
def country_all(request):
"""
Return list of all countries with pagination
"""
return objects_list(request, Country, 'country_all.html')
def country_add(request):
"""
Return form of country and file and post it on the server.
"""
return add_object_with_file(request, CountryForm, 'country_add.html', '/admin/country/all/')
def country_delete(request, url):
return delete_object(request, Country, CountryDeleteForm, url, '/admin/country/all/')
@login_required
def country_change(request, url):
"""
Return form of county and file and fill it with existing Country object data.
@ -103,4 +96,4 @@ def country_change(request, url):
#uses for creating hidden input which will be used for generating ajax url
args['obj_id'] = country_id
return render_to_response('country_add.html', args)
return render_to_response('country_add.html', args)

@ -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['consulate_%s' % code] = forms.CharField(label='Консульство', required=False, widget=CKEditorWidget())
#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'}))
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'}))
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'}))
# check if exists cities connected with country

@ -74,10 +74,13 @@ 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):
"""
@ -103,15 +106,16 @@ def country_post_save_handler(sender, **kwargs):
for code in missing_languages:
# translate
obj.translate(code)
# go through all fields and set value
# 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
print('success')
if obj.language_code == 'ru':
country = Country.objects.get(id=obj.master_id)
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
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]
# what languages are
obj_langs = obj.get_available_languages()
missing_languages = list(set(all_langs) - set(obj_langs))
if missing_languages:
# get first Translation object (require)
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()
#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__)
# get first Translation object
translation = obj.translations.all()[0]
fields = get_translated_fields(obj)
if s_list:
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'
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()
#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__)
return s_list
for s in s_list:
# get Setting model object
setting = Setting.objects.get(key=s.get('key'))
field = s.get('field_name')
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:
# translated field
for code, lang in settings.LANGUAGES:
# get translation object
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 country.models import Country
from city.models import City
from proj.models import Settings
#functions
from functions.translate import populate_all, fill_trans_fields_all
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 country.models import Country
from city.models import City
from proj.models import Settings
#functions
from functions.translate import populate_all, fill_trans_fields_all
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 -*-
from django.conf.urls import patterns, include, url
from functions import required
from django.contrib.admin.views.decorators import staff_member_required
urlpatterns = patterns('',
url(r'^$', 'proj.views.home', name='home'),
url(r'^import-event/$', 'import_xls.views.import_event'),
url(r'^export-event/$', 'import_xls.views.export_event'),
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'^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'^settings/$', include('settings.urls')),
url(r'^language/add/', 'directories.admin.language_add'),
url(r'^currency/add/', 'directories.admin.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')),
urlpatterns = required(
staff_member_required,
patterns('',
url(r'^$', 'proj.admin.admin_home'),
url(r'^import-event/$', 'import_xls.views.import_event'),
url(r'^export-event/$', 'import_xls.views.export_event'),
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'^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/$', include('settings.urls')),
url(r'^language/add/', 'directories.admin.language_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'^ajax_post_file/', 'proj.admin.ajax_post_file'),
url(r'^ajax_delete_file/', 'proj.admin.ajax_delete_file'),
url(r'^ajax_city/', 'proj.admin.ajax_city'),
url(r'^ajax_tag/', 'proj.admin.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/translator'),
os.path.join(SITE_ROOT, 'templates/admin/webinar'),
#'/home/kotzilla/Documents/qwer/proj/templates/admin/proj',
os.path.join(SITE_ROOT, 'templates/client'),
'/home/kotzilla/Documents/qwer/proj/templates/admin/forms/',
)
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
ACCOUNT_ACTIVATION_DAYS=2
# mail settings
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'kotzillla@gmail.com'
@ -218,10 +213,6 @@ INSTALLED_APPS = (
'django.contrib.staticfiles',
'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
'accounts',
'article',
@ -236,7 +227,6 @@ INSTALLED_APPS = (
'organiser',
'place_conference',
'place_exposition',
'proj',
'registration',
'review',
'seminar',

@ -1,62 +1,18 @@
# -*- coding: utf-8 -*-
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('',
url(r'^$', 'proj.views.home', name='home'),
url(r'^login/', 'registration.backends.default.views.LoginView'),
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'^accounts/', include('registration.backends.default.urls')),
)
# ajax urls
urlpatterns += patterns('',
url(r'^register/', 'registration.backends.default.views.RegisterAjaxView'),
)
'''
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)),
)
'''
url(r'^profile/change-password/', 'accounts.views.change_password'),
)

@ -10,15 +10,13 @@ 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
from registration.forms import RegistrationFormUniqueEmail, LoginForm
def home(request):
#reg_form = RegistrationFormUniqueEmail()
#login_form = LoginForm()
@ -28,9 +26,8 @@ def home(request):
return render_to_response('index.html', args, context_instance=RequestContext(request))
def test(request):
return render_to_response('test.html')
def admin_home(request):
return render_to_response('base.html')
@login_required

@ -20,7 +20,8 @@ except ImportError:
#from django.contrib.auth.models import User
from django import forms
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):
@ -54,19 +55,6 @@ class RegistrationForm(forms.Form):
label=_("Password"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':_(u'Повторите пароль')}),
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):
"""
@ -74,11 +62,14 @@ class RegistrationForm(forms.Form):
match. Note that an error here will end up in
``non_field_errors()`` because it doesn't apply to a single
field.
"""
if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
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

@ -1,14 +1,9 @@
# -*- coding: utf-8 -*-
from django.db import models
from hvad.models import TranslatableModel, TranslatedFields
from django.conf import settings
#
from functions.custom_fields import EnumField
class Setting(TranslatableModel):
"""
Create Settings model, which stores different settings of project
@ -59,12 +54,12 @@ class Setting(TranslatableModel):
# dictionaty of models settings
# every model have list of settings
# key: setting in db, field_name: field in model
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_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}],
#Country=[{'key': 'country_title', 'type': 'transl', 'verbose_name': 'title'},
# {'key': 'country_keywords', 'type': 'transl', 'verbose_name': 'keywords'},
# {'key': 'country_descriptions', 'type': 'transl', 'verbose_name': 'description'}]
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_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}],
Country=[{'key': 'country_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'title'},
{'key': 'country_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'keywords'},
{'key': 'country_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}]
)
#from settings.models import settings, Setting

@ -7403,7 +7403,25 @@ dl.add-info dd ul li {
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%;
}

@ -29,6 +29,7 @@ function addError(inputId, msg){
}
!function ($) {
var $win = $(window);
@ -54,8 +55,9 @@ function addError(inputId, msg){
$('#reg_form').on('submit', function(event){
event.preventDefault();
var formData = $(this).serialize();
var url = 'register/';
$.post('register/', formData, function(data){
$.post(url, formData, function(data){
if(data.success){
//register success
@ -68,12 +70,12 @@ function addError(inputId, msg){
}
else{
//hide help messages
// hide help messages
$("#reg_form .msg-help:visible").hide();
//delete previous errors
// delete previous errors
$("#reg_form .msg-error").parent().remove();
//generate new errors
// generate new errors
var form_inputs = ['first_name', 'last_name', 'email', 'password1', 'password2']
for(var i= 0; i < form_inputs.length; i++){
if(form_inputs[i] in data){
@ -84,26 +86,37 @@ function addError(inputId, msg){
}
});
});
/* submiting login form
$('#log_form').on('submit', function(event){
event.preventDefault();
var formData = $(this).serialize();
var url = 'login/';
$.ajax({
url: url,
type: 'post',
data: formData,
success: function(data){
if(data.success){
console.log('success');
/* submiting change password form */
$('#paswd_change').on('submit', function(event){
event.preventDefault();
var formData = $(this).serialize();
var url = 'change-password/';
var $form = $(this);
$.post(url, formData, function(data){
if (data.success){
console.log(data);
$('#paswd_change .mf-success').fadeIn(300);
setTimeout(function(){
$('#paswd_change .mf-success').fadeOut(300);
}, 3000);
//$form.find('mf-success').show();
}
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 */
$.fn.customSelect = function () {
@ -634,9 +647,12 @@ function addError(inputId, msg){
var $fLine = $input.closest(".pwf-line");
var $help = $fLine.find('div.msg-help');
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')) {
$help.fadeIn(300);
$error.parent().remove();
}
});

@ -40,7 +40,7 @@
<header class="layout">
<div class="header-wrap layout-wrap">
<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 class="header-body mcl">
@ -57,6 +57,9 @@
<ul class="lang-switch">
<li>рус</li>
<li><a href="#">eng</a></li>
{% if user.is_staff %}
<li><a href="/admin">admin</a></li>
{% endif %}
</ul>
</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-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>
</ul>
{% if user.is_authenticated %}
<div class="cabinet-links">
<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-settings">
<a class="cl-btn icon-gear" href="#">настройки</a>
@ -84,8 +88,7 @@
</div>
</div>
<div class="logout"><a href="logout/">Выход</a></div>
<div class="logout"><a href="/logout/">Выход</a></div>
</div>
{% else %}

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

Loading…
Cancel
Save