diff --git a/accounts/models.py b/accounts/models.py index f083854c..5dee4e48 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -140,6 +140,9 @@ class User(AbstractBaseUser, PermissionsMixin): USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['first_name', 'last_name'] + class Meta: + ordering=['-rating'] + def get_full_name(self): """ Returns the first_name plus the last_name, with a space in between. @@ -196,9 +199,9 @@ class User(AbstractBaseUser, PermissionsMixin): def get_permanent_url(self): if self.url: - return '/%s'%self.url + return '/%s/'%self.url #return self.catalog+self.url+'/' - return '/%d'%self.id + return '/%d/'%self.id #return self.catalog+str(self.id)+'/' def get_expos(self): diff --git a/import_xls/admin.py b/import_xls/admin.py index 2de38d12..eaca4eab 100644 --- a/import_xls/admin.py +++ b/import_xls/admin.py @@ -27,13 +27,17 @@ class ImportView(FormView): """ abstract class """ - template_name = 'import.html' + template_name = 'admin/import templates/import.html' def form_valid(self, form): - form.save_file() + errors = form.save_file() + messages.success(self.request, 'Success') + context = self.get_context_data() + context['import_errors'] = errors + context['form'] = form + return render_to_response(self.template_name, context) - return super(ImportView, self).form_valid(form) class ExportView(FormView): diff --git a/import_xls/excel_settings.py b/import_xls/excel_settings.py index 94cab89f..4a905ada 100644 --- a/import_xls/excel_settings.py +++ b/import_xls/excel_settings.py @@ -280,7 +280,7 @@ place_exp_sett = { u'Тип':{u'field': u'type', u'func': to_type}, u'Краткое описание':{u'field': u'main_title', u'func': unicode}, u'Страна':{u'field': u'country', u'func': to_country}, - u'Город':{u'field': u'city', u'func': to_city, 'extra_values': 'country'}, + u'Город':{u'field': u'city_id', u'func': to_city, 'extra_values': 'country'}, u'Описание':{u'field': u'description', u'func': unicode}, u'Адрес':{u'field': u'adress', u'func': unicode}, u'Тел.':{u'field': u'phone', u'func': to_phone}, diff --git a/import_xls/import_forms.py b/import_xls/import_forms.py index 27f83514..674c30fa 100644 --- a/import_xls/import_forms.py +++ b/import_xls/import_forms.py @@ -106,6 +106,7 @@ def google_address(address): response = {'address' : results[0].get('formatted_address'), 'lat' : results[0]['geometry']['location']['lat'], 'lng' : results[0]['geometry']['location']['lng']} + #return response return json.dumps(response) else: return '' @@ -113,11 +114,11 @@ def google_address(address): from djutils.decorators import async from djutils.queue.decorators import queue_command - +# place class ImportPlaceExpositionForm(ImportForm): model = PlaceExposition settings = place_exp_sett - #@async + def save_file(self): data = self.cleaned_data lang = data['language'] @@ -125,86 +126,113 @@ class ImportPlaceExpositionForm(ImportForm): book = xlrd.open_workbook(file_contents=f.read()) sheet = book.sheet_by_index(0) row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)] + model = self.model labels = [label for label in row_list[0]] + errors = [] for row_number, row in enumerate(row_list): + if row_number == 0: + continue + if row[0] != '': + # in first column id + try: + obj = self.model.objects.language(lang).get(id=int(row[0])) + except ValueError: + obj = self.model() + obj.translate(lang) + + except self.model.DoesNotExist: + obj = self.model(id= int(row[0])) + obj.translate(lang) + else: + # if id blank - its a new event + obj = model() + obj.translate(lang) + # ---------------- # go through all rows in file - if row_number > 0: - # first field is label - if row[0] != '': - # in first column ids + methods = [] + for col_number, cell in enumerate(row): + # go through row cells + # field name current cell + label = labels[col_number] + setting = place_exp_sett.get(label) + + if setting is None: + continue + + if setting.get('method'): + if cell != "": + methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')}) + continue + + field_name = setting['field'] + + func = setting.get('func') + if func is None: + continue + + extra_value = setting.get('extra_values') + if extra_value is not None: + # if setting has extra value then + # it is some field like city, theme, tag + # that has relation and can be created + + # in function we add language(need for relation fields) + # and extra value from object (like for city need country) try: - object = self.model.objects.language(lang).get(id=int(row[0])) - except ValueError: - object = self.model() - object.translate(lang) + extra = getattr(obj, extra_value) + except Exception: + continue + value = func(cell, 'ru', extra) - except self.model.DoesNotExist: - object = self.model(id= int(row[0])) - object.translate(lang) else: - # if id blank - its a new event - object = self.model() - object.translate(lang) - methods = [] - for col_number, cell in enumerate(row): - # go through row cells - # field name current cell - label = labels[col_number] - setting = place_exp_sett.get(label) + value = func(cell) - if setting is None: - continue + try: + setattr(obj, field_name, value) + except ValueError, e: + continue - if setting.get('method'): - if cell != "": - methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')}) + if field_name !='adress': + try: + setattr(obj, field_name, value) + except ValueError: continue - field_name = setting['field'] + else: + #gaddress = google_address(value) + setattr(obj, 'address', google_address(value)) + if not obj.url: + obj.url = translit_with_separator(obj.name) + try: + obj.save() - func = setting.get('func') - if func is not None: - extra_value = setting.get('extra_values') - if extra_value is not None: - # if setting has extra value then - # it is some field like city, theme, tag - # that has relation and can be created + except IntegrityError, e: - # in function we add language(need for relation fields) - # and extra value from object (like for city need country) - value = func(cell, lang, getattr(object, extra_value)) - else: - value = func(cell) - if field_name =='adress': - setattr(object, 'address', google_address(value)) - setattr(object, field_name, value) + error = str(e) + if typical_errors.get(error): + error = typical_errors[error] + if error.startswith('(1062, "Duplicate entry') and error.endswith('for key \'url\'")'): + error = u'Место с таким названием или урлом уже существует' + errors.append([obj.name, error]) + continue - try: - object.save() + for method in methods: + func = method['func'] + if method.get('purpose'): + try: + func(obj, method['value'], method['purpose']) + except Exception, e: + continue + else: + func(obj, method['value']) + + return errors - except IntegrityError: - continue - #url = object.url + translit_with_separator(object.city.name) - #object.url = url - #object.save() - - for method in methods: - func = method['func'] - if method.get('purpose'): - try: - func(object, method['value'], method['purpose']) - except: - continue - else: - try: - func(object, method['value']) - except: - continue class ImportPlaceConferenceForm(ImportForm): @@ -217,6 +245,7 @@ typical_errors = {'(1048, "Column \'city_id\' cannot be null")':u'Неправи '(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата окончания', '(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата начала'} +# event class ImportEventForm(ImportForm): """ extended form for importing one type of event diff --git a/import_xls/utils.py b/import_xls/utils.py index de52aac3..b664fc16 100644 --- a/import_xls/utils.py +++ b/import_xls/utils.py @@ -62,12 +62,12 @@ def to_country(value): return None def to_city(value, lang, country): + try: # get city by name #objects = get_translation_aware_manager(City) # except IndexError if no found city = City.objects.filter(translations__name=value, country=country)[0] - # print(city) return city.id except IndexError: print('---------city error------------') @@ -154,14 +154,19 @@ def get_audience(value): return ', '.join(new_list) return '' - +import types def save_logo(obj, path): if not path: return None file_name = path.split('/')[-1] logo_path = obj.logo.field.upload_to + if isinstance(logo_path, types.FunctionType): + logo_path = logo_path(obj, obj.url) + logo_path = '/'.join(logo_path.split('/')[:-1]) + full_path = settings.MEDIA_ROOT + logo_path + try: alt_name = get_alternative_filename(full_path, file_name) except UnicodeEncodeError: diff --git a/proj/urls.py b/proj/urls.py index 758f565f..8eab31d1 100644 --- a/proj/urls.py +++ b/proj/urls.py @@ -38,6 +38,7 @@ urlpatterns = patterns('', url(r'^page/', include('core.simple_urls')), url(r'^theme/', include('theme.urls')), url(r'^places/', include('place_exposition.urls')), + url(r'^translators/', include('translator.urls')), url(r'^', include('accounts.urls')), url(r'^', include('exposition.urls')), url(r'^', include('settings.conference_old_urls')), # conference redirects from old version diff --git a/settings/old_urls.py b/settings/old_urls.py index 668e0e8e..f64a48d1 100644 --- a/settings/old_urls.py +++ b/settings/old_urls.py @@ -13,9 +13,9 @@ urlpatterns = patterns('', url(r'^serv-zaoch-info.php$', old_redirect, {'redirect_url': '/service/remote/'}), url(r'^serv-visit-info.php$', old_redirect, {'redirect_url': '/service/visit/'}), url(r'^serv-bilet-info.php$', old_redirect, {'redirect_url': '/service/tickets/'}), - url(r'^serv-translator-info.php$', old_redirect, {'redirect_url': '/service/translator/'}), - url(r'^content.php/coID/(?P.*)/perevodchiki-(?P.*)/$', old_redirect, {'redirect_url': '/service/translator/'}), - url(r'^content.php/coID/(?P.*)/perevodchiki-(?P.*)$', old_redirect, {'redirect_url': '/service/translator/'}), + url(r'^serv-translator-info.php$', old_redirect, {'redirect_url': '/translators/'}), + url(r'^content.php/coID/(?P.*)/perevodchiki-(?P.*)/$', old_redirect, {'redirect_url': '/translators/{country_or_city}/'}), + url(r'^content.php/coID/(?P.*)/perevodchik-(?P.*)/$', old_redirect, {'redirect_url': '/translators/{country_or_city}/'}), url(r'^(?P.*)/(?P.*)/buildstand.html$', old_redirect, {'redirect_url': '{event_catalog}{event_url}/service/participation/'}), url(r'^(?P.*)/(?P.*)/bilet.html$', old_redirect, {'redirect_url': '{event_catalog}{event_url}/service/tickets/'}), diff --git a/settings/redirect_views.py b/settings/redirect_views.py index 3fbee5d7..74eccd85 100644 --- a/settings/redirect_views.py +++ b/settings/redirect_views.py @@ -106,11 +106,36 @@ class News_p(object): obj = get_object_or_404(Article, old_id=value) return {key: obj.slug} +class Country_or_City(object): + def get_object_url(self,key, value): + try: + obj = Country.objects.get(old_url=value) + except Country.DoesNotExist: + try: + obj = Country.objects.filter(url=value)[0] + except IndexError: + obj = None + if not obj: + try: + obj = City.objects.get(old_url=value) + except City.DoesNotExist: + obj = get_object_or_404(City, url=value) + except City.MultipleObjectsReturned: + obj = City.objects.filter(old_url=value)[0] + if not obj: + raise Http404 + + if isinstance(obj, Country): + result = 'country/%s'%obj.url + elif isinstance(obj, City): + result = 'city/%s'%obj.url + return {key: result} + old_params = {'city': CityRedirect, 'country': CountryRedirect, 'theme': ThemeRedirect, 'tag': TagRedirect, 'event': EventRedirect, 'company': Company, 'article': ArticleRedirect, 'user': UserRedirect, - 'page': PageRedirect, 'news_p': News_p} + 'page': PageRedirect, 'news_p': News_p, 'country_or_city': Country_or_City} def old_redirect(request, *args, **kwargs): diff --git a/static/seminar_lending/img/reporter3.png b/static/seminar_lending/img/reporter3.png new file mode 100644 index 00000000..7eb30b9c Binary files /dev/null and b/static/seminar_lending/img/reporter3.png differ diff --git a/templates/admin/import templates/import.html b/templates/admin/import templates/import.html index c67a3cf0..a6de3a3f 100644 --- a/templates/admin/import templates/import.html +++ b/templates/admin/import templates/import.html @@ -62,6 +62,26 @@ {% endfor %} {% endif %} + {% if import_errors %} +
+ + + + + + + + + {% for error in import_errors %} + + + + + {% endfor %} + +
СобытиеОшибка
{{ error.0 }}{{ error.1 }}
+
+ {% endif %} + {% endblock %} \ No newline at end of file diff --git a/templates/client/accounts/translators/translators_list.html b/templates/client/accounts/translators/translators_list.html new file mode 100644 index 00000000..4f8828c6 --- /dev/null +++ b/templates/client/accounts/translators/translators_list.html @@ -0,0 +1,21 @@ +{% extends 'base_catalog.html' %} +{% load i18n %} + +{% block bread_scrumbs %} + +{% endblock %} + +{% block page_title %} +
+

{% if meta %}{{ meta.h1 }}{% else %}{% trans 'Переводчики' %}{% endif %}

+
+{% endblock %} + + +{% block content_list %} + {% include 'client/includes/accounts/translators.html' with object_list=object_list %} +{% endblock %} + +{% block paginator %} + {% include 'includes/catalog_paginator.html' with page_obj=page_obj %} +{% endblock %} \ No newline at end of file diff --git a/templates/client/includes/accounts/translators.html b/templates/client/includes/accounts/translators.html new file mode 100644 index 00000000..a72fa8a6 --- /dev/null +++ b/templates/client/includes/accounts/translators.html @@ -0,0 +1,56 @@ +{% load static %} +{% load i18n %} +{% load template_filters %} + + + diff --git a/templates/client/static_client/img/fancybox/blank.gif b/templates/client/static_client/img/fancybox/blank.gif new file mode 100644 index 00000000..35d42e80 Binary files /dev/null and b/templates/client/static_client/img/fancybox/blank.gif differ diff --git a/templates/client/static_client/img/fancybox/fancybox_loading.gif b/templates/client/static_client/img/fancybox/fancybox_loading.gif new file mode 100644 index 00000000..a03a40c0 Binary files /dev/null and b/templates/client/static_client/img/fancybox/fancybox_loading.gif differ diff --git a/templates/client/static_client/img/fancybox/fancybox_loading@2x.gif b/templates/client/static_client/img/fancybox/fancybox_loading@2x.gif new file mode 100644 index 00000000..9205aeb0 Binary files /dev/null and b/templates/client/static_client/img/fancybox/fancybox_loading@2x.gif differ diff --git a/templates/client/static_client/img/fancybox/fancybox_overlay.png b/templates/client/static_client/img/fancybox/fancybox_overlay.png new file mode 100644 index 00000000..a4391396 Binary files /dev/null and b/templates/client/static_client/img/fancybox/fancybox_overlay.png differ diff --git a/templates/client/static_client/img/fancybox/fancybox_sprite.png b/templates/client/static_client/img/fancybox/fancybox_sprite.png new file mode 100644 index 00000000..fd8d5ca5 Binary files /dev/null and b/templates/client/static_client/img/fancybox/fancybox_sprite.png differ diff --git a/templates/client/static_client/img/fancybox/fancybox_sprite@2x.png b/templates/client/static_client/img/fancybox/fancybox_sprite@2x.png new file mode 100644 index 00000000..d0e4779f Binary files /dev/null and b/templates/client/static_client/img/fancybox/fancybox_sprite@2x.png differ diff --git a/translator/urls.py b/translator/urls.py new file mode 100644 index 00000000..ea3a3579 --- /dev/null +++ b/translator/urls.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import patterns, include, url +from translator.views import TranslatorList + + +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'^page/(?P\d+)/$', TranslatorList.as_view() , {'meta_id':86}), + url(r'^', TranslatorList.as_view() , {'meta_id':86}), +) \ No newline at end of file diff --git a/translator/views.py b/translator/views.py new file mode 100644 index 00000000..04f6960e --- /dev/null +++ b/translator/views.py @@ -0,0 +1,30 @@ +from django.views.generic import ListView +from django.shortcuts import get_object_or_404 +from django.conf import settings +from functions.cache_mixin import JitterCacheMixin, CacheMixin +from meta.views import MetadataMixin +from accounts.models import User +from country.models import Country +from city.models import City +from translator.models import Translator + +class TranslatorList(JitterCacheMixin, MetadataMixin, ListView): + model = User + template_name = 'client/accounts/translators/translators_list.html' + paginate_by = settings.CLIENT_PAGINATION + def get_queryset(self): + # all users with translator profile + qs = self.model.objects.select_related('profile', 'country', 'city').filter(translator__isnull=False) + + if self.kwargs.get('city'): + city_slug = self.kwargs.get('city') + city = get_object_or_404(City, url=city_slug) + self.kwargs['city'] = city + qs = qs.filter(profile__city=city) + if self.kwargs.get('country'): + country_slug = self.kwargs.get('country') + country = get_object_or_404(Country, url=country_slug) + self.kwargs['country'] = country + qs = qs.filter(profile__country=country) + + return qs