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 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):
"""
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')
if request.POST:
form = CityForm(request.POST)
form = CityForm(request.POST, request.FILES)
if form.is_valid():
form.save(city_id)
return HttpResponseRedirect('/admin/city/all')
else:
#fill form with data from database
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:
data['country'] = c.country.id

@ -34,6 +34,7 @@ class CityForm(forms.Form):
widget=forms.TextInput(attrs={'placeholder':'Код города'}))
code_IATA = forms.ModelChoiceField(label='Код IATA', queryset=Iata.objects.all(), empty_label=None, required=False)
inflect = forms.CharField(label='Inflect', required=False)
logo = forms.ImageField(label='Logo', required=False)
#field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput())
#
@ -91,6 +92,11 @@ class CityForm(forms.Form):
city.population = data.get('population')
city.inflect = data['inflect']
if data.get('logo'):
city.logo = data['logo']
else:
city.logo = ''
if data.get('code_IATA'):
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
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
logo = models.ImageField(verbose_name='Logo', upload_to='city/logo/', blank=True, max_length=255)
class Meta:
ordering = ['translations__name']

@ -63,7 +63,7 @@ def country_change(request, url):
if request.POST:
#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():
form.save(country_id)
@ -71,8 +71,9 @@ def country_change(request, url):
else:
#fill form with data from database
data = {'population' : c.population, 'teritory' : c.teritory, #data from NOT translated fields
'timezone' : c.timezone, 'country_id' : country_id,
'phone_code' : c.phone_code, 'time_delivery' : c.time_delivery}
'timezone' : c.timezone, 'country_id' : country_id,
'phone_code' : c.phone_code, 'time_delivery' : c.time_delivery,
'logo': c.logo}
if c.capital:
data['capital'] = c.capital.id

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

@ -102,6 +102,7 @@ class Country(TranslatableModel):
descriptions = 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:
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 %}
{# 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>
<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>
<div class="controls">{{ form.country}}</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 #}
{% with field='region' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}

@ -41,6 +41,13 @@
{% with field='description' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% 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 #}
<div class="control-group {% if form.capital.errors %}error{% endif %}">
<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>
<td>{{ item.id }}</td>
{% for u in item.user.all %}
<td>{{ u }}</td>
<td>{{ u.country }}</td>
{% endfor %}
<td>{{ item.get_full_name }}</td>
<td>{{ item.profile.country.name }}</td>
<td class="center sorting_1">
<a class="btn btn-info" href="/admin/translator/change/{{ item.id }}">

@ -36,19 +36,14 @@
<tr>
<td>{{ item.id }}</td>
{% for u in item.user.all %}
<td>{{ u }}</td>
<td>{{ u.country }}</td>
{% endfor %}
<td>{{ item.get_full_name }}</td>
<td>{{ item.profile.country.name }}</td>
<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> Изменить
</a>
<a class="btn btn-danger delete" href="/admin/translator/delete/{{ item.id }}/">
<i class="icon-trash icon-white"></i> Удалить
</a>
</td>
</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.core.context_processors import csrf
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
#models and forms
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.models import FileModel
from accounts.models import User
@ -83,4 +84,68 @@ def translator_change(request, url):
class TranslatorListView(AdminListView):
template_name = 'admin/translator/translator_list.html'
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 -*-
from django.conf.urls import patterns, url
from admin import TranslatorListView
from admin import TranslatorListView, TranslatorList, TranslatorAdminView
urlpatterns = patterns('translator.admin',
url(r'^add.*/$', 'translator_add'),
url(r'^delete/(?P<url>.*)/$', 'translator_delete'),
url(r'^change/(?P<url>.*)/$', 'translator_change'),
#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 city.models import City
#
from accounts.models import User
from accounts.models import User, Profile
#functions
from functions.translate import fill_with_signal
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
"""
user = forms.ModelChoiceField(label='Пользователь', queryset=User.objects.all(), empty_label=None)
car = forms.BooleanField(label='Личный автомобиль', required=False)
birth = forms.DateField(label='Дата рождения')
@ -44,12 +43,12 @@ class TranslatorForm(forms.Form):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['education_%s' % code] = forms.CharField(label='Образование', required=required)
self.fields['specialization_%s' % code] = forms.CharField(label='Специализация', required=required)
self.fields['education_%s' % code] = forms.CharField(label='Образование', required=False)
self.fields['specialization_%s' % code] = forms.CharField(label='Специализация', required=False)
self.fields['languages_%s' % code] = forms.CharField(label='Языки', required=required)
self.fields['native_language_%s' % code] = forms.CharField(label='Родной язык', required=required)
self.fields['prices_%s' % code] = forms.CharField(label='Цены',
required=required, widget=CKEditorWidget)
required=False, widget=CKEditorWidget)
self.fields['discounts_%s' % code] = forms.CharField(label='Скидки',
required=False, widget=CKEditorWidget)
#meta data
@ -61,11 +60,8 @@ class TranslatorForm(forms.Form):
widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self, id=None):
#create new conference object or get exists
if not id:
translator = Translator()
else:
translator = Translator.objects.get(id=id)
translator = Translator.objects.get(id=id)
data = self.cleaned_data
@ -75,15 +71,6 @@ class TranslatorForm(forms.Form):
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):
user = self.cleaned_data.get('user')
@ -103,4 +90,36 @@ class TranslatorDeleteForm(forms.ModelForm):
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)
translations = TranslatedFields(
education = models.CharField(verbose_name='Образование', max_length=255),
specialization = 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, blank=True),
languages = 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),
#-----meta
title = models.CharField(max_length=255, blank=True),

@ -1,13 +1,19 @@
# -*- coding: utf-8 -*-
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('',
url(r'^city/(?P<city>.*)/page/(?P<page>\d+)/$', TranslatorList.as_view(), {'meta_id':88}),
url(r'^city/(?P<city>.*)/$', TranslatorList.as_view(), {'meta_id':88}),
url(r'^country/(?P<country>.*)/page/(?P<page>\d+)/$', TranslatorList.as_view(), {'meta_id':87}),
url(r'^country/(?P<country>.*)/$', TranslatorList.as_view(), {'meta_id':87}),
url(r'^city/(?P<city>.*)/all/page/(?P<page>\d+)/$', TranslatorList.as_view(), {'meta_id':88}),
url(r'^city/(?P<city>.*)/all/$', TranslatorList.as_view(), {'meta_id':88}),
url(r'^city/(?P<slug>.*)/$', TranslatorsCity.as_view(), {'meta_id':88}),
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'^(?P<slug>.*)/$', TranslatorProfile.as_view()),
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.views.generic.detail import SingleObjectMixin
from django.utils.translation import ugettext as _
from django.conf import settings
from django.http import Http404
from functions.cache_mixin import JitterCacheMixin, CacheMixin
from meta.views import MetadataMixin
from accounts.models import User
@ -28,3 +32,102 @@ class TranslatorList(JitterCacheMixin, MetadataMixin, ListView):
qs = qs.filter(profile__country=country)
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