remotes/origin/1203
Nazar Kotjuk 12 years ago
parent e05624c4a7
commit 77a5bddb6d
  1. 2
      accounts/admin.py
  2. 9
      accounts/forms.py
  3. 21
      accounts/models.py
  4. 3
      accounts/urls.py
  5. 58
      accounts/views.py
  6. 8
      article/forms.py
  7. 2
      article/models.py
  8. 6
      article/views.py
  9. 1
      company/models.py
  10. 31
      news/forms.py
  11. 2
      news/models.py
  12. 4
      news/views.py
  13. 8
      organiser/forms.py
  14. 3
      organiser/views.py
  15. 7
      proj/settings.py
  16. 14
      templates/admin/accounts/registration.html
  17. 2
      templates/admin/article/article_all.html
  18. 2
      templates/admin/country/country_add.html
  19. 10
      templates/admin/news/news_add.html
  20. 7
      templates/admin/organiser/organiser_add.html
  21. 2
      templates/admin/theme/tag_all.html
  22. 228
      templates/admin/translator/translator_add.html
  23. 59
      templates/admin/translator/translator_all.html
  24. 7
      templates/base.html
  25. 11
      theme/forms.py
  26. 35
      translator/forms.py
  27. 5
      translator/models.py
  28. 73
      translator/views.py

@ -21,7 +21,7 @@ class UserAdmin(UserAdmin):
(None, {'fields': ('url', 'country', 'city', 'position',
'about', 'phone', 'avatar', 'web_page',
'social', 'title', 'descriptions', 'keywords',
'is_admin', 'is_active', 'is_translator', 'is_organiser')}),
'is_admin', 'is_active')}),
)
add_fieldsets = (

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from models import User, TranslatorProfile
from models import User
from country.models import Country
from city.models import City
from company.models import Company
@ -108,9 +108,4 @@ class UserForm(forms.ModelForm):
socket.getaddrinfo(web_page, 80)
return web_page
except:
return forms.ValidationError('Введите правильный адрес страници')
class TranslatorForm(forms.ModelForm):
class Meta:
model = TranslatorProfile
exclude = ('user')
return forms.ValidationError('Введите правильный адрес страници')

@ -89,9 +89,11 @@ class User(AbstractBaseUser, PermissionsMixin):
date_modified = models.DateTimeField(auto_now=True)
#relations
organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True,
unique=True,
on_delete=models.PROTECT)
translator = models.ForeignKey('translator.Translator', verbose_name='Переводчик', blank=True, null=True,
on_delete=models.PROTECT)
unique=True,
on_delete=models.PROTECT, related_name='user')
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,
@ -128,8 +130,6 @@ class User(AbstractBaseUser, PermissionsMixin):
"""
self.url = translit_with_separator(u'%s'%st)
def __unicode__(self):
return self.email
@ -150,21 +150,6 @@ class User(AbstractBaseUser, PermissionsMixin):
return True
class TranslatorProfile(models.Model):
"""
Extra information about translators
"""
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)
native_language= models.CharField(verbose_name='Родной язык', max_length=255, blank=True)
car = models.BooleanField(verbose_name='Личный автомобиль', default=0)
prices = models.TextField(verbose_name='Тарифы', blank=True)
discounts = models.TextField(verbose_name='Скидки', blank=True)
def __unicode__(self):
return self.user.email
#need import after User Model, because User imported in "organiser.models"
from organiser.models import Organiser

@ -5,13 +5,12 @@ from django.contrib.auth.views import login, logout
urlpatterns = patterns('',
url(r'^login/', login, {'template_name': 'admin/login.html' }),
url(r'^logout', logout, {'next_page': '/accounts/login/'}),
url(r'^registration/$', 'accounts.views.registration'),
url(r'^create_admin/$', 'accounts.views.create_admin'),
url(r'^create_md5user/$', 'accounts.views.create_md5'),
url(r'^change/(.*)/$', 'accounts.views.user_change'),
# url(r'^change/(?P<user_id>\d+).*/$', 'accounts.views.user_change'),
url(r'^all/$', 'accounts.views.user_all'),
url(r'^translators/$', 'accounts.views.translators'),
url(r'^translators/(?P<user_id>\d+)/$', 'accounts.views.translator_change'),
url(r'^reset_password_email/$', 'accounts.views.reset_password_email'),
)

@ -5,9 +5,9 @@ from django.core.context_processors import csrf
from django.contrib.auth.decorators import login_required
#models and forms
from models import User
from forms import UserForm, UserCreationForm, TranslatorForm
from forms import UserForm, UserCreationForm
#custom views
from functions.custom_views import objects_list, filtered_list
from functions.custom_views import objects_list
from hashlib import md5
@ -18,44 +18,6 @@ def user_all(request):
"""
return objects_list(request, User, 'user_all.html')
def translators(request):
"""
Return list of user filtered by "is_translator" field (list of translators)
"""
user_list = User.objects.filter(is_translator='True')
return filtered_list(request, user_list, 'translators.html')
def translator_change(request, user_id):
"""
Return form of translator and post it on the server.
If form is posted redirect on the page of all translators.
"""
try:
user = User.objects.get(id=user_id)
#get translator information by reverse relation
#related_name="translator" in TranslatorProfile model
translator = user.translator.get(user=user)
except:
return HttpResponseRedirect('/accounts/translators/')
if request.POST:
form = TranslatorForm(request.POST, instance=translator)
if form.is_valid():
form.save()
return HttpResponseRedirect('/accounts/translators')
else:
form = TranslatorForm(instance=translator)
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('translator_change.html', args)
def user_change(request, url):
"""
Return form of user and post it on the server.
@ -125,6 +87,22 @@ def create_md5(request):
return render_to_response('create_admin.html', args)
def registration(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/accounts/registration')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('registration.html', args)
def reset_password_email(request):
"""

@ -10,7 +10,7 @@ from functions.files import check_tmp_files
from functions.form_check import translit_with_separator
#models
from models import Article
from organiser.models import Organiser
from accounts.models import User
from theme.models import Theme, Tag
@ -22,7 +22,9 @@ class ArticleForm(forms.Form):
save function saves data in Article object. If it doesnt exist create new object
"""
author = forms.ModelChoiceField(label='Автор',queryset=Organiser.objects.all())
#users that have organiser profile
author = forms.ModelChoiceField(label='Автор',queryset=User.objects.exclude(organiser__isnull=True))
key = forms.CharField(required=False, widget=forms.HiddenInput())
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all())
#creates select input with empty choices cause it will be filled with ajax
@ -72,7 +74,7 @@ class ArticleForm(forms.Form):
if data.get('author'):
article.organiser = Organiser.objects.get(id=data['author'].id)#.id cause select uses queryset
article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset
#create slug field from russian language
article.url = translit_with_separator(data['main_title_ru']).lower()

@ -13,7 +13,7 @@ class Article(TranslatableModel):
url = models.SlugField(unique=True)
theme = models.ManyToManyField('theme.Theme')
tag = models.ManyToManyField('theme.Tag', related_name='tags',blank=True, null=True)
organiser = models.ForeignKey('organiser.Organiser', verbose_name='Автор',
user = models.ForeignKey('accounts.User', verbose_name='Автор',
on_delete=models.PROTECT, related_name='articles')
#translated fields

@ -10,7 +10,7 @@ from forms import ArticleForm, ArticleDeleteForm, Article
from theme.models import Tag
from file.models import FileModel, TmpFile
from file.forms import FileModelForm
from organiser.models import Organiser
#custom views
from functions.custom_views import objects_list, add_object_with_file, delete_object
@ -28,7 +28,7 @@ def article_add(request):
If form is posted redirect on the page of all articles.
"""
#get organiser from current user
init_data = {'author':request.user.organiser.all()[0]}
init_data = {'author':request.user.organiser}
#choices field which will be filled by ajax
choices = {'tag': Tag}
return add_object_with_file(request, ArticleForm, 'article_add.html', '/article/all',
@ -65,7 +65,7 @@ def article_change(request, url):
else:
data = {}
#fill form with data from database
data['author'] = article.organiser
data['author'] = article.user
data['theme'] = [item.id for item in article.theme.all()]
data['tag'] = [item.id for item in article.tag.all()]
#hidden field

@ -25,6 +25,7 @@ class Company(TranslatableModel):
url = models.SlugField()
#relations
creator = models.ForeignKey('accounts.User', verbose_name='Создатель', related_name='created_company')
theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль',
blank=True, null=True, related_name='companies')
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True, related_name='companies')

@ -4,9 +4,10 @@ from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError
#models and forms
from models import News, TYPES
from theme.models import Theme
from organiser.models import Organiser
from accounts.models import User
from django.db.models.loading import get_model
#functions
from functions.translate import populate_all, fill_trans_fields_all
@ -31,7 +32,8 @@ class NewsForm(forms.Form):
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all())
#creates select input with empty choices cause it will be filled with ajax
tag = forms.MultipleChoiceField(label='Теги', required=False)
organiser = forms.ModelChoiceField(label='Организатор', queryset=Organiser.objects.all(), empty_label='')
user = forms.ModelChoiceField(label='Организатор', queryset=User.objects.exclude(organiser__isnull=True),
empty_label=None)
#
event = forms.ChoiceField(label='Тип события', choices=[(None, ''), ('conference.Conference', 'Конференция'),
('exposition.Exposition', 'Выставка')], required=False)
@ -81,17 +83,18 @@ class NewsForm(forms.Form):
news.tag.clear()
#save relation if its filled
obj = get_model(data['event'].split('.')[0],data['event'].split('.')[1]).objects.get(id=data['event_id'])
news.content_type = ContentType.objects.get_for_model(obj)#
news.object_id = data['event_id']
if not data['event_id']:
obj = get_model(data['event'].split('.')[0],data['event'].split('.')[1]).objects.get(id=data['event_id'])
news.content_type = ContentType.objects.get_for_model(obj)#
news.object_id = data['event_id']
#simple fields
news.url = translit_with_separator(data['main_title_ru'])
news.date = data['date']
news.type = data['type']
news.paid = data['paid']
if data.get('organiser'):
news.organiser = data['organiser']
if data.get('user'):
news.user = data['user']
# uses because in the next loop data will be overwritten
news.save()
@ -130,16 +133,4 @@ class NewsForm(forms.Form):
except:
return main_title_ru
raise ValidationError('Новость с таким названием уже существует')
def clean_event_id(self):
"""
check event_id which must be filled only if event field filled
"""
cleaned_data = super(NewsForm, self).clean()
event = cleaned_data.get('event')
event_id = cleaned_data.get('event_id')
if not event_id and event:
raise ValidationError('Вы должны выбрать тип события')
else:
return event_id
raise ValidationError('Новость с таким названием уже существует')

@ -18,7 +18,7 @@ class News(TranslatableModel):
type = EnumField(values=TYPES)
theme = models.ManyToManyField('theme.Theme', verbose_name='Тема')
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True)
organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True,
user = models.ForeignKey('accounts.User', verbose_name='Организатор', blank=True, null=True,
on_delete=models.PROTECT)
paid = models.BooleanField(default=0)

@ -100,8 +100,8 @@ def news_change(request, url):
#fill form with data from database
data = {'date':news.date, 'type':news.type, 'paid': news.paid}
if news.organiser:
data['organiser'] = news.organiser.id
if news.user:
data['user'] = news.user.id
#
if news.content_type:
data['event'] = 'conference.Conference' if news.content_type.model=='conference'\

@ -8,6 +8,7 @@ from models import Organiser
from country.models import Country
from city.models import City
from theme.models import Theme
from accounts.models import User
from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference
#functions
@ -27,6 +28,7 @@ class OrganiserForm(forms.Form):
"""
url = forms.CharField(label='url', required=False)
user = forms.ModelChoiceField(label='Пользователь', queryset=User.objects.all(), empty_label=None)
country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None)
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all())
place_exposition = forms.ModelMultipleChoiceField(label='Места проведения выставок', queryset=PlaceExposition.objects.all(), required=False)
@ -154,6 +156,12 @@ class OrganiserForm(forms.Form):
#save files
check_tmp_files(organiser, data['key'])
#bound organiser to user
user = User.objects.safe_get(id=data['user'].id)
if user:
user.organiser = organiser
user.save()
def clean_url(self):
cleaned_data = super(OrganiserForm, self).clean()
url = cleaned_data.get('url').strip()

@ -7,6 +7,7 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import login_required
#models and forms
from models import Organiser
from accounts.models import User
from city.models import City
from theme.models import Tag
from forms import OrganiserForm
@ -70,6 +71,8 @@ def organiser_change(request, url):
'fax':organiser.fax, 'web_page':organiser.web_page, 'url':organiser.url,
'email':organiser.email, 'social':organiser.social, 'foundation': organiser.foundation}
data['user'] = User.objects.safe_get(organiser=organiser)
if organiser.country:
data['country'] = organiser.country.id

@ -22,6 +22,12 @@ DATABASES = {
}
}
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'kotzillla@gmail.com'
EMAIL_HOST_PASSWORD = 'fitter2006'
EMAIL_PORT = 587
# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = []
@ -157,6 +163,7 @@ TEMPLATE_DIRS = (
'/home/kotzilla/Documents/qwer/proj/templates/admin/seminar',
'/home/kotzilla/Documents/qwer/proj/templates/admin/service',
'/home/kotzilla/Documents/qwer/proj/templates/admin/theme',
'/home/kotzilla/Documents/qwer/proj/templates/admin/translator',
'/home/kotzilla/Documents/qwer/proj/templates/admin/webinar',
)

@ -0,0 +1,14 @@
{% extends 'base.html' %}
{% block body %}
<form method="POST" name="form" class="form-horizontal">{% csrf_token %}
{{ form }}
<input type="submit" class="btn" value="Register">
</form>
{% endblock %}

@ -24,7 +24,7 @@ Displays lists of all articles in the table
<tr>
<td>{{ item.id }}</td>
<td>{{ item.main_title }}</td>
<td>{% ifnotequal item.author None %}{{ item.author }} {% endifnotequal %}</td>
<td>{% ifnotequal item.user None %}{{ item.user }} {% endifnotequal %}</td>
<td class="center sorting_1">
<a class="btn btn-info" href="/article/change/{{ item.url|lower }}">
<i class="icon-edit icon-white"></i> Изменить

@ -21,7 +21,7 @@
{# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>{% if country_id %} Изменить {% else %} Добавить {% endif %}страну</legend>
<legend><i class="icon-edit"></i>{% if obj_id %} Изменить {% else %} Добавить {% endif %}страну</legend>
<div class="box span8">
<div class="box-header well">

@ -86,11 +86,11 @@
<span class="help-inline">{{ form.tag.errors }}</span>
</div>
</div>
{# organiser #}
<div class="control-group {% if form.organiser.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.organiser.label }}:</b></label>
<div class="controls">{{ form.organiser }}
<span class="help-inline">{{ form.organiser.errors }}</span>
{# user #}
<div class="control-group {% if form.user.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.user.label }}:</b></label>
<div class="controls">{{ form.user }}
<span class="help-inline">{{ form.user.errors }}</span>
</div>
</div>
{# description #}

@ -40,6 +40,13 @@
{# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }}
{# user #}
<div class="control-group {% if form.user.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.user.label }}:</b></label>
<div class="controls">{{ form.user }}
<span class="help-inline">{{ form.user.errors }}</span>
</div>
</div>
{# name #}
{% with field='name' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}

@ -27,7 +27,7 @@
<td>{{ item.main_title }}</td>
<td class="center sorting_1">
<a class="btn btn-info" href="/theme/tag/change/{{ tag.id }}">
<a class="btn btn-info" href="/theme/tag/change/{{ item.id }}">
<i class="icon-edit icon-white"></i> Изменить
</a>

@ -0,0 +1,228 @@
{% extends 'base.html' %}
{% load static %}
{# Displays translator form and file form in modal window #}
{% 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>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/file_delete_ajax.js' %}"></script>
{# datetimepicker #}
<link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/>
<script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#id_birth').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
});
</script>
{% endblock %}
{% block body %}
{# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>{% if obj_id %} Изменить {% else %} Добавить {% endif %}страну</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# Hidden input uses for comparing with TmpFile objects #}
{{ form.key }}
{# user #}
<div class="control-group {% if form.user.errors %}error{% endif %}">
<label class="control-label">{{ form.user.label }}:</label>
<div class="controls">{{ form.user }}
<span class="help-inline">{{ form.user.errors }}</span>
</div>
</div>
{# birth #}
<div class="control-group {% if form.birth.errors %}error{% endif %}">
<label class="control-label">{{ form.birth.label }}:</label>
<div class="controls">{{ form.birth }}
<span class="help-inline">{{ form.birth.errors }}</span>
</div>
</div>
{# gender #}
<div class="control-group {% if form.gender.errors %}error{% endif %}">
<label class="control-label">{{ form.gender.label }}:</label>
<div class="controls">{{ form.gender }}
<span class="help-inline">{{ form.gender.errors }}</span>
</div>
</div>
{# education #}
{% with field='education' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# specialization #}
{% with field='specialization' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# languages #}
{% with field='languages' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# native_language #}
{% with field='native_language' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# prices #}
{% with field='prices' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# discounts #}
{% with field='discounts' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# 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>
</div>
</div>
<a name="file"></a>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Файлы</h2>
</div>
<div class="box-content">
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">Добавить файл</a>
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
<thead>
<tr>
<td>id</td>
<td>Файл</td>
<td>Имя</td>
<td>Назначение</td>
<td></td>
</tr>
</thead>
<tbody>
{% for file in files %}
<tr>
<td>{{ file.id }}</td>
<td><img src="{{ file.file_path.url }}"></td>
<td>{{ file.file_name }}</td>
<td>{{ file.purpose }}</td>
<td>
<button class="btn btn-danger delete_file" value="{{ file.id }}">
<i class="icon-trash icon-white"></i> Удалить
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Мета данные</h2>
</div>
<div class="box-content">
{# keywords #}
{% with field='keywords' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# title #}
{% with field='title' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# descriptions #}
{% with field='descriptions' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
</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>
{# modal window #}
<div class="modal hide fade" id="myModal" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" id="close">&times;</button>
<h3>Добавить файл</h3>
</div>
<div id="form_body">
<div class="modal-body">
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="file_form" id="file_form" > {% csrf_token %}
{# hidden inputs uses for comparing with Translator form key#}
{{ file_form.key }}
{{ file_form.model }}
<input type="hidden" id="obj_id" value="{{ obj_id }}">
{# file_path #}
<div class="control-group{% if file_form.file_path.errors %}error{% endif %}">
<label class="control-label"><b>{{ file_form.file_path.label }}:</b></label>
<div class="controls">{{ file_form.file_path }}
<span class="help-inline">{{ file_form.file_path.errors }}</span>
</div>
</div>
{# file purpose #}
<div class="control-group{% if file_form.purpose.errors %}error{% endif %}">
<label class="control-label"><b>{{ file_form.purpose.label }}:</b></label>
<div class="controls">{{ file_form.purpose }}
<span class="help-inline">{{ file_form.purpose.errors }}</span>
</div>
</div>
{# file_name #}
{% with field='file_name' form=file_form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# file_description #}
{% with field='description' form=file_form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
<div class="modal-footer">
<div class="controls">
<input class="btn btn-primary" type="submit" value="Добавить">
<input type="reset" class="btn" value="Отменить" data-dismiss="modal">
</form>
</div>
</div>
</div>
</div>
{% endblock %}

@ -0,0 +1,59 @@
{% 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>Пользователь</th>
<th>Страна</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in objects %}
<tr>
<td>{{ item.id }}</td>
{% for u in item.user.all %}
<td>{{ u }}</td>
<td>{{ u.country }}</td>
{% endfor %}
<td class="center sorting_1">
<a class="btn btn-info" href="/translator/change/{{ item.id }}">
<i class="icon-edit icon-white"></i> Изменить
</a>
<a class="btn btn-danger delete" href="/translator/delete/{{ item.id }}/">
<i class="icon-trash icon-white"></i> Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="/translator/add"><i class="icon-plus-sign icon-white"></i> Добавить перводчика</a>
</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 %}

@ -43,6 +43,9 @@
#content{
}
#navigation{
margin-top: 10px;
}
</style>
</head>
@ -89,7 +92,7 @@
-->
{# Side navigation #}
{% block sidebar %}
<div class="span3" data-spy="affix" data-offset-top="0">
<div class="span3" data-spy="affix" data-offset-top="0" id="navigation">
<div class="well sidebar-nav">
<ul class="nav nav-tabs nav-stacked">
<li class="nav-header">Добавить</li>
@ -116,7 +119,7 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-eye-open"></i> Пользователи<b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/accounts/all">Пользователи</a></li>
<li><a href="/accounts/translators/">Переводчики</a></li>
<li><a href="/translator/all">Переводчики</a></li>
<li><a href="/organiser/all">Организаторы</a></li>
<li><a href="/company/all">Компании</a></li>
</ul>

@ -14,7 +14,7 @@ from functions.translate import fill_trans_fields, populate, ZERO_LANGUAGE, popu
class ThemeForm(forms.Form):
types = forms.MultipleChoiceField(label='Тип', choices=Theme.FLAGS, widget=forms.CheckboxSelectMultiple())#initial=[item for item, name in Theme.FLAGS]
types = forms.MultipleChoiceField(label='Тип', required=False, choices=Theme.FLAGS, widget=forms.CheckboxSelectMultiple())
def __init__(self, *args, **kwargs):
super(ThemeForm, self).__init__(*args, **kwargs)
@ -68,6 +68,15 @@ class ThemeForm(forms.Form):
theme_id = getattr(theme, 'id')
populate_all(Theme, data, theme_id, zero_fields)
def clean_types(self):
"""
if not checked any of types automatic select all
"""
types = self.cleaned_data.get('types')
if not types:
types = [i for (i, k) in Theme.FLAGS]
return types
class TagForm(forms.Form):

@ -5,6 +5,8 @@ from ckeditor.widgets import CKEditorWidget
from models import Translator
from country.models import Country
from city.models import City
#
from accounts.models import User
#functions
from functions.translate import populate_all, fill_trans_fields_all
from functions.files import check_tmp_files
@ -20,9 +22,13 @@ class TranslatorForm(forms.Form):
save function saves data in Translator object. If it doesnt exist create new object
"""
user = forms.ModelChoiceField(label='Пользователь', queryset=User.objects.all(), empty_label=None)
car = forms.BooleanField(label='Личный автомобиль', required=False)
birth = forms.DateField(label='Дата рождения')
gender = forms.ChoiceField(label='Пол', choices=[('male', 'Мужской'),('female', 'Женский')])
#
key = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
@ -73,7 +79,30 @@ class TranslatorForm(forms.Form):
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)
translator_id = getattr(translator, 'id')
populate_all(Translator, data, translator_id, zero_fields)
#save files
check_tmp_files(conference, data['key'])
check_tmp_files(translator, data['key'])
#bound translator to user
user = User.objects.safe_get(id=data['user'].id)
if user:
user.translator = translator
user.save()
def clean_user(self):
user = self.cleaned_data.get('user')
u = User.objects.get(id = user.id)
if u.translator:
raise forms.ValidationError('У этого пользователя уже есть профиль переводчика')
else:
return user
class TranslatorDeleteForm(forms.ModelForm):
id = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = Translator
fields = ('id', )

@ -19,7 +19,7 @@ class Translator(TranslatableModel):
Extra information about translators
"""
#set manager of this model
objects = TranslationManager()
objects = TranslatorManager()
gender = EnumField(values=('male', 'female'))
@ -30,8 +30,7 @@ class Translator(TranslatableModel):
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),
native_language = models.CharField(verbose_name='Родной язык', max_length=255),
prices = models.TextField(verbose_name='Тарифы'),
discounts = models.TextField(verbose_name='Скидки', blank=True),
#-----meta

@ -4,7 +4,78 @@ 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
from django.contrib.contenttypes.models import ContentType
#models and forms
from models import Translator
from forms import TranslatorForm, TranslatorDeleteForm
from file.forms import FileModelForm
from file.models import FileModel
from accounts.models import User
#custom views
from functions.custom_views import objects_list, delete_object
from functions.custom_views import objects_list, delete_object, add_object_with_file
def translator_all(request):
return objects_list(request, Translator, 'translator_all.html')
def translator_add(request):
return add_object_with_file(request, TranslatorForm, 'translator_add.html', '/translator/all/')
def translator_delete(request, url):
return delete_object(request, Translator, TranslatorDeleteForm, url, '/translator/all/')
from django.contrib import messages
def translator_change(request, url):
"""
"""
translator = Translator.objects.safe_get(id=url)
if translator is None:
return HttpResponseRedirect('/translator/all/')
translator_id = getattr(translator, 'id')
file_form = FileModelForm(initial={'model': 'translator.Translator'})
if request.POST:
form = TranslatorForm(request.POST)
if form.is_valid():
form.save(translator_id)
return HttpResponseRedirect('/translator/all')
else:
#fill form with data from database
data = {'car':translator.car, 'gender':translator.gender, 'birth':translator.birth}
data['user'] = User.objects.safe_get(translator=translator)
#data from translated fields
for code, name in settings.LANGUAGES:
obj = Translator._meta.translations_model.objects.get(language_code = code,master__id=translator_id) #access to translated fields
data['education_%s' % code] = obj.education
data['specialization_%s' % code] = obj.education
data['languages_%s' % code] = obj.languages
data['native_language_%s' % code] = obj.native_language
data['prices_%s' % code] = obj.prices
data['discounts_%s' % code] = obj.discounts
data['title_%s' % code] = obj.title
data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions
#initial form
form = TranslatorForm(initial=data)
args = {}
args.update(csrf(request))
args['languages'] = settings.LANGUAGES
args['form'] = form
args['file_form'] = file_form
#get list of files which connected with specific model object
args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(translator), object_id=getattr(translator, 'id'))
#uses for creating hidden input which will be used for generating ajax url
args['obj_id'] = translator_id
return render_to_response('translator_add.html', args)

Loading…
Cancel
Save