Translators

remotes/origin/1203
Kotiuk Nazarii 11 years ago
parent c104147080
commit 91c43d8f31
  1. 5
      accounts/models.py
  2. 4
      city/admin.py
  3. 6
      city/forms.py
  4. 1
      city/models.py
  5. 7
      country/admin.py
  6. 8
      country/forms.py
  7. 1
      country/models.py
  8. 11
      settings/templatetags/template_filters.py
  9. 9
      templates/admin/city/city_add.html
  10. 7
      templates/admin/country/country_add.html
  11. 133
      templates/admin/translator/translator.html
  12. 7
      templates/admin/translator/translator_all.html
  13. 11
      templates/admin/translator/translator_list.html
  14. 108
      templates/client/accounts/translators/translator_city.html
  15. 137
      templates/client/accounts/translators/translator_country.html
  16. 59
      templates/client/accounts/translators/translator_profile.html
  17. 33
      templates/client/accounts/translators/translators_by.html
  18. 71
      translator/admin.py
  19. 6
      translator/admin_urls.py
  20. 59
      translator/forms.py
  21. 6
      translator/models.py
  22. 16
      translator/urls.py
  23. 105
      translator/views.py

@ -204,6 +204,11 @@ class User(AbstractBaseUser, PermissionsMixin):
return '/%d/'%self.id return '/%d/'%self.id
#return self.catalog+str(self.id)+'/' #return self.catalog+str(self.id)+'/'
def get_translator_url(self):
if self.url:
return '/translators/%s/'%self.url
return '/translators/%d/'%self.id
def get_expos(self): def get_expos(self):
""" """
return information about expos and them related data by 1 query return information about expos and them related data by 1 query

@ -49,14 +49,14 @@ def city_change(request, url):
return HttpResponseRedirect('/admin/city/all') return HttpResponseRedirect('/admin/city/all')
if request.POST: if request.POST:
form = CityForm(request.POST) form = CityForm(request.POST, request.FILES)
if form.is_valid(): if form.is_valid():
form.save(city_id) form.save(city_id)
return HttpResponseRedirect('/admin/city/all') return HttpResponseRedirect('/admin/city/all')
else: else:
#fill form with data from database #fill form with data from database
data = {'population' : c.population, 'phone_code' : c.phone_code, data = {'population' : c.population, 'phone_code' : c.phone_code,
'city_id' : city_id, 'inflect':c.inflect} 'city_id' : city_id, 'inflect':c.inflect, 'logo': c.logo}
if c.country: if c.country:
data['country'] = c.country.id data['country'] = c.country.id

@ -34,6 +34,7 @@ class CityForm(forms.Form):
widget=forms.TextInput(attrs={'placeholder':'Код города'})) widget=forms.TextInput(attrs={'placeholder':'Код города'}))
code_IATA = forms.ModelChoiceField(label='Код IATA', queryset=Iata.objects.all(), empty_label=None, required=False) code_IATA = forms.ModelChoiceField(label='Код IATA', queryset=Iata.objects.all(), empty_label=None, required=False)
inflect = forms.CharField(label='Inflect', required=False) inflect = forms.CharField(label='Inflect', required=False)
logo = forms.ImageField(label='Logo', required=False)
#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())
# #
@ -91,6 +92,11 @@ class CityForm(forms.Form):
city.population = data.get('population') city.population = data.get('population')
city.inflect = data['inflect'] city.inflect = data['inflect']
if data.get('logo'):
city.logo = data['logo']
else:
city.logo = ''
if data.get('code_IATA'): if data.get('code_IATA'):
city.code_IATA = Iata.objects.get(id=data['code_IATA'].id)# .id cause select uses queryset city.code_IATA = Iata.objects.get(id=data['code_IATA'].id)# .id cause select uses queryset

@ -62,6 +62,7 @@ class City(TranslatableModel):
# fields saves information about creating and changing model # fields saves information about creating and changing model
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
logo = models.ImageField(verbose_name='Logo', upload_to='city/logo/', blank=True, max_length=255)
class Meta: class Meta:
ordering = ['translations__name'] ordering = ['translations__name']

@ -63,7 +63,7 @@ def country_change(request, url):
if request.POST: if request.POST:
#country_id sending for saving capital field in __init__ #country_id sending for saving capital field in __init__
form = CountryForm(request.POST, country_id=country_id) form = CountryForm(request.POST, request.FILES, country_id=country_id)
if form.is_valid(): if form.is_valid():
form.save(country_id) form.save(country_id)
@ -71,8 +71,9 @@ def country_change(request, url):
else: else:
#fill form with data from database #fill form with data from database
data = {'population' : c.population, 'teritory' : c.teritory, #data from NOT translated fields data = {'population' : c.population, 'teritory' : c.teritory, #data from NOT translated fields
'timezone' : c.timezone, 'country_id' : country_id, 'timezone' : c.timezone, 'country_id' : country_id,
'phone_code' : c.phone_code, 'time_delivery' : c.time_delivery} 'phone_code' : c.phone_code, 'time_delivery' : c.time_delivery,
'logo': c.logo}
if c.capital: if c.capital:
data['capital'] = c.capital.id data['capital'] = c.capital.id

@ -55,6 +55,8 @@ class CountryForm(forms.Form):
time_delivery = forms.CharField(label='Срок выдачи', required=False, time_delivery = forms.CharField(label='Срок выдачи', required=False,
widget=forms.TextInput(attrs={'placeholder':'Срок выдачи'})) widget=forms.TextInput(attrs={'placeholder':'Срок выдачи'}))
logo = forms.ImageField(label='Logo', required=False)
#services = forms.MultipleChoiceField(label='Сервисы', required=False, choices=); #services = forms.MultipleChoiceField(label='Сервисы', required=False, choices=);
#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())
@ -136,6 +138,12 @@ class CountryForm(forms.Form):
country.phone_code = data['phone_code'] country.phone_code = data['phone_code']
country.time_delivery = data['time_delivery'] country.time_delivery = data['time_delivery']
if data.get('logo'):
country.logo = data['logo']
else:
country.logo = ''
if data.get('capital'): if data.get('capital'):
country.capital = City.objects.get(id=data['capital']) country.capital = City.objects.get(id=data['capital'])

@ -102,6 +102,7 @@ class Country(TranslatableModel):
descriptions = models.CharField(max_length=255), descriptions = models.CharField(max_length=255),
keywords = models.CharField(max_length=255), keywords = models.CharField(max_length=255),
) )
logo = models.ImageField(verbose_name='Logo', upload_to='country/logo/', blank=True, max_length=255)
class Meta: class Meta:
ordering = ['translations__name'] ordering = ['translations__name']

@ -282,4 +282,13 @@ def generate_countries_list(value):
return ul1+ul2+ul3 return ul1+ul2+ul3
@register.filter
def how_many_years(value):
if not isinstance(value, datetime.date):
return ''
now = datetime.date.today()
delta = now - value
return delta.days/365

@ -17,7 +17,7 @@
{% block body %} {% block body %}
{# Uses multilang.html template for translated fields #} {# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" name="form2" id="form2"> {% csrf_token %} <form method="post" class="form-horizontal" name="form2" id="form2" enctype="multipart/form-data"> {% csrf_token %}
<fieldset> <fieldset>
<legend><i class="icon-edit"></i>{% if obj_id %} Изменить {% else %} Добавить {% endif %}город</legend> <legend><i class="icon-edit"></i>{% if obj_id %} Изменить {% else %} Добавить {% endif %}город</legend>
@ -47,6 +47,13 @@
<label class="control-label"><b>{{ form.country.label }}:</b></label> <label class="control-label"><b>{{ form.country.label }}:</b></label>
<div class="controls">{{ form.country}}</div> <div class="controls">{{ form.country}}</div>
</div> </div>
<div class="control-group {% if form.logo.errors %}error{% endif %}">
<label class="control-label">{{ form.logo.label }}:</label>
<div class="controls">{{ form.logo }}
<span class="help-inline">{{ form.logo.errors }}</span>
</div>
</div>
{# region #} {# region #}
{% with field='region' form=form languages=languages %} {% with field='region' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %} {% include 'admin/forms/multilang.html' %}

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

@ -0,0 +1,133 @@
{% 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>
{# 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 %}
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>Изменить переводчика(<a target="_blank" href="{{ object.get_translator_url }}">на сайте</a>)</legend>
<div class="box span8" >
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# name #}
<div class="control-group {% if form_user.first_name.errors %}error{% endif %}">
<label class="control-label"><b>{{ form_user.first_name.label }}:</b></label>
<div class="controls">{{ form_user.first_name }}
<span class="help-inline">{{ form_user.first_name.errors }}</span>
</div>
</div>
{# surname #}
<div class="control-group {% if form_user.last_name.errors %}error{% endif %}">
<label class="control-label"><b>{{ form_user.last_name.label }}:</b></label>
<div class="controls">{{ form_user.last_name }}
<span class="help-inline">{{ form_user.last_name.errors }}</span>
</div>
</div>
{# country #}
<div class="control-group {% if form_profile.country.errors %}error{% endif %}">
<label class="control-label"><b>{{ form_profile.country.label }}:</b></label>
<div class="controls">{{ form_profile.country }}
<span class="help-inline">{{ form_profile.country.errors }}</span>
</div>
</div>
{# city #}
<div class="control-group {% if form_profile.city.errors %}error{% endif %}">
<label class="control-label"><b>{{ form_profile.city.label }}:</b></label>
<div class="controls">{{ form_profile.city }}
<span class="help-inline">{{ form_profile.city.errors }}</span>
</div>
</div>
{# logo #}
<div class="control-group {% if form_profile.avatar.errors %}error{% endif %}">
<label class="control-label"><b>{{ form_profile.avatar.label }}:</b></label>
<div class="controls">{{ form_profile.avatar }}
<span class="help-inline">{{ form_profile.avatar.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">
{# car #}
<div class="control-group {% if form.car.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.car.label }}:</b></label>
<div class="controls">{{ form.car }}
<span class="help-inline">{{ form.car.errors }}</span>
</div>
</div>
{# birth #}
<div class="control-group {% if form.birth.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.birth.label }}:</b></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"><b>{{ form.gender.label }}:</b></label>
<div class="controls">{{ form.gender }}
<span class="help-inline">{{ form.gender.errors }}</span>
</div>
</div>
{# time #}
{% include 'admin/forms/multilang.html' with field='education' form=form languages=languages%}
{% include 'admin/forms/multilang.html' with field='specialization' form=form languages=languages%}
{% include 'admin/forms/multilang.html' with field='languages' form=form languages=languages%}
{% include 'admin/forms/multilang.html' with field='native_language' form=form languages=languages%}
{% include 'admin/forms/multilang.html' with field='prices' form=form languages=languages%}
{% include 'admin/forms/multilang.html' with field='discounts' form=form languages=languages%}
</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 %}

@ -21,10 +21,9 @@
<tr> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
{% for u in item.user.all %} <td>{{ item.get_full_name }}</td>
<td>{{ u }}</td> <td>{{ item.profile.country.name }}</td>
<td>{{ u.country }}</td>
{% endfor %}
<td class="center sorting_1"> <td class="center sorting_1">
<a class="btn btn-info" href="/admin/translator/change/{{ item.id }}"> <a class="btn btn-info" href="/admin/translator/change/{{ item.id }}">

@ -36,19 +36,14 @@
<tr> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
{% for u in item.user.all %} <td>{{ item.get_full_name }}</td>
<td>{{ u }}</td> <td>{{ item.profile.country.name }}</td>
<td>{{ u.country }}</td>
{% endfor %}
<td class="center sorting_1"> <td class="center sorting_1">
<a class="btn btn-info" href="/admin/translator/change/{{ item.id }}"> <a class="btn btn-info" href="/admin/translator/{{ item.id }}/">
<i class="icon-edit icon-white"></i> Изменить <i class="icon-edit icon-white"></i> Изменить
</a> </a>
<a class="btn btn-danger delete" href="/admin/translator/delete/{{ item.id }}/">
<i class="icon-trash icon-white"></i> Удалить
</a>
</td> </td>
</tr> </tr>

@ -0,0 +1,108 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% block bread_scrumbs %}
{% endblock %}
{% block page_title %}
<div class="bread-crumbs">
<a href="/">Главная страница</a>
<a href="/translators/city/{{ object.url }}/">Города</a>
<strong>Переводчики {{ object.inflect }}</strong>
</div>
{% endblock %}
{% block content_list %}
<div class="m-article">
<div class="item-wrap place clearfix">
<aside>
<div class="i-pict">
{% include 'client/includes/show_logo.html' with obj=object %}
</div>
{# <a class="button about" href="#">о городе</a> #}
</aside>
<div class="i-info">
<header>
<div class="i-title">{{ object.name }}</div>
</header>
<div class="i-descr">
<p>Компания Serve Businesses Worldwide предлагает Вам возможность заказать услуги русскоговорящих переводчиков со знанием английского языка практически непосредственно в Великобритании.</p>
</div>
</div>
</div>
<hr />
<div class="i-services country_content">
<div class="i-descr">
<h4>Коротко о наших преимуществах:</h4>
<ul class="content_list">
<li>Эффективная цена</li>
<li>Опыт и профессионализм специалистов</li>
<li>Знание разных менталитетов и психологических аспектов проведения переговоров с зарубежными бизнесменами</li>
<li>Ориентированность в мировых выставочных комплексах </li>
<li>Гарантии, отчетность по договору, прозрачные безналичные расчеты в России</li>
</ul>
</div>
</div>
<div class="rq-btn-wrap rq-btn-to-hide">
<div class="rqb-cols">
<div class="rqb-button">
<div class="rq-order-button">
<div class="rqob-wrap">
<div class="rqob-price">от 80 € / день</div>
<div class="rqob-button">
<a class="ob-text" href="#">заказать услугу</a>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class="i-staff">
<div class="sect-title"><a href="/translators/city/{{ object.url }}/all/">Наши специалисты</a></div>
<div class="i-staff-list">
<ul>
{% with object_list=object_list %}
{% for user in object_list %}
<li>
<a href="{{ user.get_translator_url }}">
<div class="sl-item clearfix">
<div class="sl-pict">
{% include 'includes/show_logo.html' with obj=user %}
</div>
<div class="sl-info">
<div class="sl-info-wrap">
<div class="sl-name">{{ user.get_full_name }}</div>
<div class="sl-position">{{ user.translator.languages }}</div>
</div>
</div>
</div>
</a>
</li>
{% endfor %}
{% endwith %}
</ul>
</div>
<a class="button more" href="/translators/city/{{ object.url }}/all/">Все переводчики</a>
</div>
</div>
{% endblock %}

@ -0,0 +1,137 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">Главная страница</a>
<a href="/translators/country/">Страны</a>
<strong>Переводчики {{ object.inflect }}</strong>
</div>
{% endblock %}
{% block page_title %}
{% endblock %}
{% block content_list %}
<div class="m-article">
<div class="item-wrap place clearfix">
<aside>
<div class="i-pict">{% include 'client/includes/show_logo.html' with obj=object %}</div>
{# <a class="button about" href="#">о стране</a> #}
</aside>
<div class="i-info">
<header>
<div class="i-title">Переводчики {{ object.inflect }}</div>
</header>
<div class="i-descr">
<p>Компания Serve Businesses Worldwide предлагает Вам возможность заказать услуги русскоговорящих переводчиков со знанием английского языка практически непосредственно в Великобритании.</p>
<p>Ниже приведен список наиболее часто востребованных территориальных направлений для оказания услуг перевода в Великобритании. Приведенный перечень не является исчерпывающим, поэтому, если Вы не нашли нужный Вам город, обратитесь к нашим консультантам. </p>
</div>
<br>
{% if object.latitude and object.longitude %}
<div class="i-address map-opened country_map">
<div class="i-map">
<!-- позиция для карты задается в атрибуте data-coords -->
<div class="map-canvas" id="map-canvas" data-coords="{{ object.latitude }},{{ object.longitude }}" ></div>
<div class="close-map"><a class="toggle-map" href="#">Скрыть карту</a></div>
</div>
<header>
<div class="show-map show-map_1"><a class="toggle-map" href="#">Раскрыть карту</a></div>
</header>
</div>
{% endif %}
</div>
</div>
<hr />
{% if object.big_cities.exists %}
{% with cities=object.big_cities.all %}
<div class="country_towns">
<h4>Крупные города:</h4>
<table>
<tr>
<td>
<ul>
{% for city in cities %}
<li><a href="/translators/city/{{ city.url }}/" title="">{{ city.name }}</a></li>
{% endfor %}
</ul>
</td>
<th>&nbsp;</th>
</tr>
</table>
</div>
<hr/>
{% endwith %}
{% endif %}
<div class="i-services country_content">
<div class="i-descr">
<h4>Коротко о наших преимуществах:</h4>
<ul class="content_list">
<li>Эффективная цена</li>
<li>Опыт и профессионализм специалистов</li>
<li>Знание разных менталитетов и психологических аспектов проведения переговоров с зарубежными бизнесменами</li>
<li>Ориентированность в мировых выставочных комплексах </li>
<li>Гарантии, отчетность по договору, прозрачные безналичные расчеты в России</li>
</ul>
</div>
</div>
<div class="rq-btn-wrap rq-btn-to-hide">
<div class="rqb-cols">
<div class="rqb-button">
<div class="rq-order-button">
<div class="rqob-wrap">
<div class="rqob-price">от 80 € / день</div>
<div class="rqob-button">
<a class="ob-text" href="#">заказать услугу</a>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class="i-staff">
<div class="sect-title"><a href="/translators/country/{{ object.url }}/all/">Наши специалисты</a></div>
<div class="i-staff-list">
<ul>
{% for user in object_list %}
<li>
<a href="{{ user.get_translator_url }}">
<div class="sl-item clearfix">
<div class="sl-pict">{% include 'client/includes/show_logo.html' with obj=user %}</div>
<div class="sl-info">
<div class="sl-info-wrap">
<div class="sl-name">{{ user.get_full_name }}</div>
<div class="sl-position">{{ user.translator.languages }}</div>
</div>
</div>
</div>
</a>
</li>
{% endfor %}
</ul>
</div>
<a class="button more" href="/translators/country/{{ object.url }}/all/">Все переводчики</a>
</div>
</div>
{% endblock %}

@ -0,0 +1,59 @@
{% extends 'base_catalog.html' %}
{% load static %}
{% load i18n %}
{% load thumbnail %}
{% load template_filters %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
{% if object.profile.country %}
<a href="/translators/country/{{ object.profile.country.url }}/">{{ object.profile.country.name }}</a>
{% if object.profile.city %}
<a href="/translators/city/{{ object.profile.city.url }}/">{{ object.profile.city.name }}</a>
{% endif %}
{% endif %}
<strong>{{ obect.get_full_name }}</strong>
</div>
{% endblock %}
{% block content_list %}
<div class="m-article cl-news blog_block">
<div class="profile_top">
<div class="profile_top_pic">
{% if object.profile.avatar %}
{% thumbnail object.profile.avatar "100x100" format="PNG" as im %}
<img class="user-avatar" src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"/>
{% endthumbnail %}
{% else %}
<img class="user-avatar" src="{% static 'client/img/no-userpic-big.gif' %}" width="100" height="100"/>
{% endif %}
</div>
<div class="profile_top_left_1">
<h1>{{ object.get_full_name }}</h1>
<p><span class="icon1"></span><b>{{ object.translator.languages }}</b></p>
<p>{% ifequal object.translator.gender 'female' %}<span class="icon2"></span>{% endifequal %}{{ object.translator.birth|how_many_years }} лет{% if object.translator.car %}<span class="icon3"></span>Есть личный автомобиль</p>{% endif %}
</div>
<div class="profile_top_right_1">
{% if object.profile.country %}
<p><span class="icon4"></span><a href="/translators/country/{{ object.profile.country.url }}/" title="">{{ object.profile.country.name }}</a>
{% if object.profile.city %}, <a href="/translators/city/{{ object.profile.city.url }}/" title="">{{ object.profile.city.name }}</a>{% endif %}</p>
{% endif %}
{% if object.translator.native_language %}
<p><span class="icon5"></span>{% trans 'Родной язык' %} — {{ object.translator.native_language }}</p>
{% endif %}
</div>
<div class="clear"></div>
<hr>
{% if object.translator.education %}
<h3>{% trans 'Образование' %}:</h3>
{{ object.translator.education }}
<hr>
{% endif %}
</div>
</div>
{% endblock %}

@ -0,0 +1,33 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% load template_filters %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">Главная страница</a>
<strong>{{ catalog_name }}</strong>
</div>
{% endblock %}
{% block page_title %}
{% endblock %}
{% block content_list %}
{% with objects=object_list %}
{% for obj in objects %}
{% set cur_word = obj.name %}
{% if cur_word|slice:":1"|lower != prev_word|slice:":1"|lower and forloop.counter != 1 %}
</ul>
{% endif %}
{% if cur_word|slice:":1"|lower != prev_word|slice:":1"|lower %}
<ul class="leter-list">
<div class="leter"><font size="5">{{ cur_word|slice:":1"|upper }}</font></div>
{% endif %}
<li>
<a href="/translators{{ obj.catalog }}{{ obj.url }}/">{{ obj.name }}&nbsp;({{ obj.translators_count }})</a>
</li>
{% set prev_word = obj.name %}
{% endfor %}
{% endwith %}
{% endblock %}

@ -3,11 +3,12 @@ from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect 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.shortcuts import get_object_or_404
from django.contrib.contenttypes.models import ContentType 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, TranslatorFilterForm from translator.forms import TranslatorForm, TranslatorDeleteForm, TranslatorFilterForm, TranslatorUserForm, \
TranslatorUserProfileForm
from file.forms import FileModelForm from file.forms import FileModelForm
from file.models import FileModel from file.models import FileModel
from accounts.models import User from accounts.models import User
@ -83,4 +84,68 @@ def translator_change(request, url):
class TranslatorListView(AdminListView): class TranslatorListView(AdminListView):
template_name = 'admin/translator/translator_list.html' template_name = 'admin/translator/translator_list.html'
form_class = TranslatorFilterForm form_class = TranslatorFilterForm
model = Translator model = Translator
from django.views.generic import ListView, FormView
class TranslatorList(ListView):
model = User
template_name = 'admin/translator/translator_list.html'
paginate_by = 20
def get_queryset(self):
return self.model.objects.select_related().filter(translator__isnull=False)
class TranslatorAdminView(FormView):
template_name = 'admin/translator/translator.html'
def translator_edit(request, id):
user = get_object_or_404(User, id=id)
if request.POST:
form_user = TranslatorUserForm(request.POST, instance=user)
form_profile = TranslatorUserProfileForm(request.POST, request.FILES, instance=user.profile)
form = TranslatorForm(request.POST)
form_user_valid = form_user.is_valid()
form_profile_valid = form_profile.is_valid()
form_valid = form.is_valid()
if form_profile_valid and form_user_valid and form_valid:
form_user.save()
form_profile.save()
form.save(user.translator.id)
return HttpResponseRedirect('/admin/translator/all/')
else:
form_user = TranslatorUserForm(instance=user)
form_profile = TranslatorUserProfileForm(instance=user.profile)
translator = user.translator
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
form = TranslatorForm(initial=data)
context = {}
context.update(csrf(request))
context['object'] = user
context['languages'] = settings.LANGUAGES
context['form'] = form
context['form_user'] = form_user
context['form_profile'] = form_profile
return render_to_response('admin/translator/translator.html', context)

@ -1,11 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from admin import TranslatorListView from admin import TranslatorListView, TranslatorList, TranslatorAdminView
urlpatterns = patterns('translator.admin', urlpatterns = patterns('translator.admin',
url(r'^add.*/$', 'translator_add'), url(r'^add.*/$', 'translator_add'),
url(r'^delete/(?P<url>.*)/$', 'translator_delete'), url(r'^delete/(?P<url>.*)/$', 'translator_delete'),
url(r'^change/(?P<url>.*)/$', 'translator_change'), url(r'^change/(?P<url>.*)/$', 'translator_change'),
#url(r'^all/$', 'translator_all'), #url(r'^all/$', 'translator_all'),
url(r'^all/$', TranslatorListView.as_view()), url(r'^all/$', TranslatorList.as_view()),
url(r'^(?P<id>.*)/$', 'translator_edit'),
#url(r'^$', TranslatorAdminView.as_view()),
) )

@ -6,7 +6,7 @@ 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 from accounts.models import User, Profile
#functions #functions
from functions.translate import fill_with_signal from functions.translate import fill_with_signal
from functions.files import check_tmp_files from functions.files import check_tmp_files
@ -23,7 +23,6 @@ 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='Дата рождения')
@ -44,12 +43,12 @@ class TranslatorForm(forms.Form):
# uses enumerate for detect iteration number # uses enumerate for detect iteration number
# first iteration is a default lang so it required fields # first iteration is a default lang so it required fields
required = True if lid == 0 else False required = True if lid == 0 else False
self.fields['education_%s' % code] = forms.CharField(label='Образование', required=required) self.fields['education_%s' % code] = forms.CharField(label='Образование', required=False)
self.fields['specialization_%s' % code] = forms.CharField(label='Специализация', required=required) self.fields['specialization_%s' % code] = forms.CharField(label='Специализация', required=False)
self.fields['languages_%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['native_language_%s' % code] = forms.CharField(label='Родной язык', required=required)
self.fields['prices_%s' % code] = forms.CharField(label='Цены', self.fields['prices_%s' % code] = forms.CharField(label='Цены',
required=required, widget=CKEditorWidget) required=False, widget=CKEditorWidget)
self.fields['discounts_%s' % code] = forms.CharField(label='Скидки', self.fields['discounts_%s' % code] = forms.CharField(label='Скидки',
required=False, widget=CKEditorWidget) required=False, widget=CKEditorWidget)
#meta data #meta data
@ -61,11 +60,8 @@ class TranslatorForm(forms.Form):
widget=forms.TextInput(attrs={'style':'width: 550px'})) widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self, id=None): def save(self, id=None):
#create new conference object or get exists
if not id: translator = Translator.objects.get(id=id)
translator = Translator()
else:
translator = Translator.objects.get(id=id)
data = self.cleaned_data data = self.cleaned_data
@ -75,15 +71,6 @@ class TranslatorForm(forms.Form):
fill_with_signal(Translator, translator, data) fill_with_signal(Translator, translator, data)
#save files
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): def clean_user(self):
user = self.cleaned_data.get('user') user = self.cleaned_data.get('user')
@ -103,4 +90,36 @@ class TranslatorDeleteForm(forms.ModelForm):
class TranslatorFilterForm(AdminFilterForm): class TranslatorFilterForm(AdminFilterForm):
model = Translator model = Translator
class TranslatorUserForm(forms.ModelForm):
class Meta:
model = User
fields = ('first_name', 'last_name')
class TranslatorUserProfileForm(forms.ModelForm):
city = forms.CharField(label=u'Город', required=False,
widget=forms.HiddenInput(attrs={'class': 'select2'}))
country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()], required=False,
widget=forms.Select(attrs={'class': 'select2'}))
def __init__(self, *args, **kwargs):
super(TranslatorUserProfileForm, self).__init__(*args, **kwargs)
if self.instance.city:
self.fields['city'].widget = forms.HiddenInput(attrs={'class': 'select2', 'data-init-text': self.instance.city.name})
def clean_city(self):
try:
return City.objects.get(id=self.cleaned_data['city'])
except City.DoesNotExist:
return None
def clean_country(self):
try:
return Country.objects.get(id=self.cleaned_data['country'])
except City.DoesNotExist:
return None
class Meta:
model = Profile
fields = ('country', 'city', 'avatar')

@ -27,11 +27,11 @@ class Translator(TranslatableModel):
car = models.BooleanField(verbose_name='Личный автомобиль', default=0) car = models.BooleanField(verbose_name='Личный автомобиль', default=0)
translations = TranslatedFields( translations = TranslatedFields(
education = models.CharField(verbose_name='Образование', max_length=255), education = models.CharField(verbose_name='Образование', max_length=255, blank=True),
specialization = models.CharField(verbose_name='Специализация', max_length=255), specialization = models.CharField(verbose_name='Специализация', max_length=255, blank=True),
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='Тарифы', blank=True),
discounts = models.TextField(verbose_name='Скидки', blank=True), discounts = models.TextField(verbose_name='Скидки', blank=True),
#-----meta #-----meta
title = models.CharField(max_length=255, blank=True), title = models.CharField(max_length=255, blank=True),

@ -1,13 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from translator.views import TranslatorList from translator.views import TranslatorList, TranslatorsCity, TranslatorsByCity, TranslatorsByCountry, \
TranslatorsCountry, TranslatorProfile
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^city/(?P<city>.*)/page/(?P<page>\d+)/$', TranslatorList.as_view(), {'meta_id':88}), url(r'^city/(?P<city>.*)/all/page/(?P<page>\d+)/$', TranslatorList.as_view(), {'meta_id':88}),
url(r'^city/(?P<city>.*)/$', TranslatorList.as_view(), {'meta_id':88}), url(r'^city/(?P<city>.*)/all/$', TranslatorList.as_view(), {'meta_id':88}),
url(r'^country/(?P<country>.*)/page/(?P<page>\d+)/$', TranslatorList.as_view(), {'meta_id':87}), url(r'^city/(?P<slug>.*)/$', TranslatorsCity.as_view(), {'meta_id':88}),
url(r'^country/(?P<country>.*)/$', TranslatorList.as_view(), {'meta_id':87}), url(r'^city/$', TranslatorsByCity.as_view(), {'meta_id':88}),
url(r'^country/(?P<country>.*)/all/page/(?P<page>\d+)/$', TranslatorList.as_view(), {'meta_id':87}),
url(r'^country/(?P<country>.*)/all/$', TranslatorList.as_view(), {'meta_id':87}),
url(r'^country/(?P<slug>.*)/$', TranslatorsCountry.as_view(), {'meta_id':87}),
url(r'^country/$', TranslatorsByCountry.as_view(), {'meta_id':87}),
url(r'^page/(?P<page>\d+)/$', TranslatorList.as_view() , {'meta_id':86}), url(r'^page/(?P<page>\d+)/$', TranslatorList.as_view() , {'meta_id':86}),
url(r'^(?P<slug>.*)/$', TranslatorProfile.as_view()),
url(r'^', TranslatorList.as_view() , {'meta_id':86}), url(r'^', TranslatorList.as_view() , {'meta_id':86}),
) )

@ -1,6 +1,10 @@
from django.views.generic import ListView # -*- coding: utf-8 -*-
from django.views.generic import ListView, DetailView
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.views.generic.detail import SingleObjectMixin
from django.utils.translation import ugettext as _
from django.conf import settings from django.conf import settings
from django.http import Http404
from functions.cache_mixin import JitterCacheMixin, CacheMixin from functions.cache_mixin import JitterCacheMixin, CacheMixin
from meta.views import MetadataMixin from meta.views import MetadataMixin
from accounts.models import User from accounts.models import User
@ -28,3 +32,102 @@ class TranslatorList(JitterCacheMixin, MetadataMixin, ListView):
qs = qs.filter(profile__country=country) qs = qs.filter(profile__country=country)
return qs return qs
class TranslatorsAbstract(SingleObjectMixin, ListView):
slug_field = 'url'
def get_object(self):
return get_object_or_404(self.model, url=self.kwargs['slug'])
def get(self, request, *args, **kwargs):
self.object = self.get_object()
return super(TranslatorsAbstract, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(TranslatorsAbstract, self).get_context_data(**kwargs)
context['object'] = self.object
return context
class TranslatorsCity(TranslatorsAbstract):
model = City
template_name = 'client/accounts/translators/translator_city.html'
def get_queryset(self):
city = self.object
self.kwargs['city'] = city
qs = User.objects.select_related('profile', 'country', 'city').filter(translator__isnull=False, profile__city=city)[:6]
return qs
class TranslatorsCountry(TranslatorsAbstract):
model = Country
template_name = 'client/accounts/translators/translator_country.html'
def get_queryset(self):
country = self.object
self.kwargs['country'] = country
qs = User.objects.select_related('profile', 'country', 'city').filter(translator__isnull=False, profile__country=country)[:6]
return qs
class TranslatorsByCity(ListView):
model = City
template_name = 'client/accounts/translators/translators_by.html'
def get_queryset(self):
qs = User.objects.select_related('profile', 'translator').filter(translator__isnull=False, profile__city__isnull=False).values('profile__city').distinct()
ids = [item['profile__city'] for item in list(qs)]
sql = {'translators_count':
"""SELECT COUNT(*)
FROM accounts_user
LEFT JOIN accounts_profile ON accounts_user.id=accounts_profile.user_id
WHERE accounts_user.translator_id is not NULL AND accounts_profile.city_id=city_city.id"""}
qs = set(list(self.model.objects.filter(id__in=ids).extra(select=sql)))
cities = sorted(qs, key=lambda x: x.name)
return cities
def get_context_data(self, **kwargs):
context = super(TranslatorsByCity, self).get_context_data(**kwargs)
context['catalog_name'] = _(u'Города')
return context
class TranslatorsByCountry(ListView):
model = Country
template_name = 'client/accounts/translators/translators_by.html'
def get_queryset(self):
qs = User.objects.select_related('profile', 'translator').filter(translator__isnull=False, profile__country__isnull=False).values('profile__country').distinct()
ids = [item['profile__country'] for item in list(qs)]
sql = {'translators_count':
"""SELECT COUNT(*)
FROM accounts_user
LEFT JOIN accounts_profile ON accounts_user.id=accounts_profile.user_id
WHERE accounts_user.translator_id is not NULL AND accounts_profile.country_id=country_country.id"""}
qs = set(list(self.model.objects.filter(id__in=ids).extra(select=sql)))
cities = sorted(qs, key=lambda x: x.name)
return cities
def get_context_data(self, **kwargs):
context = super(TranslatorsByCountry, self).get_context_data(**kwargs)
context['catalog_name'] = _(u'Страны')
return context
class TranslatorProfile(DetailView):
model = User
template_name = 'client/accounts/translators/translator_profile.html'
slug_field = 'url'
def get_object(self, queryset=None):
url = self.kwargs['slug']
try:
obj = User.objects.get(url=url)
except User.DoesNotExist:
obj = get_object_or_404(User, id=url)
if not obj.translator:
raise Http404
return obj

Loading…
Cancel
Save