remotes/origin/1203
Nazar Kotjuk 12 years ago
parent e05624c4a7
commit 77a5bddb6d
  1. 2
      accounts/admin.py
  2. 7
      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. 29
      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', (None, {'fields': ('url', 'country', 'city', 'position',
'about', 'phone', 'avatar', 'web_page', 'about', 'phone', 'avatar', 'web_page',
'social', 'title', 'descriptions', 'keywords', 'social', 'title', 'descriptions', 'keywords',
'is_admin', 'is_active', 'is_translator', 'is_organiser')}), 'is_admin', 'is_active')}),
) )
add_fieldsets = ( add_fieldsets = (

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

@ -89,9 +89,11 @@ class User(AbstractBaseUser, PermissionsMixin):
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, organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True,
unique=True,
on_delete=models.PROTECT) on_delete=models.PROTECT)
translator = models.ForeignKey('translator.Translator', verbose_name='Переводчик', blank=True, null=True, 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, 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,
@ -128,8 +130,6 @@ class User(AbstractBaseUser, PermissionsMixin):
""" """
self.url = translit_with_separator(u'%s'%st) self.url = translit_with_separator(u'%s'%st)
def __unicode__(self): def __unicode__(self):
return self.email return self.email
@ -150,21 +150,6 @@ class User(AbstractBaseUser, PermissionsMixin):
return True 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" #need import after User Model, because User imported in "organiser.models"
from organiser.models import Organiser from organiser.models import Organiser

@ -5,13 +5,12 @@ from django.contrib.auth.views import login, logout
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^login/', login, {'template_name': 'admin/login.html' }), url(r'^login/', login, {'template_name': 'admin/login.html' }),
url(r'^logout', logout, {'next_page': '/accounts/login/'}), 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_admin/$', 'accounts.views.create_admin'),
url(r'^create_md5user/$', 'accounts.views.create_md5'), url(r'^create_md5user/$', 'accounts.views.create_md5'),
url(r'^change/(.*)/$', 'accounts.views.user_change'), url(r'^change/(.*)/$', 'accounts.views.user_change'),
# url(r'^change/(?P<user_id>\d+).*/$', 'accounts.views.user_change'), # url(r'^change/(?P<user_id>\d+).*/$', 'accounts.views.user_change'),
url(r'^all/$', 'accounts.views.user_all'), 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'), 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 from django.contrib.auth.decorators import login_required
#models and forms #models and forms
from models import User from models import User
from forms import UserForm, UserCreationForm, TranslatorForm from forms import UserForm, UserCreationForm
#custom views #custom views
from functions.custom_views import objects_list, filtered_list from functions.custom_views import objects_list
from hashlib import md5 from hashlib import md5
@ -18,44 +18,6 @@ def user_all(request):
""" """
return objects_list(request, User, 'user_all.html') 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): 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.
@ -125,6 +87,22 @@ def create_md5(request):
return render_to_response('create_admin.html', args) 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): def reset_password_email(request):
""" """

@ -10,7 +10,7 @@ from functions.files import check_tmp_files
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
#models #models
from models import Article from models import Article
from organiser.models import Organiser from accounts.models import User
from theme.models import Theme, Tag 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 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()) key = forms.CharField(required=False, widget=forms.HiddenInput())
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all()) theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all())
#creates select input with empty choices cause it will be filled with ajax #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'): 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 #create slug field from russian language
article.url = translit_with_separator(data['main_title_ru']).lower() article.url = translit_with_separator(data['main_title_ru']).lower()

@ -13,7 +13,7 @@ class Article(TranslatableModel):
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
theme = models.ManyToManyField('theme.Theme') theme = models.ManyToManyField('theme.Theme')
tag = models.ManyToManyField('theme.Tag', related_name='tags',blank=True, null=True) 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') on_delete=models.PROTECT, related_name='articles')
#translated fields #translated fields

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

@ -25,6 +25,7 @@ class Company(TranslatableModel):
url = models.SlugField() url = models.SlugField()
#relations #relations
creator = models.ForeignKey('accounts.User', verbose_name='Создатель', related_name='created_company')
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')
tag = models.ManyToManyField('theme.Tag', 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 django.contrib.contenttypes.models import ContentType
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
#models and forms
from models import News, TYPES from models import News, TYPES
from theme.models import Theme from theme.models import Theme
from organiser.models import Organiser from accounts.models import User
from django.db.models.loading import get_model from django.db.models.loading import get_model
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all 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()) theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all())
#creates select input with empty choices cause it will be filled with ajax #creates select input with empty choices cause it will be filled with ajax
tag = forms.MultipleChoiceField(label='Теги', required=False) 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', 'Конференция'), event = forms.ChoiceField(label='Тип события', choices=[(None, ''), ('conference.Conference', 'Конференция'),
('exposition.Exposition', 'Выставка')], required=False) ('exposition.Exposition', 'Выставка')], required=False)
@ -81,17 +83,18 @@ class NewsForm(forms.Form):
news.tag.clear() news.tag.clear()
#save relation if its filled #save relation if its filled
obj = get_model(data['event'].split('.')[0],data['event'].split('.')[1]).objects.get(id=data['event_id']) if not data['event_id']:
news.content_type = ContentType.objects.get_for_model(obj)# obj = get_model(data['event'].split('.')[0],data['event'].split('.')[1]).objects.get(id=data['event_id'])
news.object_id = data['event_id'] news.content_type = ContentType.objects.get_for_model(obj)#
news.object_id = data['event_id']
#simple fields #simple fields
news.url = translit_with_separator(data['main_title_ru']) news.url = translit_with_separator(data['main_title_ru'])
news.date = data['date'] news.date = data['date']
news.type = data['type'] news.type = data['type']
news.paid = data['paid'] news.paid = data['paid']
if data.get('organiser'): if data.get('user'):
news.organiser = data['organiser'] news.user = data['user']
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
news.save() news.save()
@ -131,15 +134,3 @@ class NewsForm(forms.Form):
return main_title_ru return main_title_ru
raise ValidationError('Новость с таким названием уже существует') 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

@ -18,7 +18,7 @@ class News(TranslatableModel):
type = EnumField(values=TYPES) type = EnumField(values=TYPES)
theme = models.ManyToManyField('theme.Theme', verbose_name='Тема') theme = models.ManyToManyField('theme.Theme', verbose_name='Тема')
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True) 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) on_delete=models.PROTECT)
paid = models.BooleanField(default=0) paid = models.BooleanField(default=0)

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

@ -8,6 +8,7 @@ from models import Organiser
from country.models import Country from country.models import Country
from city.models import City from city.models import City
from theme.models import Theme from theme.models import Theme
from accounts.models import User
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference from place_conference.models import PlaceConference
#functions #functions
@ -27,6 +28,7 @@ class OrganiserForm(forms.Form):
""" """
url = forms.CharField(label='url', required=False) 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) country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None)
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all()) theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all())
place_exposition = forms.ModelMultipleChoiceField(label='Места проведения выставок', queryset=PlaceExposition.objects.all(), required=False) place_exposition = forms.ModelMultipleChoiceField(label='Места проведения выставок', queryset=PlaceExposition.objects.all(), required=False)
@ -154,6 +156,12 @@ class OrganiserForm(forms.Form):
#save files #save files
check_tmp_files(organiser, data['key']) 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): def clean_url(self):
cleaned_data = super(OrganiserForm, self).clean() cleaned_data = super(OrganiserForm, self).clean()
url = cleaned_data.get('url').strip() 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 from django.contrib.auth.decorators import login_required
#models and forms #models and forms
from models import Organiser from models import Organiser
from accounts.models import User
from city.models import City from city.models import City
from theme.models import Tag from theme.models import Tag
from forms import OrganiserForm from forms import OrganiserForm
@ -70,6 +71,8 @@ def organiser_change(request, url):
'fax':organiser.fax, 'web_page':organiser.web_page, 'url':organiser.url, '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}
data['user'] = User.objects.safe_get(organiser=organiser)
if organiser.country: if organiser.country:
data['country'] = organiser.country.id 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 # 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 # See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
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/seminar',
'/home/kotzilla/Documents/qwer/proj/templates/admin/service', '/home/kotzilla/Documents/qwer/proj/templates/admin/service',
'/home/kotzilla/Documents/qwer/proj/templates/admin/theme', '/home/kotzilla/Documents/qwer/proj/templates/admin/theme',
'/home/kotzilla/Documents/qwer/proj/templates/admin/translator',
'/home/kotzilla/Documents/qwer/proj/templates/admin/webinar', '/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> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
<td>{{ item.main_title }}</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"> <td class="center sorting_1">
<a class="btn btn-info" href="/article/change/{{ item.url|lower }}"> <a class="btn btn-info" href="/article/change/{{ item.url|lower }}">
<i class="icon-edit icon-white"></i> Изменить <i class="icon-edit icon-white"></i> Изменить

@ -21,7 +21,7 @@
{# Uses multilang.html template for translated fields #} {# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %} <form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %}
<fieldset> <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 span8">
<div class="box-header well"> <div class="box-header well">

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

@ -40,6 +40,13 @@
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }} {{ 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 #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %} {% include 'admin/forms/multilang.html' %}

@ -27,7 +27,7 @@
<td>{{ item.main_title }}</td> <td>{{ item.main_title }}</td>
<td class="center sorting_1"> <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> Изменить <i class="icon-edit icon-white"></i> Изменить
</a> </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{ #content{
} }
#navigation{
margin-top: 10px;
}
</style> </style>
</head> </head>
@ -89,7 +92,7 @@
--> -->
{# Side navigation #} {# Side navigation #}
{% block sidebar %} {% 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"> <div class="well sidebar-nav">
<ul class="nav nav-tabs nav-stacked"> <ul class="nav nav-tabs nav-stacked">
<li class="nav-header">Добавить</li> <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> <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-eye-open"></i> Пользователи<b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="/accounts/all">Пользователи</a></li> <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="/organiser/all">Организаторы</a></li>
<li><a href="/company/all">Компании</a></li> <li><a href="/company/all">Компании</a></li>
</ul> </ul>

@ -14,7 +14,7 @@ from functions.translate import fill_trans_fields, populate, ZERO_LANGUAGE, popu
class ThemeForm(forms.Form): 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): def __init__(self, *args, **kwargs):
super(ThemeForm, self).__init__(*args, **kwargs) super(ThemeForm, self).__init__(*args, **kwargs)
@ -68,6 +68,15 @@ class ThemeForm(forms.Form):
theme_id = getattr(theme, 'id') theme_id = getattr(theme, 'id')
populate_all(Theme, data, theme_id, zero_fields) 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): class TagForm(forms.Form):

@ -5,6 +5,8 @@ from ckeditor.widgets import CKEditorWidget
from models import Translator from models import Translator
from country.models import Country from country.models import Country
from city.models import City from city.models import City
#
from accounts.models import User
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import populate_all, fill_trans_fields_all
from functions.files import check_tmp_files from functions.files import check_tmp_files
@ -20,9 +22,13 @@ class TranslatorForm(forms.Form):
save function saves data in Translator object. If it doesnt exist create new object 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) car = forms.BooleanField(label='Личный автомобиль', required=False)
birth = forms.DateField(label='Дата рождения') birth = forms.DateField(label='Дата рождения')
gender = forms.ChoiceField(label='Пол', choices=[('male', 'Мужской'),('female', 'Женский')]) gender = forms.ChoiceField(label='Пол', choices=[('male', 'Мужской'),('female', 'Женский')])
#
key = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -73,7 +79,30 @@ class TranslatorForm(forms.Form):
fill_trans_fields_all(Translator, translator, data, id, zero_fields) fill_trans_fields_all(Translator, translator, data, id, zero_fields)
#autopopulate #autopopulate
#populate empty fields and fields which was already populated #populate empty fields and fields which was already populated
conference_id = getattr(conference, 'id') translator_id = getattr(translator, 'id')
populate_all(Conference, data, conference_id, zero_fields) populate_all(Translator, data, translator_id, zero_fields)
#save files #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 Extra information about translators
""" """
#set manager of this model #set manager of this model
objects = TranslationManager() objects = TranslatorManager()
gender = EnumField(values=('male', 'female')) gender = EnumField(values=('male', 'female'))
@ -30,8 +30,7 @@ class Translator(TranslatableModel):
education = models.CharField(verbose_name='Образование', max_length=255), education = models.CharField(verbose_name='Образование', max_length=255),
specialization = models.CharField(verbose_name='Специализация', max_length=255), specialization = models.CharField(verbose_name='Специализация', max_length=255),
languages = 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='Тарифы'), prices = models.TextField(verbose_name='Тарифы'),
discounts = models.TextField(verbose_name='Скидки', blank=True), discounts = models.TextField(verbose_name='Скидки', blank=True),
#-----meta #-----meta

@ -4,7 +4,78 @@ from django.http import HttpResponseRedirect
from django.core.context_processors import csrf from django.core.context_processors import csrf
from django.conf import settings from django.conf import settings
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType
#models and forms #models and forms
from models import Translator 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 #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