remotes/origin/1203
Nazar Kotjuk 12 years ago
parent a60c4ba173
commit e05624c4a7
  1. 6
      accounts/forms.py
  2. 24
      accounts/models.py
  3. 68
      accounts/templates/create_admin.html
  4. 75
      accounts/templates/translator_change.html
  5. 60
      accounts/templates/translators.html
  6. 68
      accounts/templates/user_all.html
  7. 220
      accounts/templates/user_change.html
  8. 14
      accounts/views.py
  9. 21
      city/models.py
  10. 19
      company/forms.py
  11. 15
      company/models.py
  12. 4
      company/urls.py
  13. 25
      company/views.py
  14. 12
      country/models.py
  15. 8
      functions/db.py
  16. 4
      organiser/forms.py
  17. 34
      organiser/models.py
  18. 8
      organiser/urls.py
  19. 23
      organiser/views.py
  20. 1
      proj/settings.py
  21. 1
      proj/urls.py
  22. 2
      templates/admin/accounts/user_all.html
  23. 3
      templates/admin/company/company_add.html
  24. 2
      templates/admin/company/company_all.html
  25. 7
      templates/admin/organiser/organiser_add.html
  26. 0
      translator/__init__.py
  27. 79
      translator/forms.py
  28. 41
      translator/models.py
  29. 16
      translator/tests.py
  30. 9
      translator/urls.py
  31. 10
      translator/views.py

@ -57,9 +57,9 @@ class UserChangeForm(forms.ModelForm):
class UserForm(forms.ModelForm):
country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None, required=False)
city = forms.ModelChoiceField(label='Город', queryset=City.objects.all(), empty_label=None, required=False)
company = forms.ModelChoiceField(label='Компания', queryset=Company.objects.all(), empty_label=None, required=False)
organiser = forms.ModelChoiceField(label='Организатор', queryset=Organiser.objects.all(), empty_label=None, required=False)
city = forms.ModelChoiceField(label='Город', queryset=City.objects.all(), empty_label='', required=False)
company = forms.ModelChoiceField(label='Компания', queryset=Company.objects.all(), empty_label='', required=False)
organiser = forms.ModelChoiceField(label='Организатор', queryset=Organiser.objects.all(), empty_label='', required=False)
title = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
descriptions = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
keywords = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)

@ -50,10 +50,15 @@ class UserManager(BaseUserManager):
user.is_active = True
user.is_superuser = True
user.is_admin = True
user.is_organiser = True
user.save(using=self._db)
return user
def safe_get(self, **kwargs):
model = self.model
try:
return model.objects.get(**kwargs)
except:
return None
class User(AbstractBaseUser, PermissionsMixin):
@ -64,7 +69,6 @@ class User(AbstractBaseUser, PermissionsMixin):
Email, first name, last name and password are required. Other fields are optional.
"""
email = models.EmailField(
verbose_name = 'Электронная почта',
max_length = 255,
@ -79,18 +83,21 @@ class User(AbstractBaseUser, PermissionsMixin):
is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле
is_staff = models.BooleanField(default=0)
is_admin = models.BooleanField(default=0)
is_translator = models.BooleanField(verbose_name='Переводчик', default=0)
is_organiser = models.BooleanField(verbose_name='Организатор', default=0)
date_joined = models.DateTimeField(auto_now_add=True)
date_registered = models.DateTimeField(blank=True, null=True)#
date_modified = models.DateTimeField(auto_now=True)
#relations
organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True,
on_delete=models.PROTECT)
translator = models.ForeignKey('translator.Translator', verbose_name='Переводчик', blank=True, null=True,
on_delete=models.PROTECT)
country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True,
on_delete=models.PROTECT, related_name='users')
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True,
on_delete=models.PROTECT)
company = models.ForeignKey('company.Company', blank=True, null=True, on_delete=models.PROTECT)
company = models.ForeignKey('company.Company', blank=True, null=True, on_delete=models.PROTECT, related_name='users')
#other user information
phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True)
position = models.CharField(verbose_name='Должность', max_length=255, blank=True)
@ -98,6 +105,7 @@ class User(AbstractBaseUser, PermissionsMixin):
avatar = models.ImageField(verbose_name='Фото', upload_to='/accounts/avatar/', blank=True)
web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True)
social = models.TextField(verbose_name='Социальные страници', blank=True)
skype = models.CharField(blank=True, max_length=50)
#meta
title = models.CharField(max_length=255, blank=True)
descriptions = models.CharField(max_length=255, blank=True)
@ -146,9 +154,6 @@ class TranslatorProfile(models.Model):
"""
Extra information about translators
"""
#required field, relation with user model
user = models.ForeignKey(User, related_name='translator')
#other fields
education = models.CharField(verbose_name='Образование', max_length=255, blank=True)
specialization = models.CharField(verbose_name='Специализация', max_length=255, blank=True)
languages = models.CharField(verbose_name='Языки', max_length=255, blank=True)
@ -163,6 +168,7 @@ class TranslatorProfile(models.Model):
#need import after User Model, because User imported in "organiser.models"
from organiser.models import Organiser
'''
def create_profiles(sender, **kw):
"""
create Translator profile if "is_translator" field in User model true
@ -208,7 +214,7 @@ def create_profiles(sender, **kw):
post_save.connect(create_profiles, sender=User)
'''
"""
class MyUserAuthBackend(object):

@ -1,68 +0,0 @@
{% extends 'base.html' %}
{% load static %}
{% block scripts %}
{% endblock %}
{% block body%}
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>Создать администратора</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> </h2>
</div>
<div class="box-content">
{# email #}
<div class="control-group {% if form.email.errors %}error{% endif %}">
<label class="control-label">{{ form.email.label }}:</label>
<div class="controls">
{{ form.email }}
<span class="help-inline">{{ form.email.errors }}</span>
</div>
</div>
{# password1 #}
<div class="control-group {% if form.password1.errors %}error{% endif %}">
<label class="control-label">{{ form.password1.label }}:</label>
<div class="controls">
{{ form.password1 }}
<span class="help-inline">{{ form.password1.errors }}</span>
</div>
</div>
{# password2 #}
<div class="control-group {% if form.password2.errors %}error{% endif %}">
<label class="control-label">{{ form.password2.label }}:</label>
<div class="controls">
{{ form.password2 }}
<span class="help-inline">{{ form.password2.errors }}</span>
</div>
</div>
{# first_name #}
<div class="control-group {% if form.first_name.errors %}error{% endif %}">
<label class="control-label">{{ form.first_name.label }}:</label>
<div class="controls">
{{ form.first_name }}
<span class="help-inline">{{ form.first_name.errors }}</span>
</div>
</div>
{# last_name #}
<div class="control-group {% if form.last_name.errors %}error{% endif %}">
<label class="control-label">{{ form.last_name.label }}:</label>
<div class="controls">
{{ form.last_name }}
<span class="help-inline">{{ form.last_name.errors }}</span>
</div>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% endblock %}

@ -1,75 +0,0 @@
{% extends 'base.html' %}
{% block body %}
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>Изменить переводчика</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Информация</h2>
</div>
<div class="box-content">
{# education #}
<div class="control-group {% if form.education.errors %}error{% endif %}">
<label class="control-label">{{ form.education.label }}:</label>
<div class="controls">{{ form.education }}
<span class="help-inline">{{ form.education.errors }}</span>
</div>
</div>
{# specialization #}
<div class="control-group {% if form.specialization.errors %}error{% endif %}">
<label class="control-label">{{ form.specialization.label }}:</label>
<div class="controls">{{ form.specialization }}
<span class="help-inline">{{ form.specialization.errors }}</span>
</div>
</div>
{# languages #}
<div class="control-group {% if form.languages.errors %}error{% endif %}">
<label class="control-label">{{ form.languages.label }}:</label>
<div class="controls">{{ form.languages }}
<span class="help-inline">{{ form.languages.errors }}</span>
</div>
</div>
{# native_language #}
<div class="control-group {% if form.native_language.errors %}error{% endif %}">
<label class="control-label">{{ form.native_language.label }}:</label>
<div class="controls">{{ form.native_language }}
<span class="help-inline">{{ form.native_language.errors }}</span>
</div>
</div>
{# car #}
<div class="control-group {% if form.car.errors %}error{% endif %}">
<label class="control-label">{{ form.car.label }}:</label>
<div class="controls">{{ form.car }}
<span class="help-inline">{{ form.car.errors }}</span>
</div>
</div>
{# prices #}
<div class="control-group {% if form.prices.errors %}error{% endif %}">
<label class="control-label">{{ form.prices.label }}:</label>
<div class="controls">{{ form.prices }}
<span class="help-inline">{{ form.prices.errors }}</span>
</div>
</div>
{# discounts #}
<div class="control-group {% if form.discounts.errors %}error{% endif %}">
<label class="control-label">{{ form.discounts.label }}:</label>
<div class="controls">{{ form.discounts }}
<span class="help-inline">{{ form.discounts.errors }}</span>
</div>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</div>
</fieldset>
</form>
{% endblock %}

@ -1,60 +0,0 @@
{% extends 'base.html' %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список переводчиков</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>id</th>
<th>Email</th>
<th>Полное имя</th>
<th>Переводчик</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in objects %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.email }}</td>
<td>{{ item.get_full_name }}</td>
{% if item.is_translator %}
<td>Да</td>
{% else %}
<td>&nbsp;</td>
{% endif %}
<td class="center sorting_1">
<a class="btn btn-info" href="/accounts/translators/{{ item.id }}">
<i class="icon-edit icon-white"></i> Изменить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{# pagination #}
<div class="pagination pagination-centered">
<ul>
{% if objects.has_previous %}
<li> <a href="?page={{ objects.previous_page_number }}"></a></li>
{% endif %}
{% if objects.has_next %}
<li><a href="?page={{ objects.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -1,68 +0,0 @@
{% extends 'base.html' %}
{% load static %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список пользователей</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>id</th>
<th>Email</th>
<th>Полное имя</th>
<th>Админ</th>
<th>Переводчик</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in objects %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.email }}</td>
<td>{{ item.get_full_name }}</td>
{% if item.is_admin %}
<td>Да</td>
{% else %}
<td>&nbsp;</td>
{% endif %}
{% if item.is_translator %}
<td>Да</td>
{% else %}
<td>&nbsp;</td>
{% endif %}
<td class="center sorting_1">
<a class="btn btn-info" href="/accounts/change/{{ item.id }}">
<i class="icon-edit icon-white"></i> Изменить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{# pagination #}
<div class="pagination pagination-centered">
<ul>
{% if objects.has_previous %}
<li> <a href="?page={{ objects.previous_page_number }}"></a></li>
{% endif %}
{% if objects.has_next %}
<li><a href="?page={{ objects.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -1,220 +0,0 @@
{% extends 'base.html' %}
{% load static %}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
<script>
$(document).ready(function(){
$('#rst_pswd').click(function(){
$.get(
"/accounts/reset_password_email/", {'email': $('#id_email').val()}, function(j){
alert(j);
});
return false;
})
})
</script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>Изменить пользователя</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{{ form.user_id }}
{# email #}
<div class="control-group {% if form.email.errors %}error{% endif %}">
<label class="control-label">{{ form.email.label }}:</label>
<div class="controls">
{{ form.email }}
<span class="help-inline">{{ form.email.errors }}</span>
</div>
</div>
{# first_name #}
<div class="control-group {% if form.first_name.errors %}error{% endif %}">
<label class="control-label">{{ form.first_name.label }}:</label>
<div class="controls">
{{ form.first_name }}
<span class="help-inline">{{ form.first_name.errors }}</span>
</div>
</div>
{# last_name #}
<div class="control-group {% if form.last_name.errors %}error{% endif %}">
<label class="control-label">{{ form.last_name.label }}:</label>
<div class="controls">
{{ form.last_name }}
<span class="help-inline">{{ form.last_name.errors }}</span>
</div>
</div>
{# url #}
<div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label">{{ form.url.label }}:</label>
<div class="controls">
{{ form.url }}
<span class="help-inline">{{ form.url.errors }}</span>
</div>
</div>
{# country #}
<div class="control-group {% if form.country.errors %}error{% endif %}">
<label class="control-label">{{ form.country.label }}:</label>
<div class="controls">
{{ form.country }}
<span class="help-inline">{{ form.country.errors }}</span>
</div>
</div>
{# city #}
<div class="control-group {% if form.city.errors %}error{% endif %}">
<label class="control-label">{{ form.city.label }}:</label>
<div class="controls">
{{ form.city }}
<span class="help-inline">{{ form.city.errors }}</span>
</div>
</div>
{# position #}
<div class="control-group {% if form.position.errors %}error{% endif %}">
<label class="control-label">{{ form.position.label }}:</label>
<div class="controls">
{{ form.position }}
<span class="help-inline">{{ form.position.errors }}</span>
</div>
</div>
</div>
</div>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Дополнительная информация</h2>
</div>
<div class="box-content">
{# avatar #}
<div class="control-group {% if form.avatar.errors %}error{% endif %}">
<label class="control-label">{{ form.avatar.label }}:</label>
<div class="controls">
{{ form.avatar }}
<span class="help-inline">{{ form.avatar.errors }}</span>
</div>
</div>
{# about #}
<div class="control-group {% if form.about.errors %}error{% endif %}">
<label class="control-label">{{ form.about.label }}:</label>
<div class="controls">
{{ form.about }}
<span class="help-inline">{{ form.about.errors }}</span>
</div>
</div>
{# phone #}
<div class="control-group {% if form.phone.errors %}error{% endif %}">
<label class="control-label">{{ form.phone.label }}:</label>
<div class="controls">
{{ form.phone }}
<span class="help-inline">{{ form.phone.errors }}</span>
</div>
</div>
{# web_page #}
<div class="control-group {% if form.web_page.errors %}error{% endif %}">
<label class="control-label">{{ form.web_page.label }}:</label>
<div class="controls">
{{ form.web_page }}
<span class="help-inline">{{ form.web_page.errors }}</span>
</div>
</div>
{# social #}
<div class="control-group {% if form.social.errors %}error{% endif %}">
<label class="control-label">{{ form.social.label }}:</label>
<div class="controls">
{{ form.social }}
<span class="help-inline">{{ form.social.errors }}</span>
</div>
</div>
{# company #}
<div class="control-group {% if form.company.errors %}error{% endif %}">
<label class="control-label">{{ form.company.label }}:</label>
<div class="controls">
{{ form.company }}
<span class="help-inline">{{ form.company.errors }}</span>
</div>
</div>
{# organiser #}
<div class="control-group {% if form.organiser.errors %}error{% endif %}">
<label class="control-label">{{ form.organiser.label }}:</label>
<div class="controls">
{{ form.organiser }}
<span class="help-inline">{{ form.organiser.errors }}</span>
</div>
</div>
{# is_translator #}
<div class="control-group {% if form.is_translator.errors %}error{% endif %}">
<label class="control-label">{{ form.is_translator.label }}:</label>
<div class="controls">
{{ form.is_translator }}
<span class="help-inline">{{ form.is_translator.errors }}</span>
</div>
</div>
</div>
</div>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Мета данные</h2>
</div>
<div class="box-content">
{# descriptions #}
<div class="control-group {% if form.descriptions.errors %}error{% endif %}">
<label class="control-label">{{ form.descriptions.label }}:</label>
<div class="controls">
{{ form.descriptions }}
<span class="help-inline">{{ form.descriptions.errors }}</span>
</div>
</div>
{# title #}
<div class="control-group {% if form.title.errors %}error{% endif %}">
<label class="control-label">{{ form.title.label }}:</label>
<div class="controls">
{{ form.title }}
<span class="help-inline">{{ form.title.errors }}</span>
</div>
</div>
{# keywords #}
<d iv class="control-group {% if form.keywords.errors %}error{% endif %}">
<label class="control-label">{{ form.keywords.label }}:</label>
<div class="controls">
{{ form.keywords }}
<span class="help-inline">{{ form.keywords.errors }}</span>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</div>
</fieldset>
</form>
{% comment %}
{% for field in form %}
{{ field }}
{% endfor %}
{% endcomment %}
{% endblock %}

@ -61,14 +61,12 @@ 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.
"""
try:
try:
user = User.objects.get(id=url)
user_id = getattr(user, 'id')
except:
user = User.objects.get(url=url)
user_id = getattr(user, 'id')
except:
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('/accounts/all')
if request.POST:

@ -1,10 +1,15 @@
# -*- coding: utf-8 -*-
from django.db import models
from django.db import models, connection
from hvad.models import TranslatableModel, TranslatedFields
from bitfield import BitField
# my models
from directories.models import Iata
from service.models import Service
#
from functions.db import db_table_exists
#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 []
class City(TranslatableModel):
@ -15,20 +20,6 @@ class City(TranslatableModel):
"""
try:
flags = [str(item.id) for item in Service.objects.all()]
except:
flags = []
"""
ids = [item.id for item in Service.objects.all() ]
if len(ids):
max = sorted(ids)[-1]
for i in range(max):
flags.append(str(i))
"""
services = BitField(flags=flags)
url = models.SlugField(unique=True)

@ -3,6 +3,7 @@ from django import forms
from django.conf import settings
from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError
from django.forms.util import ErrorList
#models
from models import Company
from country.models import Country
@ -10,7 +11,7 @@ from theme.models import Theme
from city.models import City
#functions
from functions.translate import populate_all, fill_trans_fields_all
from functions.form_check import is_positive_integer
from functions.form_check import is_positive_integer, translit_with_separator
from functions.files import check_tmp_files
from functions.custom_fields import LocationWidget
@ -49,6 +50,8 @@ class CompanyForm(forms.Form):
widget=forms.TextInput(attrs={'placeholder': 'Год основания'}))
#field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput())
#
company_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
@ -95,7 +98,7 @@ class CompanyForm(forms.Form):
company.tag.clear()
#simple fields
company.url = data['url']
company.url = translit_with_separator(data['url']).lower()
company.staff_number = data['staff_number']
company.address = data['address']
company.phone = data['phone']
@ -136,6 +139,18 @@ class CompanyForm(forms.Form):
#save files
check_tmp_files(company, data['key'])
def clean(self):
id = self.cleaned_data.get('company_id')
url = self.cleaned_data.get('url')
company = Company.objects.filter(url=translit_with_separator(url))
if company and str(company[0].id) != id:
msg = 'Такой урл уже занят'
self._errors['url'] = ErrorList([msg])
del self.cleaned_data['url']
return self.cleaned_data
def clean_foundation(self):
"""

@ -1,10 +1,19 @@
# -*- coding: utf-8 -*-
from django.db import models
from hvad.models import TranslatableModel, TranslatedFields
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
#
from functions.custom_fields import LocationField
class CompanyManager(TranslationManager):
def safe_get(self, **kwargs):
model = self.model
try:
return model.objects.get(**kwargs)
except:
return None
class Company(TranslatableModel):
"""
Create Company model
@ -12,7 +21,9 @@ class Company(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class
"""
url = models.CharField(verbose_name='URL', max_length=255)
objects = CompanyManager()
url = models.SlugField()
#relations
theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль',
blank=True, null=True, related_name='companies')

@ -3,7 +3,7 @@ from django.conf.urls import patterns, include, url
urlpatterns = patterns('company.views',
url(r'^add.*/$', 'company_add'),
url(r'^delete/(?P<company_id>\d+)/$', 'company_delete'),
url(r'^change/(?P<company_id>\d+).*/$', 'company_change'),
url(r'^delete/(?P<url>.*)/$', 'company_delete'),
url(r'^change/(?P<url>.*).*/$', 'company_change'),
url(r'^all/$', 'company_all'),
)

@ -31,24 +31,28 @@ def company_add(request):
return add_object_with_file(request, CompanyForm, 'company_add.html', '/company/all/',
{'city': City, 'tag': Tag})
def company_delete(request, company_id):
return delete_object(request, Company, CompanyDeleteForm, company_id, '/company/all')
def company_delete(request, url):
return delete_object(request, Company, CompanyDeleteForm, url, '/company/all')
@login_required
def company_change(request, company_id):
def company_change(request, url):
"""
Return form and fill it with existing Company object data.
If form is posted redirect on the page of all companies.
"""
try:
#check if company_id exists else redirect to the list of companies
company = Company.objects.get(id=company_id)
file_form = FileModelForm(initial={'model': 'company.Company'})
except:
company = Company.objects.safe_get(url=url)
# try get company by id if doesnt work by url
if company is None:
company = Company.objects.safe_get(id=url)
#redirect to list of all companies if cannot find user
if company is None:
return HttpResponseRedirect('/company/all/')
company_id = getattr(company, 'id')
file_form = FileModelForm(initial={'model': 'company.Company'})
if request.POST:
form = CompanyForm(request.POST)
#set choices filled by ajax
@ -62,7 +66,8 @@ def company_change(request, company_id):
#fill form with data from database
data = {'url':company.url, 'staff_number':company.staff_number, 'address': company.address,
'phone':company.phone, 'fax':company.fax, 'web_page':company.web_page,
'email':company.email, 'social':company.social, 'foundation': company.foundation}
'email':company.email, 'social':company.social, 'foundation': company.foundation,
'company_id':company.id}
if company.country:
data['country'] = company.country.id
@ -83,7 +88,7 @@ def company_change(request, company_id):
data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions
#fill form
form = CompanyForm(data)
form = CompanyForm(initial=data)
#set choices filled by ajax
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])]
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])]

@ -9,6 +9,11 @@ from service.models import Service
#func
from functions.custom_fields import EnumField
from bitfield import BitField
from functions.db import db_table_exists
#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 []
class Country(TranslatableModel):
"""
@ -17,13 +22,6 @@ class Country(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class
"""
try:
flags = [str(item.id) for item in Service.objects.all()]
except:
flags = []
#max = sorted(ids)[-1]
#for i in range(max):
# flags.append(str(i))
services = BitField(flags=flags)

@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
from django.db import connection
def db_table_exists(table_name):
"""
return true if table exist
"""
return table_name in connection.introspection.table_names()

@ -12,7 +12,7 @@ from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference
#functions
from functions.translate import populate_all, fill_trans_fields_all
from functions.form_check import is_positive_integer
from functions.form_check import is_positive_integer, translit_with_separator
from functions.files import check_tmp_files
from functions.custom_fields import LocationWidget
@ -105,7 +105,7 @@ class OrganiserForm(forms.Form):
organiser.place_exposition.clear()
#simple fields
organiser.url = data['url']
organiser.url = translit_with_separator(data['url']).lower()
organiser.address = data['address']
organiser.phone = data['phone']
organiser.fax = data['fax']

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from django.db import models
from hvad.models import TranslatableModel, TranslatedFields
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from accounts.models import User
from django.db.models.signals import post_save
#custom functions
@ -8,6 +8,14 @@ from functions.translate import fill_trans_fields_all, populate_all
from functions.custom_fields import LocationField
from functions.form_check import translit_with_separator
class OrganiserManager(TranslationManager):
def safe_get(self, **kwargs):
model = self.model
try:
return model.objects.get(**kwargs)
except:
return None
class Organiser(TranslatableModel):
"""
@ -16,7 +24,8 @@ class Organiser(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class
"""
user = models.ForeignKey(User, related_name='organiser')
#set manager of this model
objects = OrganiserManager()
url = models.SlugField(verbose_name='URL', blank=True)
#relations
@ -58,23 +67,4 @@ class Organiser(TranslatableModel):
modified = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.lazy_translation_getter('name', self.pk)
'''
def create_organiser(sender, **kw):
"""
create Organiser profile if "is_organiser" field in User model true
if it's false delete Organiser profile connected to User
"""
user = kw["instance"]
if user.is_organiser:
organiser = Organiser(user=user)
organiser.save()
else:
try:
Organiser.objects.get(user = user).delete()
except: pass
post_save.connect(create_organiser, sender=User)
'''
return self.lazy_translation_getter('name', self.pk)

@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^add.*/$', 'organiser.views.organiser_add'),
url(r'^change/(?P<organiser_id>\d+).*/$', 'organiser.views.organiser_change'),
url(r'^all/$', 'organiser.views.organiser_all'),
urlpatterns = patterns('organiser.views',
url(r'^add.*/$', 'organiser_add'),
url(r'^change/(?P<url>.*).*/$', 'organiser_change'),
url(r'^all/$', 'organiser_all'),
)

@ -36,18 +36,23 @@ def organiser_add(request):
choices={'city': City, 'tag': Tag})
def organiser_change(request, organiser_id):
def organiser_change(request, url):
"""
Return form and fill it with existing Organiser object data.
If form is posted redirect on the page of all organisers.
"""
try:
#check if organiser_id exists else redirect to the list of organisers
organiser = Organiser.objects.get(id=organiser_id)
file_form = FileModelForm(initial={'model': 'organiser.Organiser'})
except:
organiser = Organiser.objects.safe_get(url=url)
# try get user by id if doesnt work by url
if organiser is None:
organiser = Organiser.objects.safe_get(id=url)
#redirect to list of all organisers if cannot find organiser
if organiser is None:
return HttpResponseRedirect('/organiser/all/')
#get id
organiser_id = getattr(organiser, 'id')
#init FileModelForm
file_form = FileModelForm(initial={'model': 'organiser.Organiser'})
if request.POST:
form = OrganiserForm(request.POST)
@ -62,7 +67,7 @@ def organiser_change(request, organiser_id):
#fill form with data from database
data = {'staff_number':organiser.staff_number, 'address': organiser.address,
'events_number':organiser.events_number, 'phone':organiser.phone,
'fax':organiser.fax, 'web_page':organiser.web_page,
'fax':organiser.fax, 'web_page':organiser.web_page, 'url':organiser.url,
'email':organiser.email, 'social':organiser.social, 'foundation': organiser.foundation}
if organiser.country:
@ -91,8 +96,8 @@ def organiser_change(request, organiser_id):
#fill form
form = OrganiserForm(initial=data)
#set choices filled by ajax
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])]
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])]
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data.get('country'))]
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data.get('theme'))]
args = {}
args.update(csrf(request))

@ -206,6 +206,7 @@ INSTALLED_APPS = (
'seminar',
'service',
'theme',
'translator',
'webinar',
#django modules
'hvad',

@ -27,6 +27,7 @@ urlpatterns = patterns('',
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'),

@ -38,7 +38,7 @@
<td>&nbsp;</td>
{% endif %}
<td class="center sorting_1">
<a class="btn btn-info" href="/accounts/change/{{ item.id }}">
<a class="btn btn-info" href="/accounts/change/{% if item.url %}{{ item.url }}{% else %}{{ item.id }}{% endif %}">
<i class="icon-edit icon-white"></i> Изменить
</a>
</td>

@ -41,6 +41,9 @@
<div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.company_id }}
{# name #}
{% with field='name' form=form languages=languages %}

@ -26,7 +26,7 @@ Displays lists of all companies in the table
<td>{{ item.name }}</td>
<td class="center sorting_1">
<a class="btn btn-info" href="/company/change/{{ item.id }}">
<a class="btn btn-info" href="/company/change/{% if item.url %}{{ item.url }}{% else %}{{ item.id }}{% endif %}">
<i class="icon-edit icon-white"></i> Изменить
</a>

@ -166,6 +166,13 @@
{% with field='representation' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# url #}
<div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label">{{ form.url.label }}:</label>
<div class="controls">{{ form.url }}
<span class="help-inline">{{ form.url.errors }}</span>
</div>
</div>
</div>
</div>

@ -0,0 +1,79 @@
# -*- coding: utf-8 -*-
from django import forms
from django.conf import settings
from ckeditor.widgets import CKEditorWidget
from models import Translator
from country.models import Country
from city.models import City
#functions
from functions.translate import populate_all, fill_trans_fields_all
from functions.files import check_tmp_files
from functions.form_check import translit_with_separator
class TranslatorForm(forms.Form):
"""
Create Translator form for creating translator
__init__ uses for dynamic creates fields
save function saves data in Translator object. If it doesnt exist create new object
"""
car = forms.BooleanField(label='Личный автомобиль', required=False)
birth = forms.DateField(label='Дата рождения')
gender = forms.ChoiceField(label='Пол', choices=[('male', 'Мужской'),('female', 'Женский')])
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(TranslatorForm, self).__init__(*args, **kwargs)
#creates translated forms example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['education_%s' % code] = forms.CharField(label='Образование', required=required)
self.fields['specialization_%s' % code] = forms.CharField(label='Специализация', required=required)
self.fields['languages_%s' % code] = forms.CharField(label='Языки', required=required)
self.fields['native_language_%s' % code] = forms.CharField(label='Родной язык', required=required)
self.fields['prices_%s' % code] = forms.CharField(label='Цены',
required=required, widget=CKEditorWidget)
self.fields['discounts_%s' % code] = forms.CharField(label='Скидки',
required=False, widget=CKEditorWidget)
#meta data
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=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self, id=None):
#create new conference object or get exists
if not id:
translator = Translator()
else:
translator = Translator.objects.get(id=id)
data = self.cleaned_data
translator.car = data['car']
translator.birth = data['birth']
translator.gender = data['gender']
#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(Translator, translator, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
conference_id = getattr(conference, 'id')
populate_all(Conference, data, conference_id, zero_fields)
#save files
check_tmp_files(conference, data['key'])

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
from django.db import models
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
#
from functions.custom_fields import EnumField
class TranslatorManager(TranslationManager):
def safe_get(self, **kwargs):
model = self.model
try:
return model.objects.get(**kwargs)
except:
return None
class Translator(TranslatableModel):
"""
Extra information about translators
"""
#set manager of this model
objects = TranslationManager()
gender = EnumField(values=('male', 'female'))
birth = models.DateField(verbose_name='Дата рождения')
car = models.BooleanField(verbose_name='Личный автомобиль', default=0)
translations = TranslatedFields(
education = models.CharField(verbose_name='Образование', max_length=255),
specialization = models.CharField(verbose_name='Специализация', max_length=255),
languages = models.CharField(verbose_name='Языки', max_length=255),
native_language= models.CharField(verbose_name='Родной язык', max_length=255),
prices = models.TextField(verbose_name='Тарифы'),
discounts = models.TextField(verbose_name='Скидки', blank=True),
#-----meta
title = models.CharField(max_length=255, blank=True),
descriptions = models.CharField(max_length=255, blank=True),
keywords = models.CharField(max_length=255, blank=True),
)

@ -0,0 +1,16 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = patterns('translator.views',
url(r'^add.*/$', 'translator_add'),
url(r'^delete/(?P<url>.*)/$', 'translator_delete'),
url(r'^change/(?P<url>.*)/$', 'translator_change'),
url(r'^all/$', 'translator_all'),
)

@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from django.conf import settings
from django.contrib.auth.decorators import login_required
#models and forms
from models import Translator
#custom views
from functions.custom_views import objects_list, delete_object
Loading…
Cancel
Save