Merge remote-tracking branch 'origin/develop' into develop

remotes/origin/1203
Poul Handleman 11 years ago
commit 0aa7741216
  1. 5
      accounts/models.py
  2. 2
      banners/models.py
  3. 4
      city/admin.py
  4. 21
      city/forms.py
  5. 1
      city/models.py
  6. 19
      conference/admin.py
  7. 1
      conference/admin_urls.py
  8. 14
      conference/forms.py
  9. 11
      conference/models.py
  10. 89
      core/models.py
  11. 14
      core/simple_views.py
  12. 11
      core/urls.py
  13. 7
      country/admin.py
  14. 8
      country/forms.py
  15. 6
      country/models.py
  16. 137
      exposition/management/commands/test.py
  17. 3
      exposition/models.py
  18. 9
      functions/form_check.py
  19. 19
      import_xls/excel_settings.py
  20. 20
      import_xls/import_forms.py
  21. 1
      import_xls/utils.py
  22. 6
      proj/urls.py
  23. 6
      proj/views.py
  24. 28
      service/admin.py
  25. 5
      service/admin_urls.py
  26. 27
      service/forms.py
  27. 13
      service/models.py
  28. 24
      settings/templatetags/template_filters.py
  29. 50
      settings/views.py
  30. 47
      static/custom_js/find_events.js
  31. 16
      static/custom_js/main.js
  32. BIN
      static/img/expob/cemat15.gif
  33. BIN
      static/img/expob/cemat15_v2.gif
  34. BIN
      static/img/expob/mims15.gif
  35. 3
      templates/admin/base.html
  36. 9
      templates/admin/city/city_add.html
  37. 7
      templates/admin/country/country_add.html
  38. 3
      templates/admin/exposition/exposition.html
  39. 70
      templates/admin/service/control.html
  40. 39
      templates/admin/service/control_list.html
  41. 45
      templates/admin/settings/main_page.html
  42. 133
      templates/admin/translator/translator.html
  43. 7
      templates/admin/translator/translator_all.html
  44. 11
      templates/admin/translator/translator_list.html
  45. 108
      templates/client/accounts/translators/translator_city.html
  46. 137
      templates/client/accounts/translators/translator_country.html
  47. 59
      templates/client/accounts/translators/translator_profile.html
  48. 33
      templates/client/accounts/translators/translators_by.html
  49. 89
      templates/client/blank.html
  50. 87
      templates/client/exposition/exposition_detail.html
  51. 15
      templates/client/includes/banners/under_search.html
  52. 16
      templates/client/includes/conference/conference_object.html
  53. 9
      templates/client/includes/exposition/exposition_object.html
  54. 14
      templates/client/index.html
  55. 8
      templates/client/popups/auto_banner.html
  56. 23
      templates/client/popups/auto_modal.html
  57. 8
      templates/client/popups/cemat_banner1.html
  58. 8
      templates/client/popups/cemat_banner2.html
  59. 24
      templates/client/popups/cemat_modal.html
  60. 4
      templates/client/search/indexes/conference/conference_text.txt
  61. 6
      templates/client/simple_pages/expo_seminar.html
  62. 6
      templates/client/simple_pages/yandex_check.html
  63. BIN
      templates/client/static_client/img/expo_b/cemat15.gif
  64. BIN
      templates/client/static_client/img/expo_b/cemat15_v2.gif
  65. BIN
      templates/client/static_client/img/expo_b/cemat_modal1.png
  66. BIN
      templates/client/static_client/img/expo_b/cemat_modal2.png
  67. BIN
      templates/client/static_client/img/expo_b/mims.png
  68. BIN
      templates/client/static_client/img/expo_b/mims15.gif
  69. BIN
      templates/client/static_client/img/expob/cemat15.gif
  70. BIN
      templates/client/static_client/img/expob/cemat15_v2.gif
  71. BIN
      templates/client/static_client/img/expob/mims15.gif
  72. BIN
      templates/client/static_client/img/fancybox/blank.gif
  73. BIN
      templates/client/static_client/img/fancybox/fancybox_loading.gif
  74. BIN
      templates/client/static_client/img/fancybox/fancybox_loading@2x.gif
  75. BIN
      templates/client/static_client/img/fancybox/fancybox_overlay.png
  76. BIN
      templates/client/static_client/img/fancybox/fancybox_sprite.png
  77. BIN
      templates/client/static_client/img/fancybox/fancybox_sprite@2x.png
  78. BIN
      templates/client/static_client/img/partners/expomap-seminars-01.jpg
  79. BIN
      templates/client/static_client/img/partners/expomap-seminars-02.gif
  80. BIN
      templates/client/static_client/img/partners/expomap-seminars-03.gif
  81. 71
      translator/admin.py
  82. 6
      translator/admin_urls.py
  83. 59
      translator/forms.py
  84. 6
      translator/models.py
  85. 16
      translator/urls.py
  86. 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

@ -5,6 +5,8 @@ from django.db import models
class Redirect(models.Model):
redirect = models.URLField()
count = models.PositiveIntegerField(default=0)
views = models.PositiveIntegerField(default=0)
def __unicode__(self):
return self.redirect

@ -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
@ -161,4 +167,17 @@ class CityDeleteForm(forms.ModelForm):
class CityFilterForm(AdminFilterForm):
model = City
country = forms.ChoiceField(choices=[('', '')]+[(item.id, item.name) for item in Country.objects.all()], required=False,
label='Страна')
model = City
def filter(self):
qs = super(CityFilterForm, self).filter()
data = self.cleaned_data
country_id = data['country']
if country_id:
qs = qs.filter(country__id=country_id)
return qs

@ -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']

@ -295,4 +295,21 @@ class ConferenceListView(AdminListView):
model = Conference
def upload_conference_photo(request, conf_id):
return upload_photo(request, conf_id, Conference)
return upload_photo(request, conf_id, Conference)
from django.utils import translation
from haystack.query import SearchQuerySet
import json
from exposition.admin import get_by_lang
def search_conf(request):
term = request.GET['term'].capitalize()
lang = translation.get_language()
if not term:
qs = SearchQuerySet().models(Conference).order_by('text')[:30]
else:
qs = SearchQuerySet().models(Conference).autocomplete(content_auto=term).order_by('text')[:30]
result = [{'id': item.pk, 'label': get_by_lang(item, 'name', lang)} for item in qs]
return HttpResponse(json.dumps(result), content_type='application/json')

@ -9,6 +9,7 @@ urlpatterns = patterns('conference.admin',
#url(r'^change/(?P<url>.*)/$', 'conference_change'),
url(r'^switch/(?P<url>.*)/(?P<action>.*)$', 'conference_switch'),
url(r'^search/$', 'search_conf'),
url(r'^(?P<url>.*)/$', ConferenceView.as_view()),
url(r'^$', ConferenceView.as_view()),

@ -375,4 +375,16 @@ class TimeTableForm(forms.Form):
class ConferenceFilterForm(AdminFilterForm):
model = Conference
created = forms.DateField(required=False, label='Дата создания')
model = Conference
def filter(self):
qs = super(ConferenceFilterForm, self).filter()
data = self.cleaned_data
created = data['created']
if created:
qs = qs.filter(created__startswith=created)
return qs

@ -5,6 +5,7 @@ from django.db import models
from django.db.models import Q
from django.db.models.signals import post_save, pre_save
from django.contrib.contenttypes import generic
from django.utils import translation
from exposition.manager import ClientManager
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from functions.translate import fill_with_signal
@ -53,6 +54,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
related_name='conference_city')
place = models.ForeignKey('place_conference.PlaceConference', verbose_name='Место проведения',
blank=True, null=True, on_delete=models.PROTECT, related_name='conference_place')
place_alt = models.CharField(blank=True, null=True, max_length=255) # alternative for object place
theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики',
related_name='conference_themes')
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги',
@ -171,6 +173,15 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
def tags(self):
return self.tag.language().all()
def get_index_text(self):
translation.activate('ru')
translations = self.translations.all()
names = ' '.join([tr.name for tr in translations])
titles = ' '.join([tr.main_title for tr in translations])
themes = ' '.join([' '.join(theme.get_all_names()) for theme in self.theme.all()])
tags = ' '.join([' '.join(tag.get_all_names()) for tag in self.tag.all()])
return names + ' ' + titles + ' ' + themes + ' ' + tags
def get_gallery(self):
if self.photogallery:
return self.photogallery

@ -1,3 +1,88 @@
from django.db import models
# -*- coding: utf-8 -*-
from django.contrib.syndication.views import Feed
from django.shortcuts import get_object_or_404
# Create your models here.
from exposition.models import Exposition
from theme.models import Theme
from country.models import Country
from city.models import City
EXPO_ON_PAGE = 10
# nearest expositions at all
class LatestExpositions(Feed):
title = u"Ближайшие выставки на expomap.ru"
link = '/rss/latest/'
description = u'Подписывайтесь на наш RSS-канал'
def items(self):
return Exposition.enable.upcoming()[:EXPO_ON_PAGE]
def item_title(self, item):
return item.name
def item_description(self, item):
return item.main_title
def item_link(self, item):
return '/expo/%s/'%item.url
NUM_ITEMS_ON_PAGE = 20
class CountryFeeds(Feed):
description_template = '/rss/country_feeds/'
def get_object(self, request, slug):
return get_object_or_404(Country, url=slug)
def title(self, obj):
return u"Ближайшие выставки %s:" % obj.inflect
def link(self,obj):
return obj.get_permanent_url()
def item_description(self, obj):
return obj.main_title
def items(self, obj):
return Exposition.enable.upcoming().filter(country=obj)[:NUM_ITEMS_ON_PAGE]
class CityFeeds(Feed):
description_template = '/rss/city_feeds/'
def get_object(self, request, slug):
return get_object_or_404(City, url=slug)
def title(self, obj):
return u"Ближайшие выставки в %s: " % obj.inflect
def link(self,obj):
return obj.get_permanent_url()
def item_description(self, obj):
return obj.main_title
def items(self, obj):
return Exposition.enable.upcoming().filter(city = obj)[:NUM_ITEMS_ON_PAGE]
class ThemeFeeds(Feed):
description_template = '/rss/theme_feeds/'
def get_object(self, request, slug):
return get_object_or_404(Theme, url=slug)
def title(self, obj):
return u"Ближайшие выставки %s: " % obj.inflect
def link(self,obj):
return obj.url
def item_description(self, obj):
return obj.main_title
def items(self, obj):
return Exposition.enable.upcoming().filter(theme = obj)[:NUM_ITEMS_ON_PAGE]

@ -13,26 +13,32 @@ class SeminarLendingView(TemplateView):
def send_to_organiser(request):
mail_send = 'kotzilla@ukr.net'
mail_send = 'expomap@mail.ru'
fname = request.POST.get('name')
lname = request.POST.get('surname')
email = request.POST.get('email', '')
company = request.POST.get('company', '')
office = request.POST.get('office', '')
phone = request.POST.get('phone', '')
title = request.POST.get('type', '')
text = u"""Имя: %s;
Фамилия:%s;
Email: %s;
Телефон: %s;
компния:%s;
должность: %s"""%(fname, lname, email, company, office)
должность: %s"""%(fname, lname, email, phone, company, office)
msg = EmailMessage(title, text, settings.DEFAULT_FROM_EMAIL, [mail_send])
msg.content_subtype = "html"
msg.send()
redirect_to = '/service/thanks/'
message = u"""Мы получили Ваш запрос и очень рады, что Вам интересно участие в семинаре Expomap. Если места еще есть, мы пришлем Вам приглашение на указанную Вами электронную почту.
Увидимся на welcome-coffee """
if title.endswith(u'семинар'):
message = u"""Мы получили Ваш запрос и очень рады, что Вам интересно участие в семинаре Expomap. Если места еще есть, мы пришлем Вам приглашение на указанную Вами электронную почту.
Увидимся на welcome-coffee """
else:
message = u"""Благодарим за интерес к нашему семинару! За несколько дней до мероприятия мы пришлем Вам ссылку для подключения к онлайн-трансляции!"""
return HttpResponse(json.dumps({'success':True, 'redirect_to': redirect_to, 'message': message}), content_type='application/json')

@ -0,0 +1,11 @@
from django.conf.urls import url, patterns
from models import LatestExpositions, CountryFeeds, CityFeeds, ThemeFeeds
urlpatterns = patterns('',
url(r'^latest/$', LatestExpositions()),
url(r'^country/(?P<slug>.*)/$', CountryFeeds()),
url(r'^city/(?P<slug>.*)/$', CityFeeds()),
url(r'^theme/(?P<slug>.*)/$', ThemeFeeds()),
)

@ -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']
@ -145,8 +146,9 @@ class Country(TranslatableModel):
return Webinar.objects.filter(country=self.id).count()
def active_cities(self):
return City.used.active_qs().filter(country=self)
result = list(set(City.used.active_qs().filter(country=self)))
result.sort(key=lambda x:x.name)
return result
lang = translation.get_language()
#return City.objects.select_related('exposition_city')\
# .filter(exposition_city__city__isnull=False, translations__language_code=lang, country=self).distinct().order_by('translations__name')

@ -1,20 +1,141 @@
# -*- coding: utf-8 -*-
import MySQLdb
import os.path
from MySQLdb.cursors import DictCursor
from django.utils.translation import activate
from django.core.management.base import BaseCommand
from meta.models import MetaSetting
from django.conf import settings
from exposition.models import Exposition
from theme.models import Theme
from theme.models import Theme, Tag
class Command(BaseCommand):
def handle(self, *args, **options):
a = MetaSetting.objects.filter(translations__h1__contains='«').count()
qs = MetaSetting.objects.language('ru').all()
for item in qs:
item.title = item.title.replace(u'«', u'').replace(u'»', u'')
item.description = item.title.replace(u'«', u'').replace(u'»', u'')
item.h1 = item.h1.replace(u'«', u'').replace(u'»', u'')
#item.save()
#expos = Exposition.objects.filter(theme__isnull=True, old_url__isnull=False)
db = MySQLdb.connect(host="localhost",
user="expomap",
passwd="7FbLtAGjse",
db="old_db",
charset='utf8',
cursorclass=DictCursor)
cursor = db.cursor()
activate('ru')
#expos = Exposition.enable.upcoming().filter(logo='')
expos = Exposition.objects.filter(tag__isnull=True).order_by('-data_end')
#expo = Exposition.objects.get(old_url='salon-du-livre-2015')
#handle_expo_tag(expo, cursor)
for expo in expos:
handle_expo_tag(expo, cursor)
'''
find_old_id = """
SELECT products.products_id
from products
LEFT JOIN `products_description` ON products.products_id=products_description.products_id
WHERE url='%s'
"""
find_themes = "SELECT categories_id FROM `products_to_categories` WHERE `products_id` =%d"
'''
"""
for expo in expos:
cursor.execute(find_old_id%expo.old_url)
old_ids = [item['products_id'] for item in cursor.fetchall()]
print expo.old_url
for id in old_ids:
cursor.execute(find_themes%id)
themes_ids = [item['categories_id'] for item in cursor.fetchall()]
print themes_ids
#if not themes_ids:
# continue
theme_qs = Theme.objects.filter(id__in=themes_ids)
#expo.theme.add(*theme_qs)
break
print('----------------------')
"""
def handle_expo_tag(expo, cursor):
old_url = expo.old_url
if not old_url:
return None
print(old_url)
find_old = """
SELECT products.products_id, url
from products
LEFT JOIN `products_description` ON products.products_id=products_description.products_id
WHERE url='%s'
"""
cursor.execute(find_old%old_url)
result = cursor.fetchone()
expo_id = result.get('products_id')
if not expo_id:
return
find_tag_id = """
SELECT tag_id
FROM `products_tags`
WHERE `product_id` =%d
"""
cursor.execute(find_tag_id%expo_id)
tags_ids = [str(item['tag_id']) for item in cursor.fetchall()]
if not tags_ids:
return None
find_tag = """
SELECT title
FROM `tags`
WHERE id in(%s)
"""
cursor.execute(find_tag%', '.join(tags_ids))
tag_names = [item['title'] for item in cursor.fetchall()]
if not tag_names:
return None
themes = [item['id'] for item in expo.theme.all().values('id')]
qs = Tag.objects.filter(translations__name__in=tag_names, theme__in=themes)
expo.tag.add(*qs)
def handle_expo(expo, cursor):
"""
fixing logos
"""
if expo.logo:
return
find_old = """
SELECT products.products_id, url, products_img1 as logo
from products
LEFT JOIN `products_description` ON products.products_id=products_description.products_id
WHERE url='%s'
"""
cursor.execute(find_old%expo.old_url)
result = cursor.fetchall()
if not result:
return
logo = result[0]['logo']
if logo:
logo = logo.replace('..', '')
print(logo)
print(os.path.isfile(settings.MEDIA_ROOT[:-1]+logo))
if (os.path.isfile(settings.MEDIA_ROOT[:-1]+logo)):
expo.logo = logo
expo.save()

@ -299,6 +299,9 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
return code
return cur
def theme_ids(self):
return [item['id'] for item in self.theme.all().values('id')]
class Statistic(TranslatableModel):
exposition = models.ForeignKey(Exposition, related_name='statistic')

@ -31,10 +31,15 @@ def translit_with_separator(string, separator='-'):
#make string unicode
string = string.strip()
string = u'%s'%string
string = string.replace(u'\u200e', '')
#make string translit
st = pytils.translit.translify(string)
try:
st = pytils.translit.translify(string)
except ValueError:
# remove exception symbs(hack)
string = string.replace(u'\u200e', '')
string = string.replace(u'\u200b', '')
st = pytils.translit.translify(string)
#replace "bad" symbols for '-'symbol
st = st.replace('.', '')

@ -45,11 +45,6 @@ def get_periodic(value):
return periodic.get(value, '')
return ''
def get_date(value):
if value:
return str(value)
return ''
def get_quality(value, field):
flags = {u'UFI': 'ufi', u'РСВЯ': 'rsva', u'EXPORATING': 'exporating'}
v = flags.get(field)
@ -326,19 +321,27 @@ article_sett = {
u'Создана':{u'field': u'created', u'func': to_datetime}
}
def get_date(value):
try:
return value.strftime('%d.%m.%Y')
except AttributeError:
return ''
event_export_sett = [
{'name': 'id', 'verbose_name': u'ID', 'type': get_int, 'width':1500},
{'name': 'url', 'verbose_name': u'Url', 'type': unicode},
{'name': 'name', 'verbose_name': u'Название', 'type': unicode},
{'name': 'main_title', 'verbose_name': u'Краткое описание', 'type': unicode},
{'name': 'data_begin', 'verbose_name': u'Дата начала:(YYYY-MM-DD)', 'type': unicode},
{'name': 'data_end', 'verbose_name': u'Дата окончания:(YYYY-MM-DD)', 'type': unicode},
{'name': 'data_begin', 'verbose_name': u'Дата начала:(YYYY-MM-DD)', 'type': get_date},
{'name': 'data_end', 'verbose_name': u'Дата окончания:(YYYY-MM-DD)', 'type': get_date},
{'name': 'country', 'verbose_name': u'Страна', 'type': unicode},
{'name': 'city', 'verbose_name': u'Город', 'type': unicode},
{'name': 'place', 'verbose_name': u'Место проведения', 'type': get_place},
{'name': 'theme', 'verbose_name': u'ID Тематики', 'type': get_theme, 'width':8000},
{'name': 'tag', 'verbose_name': u'Теги', 'type': get_tag, 'width':8000},
{'name': 'description', 'verbose_name': u'Описание события', 'type': unicode},
{'name': 'org', 'verbose_name': u'Организатор №1', 'type': get_int},
{'name': 'periodic', 'verbose_name': 'Периодичность', 'type': get_periodic},
{'name': 'audience', 'verbose_name': u'Аудитория', 'type': get_audience},
{'name': 'web_page', 'verbose_name': u'Официальный веб-сайт', 'type': unicode},
@ -500,6 +503,8 @@ event_sett = {
u'Участники':{u'field': u'members', u'func': to_int},
u'Страны':{u'field': u'stat_countries', u'func': unicode},
u'Площадь':{u'field': u'area', u'func': to_int},
u'Мин стоимость':{u'field': u'min_price', u'func': to_int},
u'Макс стоимость':{u'field': u'max_price', u'func': to_int},
u'Min_Raw кв.м.':{u'field': u'min_closed_area', u'func': to_int},
u'Max_Raw кв.м.':{u'field': u'max_closed_area', u'func': to_int},
u'Min_Pack кв.м.':{u'field': u'min_closed_equipped_area', u'func': to_int},

@ -330,13 +330,25 @@ class ImportEventForm(ImportForm):
value = func(obj, cell, setting['label'])
else:
value = func(cell)
try:
setattr(obj, field_name, value)
except ValueError:
continue
if field_name != 'place':
try:
setattr(obj, field_name, value)
except ValueError:
continue
else:
if value is None:
setattr(obj, 'place_alt', cell)
else:
try:
setattr(obj, field_name, value)
except Exception:
setattr(obj, 'place_alt', cell)
if not obj.url:
obj.url = translit_with_separator(obj.name)
obj.is_published = True
try:
obj.save()

@ -30,6 +30,7 @@ def to_date(value):
return None
if isinstance(value, unicode) or isinstance(value, str):
try:
t = time.strptime(value, "%d.%m.%Y")
except ValueError:

@ -11,6 +11,9 @@ class Robot(TemplateView):
template_name = 'robots.txt'
content_type = 'text/plain'
class YandexCheck(TemplateView):
template_name = 'client/simple_pages/yandex_check.html'
from sitemaps import ExpoCard, ExpoCity, ExpoCountry, ExpoTheme, ExpoTag, ConfCard, ConfCity, ConfCountry, ConfTheme,\
ConfTag, NewsSiteMap, BlogsSiteMap, Additional, Important
@ -26,6 +29,7 @@ sitemaps = {
handler404 = 'proj.views.error404'
urlpatterns = patterns('',
url(r'^rss/', include('core.urls')),
#url(r'^__debug__/', include(debug_toolbar.urls)),
url(r'^sitemap-(?P<section>.+)\.xml$', views.sitemap, {'sitemaps': sitemaps}),
url(r'^admin/', include('proj.admin_urls')),
@ -33,6 +37,7 @@ urlpatterns = patterns('',
url(r'^sitemap\.xml$', views.index, {'sitemaps': sitemaps}),
url(r'^sitemap-(?P<section>.+)\.xml$', views.sitemap, {'sitemaps': sitemaps}),
url(r'^robots.txt$', Robot.as_view()),
url(r'^yandex_4c326c16c916403e.html$', YandexCheck.as_view()),
url(r'^$', MainPageView.as_view()),
url(r'^page/', include('core.simple_urls')),
url(r'^theme/', include('theme.urls')),
@ -74,6 +79,7 @@ urlpatterns = patterns('',
# ajax urls
urlpatterns += patterns('',
url(r'^ajax/get_popover/$', 'settings.views.get_popover_info'),
url(r'^registration/reply/$', 'registration.backends.default.views.RegisterReply'),
url(r'^register/', 'registration.backends.default.views.RegisterAjaxView'),
url(r'^register-complete/', 'registration.backends.default.views.complete_registration'),

@ -37,7 +37,9 @@ def error404(request):
expo_themes = Theme.active.expo_themes_with_count()
conf_themes = Theme.active.conference_themes_with_count()
context.update({'expo_themes': expo_themes, 'conf_themes': conf_themes})
return render_to_response('client/404.html', context, context_instance=RequestContext(request))
response = render_to_response('client/404.html', context, context_instance=RequestContext(request))
response.status_code = 404
return response
class MainPageView(JitterCacheMixin,TemplateView):
cache_range = settings.CACHE_RANGE
@ -46,7 +48,7 @@ class MainPageView(JitterCacheMixin,TemplateView):
def get_context_data(self, **kwargs):
context = super(MainPageView, self).get_context_data(**kwargs)
events = Exposition.objects.language().select_related('country', 'city', 'place').filter(main_page=1)
events = Exposition.objects.language().select_related('country', 'city', 'place').filter(main_page__gte=1).order_by('-main_page')
exposition_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.exposition)[:6]
conference_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.conference)[:6]

@ -4,6 +4,7 @@ from django.http import HttpResponseRedirect, HttpResponse
from django.core.context_processors import csrf
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.views.generic import ListView, FormView
#models and forms
from models import Service
from forms import ServiceForm, ServiceDeleteForm
@ -114,3 +115,30 @@ def get_city(request):
return render_to_response('checkbox_option.html', {'options': cities})
else:
return HttpResponse('error')
class ServiceControlList(ListView):
model = Service
template_name = 'admin/service/control_list.html'
paginate_by = 20
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import FormMixin
from django.views.generic import DetailView
from service.forms import ServiceControlForm
class ServiceControl(FormMixin, DetailView):
form_class = ServiceControlForm
template_name = 'admin/service/control.html'
model = Service
def get_form(self, form_class):
obj = self.object
data = obj.get_current_state()
return form_class(data)
def get_context_data(self, **kwargs):
context = super(ServiceControl, self).get_context_data(**kwargs)
context['form'] = self.get_form(self.form_class)
return context

@ -2,8 +2,11 @@
from django.conf.urls import patterns, include, url
from views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \
ParticipationListView, RemoteListView,TicketsListView
from service.admin import ServiceControlList, ServiceControl
urlpatterns = patterns('service.admin',
url(r'^control/list/$', ServiceControlList.as_view()),
url(r'^control/(?P<pk>.*)/$', ServiceControl.as_view()),
url(r'^add.*/$', 'service_add'),
url(r'^delete/(?P<url>.*)/$', 'service_delete'),
url(r'^change/(?P<url>.*)/$', 'service_change'),
@ -17,6 +20,6 @@ urlpatterns = patterns('service.admin',
url(r'order/tickets/$', TicketsListView.as_view()),
#ajax
url(r'^get_city/$', 'get_city'),
#url(r'^get_country/$', 'get_country'),
#url(r'^get_country/$', 'get_country'),
)

@ -121,4 +121,29 @@ class ServiceDeleteForm(forms.ModelForm):
class Meta:
model = Service
fields = ('url',)
fields = ('url',)
from country.models import Area, Country
from exposition.models import Exposition
from conference.models import Conference
class ServiceControlForm(forms.Form):
event = [{'verbose': 'Выставки', 'model': Exposition, 'id': 1},
{'verbose': 'Конференции', 'model': Conference, 'id': 2}]
region = forms.ChoiceField(required=False, label='Регион',
choices=[('', '')]+[(item.id, item.name)
for item in list(Area.objects.all())])
country = forms.MultipleChoiceField(required=False, label='Страны',
choices=[('', '')]+[(item.id, item.name)
for item in list(Country.objects.all())])
country_all = forms.BooleanField()
expositions = forms.CharField(label=u'Выставки', widget=forms.HiddenInput(), required=False)
conferences = forms.CharField(label=u'Конференции', widget=forms.HiddenInput(), required=False)
def __init__(self, *args, **kwargs):
super(ServiceControlForm, self).__init__(*args, **kwargs)
self.fields['event_type'] = forms.MultipleChoiceField(required=False, label = 'Тип события',
widget=forms.CheckboxSelectMultiple(),
choices=[(item['id'], item['verbose'])
for item in self.event])

@ -47,6 +47,19 @@ class Service(TranslatableModel):
def get_price(self):
pr = self.price
def get_current_state(self):
"""
uses for control form
:return:
"""
state = {'event_type':[1, 2],
'region': [],
'country':[],
'country_all': True,
'expositions': [],
'conferences': []}
return state

@ -156,6 +156,14 @@ def timetable_by_day(qs, day):
def random_social(value):
return bool(random.getrandbits(1))
@register.filter
def random3(value):
return random.randrange(0,3)
@register.filter
def random5(value):
return random.randrange(0,5)
@register.filter
def fourth(value):
# return almost in 75% cases True in 25% False
@ -224,7 +232,10 @@ def without_page(value):
@register.filter
def note_by_user(obj, user):
return obj.get_note_by_user(user.id)
if obj:
return obj.get_note_by_user(user.id)
return ''
@register.filter
def isdigit(value):
@ -282,4 +293,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

@ -124,4 +124,52 @@ def company_autosearch(request):
result = sorted(result, key=lambda x:x['cat'])
return HttpResponse(json.dumps(result), content_type='application/json')
else:
raise Http404
raise Http404
#------------------------------------------------------
# POPOVERS
#------------------------------------------------------
import random
from django.shortcuts import render
from django.template.loader import render_to_string
def get_popover(request):
response = {'success': True}
theme_id = request.GET.get('theme_id')
themes = {'2': ['client/popups/auto_modal.html', 'client/popups/auto_banner.html'],
'32': ['client/popups/auto_modal.html', 'client/popups/auto_banner.html', 'client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'],
'54': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'],
'26': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'],
'22': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'],
'15': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'],
'44': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'],
'30': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html']}
popovers = themes.get(theme_id)
if not popovers:
popovers = ['fail']
response['success'] = False
popover = random.choice(popovers)
html = render_to_string(popover)
response['html'] = html
return HttpResponse(json.dumps(response), content_type='application/json')
from banners.models import Redirect
from django.db.models import F
import datetime
def set_cookie(response, key, value, days_expire = 7):
if days_expire is None:
max_age = 365 * 24 * 60 * 60 #one year
else:
max_age = days_expire * 24 * 60 * 60
expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(key, value, max_age=max_age, expires=expires)
def get_popover_info(request):
id = request.GET.get('rdr')
if id:
Redirect.objects.filter(id=id).update(views = F('views') + 1)
response = HttpResponse('success')
set_cookie(response, 'popover_test1', '1')
return response

@ -0,0 +1,47 @@
function make_event_select(id, url, placeholder){
$(id).select2({
placeholder: placeholder,
multiple: true,
ajax: {
url: url,
width: '550px',
dataType: "json",
quietMillis: 200,
multiple: true,
data: function(term, page, theme){
return {term: term,
page: page};
},
results: function (data) {
var results = [];
$.each(data, function(index, item){
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection : function(element, callback) {
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
}
});
}
$(document).ready(function(){
make_event_select('#id_expositions', '/admin/exposition/search/', 'Выставки');
make_event_select('#id_conferences', '/admin/conference/search/', 'Конференции');
});

@ -113,6 +113,12 @@ function postStat(data, textStatus){
$(document).ready(function(){
$('#id_created').datetimepicker({
todayHighlight: true,
format : 'yyyy-mm-dd',
minView:2
});
$('#photo_form').on('submit', function(e){
e.preventDefault();
var url = $(this).attr('action');
@ -230,11 +236,7 @@ $(document).ready(function(){
});
// end on-of events
$('select').select2({
width: 'element',
allowClear: true
});//end select
@ -485,5 +487,11 @@ $(document).ready(function(){
});
});
$('select').select2({
width: 'element',
allowClear: true
});//end select
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

@ -72,6 +72,9 @@
</div>
</body>
{# datetimepicker #}
<link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/>
<script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script>
<script src="{% static 'custom_js/main.js' %}"></script>
{% block bot_scripts %}
{% endblock %}

@ -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>

@ -39,9 +39,6 @@
<script src="{% static 'custom_js/select_tag.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_data_begin').datetimepicker({

@ -0,0 +1,70 @@
{% extends 'base.html' %}
{% load static %}
{% block scripts %}
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" name="form" id="main_form"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>Управление услугой {{ object.name }}</legend>
<div class="box span8" >
<div class="box-header well">
<h2><i class="icon-pencil"></i></h2>
</div>
<div class="box-content">
{# event_type #}
<div class="control-group {% if form.event_type.errors %}error{% endif %}">
<label class="control-label">{{ form.event_type.label }}:</label>
<div class="controls">
{{ form.event_type }}
</div>
</div>
{# region #}
<div class="control-group {% if form.region.errors %}error{% endif %}">
<label class="control-label">{{ form.region.label }}:</label>
<div class="controls">{{ form.region }}
<span class="help-inline">{{ form.region.errors }}</span>
</div>
</div>
{# country #}
<div class="control-group {% if form.country.errors %}error{% endif %}">
<label class="control-label">{{ form.country.label }}:</label>
<div class="controls">{{ form.country }}
<span class="help-inline">{{ form.country.errors }}</span>
</div>
</div>
{# expositions #}
<div class="control-group {% if form.expositions.errors %}error{% endif %}">
<label class="control-label">{{ form.expositions.label }}:</label>
<div class="controls">{{ form.expositions }}
<span class="help-inline">{{ form.expositions.errors }}</span>
</div>
</div>
{# conferences #}
<div class="control-group {% if form.conferences.errors %}error{% endif %}">
<label class="control-label">{{ form.conferences.label }}:</label>
<div class="controls">{{ form.conferences }}
<span class="help-inline">{{ form.conferences.errors }}</span>
</div>
</div>
</div>
</div>
</fieldset>
</form>
{% endblock %}
{% block bot_scripts %}
<script src="{% static 'custom_js/find_events.js' %}"></script>
{% endblock %}

@ -0,0 +1,39 @@
{% extends 'admin_list.html' %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список услуг</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>id</th>
<th>Название</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td>
<a class="btn-small btn-info" href="/admin/service/control/{{ item.id }}/">
Управлять
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
{% endblock %}

@ -89,48 +89,5 @@
{% endblock %}
{% block bot_scripts %}
<script>
$(document).ready(function(){
$('#id_expositions').select2({
placeholder: "Выставки",
multiple: true,
ajax: {
url: "/admin/exposition/search/",
width: '550px',
dataType: "json",
quietMillis: 200,
multiple: true,
data: function(term, page, theme){
return {term: term,
page: page};
},
results: function (data) {
var results = [];
$.each(data, function(index, item){
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection : function(element, callback) {
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
}
});
});
</script>
<script src="{% static 'custom_js/find_events.js' %}"></script>
{% endblock %}

@ -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 %}

@ -1,6 +1,8 @@
{% load static %}
{% load i18n %}
{% load template_filters %}
{% get_current_language as LANGUAGE_CODE %}
{% comment %}
This template include basic anf main styles and js files,
block with header and footer, which same in all pages,
@ -147,7 +149,7 @@ This template include basic anf main styles and js files,
{% include 'client/includes/footer.html' %}
{% endblock %}
</div>
<div class="popups-wrap">
<div class="popups-wrap" id="main-popup-wrap">
{% if not user.is_authenticated %}
{% include 'client/popups/login.html' %}
{% include 'client/popups/register.html' %}
@ -156,7 +158,92 @@ This template include basic anf main styles and js files,
{% endif %}
{% include 'client/popups/callback.html' %}
{% block popup_banner %}
{% if not request.COOKIES.popover_test2 %}
{% if theme_for_filter %}
{% if theme_for_filter.id == 2 %}
{% if False|random_social %}
{% include 'client/popups/auto_modal.html' %}
{% else %}
{% include 'client/popups/auto_banner.html' %}
{% endif %}
{% endif %}
{% if theme_for_filter.id == 54 or theme_for_filter.id == 26 or theme_for_filter.id == 22 or theme_for_filter.id == 15 or theme_for_filter.id == 44 or theme_for_filter.id == 30 %}
{% with r=False|random3 %}
{% if r == 1 %}
{% include 'client/popups/cemat_modal.html' %}
{% else %}
{% if r == 2 %}
{% include 'client/popups/cemat_banner1.html' %}
{% else %}
{% include 'client/popups/cemat_banner2.html' %}
{% endif %}
{% endif %}
{% endwith %}
{% endif %}
{% if theme_for_filter.id == 32 %}
{% with r=False|random5 %}
{% if r == 1 %}
{% include 'client/popups/auto_modal.html' %}
{% endif %}
{% if r == 2 %}
{% include 'client/popups/auto_banner.html' %}
{% endif %}
{% if r == 3 %}
{% include 'client/popups/cemat_modal.html' %}
{% endif %}
{% if r == 4 %}
{% include 'client/popups/cemat_banner1.html' %}
{% endif %}
{% if r == 5 %}
{% include 'client/popups/cemat_banner2.html' %}
{% endif %}
{% endwith %}
{% endif %}
<script>
$(function() {
if ($('#expo-ad-popup').length > 0){
$('#expo-form-popup').on('submit', function(e){
e.preventDefault();
var link = $('#expo-form-popup').attr('action');
window.location = link;
});
setTimeout(function(){
$.fancybox.open(
[{href: '#expo-ad-popup'}],
{}
);
var rdr = $('#expo-ad-popup').attr('data-rdr');
sendData = {'rdr': rdr};
console.log(rdr);
$.ajax({
url: '/ajax/get_popover/',
data: sendData,
type: 'GET',
async: true,
success: function(data){
console.log(data);
}
});
}, 5000);
}
});
</script>
{% endif %}
{% endif %}
{% endblock %}
{# if user doesnt have url- show form #}
{% if not request.user.is_anonymous %}

@ -1,5 +1,6 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% load template_filters %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
@ -25,4 +26,88 @@
{% block paginator %}
{% endblock %}
{% endblock %}
{% block popup%}
{% if not request.COOKIES.popover_test1 %}
{% with theme_ids=object.theme_ids %}
{% if 32 in theme_ids %}
{% with r=False|random5 %}
{% if r == 1 %}
{% include 'client/popups/auto_modal.html' %}
{% endif %}
{% if r == 2 %}
{% include 'client/popups/auto_banner.html' %}
{% endif %}
{% if r == 3 %}
{% include 'client/popups/cemat_modal.html' %}
{% endif %}
{% if r == 4 %}
{% include 'client/popups/cemat_banner1.html' %}
{% endif %}
{% if r == 5 %}
{% include 'client/popups/cemat_banner2.html' %}
{% endif %}
{% endwith %}
{% else %}
{% if 54 in theme_ids or 26 in theme_ids or 22 in theme_ids or 15 in theme_ids or 44 in theme_ids or 30 in theme_ids %}
{% with r=False|random3 %}
{% if r == 1 %}
{% include 'client/popups/cemat_modal.html' %}
{% else %}
{% if r == 2 %}
{% include 'client/popups/cemat_banner1.html' %}
{% else %}
{% include 'client/popups/cemat_banner2.html' %}
{% endif %}
{% endif %}
{% endwith %}
{% else %}
{% if 2 in theme_ids %}
{% if False|random_social %}
{% include 'client/popups/auto_modal.html' %}
{% else %}
{% include 'client/popups/auto_banner.html' %}
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endwith %}
<script>
$(function() {
if ($('#expo-ad-popup').length > 0){
$('#expo-form-popup').on('submit', function(e){
e.preventDefault();
var link = $('#expo-form-popup').attr('action');
window.location = link;
});
setTimeout(function(){
$.fancybox.open(
[{href: '#expo-ad-popup'}],
{}
);
var rdr = $('#expo-ad-popup').attr('data-rdr');
sendData = {'rdr': rdr};
console.log(rdr);
$.ajax({
url: '/ajax/get_popover/',
data: sendData,
type: 'GET',
async: true,
success: function(data){
console.log(data);
}
});
}, 5000);
}
});
</script>
{% endif %}
{% endblock %}

@ -1,9 +1,24 @@
{% load static %}
{% load template_filters %}
<div class="abn">
{% comment %}
{% if False|random3 == 1 %}
<a target="_blank" href="/redirect/redirect/31/"><img src="{% static 'client/img/partners/expomap-seminars-01.jpg' %}" alt="" /></a>
{% else %}
{% if False|random3 == 2 %}
<a target="_blank" href="/redirect/redirect/32/"><img src="{% static 'client/img/partners/expomap-seminars-02.gif' %}" alt="" /></a>
{% else %}
<a target="_blank" href="/redirect/redirect/33/"><img src="{% static 'client/img/partners/expomap-seminars-03.gif' %}" alt="" /></a>
{% endif %}
{% endif %}
{% endcomment %}
{% comment %}
{% if False|fourth %}
<a target="_blank" href="/redirect/redirect/21/"><img src="{% static 'client/img/partners/unnamed.gif' %}" alt="" /></a>
{% else %}
<a target="_blank" href="/redirect/redirect/23/"><img src="{% static 'client/img/partners/unnamed_1.gif' %}" alt="" /></a>
{% endif %}
{% endcomment %}
</div>

@ -152,6 +152,22 @@
{% endfor %}
{% endwith %}
</dd>
{% else %}
{% if event.org %}
<dt>{% trans 'Организатор' %}:</dt>
<dd>
{{ event.org }}
</dd>
{% endif %}
{% endif %}
{% if event.place_alt %}
{% if not event.place %}
<dt>{% trans 'Место проведения' %}:</dt>
<dd>
{{ event.place_alt }}
</dd>
{% endif %}
{% endif %}
{% if event.web_page %}
<dt>{% trans 'Веб-сайт' %}:</dt>

@ -165,6 +165,15 @@
</dd>
{% endif %}
{% endif %}
{% if exposition.place_alt %}
{% if not exposition.place %}
<dt>{% trans 'Место проведения' %}:</dt>
<dd>
{{ exposition.place_alt }}
</dd>
{% endif %}
{% endif %}
{% if exposition.web_page %}
<dt>{% trans 'Веб-сайт' %}:</dt>
<dd>

@ -58,11 +58,17 @@
<div class="abn">
{% block menu_banner %}
{% if False|fourth %}
<a target="_blank" href="/redirect/redirect/21/"><img src="{% static 'client/img/partners/unnamed.gif' %}" alt="" /></a>
{% comment %}
{% if False|random3 == 1 %}
<a target="_blank" href="/redirect/redirect/31/"><img src="{% static 'client/img/partners/expomap-seminars-01.jpg' %}" alt="" /></a>
{% else %}
<a target="_blank" href="/redirect/redirect/23/"><img src="{% static 'client/img/partners/unnamed_1.gif' %}" alt="" /></a>
{% if False|random3 == 2 %}
<a target="_blank" href="/redirect/redirect/32/"><img src="{% static 'client/img/partners/expomap-seminars-02.gif' %}" alt="" /></a>
{% else %}
<a target="_blank" href="/redirect/redirect/33/"><img src="{% static 'client/img/partners/expomap-seminars-03.gif' %}" alt="" /></a>
{% endif %}
{% endif %}
{% endcomment %}
{% endblock %}
</div>
</div>
@ -88,7 +94,7 @@
</header>
<div id="mp-photo-gallery" class="photo-gallery swiper-container">
<iframe width="100%" height="363" src="https://www.youtube.com/embed/O_JU21xVlsQ" frameborder="0" allowfullscreen></iframe>
<iframe width="100%" height="363" src="https://www.youtube.com/embed/4DUrpYvh3V4" frameborder="0" allowfullscreen></iframe>
</div>
{% comment %}
<div id="mp-photo-gallery" class="photo-gallery swiper-container">

@ -0,0 +1,8 @@
<div id="expo-ad-popup" data-rdr="51" class="popup-window" style="width:800px;">
<header class="clearfix">
<div class="pw-title"></div>
</header>
<div class="pw-body clearfix">
<a href="/redirect/redirect/51/"><img src="/static/client/img/expo_b/mims15.gif"/></a>
</div>
</div>

@ -0,0 +1,23 @@
<div id="expo-ad-popup" data-rdr="52" class="popup-window" style="width:500px;">
<header class="clearfix">
<div class="pw-title">Вы планируете посещение MIMS Automechanika Moscow в Экспоцентре?</div>
</header>
<div class="pw-body clearfix">
<form id="expo-form-popup" class="pw-form simple-validate" action="/redirect/redirect/52/">
<div class="pwf-line">
С 24 по 27 августа 2015 г. в Экспоцентре будут представлены лучшие предложения производителей и поставщиков автозапчастей, оборудования и товаров для технического обслуживания автомобилей.
</div>
<div class="pwf-line">
<a href="/redirect/redirect/52/">
<img src="/static/client/img/expo_b/mims.png">
</a>
</div>
<button>Узнать подробнее</button>
</form>
</div>
</div>

@ -0,0 +1,8 @@
<div id="expo-ad-popup" data-rdr="49" class="popup-window" style="width:800px;">
<header class="clearfix">
<div class="pw-title"></div>
</header>
<div class="pw-body clearfix">
<a href="/redirect/redirect/49/"><img src="/static/client/img/expo_b/cemat15.gif"/></a>
</div>
</div>

@ -0,0 +1,8 @@
<div id="expo-ad-popup" data-rdr="50" class="popup-window" style="width:800px;">
<header class="clearfix">
<div class="pw-title"></div>
</header>
<div class="pw-body clearfix">
<a href="/redirect/redirect/50/"><img src="/static/client/img/expo_b/cemat15_v2.gif"/></a>
</div>
</div>

@ -0,0 +1,24 @@
<div id="expo-ad-popup" data-rdr="53" class="popup-window">
<header class="clearfix">
<div class="pw-title">Ваш логист пойдет на выставку CEMAT?</div>
</header>
<div class="pw-body clearfix">
<form id="expo-form-popup" class="pw-form simple-validate" action="/redirect/redirect/53/">
<div class="pwf-line">
С 22 по 25 сентября 2015 г. в Крокус Экспо производители складского оборудования и техники представят свои выгодные предложения.
</div>
<div class="pwf-line">
<a href="/redirect/redirect/53/">
<img src="/static/client/img/expo_b/cemat_modal1.png">
</a>
<a href="/redirect/redirect/53. /" style="margin-left: 10px;">
<img src="/static/client/img/expo_b/cemat_modal2.png">
</a>
</div>
<button >Узнать подробнее</button>
</form>
</div>
</div>

@ -1,3 +1 @@
{% for text in object.get_index_text %}
{{ text }}
{% endfor %}
{{ object.get_index_text }}

@ -248,6 +248,9 @@
<div class="form-group required">
<input type="text" class="form-control" id="surname" name="surname" placeholder="Фамилия:">
</div>
<div class="form-group required">
<input type="text" class="form-control" id="phone" name="phone" placeholder="Номер телефона:">
</div>
<div class="form-group required">
<input type="text" class="form-control" id="email" name="email" placeholder="Email:">
</div>
@ -286,6 +289,9 @@
<div class="form-group required">
<input type="text" class="form-control" id="surname" name="surname" placeholder="Фамилия:">
</div>
<div class="form-group required">
<input type="text" class="form-control" id="phone" name="phone" placeholder="Номер телефона:">
</div>
<div class="form-group required">
<input type="text" class="form-control" id="email" name="email" placeholder="Email:">
</div>

@ -0,0 +1,6 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>Verification: 4c326c16c916403e</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1003 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

@ -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