diff --git a/app/settings.py b/app/settings.py index 7f37405..8e609bc 100644 --- a/app/settings.py +++ b/app/settings.py @@ -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', diff --git a/trademark/cms_plugins.py b/trademark/cms_plugins.py index 691badb..7fc7005 100644 --- a/trademark/cms_plugins.py +++ b/trademark/cms_plugins.py @@ -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 diff --git a/trademark/migrations/0001_initial.py b/trademark/migrations/0001_initial.py index 66aefa7..2c6f15e 100644 --- a/trademark/migrations/0001_initial.py +++ b/trademark/migrations/0001_initial.py @@ -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', diff --git a/trademark/models.py b/trademark/models.py index c113391..fc40494 100644 --- a/trademark/models.py +++ b/trademark/models.py @@ -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() diff --git a/trademark/static/trademark/js/app.js b/trademark/static/trademark/js/app.js new file mode 100644 index 0000000..10a9ad0 --- /dev/null +++ b/trademark/static/trademark/js/app.js @@ -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('Остановить поиск и перейти к результатам'); + } 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(); + }); +}); + + diff --git a/trademark/static/trademark/js/modal.js b/trademark/static/trademark/js/modal.js new file mode 100644 index 0000000..41a7586 --- /dev/null +++ b/trademark/static/trademark/js/modal.js @@ -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'); + }; +}]); \ No newline at end of file diff --git a/trademark/static/trademark/js/nice.js b/trademark/static/trademark/js/nice.js new file mode 100644 index 0000000..dff7d19 --- /dev/null +++ b/trademark/static/trademark/js/nice.js @@ -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] + } +]; diff --git a/trademark/static/trademark/js/nice_ctrl.js b/trademark/static/trademark/js/nice_ctrl.js new file mode 100644 index 0000000..65ce113 --- /dev/null +++ b/trademark/static/trademark/js/nice_ctrl.js @@ -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(); + }; + + +}]); \ No newline at end of file diff --git a/trademark/static/trademark/js/result.js b/trademark/static/trademark/js/result.js new file mode 100644 index 0000000..d2d9cec --- /dev/null +++ b/trademark/static/trademark/js/result.js @@ -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(); + } + } +}); \ No newline at end of file diff --git a/trademark/static/trademark/less/detail.less b/trademark/static/trademark/less/detail.less new file mode 100644 index 0000000..2b8d740 --- /dev/null +++ b/trademark/static/trademark/less/detail.less @@ -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%; + } + } +} \ No newline at end of file diff --git a/trademark/static/trademark/less/loading.less b/trademark/static/trademark/less/loading.less new file mode 100644 index 0000000..44850c7 --- /dev/null +++ b/trademark/static/trademark/less/loading.less @@ -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); + } +} diff --git a/trademark/static/trademark/less/main.less b/trademark/static/trademark/less/main.less new file mode 100644 index 0000000..5aeb8d1 --- /dev/null +++ b/trademark/static/trademark/less/main.less @@ -0,0 +1,4 @@ +@import 'result.less'; +@import 'detail.less'; +@import 'loading.less'; +@import 'modal.less'; \ No newline at end of file diff --git a/trademark/static/trademark/less/modal.less b/trademark/static/trademark/less/modal.less new file mode 100644 index 0000000..de49ee6 --- /dev/null +++ b/trademark/static/trademark/less/modal.less @@ -0,0 +1,5 @@ +.trademark-search-modal { + .modal-dialog { + width: 700px; + } +} \ No newline at end of file diff --git a/zsite/static/less/search.less b/trademark/static/trademark/less/result.less similarity index 57% rename from zsite/static/less/search.less rename to trademark/static/trademark/less/result.less index 99fea5c..8879956 100644 --- a/zsite/static/less/search.less +++ b/trademark/static/trademark/less/result.less @@ -62,18 +62,18 @@ text-align: center; padding: 3px; - + cursor: pointer; a { text-decoration: none; } - + .popover { color: #000 !important; } - + .trademark-search-result-image { background-position: center center; background-size: contain; @@ -99,7 +99,7 @@ .trademark-search-result:hover, .trademark-search-result-identity:hover, .trademark-search-result-contains:hover { border: 1px solid #ccc; border-radius: 5px; - + } } @@ -111,12 +111,16 @@ } .trademark-search-nice-busy, .trademark-register-block { - + border-radius: 5px; padding: 15px 15px 10px; 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%; - } - } -} \ No newline at end of file diff --git a/trademark/templates/trademark/base.html b/trademark/templates/trademark/base.html index 11cfca2..445217d 100644 --- a/trademark/templates/trademark/base.html +++ b/trademark/templates/trademark/base.html @@ -1,11 +1,14 @@ - - {% extends CMS_TEMPLATE %} +{% load i18n menu_tags cms_tags %} +{% block content %} +
Поиск происходит в {{ classes + GetNoun(classes, ' классе', ' классах', ' классах') }}
+Знак, который вы выбрали, уже используется в этих сферах. Это означает, что существуюет вероятность, что могут отказать в регистрации вашего знака.
- +Если же вы заинтересованы в регистрации этого товарного знака, мы проведем проверку и поиск товарного знака на возможность его регистрации.
Регистрация возможна в {{ nice_available.count }} классах товаров и услуг.
diff --git a/trademark/templates/trademark/search_detail.html b/trademark/templates/trademark/search_detail.html index 25f6e05..316f55b 100644 --- a/trademark/templates/trademark/search_detail.html +++ b/trademark/templates/trademark/search_detail.html @@ -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 %} +Исключительные права на эти товарные знаки не продлили, поэтому они доступны для регистрации в этих классах товаров и услуг.
+Исключительные права на эти товарные знаки не продлили, поэтому они доступны для регистрации в этих классах товаров и услуг.
Существует ряд законодательных требований, которым должен соответствовать знак, не выполнение которых может привести к отказу в регистрации вашего знака.
@@ -75,7 +84,7 @@
Исключительные права на эти товарные знаки не продлили, поэтому их регистрация возможна после проведения полного поиска.
+Исключительные права на эти товарные знаки не продлили, поэтому их регистрация возможна после проведения полного поиска.
+Вернуться к результатам поиска