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): class UserForm(forms.ModelForm):
country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None, required=False) 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) city = forms.ModelChoiceField(label='Город', queryset=City.objects.all(), empty_label='', required=False)
company = forms.ModelChoiceField(label='Компания', queryset=Company.objects.all(), empty_label=None, required=False) company = forms.ModelChoiceField(label='Компания', queryset=Company.objects.all(), empty_label='', required=False)
organiser = forms.ModelChoiceField(label='Организатор', queryset=Organiser.objects.all(), empty_label=None, 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) title = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
descriptions = 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) 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_active = True
user.is_superuser = True user.is_superuser = True
user.is_admin = True user.is_admin = True
user.is_organiser = True
user.save(using=self._db) user.save(using=self._db)
return user return user
def safe_get(self, **kwargs):
model = self.model
try:
return model.objects.get(**kwargs)
except:
return None
class User(AbstractBaseUser, PermissionsMixin): 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, first name, last name and password are required. Other fields are optional.
""" """
email = models.EmailField( email = models.EmailField(
verbose_name = 'Электронная почта', verbose_name = 'Электронная почта',
max_length = 255, max_length = 255,
@ -79,18 +83,21 @@ class User(AbstractBaseUser, PermissionsMixin):
is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле
is_staff = models.BooleanField(default=0) is_staff = models.BooleanField(default=0)
is_admin = 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_joined = models.DateTimeField(auto_now_add=True)
date_registered = models.DateTimeField(blank=True, null=True)# date_registered = models.DateTimeField(blank=True, null=True)#
date_modified = models.DateTimeField(auto_now=True) date_modified = models.DateTimeField(auto_now=True)
#relations #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, country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True,
on_delete=models.PROTECT, related_name='users') on_delete=models.PROTECT, related_name='users')
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True, city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True,
on_delete=models.PROTECT) 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 #other user information
phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True) phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True)
position = models.CharField(verbose_name='Должность', max_length=255, blank=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) avatar = models.ImageField(verbose_name='Фото', upload_to='/accounts/avatar/', blank=True)
web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True) web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True)
social = models.TextField(verbose_name='Социальные страници', blank=True) social = models.TextField(verbose_name='Социальные страници', blank=True)
skype = models.CharField(blank=True, max_length=50)
#meta #meta
title = models.CharField(max_length=255, blank=True) title = models.CharField(max_length=255, blank=True)
descriptions = 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 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) education = models.CharField(verbose_name='Образование', max_length=255, blank=True)
specialization = 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) 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" #need import after User Model, because User imported in "organiser.models"
from organiser.models import Organiser from organiser.models import Organiser
'''
def create_profiles(sender, **kw): def create_profiles(sender, **kw):
""" """
create Translator profile if "is_translator" field in User model true 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) post_save.connect(create_profiles, sender=User)
'''
""" """
class MyUserAuthBackend(object): 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. Return form of user and post it on the server.
If form is posted redirect on the page of all users. If form is posted redirect on the page of all users.
""" """
try: user = User.objects.safe_get(id=url)
try: # try get user by url if doesnt work by id
user = User.objects.get(id=url) if user is None:
user_id = getattr(user, 'id') user = User.objects.safe_get(url=url)
except: #redirect to list of all users if cannot find user
user = User.objects.get(url=url) if user is None:
user_id = getattr(user, 'id')
except:
return HttpResponseRedirect('/accounts/all') return HttpResponseRedirect('/accounts/all')
if request.POST: if request.POST:

@ -1,10 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models, connection
from hvad.models import TranslatableModel, TranslatedFields from hvad.models import TranslatableModel, TranslatedFields
from bitfield import BitField from bitfield import BitField
# my models # my models
from directories.models import Iata from directories.models import Iata
from service.models import Service 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): 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) services = BitField(flags=flags)
url = models.SlugField(unique=True) url = models.SlugField(unique=True)

@ -3,6 +3,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms.util import ErrorList
#models #models
from models import Company from models import Company
from country.models import Country from country.models import Country
@ -10,7 +11,7 @@ from theme.models import Theme
from city.models import City from city.models import City
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import 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.files import check_tmp_files
from functions.custom_fields import LocationWidget from functions.custom_fields import LocationWidget
@ -49,6 +50,8 @@ class CompanyForm(forms.Form):
widget=forms.TextInput(attrs={'placeholder': 'Год основания'})) widget=forms.TextInput(attrs={'placeholder': 'Год основания'}))
#field for comparing tmp files #field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
company_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -95,7 +98,7 @@ class CompanyForm(forms.Form):
company.tag.clear() company.tag.clear()
#simple fields #simple fields
company.url = data['url'] company.url = translit_with_separator(data['url']).lower()
company.staff_number = data['staff_number'] company.staff_number = data['staff_number']
company.address = data['address'] company.address = data['address']
company.phone = data['phone'] company.phone = data['phone']
@ -136,6 +139,18 @@ class CompanyForm(forms.Form):
#save files #save files
check_tmp_files(company, data['key']) 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): def clean_foundation(self):
""" """

@ -1,10 +1,19 @@
# -*- 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, TranslationManager
# #
from functions.custom_fields import LocationField 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): class Company(TranslatableModel):
""" """
Create Company model Create Company model
@ -12,7 +21,9 @@ class Company(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class 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 #relations
theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль', theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль',
blank=True, null=True, related_name='companies') blank=True, null=True, related_name='companies')

@ -3,7 +3,7 @@ from django.conf.urls import patterns, include, url
urlpatterns = patterns('company.views', urlpatterns = patterns('company.views',
url(r'^add.*/$', 'company_add'), url(r'^add.*/$', 'company_add'),
url(r'^delete/(?P<company_id>\d+)/$', 'company_delete'), url(r'^delete/(?P<url>.*)/$', 'company_delete'),
url(r'^change/(?P<company_id>\d+).*/$', 'company_change'), url(r'^change/(?P<url>.*).*/$', 'company_change'),
url(r'^all/$', 'company_all'), 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/', return add_object_with_file(request, CompanyForm, 'company_add.html', '/company/all/',
{'city': City, 'tag': Tag}) {'city': City, 'tag': Tag})
def company_delete(request, company_id): def company_delete(request, url):
return delete_object(request, Company, CompanyDeleteForm, company_id, '/company/all') return delete_object(request, Company, CompanyDeleteForm, url, '/company/all')
@login_required @login_required
def company_change(request, company_id): def company_change(request, url):
""" """
Return form and fill it with existing Company object data. Return form and fill it with existing Company object data.
If form is posted redirect on the page of all companies. If form is posted redirect on the page of all companies.
""" """
try: company = Company.objects.safe_get(url=url)
#check if company_id exists else redirect to the list of companies # try get company by id if doesnt work by url
company = Company.objects.get(id=company_id) if company is None:
file_form = FileModelForm(initial={'model': 'company.Company'}) company = Company.objects.safe_get(id=url)
except: #redirect to list of all companies if cannot find user
if company is None:
return HttpResponseRedirect('/company/all/') return HttpResponseRedirect('/company/all/')
company_id = getattr(company, 'id')
file_form = FileModelForm(initial={'model': 'company.Company'})
if request.POST: if request.POST:
form = CompanyForm(request.POST) form = CompanyForm(request.POST)
#set choices filled by ajax #set choices filled by ajax
@ -62,7 +66,8 @@ def company_change(request, company_id):
#fill form with data from database #fill form with data from database
data = {'url':company.url, 'staff_number':company.staff_number, 'address': company.address, data = {'url':company.url, 'staff_number':company.staff_number, 'address': company.address,
'phone':company.phone, 'fax':company.fax, 'web_page':company.web_page, '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: if company.country:
data['country'] = company.country.id data['country'] = company.country.id
@ -83,7 +88,7 @@ def company_change(request, company_id):
data['keywords_%s' % code] = obj.keywords data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions data['descriptions_%s' % code] = obj.descriptions
#fill form #fill form
form = CompanyForm(data) form = CompanyForm(initial=data)
#set choices filled by ajax #set choices filled by ajax
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])] 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['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 #func
from functions.custom_fields import EnumField from functions.custom_fields import EnumField
from bitfield import BitField from bitfield import BitField
from functions.db import db_table_exists
#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): class Country(TranslatableModel):
""" """
@ -17,13 +22,6 @@ class Country(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class 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) 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 from place_conference.models import PlaceConference
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all 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.files import check_tmp_files
from functions.custom_fields import LocationWidget from functions.custom_fields import LocationWidget
@ -105,7 +105,7 @@ class OrganiserForm(forms.Form):
organiser.place_exposition.clear() organiser.place_exposition.clear()
#simple fields #simple fields
organiser.url = data['url'] organiser.url = translit_with_separator(data['url']).lower()
organiser.address = data['address'] organiser.address = data['address']
organiser.phone = data['phone'] organiser.phone = data['phone']
organiser.fax = data['fax'] organiser.fax = data['fax']

@ -1,6 +1,6 @@
# -*- 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, TranslationManager
from accounts.models import User from accounts.models import User
from django.db.models.signals import post_save from django.db.models.signals import post_save
#custom functions #custom functions
@ -8,6 +8,14 @@ from functions.translate import fill_trans_fields_all, populate_all
from functions.custom_fields import LocationField from functions.custom_fields import LocationField
from functions.form_check import translit_with_separator 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): class Organiser(TranslatableModel):
""" """
@ -16,7 +24,8 @@ class Organiser(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class 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) url = models.SlugField(verbose_name='URL', blank=True)
#relations #relations
@ -58,23 +67,4 @@ class Organiser(TranslatableModel):
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', self.pk) 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)
'''

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

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

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

@ -27,6 +27,7 @@ urlpatterns = patterns('',
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'^webinar/', include('webinar.urls')), url(r'^webinar/', include('webinar.urls')),
url(r'^settings/$', 'proj.views.settings'), url(r'^settings/$', 'proj.views.settings'),
url(r'^language/add/', 'directories.views.language_add'), url(r'^language/add/', 'directories.views.language_add'),

@ -38,7 +38,7 @@
<td>&nbsp;</td> <td>&nbsp;</td>
{% endif %} {% endif %}
<td class="center sorting_1"> <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> Изменить <i class="icon-edit icon-white"></i> Изменить
</a> </a>
</td> </td>

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

@ -26,7 +26,7 @@ Displays lists of all companies in the table
<td>{{ item.name }}</td> <td>{{ item.name }}</td>
<td class="center sorting_1"> <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> Изменить <i class="icon-edit icon-white"></i> Изменить
</a> </a>

@ -166,6 +166,13 @@
{% with field='representation' form=form languages=languages %} {% with field='representation' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %} {% include 'admin/forms/multilang.html' %}
{% endwith %} {% 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>
</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