Рефакторинг + Доработка поиска товарных знаков

master
Alexander Kondratyev 9 years ago
parent 8e9fbcc0b6
commit ef6b5ba86f
  1. 36
      app/settings.py
  2. 13
      trademark/cms_plugins.py
  3. 78
      trademark/migrations/0001_initial.py
  4. 1
      trademark/models.py
  5. 136
      trademark/static/trademark/js/app.js
  6. 51
      trademark/static/trademark/js/modal.js
  7. 565
      trademark/static/trademark/js/nice.js
  8. 71
      trademark/static/trademark/js/nice_ctrl.js
  9. 85
      trademark/static/trademark/js/result.js
  10. 33
      trademark/static/trademark/less/detail.less
  11. 88
      trademark/static/trademark/less/loading.less
  12. 4
      trademark/static/trademark/less/main.less
  13. 5
      trademark/static/trademark/less/modal.less
  14. 127
      trademark/static/trademark/less/result.less
  15. 15
      trademark/templates/trademark/base.html
  16. 22
      trademark/templates/trademark/breadcrumb.html
  17. 26
      trademark/templates/trademark/form.html
  18. 2
      trademark/templates/trademark/index.html
  19. 88
      trademark/templates/trademark/modal.html
  20. 2
      trademark/templates/trademark/nice_block_busy.html
  21. 2
      trademark/templates/trademark/registration.html
  22. 51
      trademark/templates/trademark/search_detail.html
  23. 3
      trademark/templates/trademark/search_list_item.html
  24. 3
      trademark/templates/trademark/trademark_detail.html
  25. 16
      zsite/static/js/snippets.js
  26. 194
      zsite/static/js/trademarks.js
  27. 1
      zsite/static/less/main.less
  28. 3
      zsite/templates/aldryn_people/includes/people_item.html
  29. 2
      zsite/templates/base.html
  30. 6
      zsite/templates/form_template/consultation.html
  31. 66
      zsite/templates/form_template/nice.html
  32. 6
      zsite/templates/form_template/order_modal.html
  33. 65
      zsite/templates/form_template/product_class.html
  34. 1
      zsite/templates/page.html

@ -1,24 +1,10 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
gettext = lambda s: s
DATA_DIR = os.path.dirname(os.path.dirname(__file__))
"""
Django settings for zsite project.
For more information on this file, see
https://docs.djangoproject.com/en/1.7/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.7/ref/settings/
"""
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
DATA_DIR = BASE_DIR
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/
@ -95,7 +81,9 @@ STATIC_ROOT = os.path.join(DATA_DIR, 'static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'zsite', 'static'),
os.path.join(BASE_DIR, 'trademark', 'static'),
)
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
@ -109,11 +97,8 @@ PIPELINE_COMPILERS = (
PIPELINE_JS = {
'main': {
'source_filenames': (
'js/app.js',
'js/forms.js',
'js/snippets.js',
'js/nice.js',
'js/trademarks.js',
'js/*.js',
'trademark/js/*.js'
),
'output_filename': 'js/zuykov.js',
},
@ -136,6 +121,7 @@ PIPELINE_CSS = {
'main': {
'source_filenames': (
'less/main.less',
'trademark/less/main.less'
),
'output_filename': 'css/main.css',
}
@ -153,7 +139,7 @@ TEMPLATE_LOADERS = (
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# 'country_segment.middleware.resolve_country_code_middleware.ResolveCountryCodeMiddleware',
#'country_segment.middleware.resolve_country_code_middleware.ResolveCountryCodeMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
@ -165,9 +151,11 @@ MIDDLEWARE_CLASSES = (
'cms.middleware.page.CurrentPageMiddleware',
'cms.middleware.toolbar.ToolbarMiddleware',
'cms.middleware.language.LanguageCookieMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'country_segment.middleware.ResolveCountryCodeMiddleware',
'promo.middleware.cookies.PageHistoryMiddleware',
'django.middleware.gzip.GZipMiddleware',
'pipeline.middleware.MinifyHTMLMiddleware',
)
TEMPLATE_CONTEXT_PROCESSORS = (
@ -219,6 +207,7 @@ CACHES = {
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'zsite', 'templates'),
os.path.join(BASE_DIR, 'trademark', 'templates'),
)
INSTALLED_APPS = (
@ -250,6 +239,7 @@ INSTALLED_APPS = (
'country_segment',
'reversion',
'pipeline',
'zsite',
# People
@ -260,10 +250,8 @@ INSTALLED_APPS = (
'parler',
'sortedm2m',
# 'easy_thumbnails',
'cmsplugin_filer_image',
'cmsplugin_tabs',
# 'parler',
'taggit',
'taggit_autosuggest',
'django_select2',

@ -4,15 +4,26 @@ from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from django.utils.translation import ugettext as _
# from .models import Promo
from django.db.models import Q
from django.db.models import Q, Count
from .models import Search
class TrademarkSearchPluginPublisher(CMSPluginBase):
# model = PollPluginModel # model where plugin data are saved
module = _("Trademark")
name = _("Search Form Plugin") # name of the plugin in the interface
render_template = "trademark/form.html"
cache = False
def render(self, context, instance, placeholder):
search = Search.objects.annotate(results_count=Count('results')) \
.filter(similarity=146, results_count__gt=0).order_by('?')[0]
keyword = search.keyword.request
context.update({
'keyword_request': keyword,
})
return context
plugin_pool.register_plugin(TrademarkSearchPluginPublisher) # register the plugin

@ -2,14 +2,11 @@
from __future__ import unicode_literals
from django.db import models, migrations
import app_data.fields
import cms.models.fields
class Migration(migrations.Migration):
dependencies = [
('cms', '0012_auto_20150607_2207'),
]
operations = [
@ -57,6 +54,19 @@ class Migration(migrations.Migration):
},
bases=(models.Model,),
),
migrations.CreateModel(
name='Product',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.TextField()),
('nice', models.ForeignKey(to='trademark.Nice')),
],
options={
'verbose_name': 'product',
'verbose_name_plural': 'products',
},
bases=(models.Model,),
),
migrations.CreateModel(
name='Search',
fields=[
@ -81,6 +91,7 @@ class Migration(migrations.Migration):
('search', models.ForeignKey(to='trademark.Search')),
],
options={
'ordering': ('similarity',),
},
bases=(models.Model,),
),
@ -89,20 +100,21 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=255)),
('ext_id', models.IntegerField()),
('ext_id', models.CharField(unique=True, max_length=20)),
('application_id', models.IntegerField()),
('cert_id', models.IntegerField()),
('image_url', models.URLField(blank=True)),
('owner', models.TextField()),
('image_url', models.URLField(null=True)),
('status', models.CharField(max_length=20)),
('source_url', models.URLField(blank=True)),
('application_at', models.DateField(blank=True)),
('registration_at', models.DateField(blank=True)),
('expiration_at', models.DateField(blank=True)),
('renewed_at', models.DateField(blank=True)),
('priority_at', models.DateField(blank=True)),
('source_url', models.URLField(null=True)),
('application_at', models.DateField(null=True)),
('registration_at', models.DateField(null=True)),
('expiration_at', models.DateField(null=True)),
('renewed_at', models.DateField(null=True)),
('priority_at', models.DateField(null=True)),
('access_key', models.CharField(max_length=20)),
('nices', models.ManyToManyField(to='trademark.Nice')),
('owner', models.ForeignKey(to='trademark.Owner')),
('products', models.ManyToManyField(to='trademark.Product')),
],
options={
'verbose_name': 'trademark',
@ -110,48 +122,6 @@ class Migration(migrations.Migration):
},
bases=(models.Model,),
),
migrations.CreateModel(
name='TrademarkConfig',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('type', models.CharField(max_length=100, verbose_name='type')),
('namespace', models.CharField(default=None, unique=True, max_length=100, verbose_name='instance namespace')),
('app_data', app_data.fields.AppDataField(default=b'{}', editable=False)),
('paginate_by', models.PositiveIntegerField(default=5, help_text='When paginating list views, how many articles per page?', verbose_name='Paginate size')),
('placeholder_base_sidebar', cms.models.fields.PlaceholderField(related_name='search_base_sidebar', slotname='trademark_search_base_sidebar', editable=False, to='cms.Placeholder', null=True)),
('placeholder_base_top', cms.models.fields.PlaceholderField(related_name='search_base_top', slotname='trademark_search_base_top', editable=False, to='cms.Placeholder', null=True)),
('placeholder_detail_bottom', cms.models.fields.PlaceholderField(related_name='search_detail_bottom', slotname='trademark_search_detail_bottom', editable=False, to='cms.Placeholder', null=True)),
('placeholder_detail_footer', cms.models.fields.PlaceholderField(related_name='search_detail_footer', slotname='trademark_search_detail_footer', editable=False, to='cms.Placeholder', null=True)),
('placeholder_detail_top', cms.models.fields.PlaceholderField(related_name='search_detail_top', slotname='trademark_search_detail_top', editable=False, to='cms.Placeholder', null=True)),
('placeholder_list_footer', cms.models.fields.PlaceholderField(related_name='search_list_footer', slotname='trademark_search_list_footer', editable=False, to='cms.Placeholder', null=True)),
('placeholder_list_top', cms.models.fields.PlaceholderField(related_name='search_list_top', slotname='trademark_search_list_top', editable=False, to='cms.Placeholder', null=True)),
],
options={
'abstract': False,
},
bases=(models.Model,),
),
migrations.CreateModel(
name='TrademarkConfigTranslation',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('language_code', models.CharField(max_length=15, verbose_name='Language', db_index=True)),
('app_title', models.CharField(max_length=234, verbose_name='application title')),
('master', models.ForeignKey(related_name='translations', editable=False, to='trademark.TrademarkConfig', null=True)),
],
options={
'managed': True,
'db_table': 'trademark_trademarkconfig_translation',
'db_tablespace': '',
'default_permissions': (),
'verbose_name': 'trademark config Translation',
},
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name='trademarkconfigtranslation',
unique_together=set([('language_code', 'master')]),
),
migrations.AddField(
model_name='searchresult',
name='trademark',

@ -300,4 +300,5 @@ def update_fields(sender, instance, **kwargs):
@receiver(post_save, sender=Keyword)
def create_searches(sender, instance, created, **kwargs):
if created:
instance.slug = instance.slug + u'-' + unicode(instance.id)
instance.create_searches()

@ -0,0 +1,136 @@
var trademarkSearchFilter = [];
var TrademarkSearch = (function(searchContainer){
function send () {
var request = $(searchContainer + " .trademark-search-request").val(),
$form = $(searchContainer + ' .trademark-search-form'),
$loading = $(searchContainer + ' .trademark-search-loading'),
$status_list = $(searchContainer + ' .trademark-search-loading-status'),
$count = $(searchContainer + ' .trademark-search-count'),
$title = $(searchContainer + ' .trademark-search-request-value'),
$sending = $(searchContainer + ' .trademark-search-sending'),
$identity = $(searchContainer + ' .trademark-search-identity'),
$contains = $(searchContainer + ' .trademark-search-contains'),
$similar = $(searchContainer + ' .trademark-search-similar'),
$wait = $(searchContainer + ' .trademark-search-wait'),
slug = '',
iteration = 0;
function update_status(data) {
var identity = data['identity'],
contains = data['contains'],
similar = data['similar'],
completed = identity['status'] == 'finished' && contains['status'] == 'finished' && similar['status'] == 'finished',
almost_completed = identity['status'] == 'finished' && contains['status'] == 'finished' && identity['count'] > 0,
show_link = identity['status'] == 'finished' || contains['status'] == 'finished' || similar['status'] == 'finished',
tm_url = '/ru/trademarks/online-search/results/' + slug + '/';
if(identity['status'] == 'finished') {
var count = identity['count'];
if(count > 0) {
$identity.text(GetNoun(count, 'Найден', 'Найдены', 'Найдено') + ' '+ count + ' ' + GetAdj(count, 'такой', 'таких') + ' ' + GetNoun(count, 'знак', 'знака', 'знаков')+ ' в ' + identity['nices'] + ' ' + GetNoun(identity['nices'], 'классе', 'классах', 'классах'));
} else {
$identity.text('Точно таких же знаков не найдено');
}
}
if(contains['status'] == 'finished') {
var count = contains['count'];
if(count > 0) {
$contains.text(GetNoun(count, 'Обнаружен', 'Обнаружены', 'Обнаружено') + ' ' + count + ' ' + GetAdj(count, 'похожий', 'похожих') + ' ' + GetNoun(count, 'знак', 'знака', 'знаков'));
} else {
$contains.text('Похожих знаков не обнаружено');
}
}
if(similar['status'] == 'finished') {
var count = similar['count'];
if(count > 0) {
$similar.text(GetNoun(count, 'Подобран', 'Подобраны', 'Подобрано') + ' ' + count + ' ' + GetAdj(count, 'производный', 'производных') + ' ' + GetNoun(count, 'знак', 'знака', 'знаков'));
} else {
$similar.text('Не удалось подобрать производных знаков');
}
}
if(iteration > 3) {
$wait.show(500);
}
if(show_link && iteration > 5) {
var href = ''
$wait.html('<a href="' + tm_url + '">Остановить поиск и перейти к результатам</a>');
} else {
}
if(completed || almost_completed) {
document.location.href = tm_url;
} else {
iteration += 1;
setTimeout(function () {
get_status(slug);
}, 10000);
}
}
function get_status(slug) {
try {
$.get("/ru/trademarks/online-search/request/" + slug + "/").done(function(data) {
update_status(data);
});
} catch (err) {
setTimeout(function () {
get_status(slug);
}, 5000);
}
}
// Show Loading Block
$title.text(request);
$form.hide();
$loading.show();
$sending.show();
$.post("/ru/trademarks/online-search/request/",
{ 'keyword': request}).done(function(data) {
var tm_count = Math.floor(Math.random() * (3000000 - 1000000) + 1000000);
$(searchContainer + ' .trademark-search-count').text(tm_count.toLocaleString() + ' знаков')
$count.show(500);
$identity.delay(3000).show(500);
$contains.delay(6000).show(500);
$similar.delay(12000).show(500);
slug = data['slug'];
update_status(data);
})
.fail(function(data) {
})
.always(function(data) {
$sending.hide()
});
}
$(searchContainer + ' .trademark-search-example').click(function(event) {
var keyword = $(searchContainer + ' .trademark-search-example').text();
event.preventDefault();
$(searchContainer + " .trademark-search-request").val(keyword);
});
$(searchContainer + ' .trademark-search-request').keypress(function (e) {
if (e.which == 13) {
send();
return false; //<---- Add this line
}
});
$(searchContainer + ' .trademark-search-submit').click(function(){
send();
});
});

@ -0,0 +1,51 @@
angular.module('zuykov')
.controller('ModalTrademarkSearchCtrl', ['$scope', '$modal', function ($scope, $modal) {
$scope.nice = nicesRu;
$scope.classes_values = trademarkSearchFilter;
$scope.animationsEnabled = true;
$scope.open = function (form_id) {
var modalInstance = $modal.open({
animation: $scope.animationsEnabled,
templateUrl: 'modalTrademarkSearchTemplate.html',
controller: 'ModalTrademarkSearchInstanceCtrl',
windowClass: 'trademark-search-modal'
});
modalInstance.result.then(function (selectedItem) {
console.log('clooosed');
$scope.classes_values = trademarkSearchFilter;
});
};
$scope.toggleAnimation = function () {
$scope.animationsEnabled = !$scope.animationsEnabled;
};
}])
// Please note that $modalInstance represents a modal window (instance) dependency.
// It is not the same as the $modal service used above.
.controller('ModalTrademarkSearchInstanceCtrl', ['$scope', '$modalInstance', function ($scope, $modalInstance) {
$scope.nice = nicesRu;
$scope.categories = nicesCategories;
$scope.GetNoun = GetNoun;
$scope.ok = function () {
trademarkSearchFilter = $scope.classes_values;
searchResults.expand();
$modalInstance.close('params');
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
}]);

@ -0,0 +1,565 @@
var nicesRu = [
{
id: 1,
title: 'Химические продукты',
description: 'Класс включает, в основном, химические продукты, предназначенные для использования в промышленных, научных целях и сельском хозяйстве, в том числе входящие в состав товаров, относящихся к другим классам.',
products: [
'Химические продукты, предназначенные для использования в промышленных, научных целях, в фотографии, сельском хозяйстве, садоводстве и лесоводстве',
'Необработанные синтетические смолы, необработанные пластические материалы',
'Удобрения',
'Составы для тушения огня',
'Препараты для закалки и пайки металлов',
'Препараты для консервирования пищевых продуктов',
'Дубильные вещества',
'Клеящие вещества для промышленных целей'
]
},
{
id: 2,
title: 'Краски, олифы, лаки',
description: 'Класс включает, в основном, краски, красящие вещества и защитные средства от коррозии.',
products: [
'Краски, олифы, лаки',
'Защитные средства, предохраняющие металлы от коррозии и древесину от разрушения',
'Красящие вещества',
'Протравы',
'Необработанные природные смолы',
'Листовые и порошкообразные металлы, используемые для художественно-декоративных целей и художественной печати'
]
},
{
id: 3,
title: 'Препараты для чистки, парфюмерия и косметика',
description: 'Класс включает, в основном, препараты для чистки и парфюмерно-косметические товары.',
products: [
'Препараты для отбеливания и прочие вещества для стирки',
'Препараты для чистки, полирования, обезжиривания и абразивной обработки',
'Мыла',
'Парфюмерные изделия, эфирные масла, косметика, лосьоны для волос',
'Зубные порошки и пасты'
]
},
{
id: 4,
title: 'Технические масла, смазки, топлива',
description: 'Класс включает, в основном, технические масла и смазки, топлива и осветительные материалы.',
products: [
'Технические масла и смазки',
'Смазочные материалы',
'Составы для поглощения, смачивания и связывания пыли',
'Топлива (в том числе моторные бензины) и осветительные материалы',
'Фитили и свечи для освещения'
]
},
{
id: 5,
title: 'Фармацевтические препараты',
description: 'Класс включает, в основном, фармацевтические препараты и прочие препараты для медицинских целей.',
products: [
'Фармацевтические и ветеринарные препараты',
'Гигиенические препараты для медицинских целей',
'Диетическое питание и вещества для медицинских или ветеринарных целей, детское питание',
'Пищевые добавки для человека и животных',
'Пластыри, перевязочные материалы',
'Материалы для пломбирования зубов и изготовления зубных слепков',
'Дезинфицирующие средства',
'Препараты для уничтожения вредных животных',
'Фунгициды, гербициды'
]
},
{
id: 6,
title: 'Обычные металлы и сплавы',
description: 'Класс включает, в основном, необработанные и частично обработанные обычные металлы и простые изделия из них.',
products: [
'Обычные металлы и их сплавы',
'Металлические строительные материалы',
'Передвижные металлические конструкции и сооружения',
'Металлические материалы для рельсовых путей',
'Металлические тросы и проволока [неэлектрические]',
'Скобяные и замочные изделия',
'Металлические трубы',
'Сейфы',
'Изделия из обычных металлов, не относящиеся к другим классам',
'Руды'
]
},
{
id: 7,
title: 'Машины, станки и двигатели',
description: 'Класс включает, в основном, машины, станки и двигатели.',
products: [
'Машины и станки',
'Двигатели (за исключением предназначенных для наземных транспортных средств)',
'Соединения и элементы передач (за исключением предназначенных для наземных транспортных средств)',
'Сельскохозяйственные орудия, иные чем орудия с ручным управлением',
'Инкубаторы',
'Торговые автоматы'
]
},
{
id: 8,
title: 'Ручные инструмены',
description: 'Класс включает, в основном, ручные инструменты, используемые как орудия труда в соответствующих профессиях.',
products: [
'Ручные орудия и инструменты',
'Ножевые изделия, вилки и ложки',
'Холодное оружие',
'Бритвы'
]
},
{
id: 9,
title: 'Приборы, инструменты, оборудование',
description: 'Класс включает в себя приборы, программное обеспечение, инструменты и оборудование.',
products: [
'Приборы и инструменты научные, морские, геодезические, фотографические, кинематографические, оптические, для взвешивания, измерения, сигнализации, контроля (проверки), спасания и обучения',
'Приборы и инструменты для передачи, распределения, трансформации, накопления, регулирования или управления электричеством',
'Аппаратура для записи, передачи, воспроизведения звука или изображений',
'Магнитные носители информации, диски звукозаписи',
'Компакт-диски, DVD и другие цифровые носители информации',
'Механизмы для аппаратов с предварительной оплатой',
'Кассовые аппараты, счетные машины, оборудование для обработки информации и компьютеры',
'Программное обеспечение',
'Оборудование для тушения огня'
]
},
{
id: 10,
title: 'Медицинские приборы и инструменты',
description: 'Класс включает, в основном, медицинские приборы, инструменты и изделия.',
products: [
'Приборы и инструменты хирургические, медицинские, стоматологические и ветеринарные',
'Протезы конечностей, глазные и зубные протезы',
'Ортопедические изделия',
'Материалы для наложения швов'
]
},
{
id: 11,
title: 'Устройства для получения тепла',
description: 'Устройства для освещения, нагрева, получения пара, тепловой обработки пищевых продуктов, для охлаждения, сушки, вентиляции, водораспределительные и санитарно-технические.',
products: [
]
},
{
id: 12,
title: 'Транспортные средства',
description: 'Аппараты, перемещающиеся по земле, воде и воздуху',
products: [
]
},
{
id: 13,
title: 'Огнестрельное оружие и пиротехнические средства',
description: '',
products: [
'Огнестрельное оружие',
'Боеприпасы и снаряды',
'Взрывчатые вещества',
'Фейерверки'
]
},
{
id: 14,
title: 'Благородные металлы и их сплавы, изделия из них',
description: 'Класс включает, главным образом, благородные металлы, изделия из них, не включенные в другие классы, в основном, ювелирные изделия, бижутерию и часы.',
products: [
'Благородные металлы и их сплавы, изделия или покрытия из них, не относящиеся к другим классам',
'Ювелирные изделия, бижутерия, драгоценные камни',
'Часы и прочие хронометрические приборы'
]
},
{
id: 15,
title: 'Музыкальные инструменты',
description: '',
products: [
'Механические пианино и их принадлежности',
'Музыкальные шкатулки',
'Электрические и электронные музыкальные инструменты'
]
},
{
id: 16,
title: 'Бумага и изделия из бумаги',
description: 'Класс включает, в основном, бумагу, изделия из бумаги и конторские принадлежности.',
products: [
'Бумага, картон и изделия из них, не относящиеся к другим классам',
'Печатная продукция',
'Материалы для переплетных работ',
'Фотоснимки',
'Писчебумажные товары',
'Клейкие вещества для канцелярских и бытовых целей',
'Принадлежности для художников',
'Кисти',
'Пишущие машины и конторские принадлежности (за исключением мебели)',
'Учебные материалы и наглядные пособия (за исключением аппаратуры)',
'Пластмассовые материалы для упаковки (не относящиеся к другим классам)',
'Шрифты',
'Клише типографские'
]
},
{
id: 17,
title: 'Резина, асбест, пластмассы',
description: 'Класс включает, в основном, электро-, тепло- и звукоизоляционные материалы и частично обработанные пластмассы в виде листов, плиток, пластин или прутков для промышленных целей.',
products: [
'Каучук, резина, гуттаперча, асбест, слюда и изделия из этих материалов, не относящиеся к другим классам',
'Изделия из частично обработанных пластмасс',
'Материалы для конопачения, уплотнения и изоляции',
'Неметаллические гибкие трубы'
]
},
{
id: 18,
title: 'Кожа и имитация кожи',
description: 'Класс включает, в основном, кожу, имитацию кожи, дорожные принадлежности, не относящиеся к другим классам, и шорные изделия.',
products: [
'Кожа и имитация кожи, изделия из них, не относящиеся к другим классам',
'Шкуры животных',
'Дорожные сундуки, чемоданы',
'Зонты от дождя и солнца, трости',
'Хлысты, кнуты, конская сбруя и шорные изделия'
]
},
{
id: 19,
title: 'Неметаллические строительные материалы',
description: 'Класс включает, в основном, неметаллические строительные материалы.',
products: [
'Неметаллические строительные материалы',
'Неметаллические жесткие трубы для строительных целей',
'Асфальт, смолы и битум',
'Неметаллические передвижные конструкции и сооружения',
'Неметаллические памятники'
]
},
{
id: 20,
title: 'Мебель и другие изделия',
description: 'Класс включает, в основном, мебель и ее части и изделия из пластмасс, не относящиеся к другим классам.',
products: [
'Мебель, зеркала, обрамления для картин и т.п.',
'Металлическая мебель и мебель для кемпинга',
'Постельные принадлежности (например, матрацы, матрацы пружинные, подушки)',
'Зеркала, в том числе для мебели и туалетные',
'Пластины с регистрационными номерами неметаллические',
'Почтовые ящики (за исключением ящиков, изготовленных из металла или камня)'
]
},
{
id: 21,
title: 'Домашняя и кухонная утварь',
description: 'Класс включает, в основном, малогабаритные, приводимые в действие вручную домашние или кухонные приспособления, устройства и утварь, а также туалетные принадлежности, изделия из стекла и фарфора.',
products: [
'Домашняя или кухонная утварь и посуда',
'Расчески и губки',
'Щетки (за исключением кистей)',
'Материалы для щеточных изделий',
'Приспособления для чистки и уборки',
'Мочалки металлические',
'Необработанное или частично обработанное стекло (за исключением строительного стекла)',
'Изделия из стекла, фарфора и фаянса, не относящиеся к другим классам'
]
},
{
id: 22,
title: 'Верёвочно-канатные изделия',
description: 'Класс включает в основном веревочно-канатные изделия и изделия из парусины, набивочные материалы и текстильное волокнистое сырье.',
products: [
'Канаты, веревки, бечевки, сети, палатки, навесы, брезент, паруса и мешки, не относящиеся к другим классам',
'Набивочные материалы (за исключением из резиновых и пластических материалов)',
'Текстильное волокнистое сырье'
]
},
{
id: 23,
title: 'Нити текстильные и пряжа',
description: '',
products: [
]
},
{
id: 24,
title: 'Ткани, одеяла, покрывала и скатерти',
description: 'Класс включает, в основном, ткани, одеяла, покрывала и скатерти.',
products: [
'Ткани и текстильные изделия, не относящиеся к другим классам, покрывала и скатерти',
'Одеяла'
]
},
{
id: 25,
title: 'Одежда, обувь, головные уборы',
description: '',
products: [
]
},
{
id: 26,
title: 'Галантерейные и басонные изделия',
description: 'Класс включает, в основном, галантерейные и басонные изделия.',
products: [
'Кружева и вышитые изделия, тесьма и ленты',
'Пуговицы, кнопки, крючки и блочки, булавки и иглы',
'Искусственные цветы'
]
},
{
id: 27,
title: 'Покрытия для полов',
description: 'Класс включает, в основном, изделия, предназначенные для покрытия готовых полов или стен.',
products: [
'Ковры, циновки, маты, линолеум и прочие покрытия для полов',
'Стенные обои и обивочные материалы (нетекстильные)'
]
},
{
id: 28,
title: 'Игрушки и спортивные товары',
description: '',
products: [
'Игры, игрушки',
'Гимнастические и спортивные товары, не относящиеся к другим классам',
'Елочные украшения'
]
},
{
id: 29,
title: 'Продукты животного происхождения',
description: 'Класс включает, в основном, продовольственные товары животного происхождения, а также овощи и садово-огородные продукты, подготовленные для употребления или консервирования.',
products: [
'Мясо, рыба, птица и дичь',
'Мясные экстракты',
'Овощи и фрукты консервированные, сушеные и подвергнутые тепловой обработке',
'Желе, варенье, компоты',
'Яйца, молоко и молочные продукты',
'Масла и жиры пищевые'
]
},
{
id: 30,
title: 'Растительные пищевые продукты',
description: 'Класс включает, в основном, растительные пищевые продукты, подготовленные для потребления или консервирования, а также вспомогательные добавки, предназначенные для улучшения вкусовых качеств пищевых продуктов',
products: [
'Кофе, чай, какао, сахар, рис, тапиока (маниока), саго, заменители кофе',
'Мука и зерновые продукты, хлебобулочные изделия, кондитерские изделия, мороженое',
'Мед, сироп из патоки',
'Дрожжи, пекарные порошки',
'Соль, горчица',
'Уксус, приправы',
'Пряности',
'Пищевой лед'
]
},
{
id: 31,
title: 'Продукты земледелия и лесного хозяйства',
description: 'Класс включает, в основном, продукты земледелия и лесного хозяйства, живых животных и живые растения, не подвергнутые никакой обработке для потребления, а также корма для животных.',
products: [
'Зерно и сельскохозяйственные, садово-огородные и лесные продукты, не относящиеся к другим классам',
'Живые животные',
'Свежие фрукты и овощи',
'Семена',
'Живые растения и цветы',
'Корма для животных',
'Солод'
]
},
{
id: 32,
title: 'Безалкогольные напитки и пиво',
description: 'Класс включает, в основном, безалкогольные напитки, а также пиво.',
products: [
'Пиво',
'Минеральные и газированные воды и прочие безалкогольные напитки',
'Фруктовые напитки и фруктовые соки',
'Сиропы и прочие составы для изготовления напитков'
]
},
{
id: 33,
title: 'Алкогольные напитки (за исключением пива)',
description: '',
products: [
]
},
{
id: 34,
title: 'Табак и курительные принадлежности',
description: '',
products: [
'Табак',
'Курительные принадлежности',
'Спички',
]
},
{
id: 35,
title: 'Помощь в управлении бизнесом',
description: 'Класс включает, в основном, услуги, оказываемые лицами или организациями, основной целью которых является: (1) помощь в эксплуатации или управлении коммерческого предприятия, или (2) помощь в управлении делами или в коммерческой деятельности промышленного или торгового предприятия, а также услуги, оказываемые рекламными учреждениями, обеспечивающими, главным образом, связь с потребителями и оповещение или объявление с помощью любых средств информации о всевозможных товарах и видах услуг.',
products: [
'Реклама',
'Менеджмент в сфере бизнеса',
'Административная деятельность в сфере бизнеса',
'Офисная служба'
]
},
{
id: 36,
title: 'Финансовые услуги',
description: 'Класс включает, в основном, услуги по денежно-финансовым операциям и услуги, связанные со всеми видами страховых контрактов.',
products: [
'Страхование',
'Финансовая деятельность',
'Кредитно-денежные операции',
'Операции с недвижимостью',
]
},
{
id: 37,
title: 'Строительство и ремонт',
description: 'Класс включает, в основном, услуги, оказываемые подрядчиками или субподрядчиками по строительству или изготовлению капитальных зданий, а также услуги частных лиц или организаций по восстановлению объектов в их первоначальном виде или их сохранению без изменения их физических или химических характеристик.',
products: [
'Строительство',
'Ремонт',
'Установка оборудования'
]
},
{
id: 38,
title: 'Телекоммуникации',
description: 'Класс включает, в основном, услуги, дающие возможность, по меньшей мере, одному человеку установить связь с другим человеком с помощью сенсорных средств. Такие услуги позволяют: (1) одному человеку разговаривать с другим, (2) передавать сообщения от одного человека к другому, (3) предоставлять возможность устной и визуальной коммуникации одного человека с другим (радио и телевидение).',
products: [
]
},
{
id: 39,
title: 'Перевозка людей и товаров',
description: 'Класс включает, в основном, услуги, относящиеся к перевозке людей или товаров из одного места в другое (железнодорожным, автомобильным, водным, воздушным транспортом или по трубопроводу), и услуги, связанные с такой перевозкой, а также услуги по хранению товаров на складах или в других помещениях для предотвращения их повреждения или хищения.',
products: [
'Транспортировка',
'Упаковка и хранение товаров',
'Организация путешествий',
]
},
{
id: 40,
title: 'Обработка материалов',
description: 'Класс включает, в основном, услуги, не относящиеся к другим классам и заключающиеся в механической или химической обработке или преобразовании предметов или органических или неорганических веществ. ',
products: [
]
},
{
id: 41,
title: 'Услуги обучения и развлекательные мероприятия',
description: 'Класс включает, в основном, услуги отдельных лиц или организаций по развитию умственных способностей людей или дрессировке животных, а также услуги, предназначенные для развлечения людей или организации досуга.',
products: [
'Воспитание',
'Обеспечение учебного процесса',
'Развлечения',
'Организация спортивных и культурно-просветительных мероприятий'
]
},
{
id: 42,
title: 'Научные и технические услуги',
description: 'Класс включает, в основном, услуги, предоставляемые физическими лицами, индивидуально или коллективно, в отношении теоретических и практических аспектов сложных областей деятельности, такие услуги предоставляются специалистами в областях химии, физики, техники и программирования.',
products: [
'Научные и технологические услуги и относящиеся к ним научные исследования и разработки',
'Услуги по промышленному анализу и научным исследованиям',
'Разработка и усовершенствование технического и программного обеспечения компьютеров'
]
},
{
id: 43,
title: 'Гостиницы, кейтеринг',
description: 'Класс включает, в основном, услуги, предоставляемые физическими лицами или учреждениями, целью которых является приготовление пищевых продуктов и напитков для употребления и оказание услуг по предоставлению мест и питания в гостиницах, пансионатах или других заведениях, предоставляющих временное проживание.',
products: [
'Услуги по обеспечению пищевыми продуктами и напитками',
'Обеспечение временного проживания'
]
},
{
id: 44,
title: 'Медицинский и косметические услуги',
description: 'Класс включает, в основном, медицинский уход, услуги в области гигиены и косметики, оказываемые лицами или учреждениями людям и животным; услуги, относящиеся к областям сельского хозяйства, огородничества и лесоводства.',
products: [
'Медицинские услуги',
'Ветеринарные услуги',
'Услуги в области гигиены и косметики для людей и животных',
'Услуги в области сельского хозяйства, огородничества и лесоводства'
]
},
{
id: 45,
title: 'Юридические услуги и службы безопасности',
description: '',
products: [
'Услуги юридические',
'Службы безопасности для защиты имущества и индивидуальных лиц',
'Персональные и социальные услуги, оказываемые другим для удовлетворения потребностей индивидуальных лиц',
]
},
];
var nicesCategories = [
{
id: 1,
title: 'Химические товары',
classes: [1, 2, 3, 4, 5]
},
{
id: 2,
title: 'Металлы и сплавы',
classes: [6, 14]
},
{
id: 3,
title: 'Машины и устройства',
classes: [7, 9, 11, 12]
},
{
id: 4,
title: 'Приборы и инструменты',
classes: [8, 10, 13, 15]
},
{
id: 5,
title: 'Продукты питания',
classes: [29, 30, 31]
},
{
id: 6,
title: 'Напитки и табак',
classes: [32, 33, 34]
},
{
id: 7,
title: 'Изделия и материалы',
classes: [16, 17, 18, 19]
},
{
id: 8,
title: 'Текстиль и одежда',
classes: [22, 23, 24, 25, 26, 27]
},
{
id: 9,
title: 'Товары для дома',
classes: [20, 21, 28]
},
{
id: 10,
title: 'Услуги',
classes: [35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
}
];

@ -0,0 +1,71 @@
angular.module('zuykov')
.controller('TrademarkSearchNiceCtrl', ['$scope', '$rootScope', function ($scope, $rootScope) {
$scope.selectedCategory = 1;
$scope.filterByCategory = function (nice_class) {
var category = $scope.categories[$scope.selectedCategory - 1];
return (category.classes.indexOf(nice_class.id) !== -1);
};
$scope.selectCategory = function (id) {
$scope.selectedCategory = id;
};
$scope.setClasses = function () {
var classes = [];
$(".service-trademarks-class-form form input[type=checkbox]:checked").prop('checked', false);
for(var i in $scope.nice) {
var el = $scope.nice[i];
if(el.selected) {
classes.push(el.id);
$(".service-trademarks-class-form form input[value=" + el.id + "]").prop('checked', true);
}
}
$rootScope.classes_values = classes;
$rootScope.classes = classes.length;
$scope.countCategories();
};
$scope.countCategories = function () {
for(var index in $scope.categories) {
var category = $scope.categories[index];
category.selected = [];
for(var cl_i in category.classes) {
var class_el = $scope.nice[category.classes[cl_i]-1];
if(class_el.selected) {
category.selected.push(class_el.id);
}
}
}
};
$scope.getClasses = function () {
var classes = $rootScope.classes_values;
for(var i in classes) {
var class_id = classes[i];
$scope.nice[class_id-1].selected = true;
}
$scope.countCategories();
$scope.setClasses();
};
}]);

@ -0,0 +1,85 @@
// Results
var TrademarkSearchResult = (function (resultContainer) {
function prepare_nice_products ($nice) {
var product_id = $nice.attr('product-id')
$nice.click(function () {
var $list = $('');
$('.trademark-search-nice-busy-products[product-id=' + product_id + ']').slideToggle('slow');
});
}
function prepare_load_more ($container, display_classes) {
var results_count = $container.find(".load-more-result.filtered").size(),
showed = 6,
$this = $container,
$count = $container.find('.load-more-count');
function update_count() {
var count = results_count - showed;
if(count > 0) {
$container.find('.load-more-li').css('display', 'block');
$container.css('display', 'block');
} else {
$container.find('.load-more-li').css('display', 'none');
$container.css('display', 'none');
}
if($container.attr('list-type') == 'nices') {
$count.text(count + ' ' + GetNoun(count, 'класс', 'класса', 'классов'));
if (count > 0) {
$container.parent().css('display', 'block');
} else {
$container.parent().css('display', 'none');
}
} else {
$count.text(count + ' ' + GetNoun(count, 'знак', 'знака', 'знаков'));
}
}
function show_more() {
var display_value = 'inline-block';
if($container.attr('list-type') == 'nices') {
display_value = 'block'
}
$container.find('.load-more-result.filtered:lt(' + showed + ')').css('display', display_value);
}
show_more();
update_count();
$container.find('.load-more').click(function () {
showed = ( showed + 6 <= results_count) ? showed + 6 : results_count;
show_more();
update_count();
});
}
$(resultContainer + ' .trademark-search-show-products').each(function() {
prepare_nice_products($(this));
});
function prepare_all_blocks () {
var display_css_classes = trademarkSearchFilter.length == 0 ? resultContainer + ' .load-more-result' : resultContainer + ' .c' + trademarkSearchFilter.join(', ' + resultContainer +' .c');
$(resultContainer + ' .load-more').unbind('click');
$(resultContainer + ' .load-more-result').css('display', 'none');
$(resultContainer + ' .load-more-result').removeClass('filtered');
$(display_css_classes).addClass('filtered');
$(resultContainer + ' .load-more-results').each(function () {
prepare_load_more($(this));
});
}
return {
expand: function () {
prepare_all_blocks();
}
}
});

@ -0,0 +1,33 @@
// Trademark detail
.trademark-detail-fips-wrap { width: 100%; padding: 0; overflow: hidden; float: left;
.frame { width: 120%; height: 900px; border: 1px solid black}
.frame {
// zoom: 0.25;
-moz-transform: scale(0.8);
-moz-transform-origin: 0 0;
-o-transform: scale(0.8);
-o-transform-origin: 0 0;
-webkit-transform: scale(0.8);
-webkit-transform-origin: 0 0;
}
}
.trademark-detail-arrow {
font-size: 40px;
}
.trademark-detail-description {
.trademark-detail-description-visual {
img {
width: 100%;
}
}
}

@ -0,0 +1,88 @@
.trademark-search-loading {
display: none;
border: 1px solid silver;
border-radius: 6px;
background: white;
margin-left: -14px;
margin-bottom: 5px;
.trademark-search-loading-header {
padding: 9px 13px;
}
ul {
margin-left: 14px;
li {
margin-bottom: 3px;
display: none;
}
}
}
.block-hide-animation {
opacity:0;
transition:opacity 0.5s linear;
}
.block-show-animation {
visibility:visible;
opacity:1;
transition:opacity 1s linear;
}
.spinner {
width: 24px;
height: 14px;
text-align: center;
font-size: 8px;
display: inline-block;
padding-top: 5px
}
.spinner > div {
background-color: #333;
height: 100%;
width: 3px;
display: inline-block;
-webkit-animation: sk-stretchdelay 1.2s infinite ease-in-out;
animation: sk-stretchdelay 1.2s infinite ease-in-out;
}
.spinner .rect2 {
-webkit-animation-delay: -1.1s;
animation-delay: -1.1s;
}
.spinner .rect3 {
-webkit-animation-delay: -1.0s;
animation-delay: -1.0s;
}
.spinner .rect4 {
-webkit-animation-delay: -0.9s;
animation-delay: -0.9s;
}
.spinner .rect5 {
-webkit-animation-delay: -0.8s;
animation-delay: -0.8s;
}
@-webkit-keyframes sk-stretchdelay {
0%, 40%, 100% { -webkit-transform: scaleY(0.4) }
20% { -webkit-transform: scaleY(1.0) }
}
@keyframes sk-stretchdelay {
0%, 40%, 100% {
transform: scaleY(0.4);
-webkit-transform: scaleY(0.4);
} 20% {
transform: scaleY(1.0);
-webkit-transform: scaleY(1.0);
}
}

@ -0,0 +1,4 @@
@import 'result.less';
@import 'detail.less';
@import 'loading.less';
@import 'modal.less';

@ -0,0 +1,5 @@
.trademark-search-modal {
.modal-dialog {
width: 700px;
}
}

@ -117,6 +117,10 @@
margin-left: -15px;
margin-top: 10px;
h1 {
margin-top: 0;
}
.load-more-li {
margin-top: 10px;
}
@ -169,126 +173,3 @@
border-color: #000;
}
}
.trademark-search-loading {
display: none;
border: 1px solid silver;
border-radius: 6px;
background: white;
margin-left: -14px;
margin-bottom: 5px;
.trademark-search-loading-header {
padding: 9px 13px;
}
ul {
margin-left: 14px;
li {
margin-bottom: 3px;
display: none;
}
}
}
.block-hide-animation {
opacity:0;
transition:opacity 0.5s linear;
}
.block-show-animation {
visibility:visible;
opacity:1;
transition:opacity 1s linear;
}
.spinner {
width: 24px;
height: 14px;
text-align: center;
font-size: 8px;
display: inline-block;
padding-top: 5px
}
.spinner > div {
background-color: #333;
height: 100%;
width: 3px;
display: inline-block;
-webkit-animation: sk-stretchdelay 1.2s infinite ease-in-out;
animation: sk-stretchdelay 1.2s infinite ease-in-out;
}
.spinner .rect2 {
-webkit-animation-delay: -1.1s;
animation-delay: -1.1s;
}
.spinner .rect3 {
-webkit-animation-delay: -1.0s;
animation-delay: -1.0s;
}
.spinner .rect4 {
-webkit-animation-delay: -0.9s;
animation-delay: -0.9s;
}
.spinner .rect5 {
-webkit-animation-delay: -0.8s;
animation-delay: -0.8s;
}
@-webkit-keyframes sk-stretchdelay {
0%, 40%, 100% { -webkit-transform: scaleY(0.4) }
20% { -webkit-transform: scaleY(1.0) }
}
@keyframes sk-stretchdelay {
0%, 40%, 100% {
transform: scaleY(0.4);
-webkit-transform: scaleY(0.4);
} 20% {
transform: scaleY(1.0);
-webkit-transform: scaleY(1.0);
}
}
// Trademark detail
.trademark-detail-fips-wrap { width: 100%; padding: 0; overflow: hidden; float: left;
.frame { width: 120%; height: 900px; border: 1px solid black}
.frame {
// zoom: 0.25;
-moz-transform: scale(0.8);
-moz-transform-origin: 0 0;
-o-transform: scale(0.8);
-o-transform-origin: 0 0;
-webkit-transform: scale(0.8);
-webkit-transform-origin: 0 0;
}
}
.trademark-detail-arrow {
font-size: 40px;
}
.trademark-detail-description {
.trademark-detail-description-visual {
img {
width: 100%;
}
}
}

@ -1,11 +1,14 @@
{% extends CMS_TEMPLATE %}
{% load i18n menu_tags cms_tags %}
{% block content %}
<h4 class="header-menu-font"><span class="header-menu-services"><a href="{% page_url "main" %}">{% trans 'Our Services' %}</a></span> <span class="header-menu-contacts"><a href="{% page_url "about" %}">{% page_attribute "page_title" "about" %}</a></span></h4>
{% block content_safe %}
<div class="app app-trademark span8">
{% block trademark_content %}
<div class="app app-trademark span8 l-offset-bottom">
{% block trademark_content %}
{% endblock %}
</div>
{% endblock content_safe %}
<div class="background-line-pattern"></div>
{% static_placeholder 'footer-page-content-trademarks-online-search' %}
{% endblock content %}

@ -0,0 +1,22 @@
{% load i18n menu_tags cms_tags %}
<ol class="list-unstyled list-inline breadcrumb" vocab="http://schema.org/" typeof="BreadcrumbList">
<li property="itemListElement" typeof="ListItem">
<a href="{% page_url "main" %}" property="item" typeof="WebPage"><span property="name">Главная страница</span></a>
<meta property="position" content="1">
</li>
<li property="itemListElement" typeof="ListItem">
<a href="{% page_url "trademarks" %}" property="item" typeof="WebPage"><span property="name">Товарные знаки</span></a>
<meta property="position" content="2">
</li>
<li property="itemListElement" typeof="ListItem">
{% if trademark %}<a href="{{ request.META.HTTP_REFERER }}" property="item" typeof="WebPage"><span property="name">Онлайн поиск</span></a>{% else %}<span property="name">Онлайн поиск</span>{% endif %}
<meta property="position" content="3">
</li>
{% if trademark %}
<li property="itemListElement" typeof="ListItem">
<span property="name">Товарный знак «{{ trademark }}»</span>
<meta property="position" content="4">
</li>
{% endif %}
</ol>

@ -2,15 +2,15 @@
<div class="trademark-search no-print">
<div class="trademark-search-form">
<div class="trademark-search-field input-group">
<input id="trademark-search-request" type="text" placeholder="Название товарного знака" class="form-control">
<input type="text" placeholder="Название товарного знака" class="trademark-search-request form-control">
<span class="input-group-btn">
<button id="trademark-search-submit" class="btn btn-primary" type="button">Найти</button>
<button class="btn btn-primary trademark-search-submit" type="button">Найти</button>
</span>
</div>
<example>Например, <a id="trademark-search-example" href="#">Coca-Cola</a></example>
<example>Например, <a class="trademark-search-example" href="#">Coca-Cola</a></example>
</div>
<div class="trademark-search-loading">
<div class="trademark-search-loading-header">Поиск знака «<strong id="trademark-search-request-value">Coca-cola</strong>»
<div class="trademark-search-loading-header">Поиск знака «<strong class="trademark-search-request-value">Coca-cola</strong>»
<div class="spinner">
<div class="rect1"></div>
@ -22,7 +22,7 @@
</div>
<ul class="list-unstyled trademark-search-loading-status">
<li id="trademark-search-sending"><div class="spinner">
<li class="trademark-search-sending"><div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
@ -30,7 +30,7 @@
<div class="rect5"></div>
</div>
Отправка запроса</li>
<li id="trademark-search-count"><div class="spinner">
<li class="trademark-search-count"><div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
@ -38,7 +38,7 @@
<div class="rect5"></div>
</div>
Поиск среди <span class="trademark-search-count"></span></li>
<li id="trademark-search-identity"><div class="spinner">
<li class="trademark-search-identity"><div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
@ -46,21 +46,21 @@
<div class="rect5"></div>
</div>
Поиск тождественных знаков</li>
<li id="trademark-search-contains"><div class="spinner">
<li class="trademark-search-contains"><div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
<div class="rect4"></div>
<div class="rect5"></div>
</div> Анализ похожих товарных марок</li>
<li id="trademark-search-similar"><div class="spinner">
<li class="trademark-search-similar"><div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
<div class="rect4"></div>
<div class="rect5"></div>
</div> Подбор производных знаков</li>
<li id="trademark-search-wait"><div class="spinner">
<li class="trademark-search-wait"><div class="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
@ -70,3 +70,9 @@
</ul>
</div>
</div>
<script type="text/javascript">
$(function() {
var searchForm = TrademarkSearch('.trademark-search');
});
</script>

@ -4,7 +4,7 @@
<h1>История поисков товарных знаков</h1>
<ul class="trademarks-searches">
{% for tm in trademarks %}
{% for tm in trademarks|slice:":10" %}
<li><a href="results/{{ tm.slug }}">{{ tm.request|title }}</a></li>
{% endfor %}
</ul>

@ -0,0 +1,88 @@
{% load i18n menu_tags cms_tags %}
<div class="trademark-search-form" ng-controller="ModalTrademarkSearchCtrl">
<script type="text/ng-template" id="modalTrademarkSearchTemplate.html">
<div class="modal-body trademark-search-modal">
<h1>Проверка товарного знака на регистрацию</h1>
<p>Каждый товарный знак регистрируется в отношении определённых товаров и услуг, распределенных по классам. Всего таких классов на сегодняшний день 45 (34 — товаров и 11 — услуг), они установлены Международной классификацией товаров и услуг для регистрации знаков (МКТУ).</p>
<p>Выберите классы в которых хотите проверить товарный знак.</p>
{% verbatim %}
<div class="nice" ng-controller="TrademarkSearchNiceCtrl">
<div id="{{ tabs_list_id }}" ng-tabs class="nice-tabs tabs-plugin">
{% endverbatim %}
<ul class="tabs-list list-unstyled list-inline">
<li ng-tab-head="active"><a ng-click="$event.preventDefault()" href="#nice-catalog">{% trans 'Classes Catalog' %}</a></li>
<li ng-tab-head="active"><a ng-click="$event.preventDefault()" href="#nice-all">{% trans 'All Classes' %}</a></li>
</ul>
{% verbatim %}
<div class="nice-catalog tab-body" id="nice-catalog" ng-tab-body>
<div class="nice-categories">
<ul class="list-unstyled list-inline">
<li ng-repeat="category in categories track by category.id" ng-class="selectedCategory == category.id ? 'active' : ''">
<button ng-click="selectCategory(category.id)" class="btn btn-link">{{ category.title }}</button> <span class="category_size badge" id="category_{{ category.id }}_label">{{ category.selected.length || '' }}</span>
</li>
</ul>
</div>
<div class="nice-classes">
<ul class="list-unstyled">
<li ng-repeat="class in nice | filter:filterByCategory">
<label for="class_{{ class.id }}">
<input id="class_{{ class.id }}" type="checkbox" ng-model="class.selected" ng-change="setClasses()"/>
<button popover="{{ class.description }}" popover-title="{{ class.title }}" popover-trigger="mouseenter" popover-placement="bottom" class="btn btn-xs btn-default">{{ class.id }}</button> – {{ class.title }}
</label>
</li>
</ul>
</div>
</div>
<div class="nice-all tab-body" id="nice-all" ng-tab-body>
<ul class="list-unstyled list-inline">
<li ng-repeat="class in nice">
<label for="class_{{ class.id }}">
<input id="class_{{ class.id }}" type="checkbox" ng-model="class.selected" ng-change="setClasses()"/>
<button popover="{{ class.description }}" popover-title="{{ class.title }}" popover-trigger="mouseenter" popover-placement="bottom" class="btn btn-xs btn-default">{{ class.id }}</button>
– {{ class.title }}
</label>
</li>
</ul>
</div>
</div>
{% endverbatim %}
{% verbatim %}
<ul class="nice-selected list-unstyled list-inline">
<li ng-repeat="id in classes_values"><span class="label label-default"><strong>{{ nice[id-1].id }}</strong> – {{ nice[id-1].title }}</span></li>
</ul>
</div>
<div class="button-wrapper submit">
<button class="form-button btn btn-primary" ng-click="ok()" value="Проверить в {{ classes }} классах">Проверить {{ classes == 0 ? 'во всех классах' : 'в ' + classes + GetNoun(classes, ' классе', ' классах', ' классах') }}</button>
{% endverbatim %}
<button class="btn btn-default pull-right" ng-click="cancel()">{% trans 'Cancel' %}</button>
</div>
</div>
</div>
</script>
{% verbatim %}
<div ng-show="classes_values.length > 0">
<p>Поиск происходит в {{ classes + GetNoun(classes, ' классе', ' классах', ' классах') }}</p>
<ul class="nice-selected list-unstyled list-inline">
<li ng-repeat="id in classes_values"><span class="label label-default"><strong>{{ nice[id-1].id }}</strong> – {{ nice[id-1].title }}</span></li>
</ul>
</div>
{% endverbatim %}
<div>
<button class="btn btn-primary btn-xs" ng-click="open();" value="">Расширенный поиск</button> — для того, чтобы уточнить классы МКТУ, регистрацию в которых хотите проверить.
</div>
</div>

@ -4,7 +4,7 @@
<ul class="list-unstyled load-more-results" list-type="nices">
{% for product in products_busy %}
{% if product.titles %}
<li class="trademark-search-nice-busy-product load-more-result"><button class="btn btn-xs btn-default" popover="{% if product.nice.description %}{{ product.nice.description }}{% else %}{{ product.nice.title }}{% endif %}" popover-title="{{ product.nice.title }}" popover-trigger="mouseenter" popover-placement="bottom">{{ product.nice.nice_id }} класс</button> <button class="btn btn-xs btn-default trademark-search-show-products" product-id="{{ product.id }}">{{ product.titles|length }} категорий <span class="caret"> </span></button> {{ product.nice.title }}</li>
<li class="trademark-search-nice-busy-product load-more-result c{{ product.nice.nice_id }}"><button class="btn btn-xs btn-default" popover="{% if product.nice.description %}{{ product.nice.description }}{% else %}{{ product.nice.title }}{% endif %}" popover-title="{{ product.nice.title }}" popover-trigger="mouseenter" popover-placement="bottom">{{ product.nice.nice_id }} класс</button> <button class="btn btn-xs btn-default trademark-search-show-products" product-id="{{ product.id }}">{{ product.titles|length }} категорий <span class="caret"> </span></button> {{ product.nice.title }}</li>
<ul class="trademark-search-nice-busy-products row" style="display: none;" product-id="{{ product.id }}">{% for title in product.titles %}<li class="col-xs-6">{{ title }}</li>{% endfor %}</ul>
{% else %}
<li class="trademark-search-nice-busy-product load-more-result"><button class="btn btn-xs btn-default" popover="{% if product.nice.description %}{{ product.nice.description }}{% else %}{{ product.nice.title }}{% endif %}" popover-title="{{ product.nice.title }}" popover-trigger="mouseenter" popover-placement="bottom">{{ product.nice.nice_id }} класс</button> {{ product.cap_title }}</li>

@ -1,6 +1,6 @@
{% if nice_available.count > 0 %}
<div class="trademark-register-block">
<h1>Зарегистрируйте знак «{{ trademark_title|title }}»</h1>
<h1>Зарегистрируйте знак <span class="no-wrap">«{{ trademark_title|title }}»</span></h1>
<div class="description">
<p>
Регистрация возможна в {{ nice_available.count }} классах товаров и услуг.</p>

@ -1,19 +1,27 @@
{% extends "trademark/base.html" %}
{% load sekizai_tags %}
{% block title %}Отчёт по поиску товарных знаков на запрос «{{ keyword.request|title }}» — заявки, свидетельства, классы{% endblock %}
{% block trademark_content %}
{% include 'trademark/breadcrumb.html' with keyword=keyword.request %}
<h1>Результаты поиска знаков по запросу «{{ keyword|title }}»</h1>
{% include 'trademark/modal.html' %}
<div class="row">
<div class="col-xs-12 col-sm-8">
{% if identity.count > 0 %}
<h1>Товарный знак «{{ keyword.request|title }}» зарегистрирован <nobr>{% if nice_busy.count == 45 %}во всех{% else %}в {{ nice_busy.count }}{% endif %} классах</nobr> товаров и услуг</h1>
<h2>{% if nice_busy.count == 45 %}Скорее всего, вы не можете зарегистрировать этот знак{% endif %}</h2>
<ul class="trademark-search-results load-more-results list-inline list-unstyled">
<li><h2>Товарный знак «{{ keyword.request|title }}» зарегистрирован <nobr>{% if nice_busy.count == 45 %}во всех{% else %}в {{ nice_busy.count }}{% endif %} классах</nobr> товаров и услуг</h2>
<h3>{% if nice_busy.count == 45 %}Скорее всего, вы не можете зарегистрировать этот знак{% endif %}</h3>
</li>
{% for tm in identity %}
<li class="trademark-search-result-identity load-more-result trademark-search-result" trademark-id='{{ tm.id }}'>
<li class="trademark-search-result-identity load-more-result trademark-search-result {% for class in tm.nices.all %}c{{ class.nice_id }} {% endfor %}" trademark-id='{{ tm.id }}'>
<a href='/ru/trademarks/online-search/trademark/{{ tm.id }}/'>
<div class='trademark-search-result-image' style="background-image: url({{ tm.image_url }});">
{% if not tm.image_url %}
@ -47,9 +55,10 @@
</ul>
{% if identity_expired %}
<h2>Недействующие товарные знаки «{{ keyword.request|title }}»</h2>
<p>Исключительные права на эти товарные знаки не продлили, поэтому они доступны для <a href="http://zuykov.com/ru/trademarks/registraciya-tovarnogo-znaka/">регистрации</a> в этих классах товаров и услуг.</p>
<ul class="trademark-search-results load-more-results list-inline list-unstyled">
<li><h2>Недействующие товарные знаки «{{ keyword.request|title }}»</h2>
<p>Исключительные права на эти товарные знаки не продлили, поэтому они доступны для <a href="http://zuykov.com/ru/trademarks/registraciya-tovarnogo-znaka/">регистрации</a> в этих классах товаров и услуг.</p></li>
{% for tm in identity_expired %}
{% include 'trademark/search_list_item.html' with tm=tm %}
{% endfor %}
@ -64,7 +73,7 @@
{% endif %}
{% else %}
<h1>Товарный знак «{{ keyword.request|title }}» не зарегистрирован в базе свидетельств Роспатента</h1>
<h2>Товарный знак «{{ keyword.request|title }}» не зарегистрирован в базе свидетельств Роспатента</h2>
<p>
Существует ряд законодательных требований, которым должен соответствовать знак, не выполнение которых может привести к отказу в регистрации вашего знака.</p>
<p>
@ -75,7 +84,7 @@
<div class="col-xs-12 col-sm-4 no-print">
<div class="trademark-search-block">
<h2>Попробуйте проверить другой товарный знак</h2>
<h3>Попробуйте проверить другой товарный знак</h3>
{% include 'trademark/form.html' %}
</div>
@ -87,9 +96,12 @@
</div>
{% if similar_expired.count > 0 %}
<h2>Похожие на «{{ keyword.request|title }}» знаки, для которых возможна регистрация</h2>
<p>Исключительные права на эти товарные знаки не продлили, поэтому их <a href="http://zuykov.com/ru/trademarks/registraciya-tovarnogo-znaka/">регистрация</a> возможна после проведения <a href="http://zuykov.com/ru/trademarks/poisk-tovarnogo-znaka/">полного поиска</a>.</p>
<ul class="trademark-search-results load-more-results list-inline list-unstyled">
<li>
<h2>Похожие на «{{ keyword.request|title }}» знаки, для которых возможна регистрация</h2>
<p>Исключительные права на эти товарные знаки не продлили, поэтому их <a href="http://zuykov.com/ru/trademarks/registraciya-tovarnogo-znaka/">регистрация</a> возможна после проведения <a href="http://zuykov.com/ru/trademarks/poisk-tovarnogo-znaka/">полного поиска</a>.</p>
</li>
{% for tm in similar_expired %}
{% include 'trademark/search_list_item.html' with tm=tm %}
{% endfor %}
@ -101,8 +113,9 @@
{% endif %}
{% if contains.count > 0 %}
<h2>Похожие на «{{ keyword.request|title }}» торговые марки</h2>
<ul class="trademark-search-results load-more-results list-inline list-unstyled">
<h2>Похожие на «{{ keyword.request|title }}» торговые марки</h2>
{% for tm in contains %}
{% include 'trademark/search_list_item.html' with tm=tm %}
{% endfor %}
@ -114,8 +127,9 @@
{% endif %}
{% if similar.count > 0 %}
<h2>Знаки схожие с «{{ keyword.request|title }}»</h2>
<ul class="trademark-search-results load-more-results list-inline list-unstyled">
<h2>Знаки схожие с «{{ keyword.request|title }}»</h2>
{% for tm in similar %}
{% include 'trademark/search_list_item.html' with tm=tm %}
{% endfor %}
@ -125,6 +139,15 @@
</ul>
{% endif %}
<script type="text/javascript">
var searchResults = TrademarkSearchResult('.app-trademark');
searchResults.expand();
</script>
{% endblock %}
{% addtoblock 'js' %}
<script type="text/javascript">
var ebala = 1;
</script>
{% endaddtoblock %}

@ -1,7 +1,6 @@
<li class='trademark-search-result-contains load-more-result {% if tm.status == "Expired" %}trademark-search-result-expired{% endif %}'>
<li class='trademark-search-result-contains load-more-result trademark-search-result {% for class in tm.nices.all %}c{{ class.nice_id }} {% endfor %} {% if tm.status == "Expired" %}trademark-search-result-expired{% endif %}'>
<a href='/ru/trademarks/online-search/trademark/{{ tm.id }}/'>
<div class='trademark-search-result-image' style="background-image: url({{ tm.image_url }});">
<img class="trademark-search-result-image-print" src='{{ tm.image_url }}' />
{% if not tm.image_url %}
<h4>{{ tm.title|title }}</h4>
{% endif %}

@ -5,10 +5,11 @@
{% block title %}Товарный знак «{{ tm.title }}» — заявка, свидетельство, классы{% endblock %}
{% block trademark_content %}
{% include 'trademark/breadcrumb.html' with trademark=tm.title %}
<div class="row">
<div class="col-xs-12 col-sm-8">
<h1>Товарный знак «{{ tm.title }}»</h1>
<p><a href="{{ request.META.HTTP_REFERER }}">Вернуться к результатам поиска</a></p>
<ul class="list-unstyled row">
<li class='col-xs-4'>
<h2>Подана заявка <nobr>{{ tm.application_at }}</nobr></h2>

@ -1,4 +1,4 @@
GetNoun = function(number, one, two, five) {
GetNoun = function(number, one, two, five) {
number = Math.abs(number);
number %= 100;
if (number >= 5 && number <= 20) {
@ -96,8 +96,6 @@ detectRegion = function() {
var current_region = regions[region_name] || regions[country_code]
console.log(current_region);
if(typeof current_region !== "undefined") {
$('.city').text(current_region['city']);
$('.header-contacts .consultation h3').text(current_region['phone']);
@ -123,20 +121,12 @@ detectRegion = function() {
$(function() {
var csrftoken = getCookie('csrftoken');
$( "[href^=mailto]" ).click(function() {
yaCounter950321.reachGoal('EmailClick');
ga('send', 'event', 'Communication', 'email', document.title);
});
$( "[href^='#service-form-submit']" ).click(function(e) {
e.preventDefault();
$('.service-calculator form').submit();
});
$( ".header-promo a" ).click(function(e) {
yaCounter950321.reachGoal('PromoClick');
ga('send', 'event', 'Promo', 'click', document.title);
});
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
@ -150,7 +140,9 @@ $(function() {
}
});
detectRegion();
// Pr
});

@ -1,194 +0,0 @@
$(function(){
// SearchForm
function send () {
var request = $("#trademark-search-request").val(),
$form = $('.trademark-search-form'),
$loading = $('.trademark-search-loading'),
$status_list = $('.trademark-search-loading-status'),
$count = $('#trademark-search-count'),
$title = $('#trademark-search-request-value'),
$sending = $('#trademark-search-sending'),
$identity = $('#trademark-search-identity'),
$contains = $('#trademark-search-contains'),
$similar = $('#trademark-search-similar'),
$wait = $('#trademark-search-wait'),
slug = '',
iteration = 0;
function update_status(data) {
var identity = data['identity'],
contains = data['contains'],
similar = data['similar'],
completed = identity['status'] == 'finished' && contains['status'] == 'finished' && similar['status'] == 'finished',
almost_completed = identity['status'] == 'finished' && contains['status'] == 'finished' && identity['count'] > 0,
show_link = identity['status'] == 'finished' || contains['status'] == 'finished' || similar['status'] == 'finished',
tm_url = '/ru/trademarks/online-search/results/' + slug + '/';
if(identity['status'] == 'finished') {
var count = identity['count'];
if(count > 0) {
$identity.text(GetNoun(count, 'Найден', 'Найдены', 'Найдено') + ' '+ count + ' ' + GetAdj(count, 'такой', 'таких') + ' ' + GetNoun(count, 'знак', 'знака', 'знаков')+ ' в ' + identity['nices'] + ' ' + GetNoun(identity['nices'], 'классе', 'классах', 'классах'));
} else {
$identity.text('Точно таких же знаков не найдено');
}
}
if(contains['status'] == 'finished') {
var count = contains['count'];
if(count > 0) {
$contains.text(GetNoun(count, 'Обнаружен', 'Обнаружены', 'Обнаружено') + ' ' + count + ' ' + GetAdj(count, 'похожий', 'похожих') + ' ' + GetNoun(count, 'знак', 'знака', 'знаков'));
} else {
$contains.text('Похожих знаков не обнаружено');
}
}
if(similar['status'] == 'finished') {
var count = similar['count'];
if(count > 0) {
$similar.text(GetNoun(count, 'Подобран', 'Подобраны', 'Подобрано') + ' ' + count + ' ' + GetAdj(count, 'производный', 'производных') + ' ' + GetNoun(count, 'знак', 'знака', 'знаков'));
} else {
$similar.text('Не удалось подобрать производных знаков');
}
}
if(iteration > 3) {
$wait.show(500);
}
if(show_link && iteration > 5) {
var href = ''
$wait.html('<a href="' + tm_url + '">Остановить поиск и перейти к результатам</a>');
} else {
console.log(iteration);
}
if(completed || almost_completed) {
yaCounter950321.reachGoal('TrademarkSearchResults');
ga('send', 'event', 'TrademarkSearch', 'results', document.title);
document.location.href = tm_url;
} else {
iteration += 1;
setTimeout(function () {
get_status(slug);
}, 10000);
}
}
function get_status(slug) {
try {
$.get("/ru/trademarks/online-search/request/" + slug + "/").done(function(data) {
update_status(data);
});
} catch (err) {
setTimeout(function () {
get_status(slug);
}, 5000);
}
}
yaCounter950321.reachGoal('TrademarkSearchClick');
ga('send', 'event', 'TrademarkSearch', 'click', document.title);
// Show Loading Block
$title.text(request);
$form.hide();
$loading.show();
$sending.show();
$.post("/ru/trademarks/online-search/request/",
{ 'keyword': request}).done(function(data) {
var tm_count = Math.floor(Math.random() * (3000000 - 1000000) + 1000000);
$('.trademark-search-count').text(tm_count.toLocaleString() + ' знаков')
$count.show(500);
$identity.delay(3000).show(500);
$contains.delay(6000).show(500);
$similar.delay(12000).show(500);
slug = data['slug'];
update_status(data);
})
.fail(function(data) {
console.log( "error " );
console.log(data);
})
.always(function(data) {
console.log( "finished" );
console.log(data);
$sending.hide()
});
}
$('#trademark-search-example').click(function(event) {
var keyword = $('#trademark-search-example').text();
event.preventDefault();
$("#trademark-search-request").val(keyword);
});
$('#trademark-search-request').keypress(function (e) {
if (e.which == 13) {
send();
return false; //<---- Add this line
}
});
$('#trademark-search-submit').click(function(){
send();
});
// Results
$('.trademark-search-show-products').each(function() {
var product_id = $(this).attr('product-id')
$(this).click(function () {
var $list = $('');
$('.trademark-search-nice-busy-products[product-id=' + product_id + ']').slideToggle('slow');
});
});
$('.load-more-results').each(function () {
var results_count = $(this).find(".load-more-result").size(),
showed = 6,
$this = $(this),
$count = $(this).find('.load-more-count');
function update_count() {
var count = results_count - showed;
if(count > 0) {
$this.find('.load-more-li').css('display', 'block');
} else {
$this.find('.load-more-li').css('display', 'none');
}
if($this.attr('list-type') == 'nices') {
$count.text(count + ' ' + GetNoun(count, 'класс', 'класса', 'классов'));
} else {
$count.text(count + ' ' + GetNoun(count, 'знак', 'знака', 'знаков'));
}
}
function show_more() {
var display_value = 'inline-block'
if($this.attr('list-type') == 'nices') {
display_value = 'block'
}
$this.find('.load-more-result:lt(' + showed + ')').css('display', display_value);
}
show_more();
update_count();
$this.find('.load-more').click(function () {
showed = ( showed + 6 <= results_count) ? showed + 6 : results_count;
show_more();
update_count();
});
});
});

@ -30,7 +30,6 @@
@import 'nice.less';
@import 'search.less';
.container {
width: 100%;

@ -11,7 +11,7 @@
<div class="plugin-people people-detail row">
<div class="people-detail-visual">
{% if person.visual %}
<img src="{{ person.visual.url }}" alt="{{ person.name }}" />
<img src="{% thumbnail person.visual.url 530x800 crop %}" alt="{{ person.name }}" />
{% endif %}
</div>
<div class="people-detail-description">
@ -29,6 +29,7 @@
<h2>Статьи</h2>
<ul class="articles list-unstyled">
{% for article in person.blog_post_author.all %}
{{ article }}
<li><a href="{{ article.get_absolute_url }}">{{ article.title }}</a>
&nbsp;<small class="date">{{ article.date_published|date:"DATE_FORMAT" }}</small></li>
{% endfor %}

@ -10,7 +10,7 @@
<meta name="google-site-verification" content="EoS8MgJcpPun9wGnGcnkZwIscIul2QSCu-gDPQ5hWew" />
<meta name='yandex-verification' content='5a95933195045ad8' />
{% stylesheet 'trademark.main' %}
{% stylesheet 'main' %}
{% javascript 'vendor' %}
{% javascript 'main' %}

@ -18,7 +18,7 @@
</div>
{% endif %}
<div class="form-wrapper">
<form action="{{ form.submission_url }}" method="POST" enctype="multipart/form-data" class="{% if form.email %}form_consult{% else %}form_callback{% endif %}" onsubmit="yaCounter950321.reachGoal('Callback'); ga('send', 'event', 'Communication', 'callback', document.title); return true;">
<form action="{{ form.submission_url }}" method="POST" enctype="multipart/form-data" class="{% if form.email %}form_consult{% else %}form_callback{% endif %}">
<div class="form-errors" style="display:none;"></div>
<div class="field-wrapper">
@ -104,7 +104,7 @@
</div>
</script>
<button class="btn btn-consultation {% if form.email %}form_consult{% else %}btn_callback{% endif %}" ng-click="open('{{ instance.id }}');" onclick="yaCounter950321.reachGoal('CallbackOpen'); ga('send', 'event', 'Communication', 'callback_open', document.title); return true;" value="">{{ instance.title }}</button>
<button class="btn btn-consultation {% if form.email %}form_consult{% else %}btn_callback{% endif %}" ng-click="open('{{ instance.id }}');" value="">{{ instance.title }}</button>
</div>
@ -118,8 +118,6 @@
event.preventDefault();
angular.element($('.consultation-form')[0]).scope().open({{ instance.id }});
yaCounter950321.reachGoal('CallbackOpen');
ga('send', 'event', 'Communication', 'callback_open');
});
consultation_link = true;

@ -0,0 +1,66 @@
{% load i18n %}
{% verbatim %}
<div class="nice" ng-controller="NiceCtrl">
<div id="{{ tabs_list_id }}" ng-tabs class="nice-tabs tabs-plugin">
{% endverbatim %}
<ul class="tabs-list list-unstyled list-inline">
<li ng-tab-head="active"><a ng-click="$event.preventDefault()" href="#nice-catalog">{% trans 'Classes Catalog' %}</a></li>
<li ng-tab-head="active"><a ng-click="$event.preventDefault()" href="#nice-all">{% trans 'All Classes' %}</a></li>
</ul>
{% verbatim %}
<div class="nice-catalog tab-body" id="nice-catalog" ng-tab-body>
<div class="nice-categories">
<ul class="list-unstyled list-inline">
<li ng-repeat="category in categories track by category.id" ng-class="selectedCategory == category.id ? 'active' : ''">
<button ng-click="selectCategory(category.id)" class="btn btn-link">{{ category.title }}</button> <span class="category_size badge" id="category_{{ category.id }}_label">{{ category.selected.length || '' }}</span>
</li>
</ul>
</div>
<div class="nice-classes">
<ul class="list-unstyled">
<li ng-repeat="class in nice | filter:filterByCategory">
<label for="class_{{ class.id }}">
<input id="class_{{ class.id }}" type="checkbox" ng-model="class.selected" ng-change="setClasses()"/>
<strong>{{ class.id }}</strong> – {{ class.title }}
<button ng-show="class.description.length > 0" popover="{{ class.description }}" popover-title="{{ class.title }}" popover-trigger="mouseenter" popover-placement="bottom" class="btn btn-xs btn-default">···</button>
</label>
</li>
</ul>
</div>
</div>
<div class="nice-all tab-body" id="nice-all" ng-tab-body>
<ul class="list-unstyled list-inline">
<li ng-repeat="class in nice">
<label for="class_{{ class.id }}">
<input id="class_{{ class.id }}" type="checkbox" ng-model="class.selected" ng-change="setClasses()"/>
<strong>{{ class.id }}</strong> – {{ class.title }}
<button ng-show="class.description.length > 0" popover="{{ class.description }}" popover-title="{{ class.title }}" popover-trigger="mouseenter" popover-placement="bottom" class="btn btn-xs btn-default">···</button>
</label>
</li>
</ul>
</div>
</div>
{% endverbatim %}
{% if request.LANGUAGE_CODE == 'ru' %}
{% verbatim %}<h5 ng-show="classes_values.length > 0">{{ GetNoun(classes, 'Выбран', 'Выбраны', 'Выбрано') }} {{ classes }} {{ GetNoun(classes, 'класс', 'класса', 'классов') }}</h5>{% endverbatim %}
{% else %}
{% verbatim %}<h5 ng-show="classes_values.length > 0">Selected {{ classes }} {{ GetNoun(classes, 'сlass', 'сlasses', 'сlasses') }}</h5>{% endverbatim %}
{% endif %}
{% verbatim %}
<ul class="nice-selected list-unstyled list-inline">
<li ng-repeat="id in classes_values"><span class="label label-default"><strong>{{ nice[id-1].id }}</strong> – {{ nice[id-1].title }}</span></li>
</ul>
</div>
{% endverbatim %}

@ -22,7 +22,7 @@
</div>
{% endif %}
<div class="form-wrapper">
<form action="{{ form.submission_url }}" method="POST" enctype="multipart/form-data" class="request" onsubmit="yaCounter950321.reachGoal('Order'); ga('send', 'event', 'Service', 'order', document.title); return true;">
<form action="{{ form.submission_url }}" method="POST" enctype="multipart/form-data" class="request">
<div class="form-errors" style="display:none;"></div>
<div class="field-wrapper">
@ -103,7 +103,7 @@
</div>
</script>
<button class="btn btn-consultation btn_request xs-offset-bottom" ng-click="open('{{ instance.id }}');" onclick="yaCounter950321.reachGoal('OrderOpen'); ga('send', 'event', 'Service', 'order_open', document.title); return true;" value="">{{ instance.title }}</button>
<button class="btn btn-consultation btn_request xs-offset-bottom" ng-click="open('{{ instance.id }}');" value="">{{ instance.title }}</button>
{% if request.LANGUAGE_CODE == 'ru' %}
<p>Вы можете <em>обратить к нам с вопросом</em> или <em>заказать услугу</em> «{{ instance.name }}»</p>
{% else %}
@ -121,8 +121,6 @@
event.preventDefault();
angular.element($('.order-form')[0]).scope().open({{ instance.id }});
yaCounter950321.reachGoal('OrderOpen');
ga('send', 'event', 'Service', 'order_open', document.title);
});
consultation_link = true;

@ -46,70 +46,7 @@ var form = {
</div>
{% endif %}
{% verbatim %}
<div class="nice" ng-controller="NiceCtrl">
<div id="{{ tabs_list_id }}" ng-tabs class="nice-tabs tabs-plugin">
{% endverbatim %}
<ul class="tabs-list list-unstyled list-inline">
<li ng-tab-head="active"><a ng-click="$event.preventDefault()" href="#nice-catalog">{% trans 'Classes Catalog' %}</a></li>
<li ng-tab-head="active"><a ng-click="$event.preventDefault()" href="#nice-all">{% trans 'All Classes' %}</a></li>
</ul>
{% verbatim %}
<div class="nice-catalog tab-body" id="nice-catalog" ng-tab-body>
<div class="nice-categories">
<ul class="list-unstyled list-inline">
<li ng-repeat="category in categories track by category.id" ng-class="selectedCategory == category.id ? 'active' : ''">
<button ng-click="selectCategory(category.id)" class="btn btn-link">{{ category.title }}</button> <span class="category_size badge" id="category_{{ category.id }}_label">{{ category.selected.length || '' }}</span>
</li>
</ul>
</div>
<div class="nice-classes">
<ul class="list-unstyled">
<li ng-repeat="class in nice | filter:filterByCategory">
<label for="class_{{ class.id }}">
<input id="class_{{ class.id }}" type="checkbox" ng-model="class.selected" ng-change="setClasses()"/>
<strong>{{ class.id }}</strong> – {{ class.title }}
<button ng-show="class.description.length > 0" popover="{{ class.description }}" popover-title="{{ class.title }}" popover-trigger="mouseenter" popover-placement="bottom" class="btn btn-xs btn-default">···</button>
</label>
</li>
</ul>
</div>
</div>
<div class="nice-all tab-body" id="nice-all" ng-tab-body>
<ul class="list-unstyled list-inline">
<li ng-repeat="class in nice">
<label for="class_{{ class.id }}">
<input id="class_{{ class.id }}" type="checkbox" ng-model="class.selected" ng-change="setClasses()"/>
<strong>{{ class.id }}</strong> – {{ class.title }}
<button ng-show="class.description.length > 0" popover="{{ class.description }}" popover-title="{{ class.title }}" popover-trigger="mouseenter" popover-placement="bottom" class="btn btn-xs btn-default">···</button>
</label>
</li>
</ul>
</div>
</div>
{% endverbatim %}
{% if request.LANGUAGE_CODE == 'ru' %}
{% verbatim %}<h5 ng-show="classes_values.length > 0">{{ GetNoun(classes, 'Выбран', 'Выбраны', 'Выбрано') }} {{ classes }} {{ GetNoun(classes, 'класс', 'класса', 'классов') }}</h5>{% endverbatim %}
{% else %}
{% verbatim %}<h5 ng-show="classes_values.length > 0">Selected {{ classes }} {{ GetNoun(classes, 'сlass', 'сlasses', 'сlasses') }}</h5>{% endverbatim %}
{% endif %}
{% verbatim %}
<ul class="nice-selected list-unstyled list-inline">
<li ng-repeat="id in classes_values"><span class="label label-default"><strong>{{ nice[id-1].id }}</strong> – {{ nice[id-1].title }}</span></li>
</ul>
</div>
{% endverbatim %}
{% include 'form_template/nice.html' %}
<div class="form-wrapper">
<form action="{{ form.submission_url }}" method="POST" enctype="multipart/form-data">

@ -5,6 +5,7 @@
{% block content %}
{% placeholder "content" %}
{% if request.current_page != request.current_page.get_root %}
{% static_placeholder 'footer-page-content-'|add:request.current_page.get_root.reverse_id %}
{% endif %}

Loading…
Cancel
Save