From 91c43d8f3102d523ca73a53ab55567b3cc2a680d Mon Sep 17 00:00:00 2001 From: Kotiuk Nazarii Date: Wed, 8 Jul 2015 17:32:58 +0300 Subject: [PATCH] Translators --- accounts/models.py | 5 + city/admin.py | 4 +- city/forms.py | 6 + city/models.py | 1 + country/admin.py | 7 +- country/forms.py | 8 + country/models.py | 1 + settings/templatetags/template_filters.py | 11 +- templates/admin/city/city_add.html | 9 +- templates/admin/country/country_add.html | 7 + templates/admin/translator/translator.html | 133 +++++++++++++++++ .../admin/translator/translator_all.html | 7 +- .../admin/translator/translator_list.html | 11 +- .../accounts/translators/translator_city.html | 108 ++++++++++++++ .../translators/translator_country.html | 137 ++++++++++++++++++ .../translators/translator_profile.html | 59 ++++++++ .../accounts/translators/translators_by.html | 33 +++++ translator/admin.py | 71 ++++++++- translator/admin_urls.py | 6 +- translator/forms.py | 59 +++++--- translator/models.py | 6 +- translator/urls.py | 16 +- translator/views.py | 105 +++++++++++++- 23 files changed, 757 insertions(+), 53 deletions(-) create mode 100644 templates/admin/translator/translator.html create mode 100644 templates/client/accounts/translators/translator_city.html create mode 100644 templates/client/accounts/translators/translator_country.html create mode 100644 templates/client/accounts/translators/translator_profile.html create mode 100644 templates/client/accounts/translators/translators_by.html diff --git a/accounts/models.py b/accounts/models.py index 5dee4e48..43125dcc 100644 --- a/accounts/models.py +++ b/accounts/models.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 diff --git a/city/admin.py b/city/admin.py index adf383e3..b2642e36 100644 --- a/city/admin.py +++ b/city/admin.py @@ -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 diff --git a/city/forms.py b/city/forms.py index 98cc5ce5..258b9877 100644 --- a/city/forms.py +++ b/city/forms.py @@ -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 diff --git a/city/models.py b/city/models.py index 73d3cbf5..e02547f6 100644 --- a/city/models.py +++ b/city/models.py @@ -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'] diff --git a/country/admin.py b/country/admin.py index ede3a8cf..1ad06c86 100644 --- a/country/admin.py +++ b/country/admin.py @@ -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 diff --git a/country/forms.py b/country/forms.py index cdc0be8d..67193e43 100644 --- a/country/forms.py +++ b/country/forms.py @@ -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']) diff --git a/country/models.py b/country/models.py index 548d54c7..7508cbf1 100644 --- a/country/models.py +++ b/country/models.py @@ -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'] diff --git a/settings/templatetags/template_filters.py b/settings/templatetags/template_filters.py index 10c11444..ec5ede18 100644 --- a/settings/templatetags/template_filters.py +++ b/settings/templatetags/template_filters.py @@ -282,4 +282,13 @@ def generate_countries_list(value): - return ul1+ul2+ul3 \ No newline at end of file + 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 diff --git a/templates/admin/city/city_add.html b/templates/admin/city/city_add.html index ff7aaec1..da12c2cc 100644 --- a/templates/admin/city/city_add.html +++ b/templates/admin/city/city_add.html @@ -17,7 +17,7 @@ {% block body %} {# Uses multilang.html template for translated fields #} -
{% csrf_token %} + {% csrf_token %}
{% if obj_id %} Изменить {% else %} Добавить {% endif %}город @@ -47,6 +47,13 @@
{{ form.country}}
+ +
+ +
{{ form.logo }} + {{ form.logo.errors }} +
+
{# region #} {% with field='region' form=form languages=languages %} {% include 'admin/forms/multilang.html' %} diff --git a/templates/admin/country/country_add.html b/templates/admin/country/country_add.html index 0e48444a..6b06e613 100644 --- a/templates/admin/country/country_add.html +++ b/templates/admin/country/country_add.html @@ -41,6 +41,13 @@ {% with field='description' form=form languages=languages %} {% include 'admin/forms/multilang.html' %} {% endwith %} + +
+ +
{{ form.logo }} + {{ form.logo.errors }} +
+
{# capital #}
diff --git a/templates/admin/translator/translator.html b/templates/admin/translator/translator.html new file mode 100644 index 00000000..261f67ad --- /dev/null +++ b/templates/admin/translator/translator.html @@ -0,0 +1,133 @@ +{% extends 'base.html' %} +{% load static %} +{# Displays translator form and file form in modal window #} + + +{% block scripts %} + + + {# selects #} + + + + {# ajax #} + + {# datetimepicker #} + + + + + +{% endblock %} + +{% block body %} + {% csrf_token %} +
+ Изменить переводчика(на сайте) + +
+
+

Основная информация

+
+
+ {# name #} +
+ +
{{ form_user.first_name }} + {{ form_user.first_name.errors }} +
+
+ + {# surname #} +
+ +
{{ form_user.last_name }} + {{ form_user.last_name.errors }} +
+
+ + {# country #} +
+ +
{{ form_profile.country }} + {{ form_profile.country.errors }} +
+
+ + {# city #} +
+ +
{{ form_profile.city }} + {{ form_profile.city.errors }} +
+
+ + {# logo #} +
+ +
{{ form_profile.avatar }} + {{ form_profile.avatar.errors }} +
+
+ + +
+ +
+ +
+
+

Информация по переводчику

+
+
+ + {# car #} +
+ +
{{ form.car }} + {{ form.car.errors }} +
+
+ + {# birth #} +
+ +
{{ form.birth }} + {{ form.birth.errors }} +
+
+ + {# gender #} +
+ +
{{ form.gender }} + {{ form.gender.errors }} +
+
+ {# 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%} + + +
+
+
+ + +
+
+ +{% endblock %} \ No newline at end of file diff --git a/templates/admin/translator/translator_all.html b/templates/admin/translator/translator_all.html index 180e0289..7b6abfb5 100644 --- a/templates/admin/translator/translator_all.html +++ b/templates/admin/translator/translator_all.html @@ -21,10 +21,9 @@ {{ item.id }} - {% for u in item.user.all %} - {{ u }} - {{ u.country }} - {% endfor %} + {{ item.get_full_name }} + {{ item.profile.country.name }} + diff --git a/templates/admin/translator/translator_list.html b/templates/admin/translator/translator_list.html index d64ec743..54e2a8e5 100644 --- a/templates/admin/translator/translator_list.html +++ b/templates/admin/translator/translator_list.html @@ -36,19 +36,14 @@ {{ item.id }} - {% for u in item.user.all %} - {{ u }} - {{ u.country }} - {% endfor %} + {{ item.get_full_name }} + {{ item.profile.country.name }} - + Изменить - - Удалить - diff --git a/templates/client/accounts/translators/translator_city.html b/templates/client/accounts/translators/translator_city.html new file mode 100644 index 00000000..7084eacd --- /dev/null +++ b/templates/client/accounts/translators/translator_city.html @@ -0,0 +1,108 @@ +{% extends 'base_catalog.html' %} +{% load i18n %} + + +{% block bread_scrumbs %} + +{% endblock %} + +{% block page_title %} + +{% endblock %} + +{% block content_list %} +
+
+ + +
+
+
{{ object.name }}
+
+ +
+

Компания Serve Businesses Worldwide предлагает Вам возможность заказать услуги русскоговорящих переводчиков со знанием английского языка практически непосредственно в Великобритании.

+
+ +
+
+ +
+ +
+
+

Коротко о наших преимуществах:

+
    +
  • Эффективная цена
  • +
  • Опыт и профессионализм специалистов
  • +
  • Знание разных менталитетов и психологических аспектов проведения переговоров с зарубежными бизнесменами
  • +
  • Ориентированность в мировых выставочных комплексах
  • +
  • Гарантии, отчетность по договору, прозрачные безналичные расчеты в России
  • +
+ +
+
+ +
+ +
+
+
+
+
от 80 € / день
+ +
+
+
+
+
+ +
+ + + + +
+{% endblock %} + diff --git a/templates/client/accounts/translators/translator_country.html b/templates/client/accounts/translators/translator_country.html new file mode 100644 index 00000000..121e297b --- /dev/null +++ b/templates/client/accounts/translators/translator_country.html @@ -0,0 +1,137 @@ +{% extends 'base_catalog.html' %} +{% load i18n %} + + +{% block bread_scrumbs %} + +{% endblock %} + +{% block page_title %} + +{% endblock %} + +{% block content_list %} +
+
+ + +
+
+
Переводчики {{ object.inflect }}
+
+ +
+

Компания Serve Businesses Worldwide предлагает Вам возможность заказать услуги русскоговорящих переводчиков со знанием английского языка практически непосредственно в Великобритании.

+

Ниже приведен список наиболее часто востребованных территориальных направлений для оказания услуг перевода в Великобритании. Приведенный перечень не является исчерпывающим, поэтому, если Вы не нашли нужный Вам город, обратитесь к нашим консультантам.

+
+
+ {% if object.latitude and object.longitude %} + + {% endif %} + +
+
+ +
+ + {% if object.big_cities.exists %} + {% with cities=object.big_cities.all %} +
+

Крупные города:

+ + + + + + +
+ +  
+
+ +
+ {% endwith %} + {% endif %} + +
+
+

Коротко о наших преимуществах:

+
    +
  • Эффективная цена
  • +
  • Опыт и профессионализм специалистов
  • +
  • Знание разных менталитетов и психологических аспектов проведения переговоров с зарубежными бизнесменами
  • +
  • Ориентированность в мировых выставочных комплексах
  • +
  • Гарантии, отчетность по договору, прозрачные безналичные расчеты в России
  • +
+ +
+
+ +
+ +
+
+
+
+
от 80 € / день
+ +
+
+
+
+
+ + +
+ + + +
+{% endblock %} \ No newline at end of file diff --git a/templates/client/accounts/translators/translator_profile.html b/templates/client/accounts/translators/translator_profile.html new file mode 100644 index 00000000..0c714b5f --- /dev/null +++ b/templates/client/accounts/translators/translator_profile.html @@ -0,0 +1,59 @@ +{% extends 'base_catalog.html' %} +{% load static %} +{% load i18n %} +{% load thumbnail %} +{% load template_filters %} + + +{% block bread_scrumbs %} + +{% endblock %} + +{% block content_list %} +
+
+
+ {% if object.profile.avatar %} + {% thumbnail object.profile.avatar "100x100" format="PNG" as im %} + + {% endthumbnail %} + {% else %} + + {% endif %} +
+
+

{{ object.get_full_name }}

+

{{ object.translator.languages }}

+ +

{% ifequal object.translator.gender 'female' %}{% endifequal %}{{ object.translator.birth|how_many_years }} лет{% if object.translator.car %}Есть личный автомобиль

{% endif %} +
+
+ {% if object.profile.country %} +

{{ object.profile.country.name }} + {% if object.profile.city %}, {{ object.profile.city.name }}{% endif %}

+ {% endif %} + {% if object.translator.native_language %} +

{% trans 'Родной язык' %} — {{ object.translator.native_language }}

+ {% endif %} +
+
+ +
+ {% if object.translator.education %} +

{% trans 'Образование' %}:

+ {{ object.translator.education }} +
+ {% endif %} +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/client/accounts/translators/translators_by.html b/templates/client/accounts/translators/translators_by.html new file mode 100644 index 00000000..e3586b48 --- /dev/null +++ b/templates/client/accounts/translators/translators_by.html @@ -0,0 +1,33 @@ +{% extends 'base_catalog.html' %} +{% load i18n %} +{% load template_filters %} + +{% block bread_scrumbs %} + +{% 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 %} + + {% endif %} + {% if cur_word|slice:":1"|lower != prev_word|slice:":1"|lower %} +
    +
    {{ cur_word|slice:":1"|upper }}
    + {% endif %} +
  • + {{ obj.name }} ({{ obj.translators_count }}) +
  • + {% set prev_word = obj.name %} + {% endfor %} + {% endwith %} +{% endblock %} \ No newline at end of file diff --git a/translator/admin.py b/translator/admin.py index a5abb15e..f80c6e8a 100644 --- a/translator/admin.py +++ b/translator/admin.py @@ -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 \ No newline at end of file + 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) diff --git a/translator/admin_urls.py b/translator/admin_urls.py index a5652afb..dd31d598 100644 --- a/translator/admin_urls.py +++ b/translator/admin_urls.py @@ -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.*)/$', 'translator_delete'), url(r'^change/(?P.*)/$', 'translator_change'), #url(r'^all/$', 'translator_all'), - url(r'^all/$', TranslatorListView.as_view()), + url(r'^all/$', TranslatorList.as_view()), + url(r'^(?P.*)/$', 'translator_edit'), + #url(r'^$', TranslatorAdminView.as_view()), ) diff --git a/translator/forms.py b/translator/forms.py index 205d50ab..7528e109 100644 --- a/translator/forms.py +++ b/translator/forms.py @@ -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 \ No newline at end of file + 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') \ No newline at end of file diff --git a/translator/models.py b/translator/models.py index 6a8af0d0..ac541a72 100644 --- a/translator/models.py +++ b/translator/models.py @@ -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), diff --git a/translator/urls.py b/translator/urls.py index ea3a3579..3339ff22 100644 --- a/translator/urls.py +++ b/translator/urls.py @@ -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.*)/page/(?P\d+)/$', TranslatorList.as_view(), {'meta_id':88}), - url(r'^city/(?P.*)/$', TranslatorList.as_view(), {'meta_id':88}), - url(r'^country/(?P.*)/page/(?P\d+)/$', TranslatorList.as_view(), {'meta_id':87}), - url(r'^country/(?P.*)/$', TranslatorList.as_view(), {'meta_id':87}), + url(r'^city/(?P.*)/all/page/(?P\d+)/$', TranslatorList.as_view(), {'meta_id':88}), + url(r'^city/(?P.*)/all/$', TranslatorList.as_view(), {'meta_id':88}), + url(r'^city/(?P.*)/$', TranslatorsCity.as_view(), {'meta_id':88}), + url(r'^city/$', TranslatorsByCity.as_view(), {'meta_id':88}), + url(r'^country/(?P.*)/all/page/(?P\d+)/$', TranslatorList.as_view(), {'meta_id':87}), + url(r'^country/(?P.*)/all/$', TranslatorList.as_view(), {'meta_id':87}), + url(r'^country/(?P.*)/$', TranslatorsCountry.as_view(), {'meta_id':87}), + url(r'^country/$', TranslatorsByCountry.as_view(), {'meta_id':87}), url(r'^page/(?P\d+)/$', TranslatorList.as_view() , {'meta_id':86}), + url(r'^(?P.*)/$', TranslatorProfile.as_view()), url(r'^', TranslatorList.as_view() , {'meta_id':86}), ) \ No newline at end of file diff --git a/translator/views.py b/translator/views.py index 04f6960e..a6884462 100644 --- a/translator/views.py +++ b/translator/views.py @@ -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 +