Trademark update

master
fefa4ka 9 years ago
parent d08cd19c32
commit 7439ff1de0
  1. 4
      app/settings.py
  2. 2
      trademark/cms_app.py
  3. 81
      trademark/cms_appconfig.py
  4. 18
      trademark/cms_plugins.py
  5. 17
      trademark/lib/poiskznakov.py
  6. 6
      trademark/migrations/0001_initial.py
  7. 63
      trademark/models.py
  8. 11
      trademark/templates/trademark/base.html
  9. 152
      trademark/templates/trademark/form.html
  10. 11
      trademark/templates/trademark/index.html
  11. 23
      trademark/templates/trademark/registration.html
  12. 90
      trademark/templates/trademark/search_detail.html
  13. 7
      trademark/urls.py
  14. 123
      trademark/views.py
  15. 14
      zsite/static/js/snippets.js
  16. 3
      zsite/static/less/main.less
  17. 171
      zsite/static/less/search.less

@ -26,7 +26,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(__file__))
SECRET_KEY = '=%%a@whz46w1#=8ffk^a+8vya5fg-kz0ztyz!_@hdg-(5a9q+s'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
DEBUG = False
TEMPLATE_DEBUG = False
@ -278,7 +278,7 @@ INSTALLED_APPS = (
'easy_select2',
'promo',
# 'trademark',
'trademark',
)
SOUTH_MIGRATION_MODULES = {

@ -7,7 +7,7 @@ from .models import TrademarkConfig
class TrademarkApp(CMSConfigApp):
app_config = TrademarkConfig
# app_config = TrademarkConfig
name = _('Trademark')
urls = ['trademark.urls']
app_name = 'trademark'

@ -16,12 +16,7 @@ from parler.models import TranslatedFields
from cms.models.fields import PlaceholderField
class TrademarkConfig(TranslatableModel, AppHookConfig):
"""Adds some translatable, per-app-instance fields."""
translations = TranslatedFields(
app_title=models.CharField(_('application title'), max_length=234),
)
class TrademarkConfig(AppHookConfig):
# search_PAGINATE_BY
paginate_by = models.PositiveIntegerField(
_('Paginate size'),
@ -30,43 +25,43 @@ class TrademarkConfig(TranslatableModel, AppHookConfig):
help_text=_('When paginating list views, how many articles per page?'),
)
placeholder_base_top = PlaceholderField(
'trademark_search_base_top',
related_name='search_base_top',
)
placeholder_base_sidebar = PlaceholderField(
'trademark_search_base_sidebar',
related_name='search_base_sidebar',
)
placeholder_list_top = PlaceholderField(
'trademark_search_list_top',
related_name='search_list_top',
)
placeholder_list_footer = PlaceholderField(
'trademark_search_list_footer',
related_name='search_list_footer',
)
placeholder_detail_top = PlaceholderField(
'trademark_search_detail_top',
related_name='search_detail_top',
)
placeholder_detail_bottom = PlaceholderField(
'trademark_search_detail_bottom',
related_name='search_detail_bottom',
)
placeholder_detail_footer = PlaceholderField(
'trademark_search_detail_footer',
related_name='search_detail_footer',
)
def get_app_title(self):
return getattr(self, 'app_title', _('untitled'))
# placeholder_base_top = PlaceholderField(
# 'trademark_search_base_top',
# related_name='search_base_top',
# )
# placeholder_base_sidebar = PlaceholderField(
# 'trademark_search_base_sidebar',
# related_name='search_base_sidebar',
# )
# placeholder_list_top = PlaceholderField(
# 'trademark_search_list_top',
# related_name='search_list_top',
# )
# placeholder_list_footer = PlaceholderField(
# 'trademark_search_list_footer',
# related_name='search_list_footer',
# )
# placeholder_detail_top = PlaceholderField(
# 'trademark_search_detail_top',
# related_name='search_detail_top',
# )
# placeholder_detail_bottom = PlaceholderField(
# 'trademark_search_detail_bottom',
# related_name='search_detail_bottom',
# )
# placeholder_detail_footer = PlaceholderField(
# 'trademark_search_detail_footer',
# related_name='search_detail_footer',
# )
# def get_app_title(self):
# return getattr(self, 'app_title', _('untitled'))
# class TrademarkConfigForm(AppDataForm):

@ -0,0 +1,18 @@
# # -*- coding: utf-8 -*-
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
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"
def render(self, context, instance, placeholder):
return context
plugin_pool.register_plugin(TrademarkSearchPluginPublisher) # register the plugin

@ -32,7 +32,7 @@ class TrademarkSearchAPI():
'module': 'search',
'procedure': 'make_search',
'search_type': 'wdesc',
'search_string': str(keyword),
'search_string': keyword,
'databases': [21],
'use_translit': 'true',
'skip_expired': 'false',
@ -41,9 +41,13 @@ class TrademarkSearchAPI():
if similarity < 100:
request['search_method'] = 'similarity'
request['minimum_similarity'] = similarity
else:
if similarity == 100:
request['search_method'] = 'containment'
if similarity == 146:
request['search_method'] = 'identity'
return self.send_request(request)
def get_status(self, search_id):
@ -58,11 +62,9 @@ class TrademarkSearchAPI():
def get_results(self, search_id):
# Если не готов результат, то ничего не делаем
status = self.get_status(search_id)
print status
if status['search_status'] != 'finished':
print status
return {}
return {}, status
request = {
'module': 'search',
@ -72,7 +74,10 @@ class TrademarkSearchAPI():
}
data = self.send_request(request)
return data['records_list']['21']['records']
if int(data['total_records_found']) > 0:
return data['records_list']['21']['records'], status
else:
return None, status
def get_details(self, ids, keys):
request = {

@ -4,10 +4,14 @@ from __future__ import unicode_literals
from django.db import models, migrations
import app_data.fields
import cms.models.fields
import parler.models
class Migration(migrations.Migration):
dependencies = [
('cms', '0012_auto_20150607_2207'),
]
operations = [
migrations.CreateModel(
name='Keyword',

@ -93,10 +93,18 @@ class Keyword(models.Model):
def __str__(self):
return self.request
@property
def contains_results(self):
search = self.searches.filter(similarity=100)[0]
return search.results.all().order_by('similarity')
def create_searches(self):
identity = Search(keyword_id=self.id, similarity=146)
contains = Search(keyword_id=self.id, similarity=100)
similar = Search(keyword_id=self.id, similarity=97)
searches = [contains, similar]
searches = [identity, contains, similar]
for search in searches:
search.save()
@ -131,6 +139,12 @@ class Search(models.Model):
def __str__(self):
return self.keyword.request
@property
def nices(self):
nices = self.results.values_list('nices__nice_id', flat=True).distinct()
return nices
def send_request(self):
data = TrademarkAPI.search_trademark(keyword=self.keyword.request, similarity=self.similarity)
@ -140,12 +154,36 @@ class Search(models.Model):
def get_results(self):
results = TrademarkAPI.get_results(self.search_id)
results, status = TrademarkAPI.get_results(self.search_id)
if status['search_status'] == 'failed':
self.send_request
return
if results == None:
self.status = 'finished'
self.save()
return
if results == {}:
self.status = status['progress']
for key, trademark in results.iteritems():
owner, created = Owner.objects.get_or_create(title=trademark['owner'][0]['name'])
if trademark['siml'] < 97 and self.similarity < 100:
continue
try:
tm = Trademark.objects.get(ext_id=int(trademark['id']))
result = SearchResult(search=self, trademark=tm, similarity=trademark['siml'])
result.save()
continue
except:
pass
owner, created = Owner.objects.get_or_create(title=trademark['owner'][0]['name'].encode('utf-8'))
instance, created = Trademark.objects.get_or_create(
instance = Trademark(
title=trademark['wdesc'],
application_id=trademark['appnum'],
cert_id=trademark['certnum'],
@ -156,16 +194,16 @@ class Search(models.Model):
application_at=trademark['dateapp'],
registration_at=trademark['datereg'],
ext_id=trademark['id'],
ext_id=int(trademark['id']),
access_key=trademark['access_key']
)
instance.save()
for nice_id in trademark['icgs']:
nice, created = Nice.objects.get_or_create(nice_id=nice_id)
instance.nices.add(nice)
instance.save()
result = SearchResult(search=self, trademark=instance, similarity=trademark['siml'])
result.save()
@ -176,19 +214,22 @@ class Search(models.Model):
if len(trademark_ids) == 0:
return
self.status = 'finished'
self.save()
details = TrademarkAPI.get_details(ids=trademark_ids, keys=trademark_keys)
for key, trademark in details.iteritems():
instance = Trademark.objects.get(ext_id=trademark['id'])
instance.owner.name = trademark['owner'][0]['name']
# instance.owner.name = trademark['owner'][0]['name']
instance.source_url = trademark.get('source', '')
instance.expiration_at = trademark.get('dateexp', '')
instance.renewed_at = trademark.get('renewed', '')
instance.save()
self.status = 'finished'
self.save()
class SearchResult(models.Model):
@ -196,6 +237,8 @@ class SearchResult(models.Model):
trademark = models.ForeignKey(Trademark, on_delete=models.CASCADE)
similarity = models.IntegerField()
class Meta:
ordering = ('similarity',)
@receiver(pre_save, sender=Keyword)
def update_fields(sender, instance, **kwargs):

@ -1,6 +1,11 @@
{% extends 'base.html' %}
{% block content %}
{% extends CMS_TEMPLATE %}
{% block content_safe %}
<div class="app app-trademark span8">
{% block trademark_content %}
{% endblock %}
{% endblock %}
</div>
{% endblock content_safe %}

@ -0,0 +1,152 @@
{% block trademark_content %}
<div class="trademark-search">
<div class="trademark-search-form">
<div class="trademark-search-field input-group">
<input id="trademark-search-request" type="text" placeholder="Название товарного знака" class="form-control">
<span class="input-group-btn">
<button id="trademark-search-submit" class="btn btn-primary" type="button">Найти</button>
</span>
</div>
<example>Например: <a id="trademark-search-example" href="#">Yandex</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="spinner">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
<div class="rect4"></div>
<div class="rect5"></div>
</div>
</div>
<ul class="list-unstyled trademark-search-loading-status">
<li id="trademark-search-sending"><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-identity"><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-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">
<div class="rect1"></div>
<div class="rect2"></div>
<div class="rect3"></div>
<div class="rect4"></div>
<div class="rect5"></div>
</div> Подбор производных знаков</li>
</ul>
</div>
</div>
<script type="text/javascript">
$(function(){ // I use jQuery in this example
function send () {
var request = $("#trademark-search-request").val(),
$form = $('.trademark-search-form'),
$loading = $('.trademark-search-loading'),
$status_list = $('.trademark-search-loading-status'),
$title = $('#trademark-search-request-value'),
$sending = $('#trademark-search-sending'),
$identity = $('#trademark-search-identity'),
$contains = $('#trademark-search-contains'),
$similar = $('#trademark-search-similar'),
slug = '';
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;
if(identity['status'] == 'finished') {
$identity.text('Найдено ' + identity['count'] + ' таких знаков в ' + identity['nices'] + ' классах');
}
if(contains['status'] == 'finished') {
$contains.text('Обнаружено ' + contains['count'] + ' похожих знака');
}
if(similar['status'] == 'finished') {
$similar.text('Подобрано ' + similar['count'] + ' производных знаков');
}
if(completed || almost_completed) {
document.location.href = '/ru/trademarks/online-search/results/' + slug + '/';
} else {
setTimeout(function () {
get_status(slug);
}, 5000);
}
}
function get_status(slug) {
$.get("/ru/trademarks/online-search/request/" + slug + "/").done(function(data) {
update_status(data);
});
}
// Show Loading Block
$title.text(request);
$form.hide();
$loading.show();
$sending.show();
$.post("/ru/trademarks/online-search/request/",
{ 'keyword': request}).done(function(data) {
console.log( "second success" );
console.log(data);
$identity.show(500);
$contains.delay(3000).show(500);
$similar.delay(5000).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) {
event.preventDefault();
$("#trademark-search-request").val('Yandex');
});
$('#trademark-search-request').keypress(function (e) {
if (e.which == 13) {
send();
return false; //<---- Add this line
}
});
$('#trademark-search-submit').click(function(){
send();
});
});
</script>
{% endblock %}

@ -0,0 +1,11 @@
{% extends "trademark/base.html" %}
{% block trademark_content %}
<h1>История поисков товарных знаков</h1>
<ul class="trademarks-searches">
{% for tm in trademarks %}
<li><a href="results/{{ tm.slug }}">{{ tm.request|title }}</a></li>
{% endfor %}
</ul>
{% endblock %}

@ -0,0 +1,23 @@
{% if nice_available.count > 0 %}
<div class="trademark-register-block">
<h1>Зарегистрируйте товарный знак <nobr>«{{ keyword.request|title }}»</nobr></h1>
<div class="description">
<p>
Регистрация доступна в {{ nice_available.count }} классах товаров и услуг.</p>
<p>Мы готовы оказать вам <a href="#">услуги по оформлению и подаче заявки на регистрацию</a> товарного знака и вести переписку с Роспатентом до получения свидетельства в России на товарный знак.</p>
</div>
<button class="btn btn-primary">Зарегистрировать</button>
<div class="price">от 14 000 ₽</div>
{% if nice_available.count < 45 and nice_available.count < nice_busy.count %}
<div>
<h2>Доступные классы для регистрации:</h2>
<ul class="trademark-search-available-classes list-unstyled">
{% for class in nice_available %}
<li> <button class="btn btn-xs btn-default">{{ class.nice_id }}</button> {{ class.title }}</li>
{% endfor %}</ul>
</div>
{% endif %}
</div>
{% endif %}

@ -1,2 +1,92 @@
{% extends "trademark/base.html" %}
{% block trademark_content %}
<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 list-inline list-unstyled">
{% for tm in identity %}
<li class="trademark-search-result">
{% if tm.image_url %}
<img src="{{ tm.image_url }}" width=150>
{% else %}
<h4>{{ tm.title|title }}</h4>
{% endif %}
<p>{{ tm.title|title }}</p>
<span>{% for class in tm.nices.all %}<button class="btn btn-xs btn-default">{{ class.nice_id }}</button>{% endfor %}</span>
</li>
{% endfor %}
</ul>
<div class="trademark-search-nice-busy">
<h2>«{{ keyword.request|title }}» нельзя использовать в следующих сферах</h2>
<ul class="trademark-search-available-classes list-unstyled">
{% for class in nice_busy %}
<li> <button class="btn btn-xs btn-default">{{ class.nice_id }}</button> {{ class.title }}</li>
{% endfor %}
</ul>
</div>
{% else %}
<h1>Товарный знак «{{ keyword.request|title }}» не зарегистрирован в базе свидетельств Роспатента</h1>
<p>Знак, который вы выбрали, пока не зарегистрирован, но кто-то мог подать заявку на регистрацию сходного знака. Это означает, что существуюет вероятность, что вам могут отказать в регистрации вашего знака.</p>
<p>
Так же есть ряд законодательных требований, которым должен соответствовать знак, не выполнение которых может привести к отказу в регистрации вашего знака.</p>
<p>
<p>Если же вы заинтересованы в регистрации товарного знака, мы <a href="#">проведем поиск сходных знаков</a>, как уже зарегистрированных, так и заявок, поданных на регистрацию, а так же проверим ваш знак на соответствие требованиям законодательства. Это значительно (до 95%) увеличивает вероятность того, что ваш знак будет зарегистрирован.</p>
{% include 'trademark/registration.html' with nice_available=nice_available nice_busy=nice_busy %}
{% endif %}
</div>
<div class="col-xs-12 col-sm-4">
<div class="trademark-search-block">
<h2>Попробуйте проверить другой товарный знак</h2>
{% include 'trademark/form.html' %}
</div>
{% if identity.count > 0 %}
{% include 'trademark/registration.html' with nice_available=nice_available nice_busy=nice_busy %}
{% endif %}
</div>
</div>
{% if contains.count > 0 %}
<h2>Похожие на «{{ keyword.request|title }}» торговые марки</h2>
<ul class="trademark-search-results list-inline list-unstyled">
{% for tm in contains %}
<li class="trademark-search-result">
{% if tm.image_url %}
<img src="{{ tm.image_url }}" width=100>
{% else %}
<h4>{{ tm.title|title }}</h4>
{% endif %}
<p>{{ tm.title|title }}</p>
</li>
{% endfor %}
</ul>
{% endif %}
{% if similar.count > 0 %}
<h2>Знаки включающие в себя части от «{{ keyword.request|title }}»</h2>
<ul class="trademark-search-results list-inline list-unstyled">
{% for tm in similar %}
<li class="trademark-search-result">
{% if tm.image_url %}
<img src="{{ tm.image_url }}" width=100>
{% else %}
<h4>{{ tm.title|title }}</h4>
{% endif %}
<p>{{ tm.title|title }}</p>
</li>
{% endfor %}
</ul>
{% endif %}
{% endblock %}

@ -5,7 +5,8 @@ from django.conf.urls import patterns, url
from . import views
urlpatterns = patterns('',
# url(r'^search/$', views.IndexView.as_view(), name='index'),
url(r'^online_search/(?P<slug>[\w-]+)/$', views.SearchDetailView.as_view(), name='search-detail'),
url(r'^online_search/$', views.Search.as_view(), name='search'),
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^results/(?P<slug>[\w-]+)/$', views.SearchDetailView.as_view(), name='search-detail'),
url(r'^request/(?P<slug>[\w-]+)/$', views.Search.as_view(), name='search-detail'),
url(r'^request/$', views.Search.as_view(), name='search'),
)

@ -8,21 +8,46 @@ from django.http import HttpResponse
import json
from .models import *
from django.views.decorators.cache import never_cache
class SearchDetailView(generic.DetailView):
model = Keyword
context_object_name = 'post'
context_object_name = 'keyword'
template_name = 'trademark/search_detail.html'
slug_field = 'slug'
view_url_name = 'trademark:search-detail'
def get_context_data(self, **kwargs):
context = super(SearchDetailView, self).get_context_data(**kwargs)
identity = self.get_object().searches.filter(similarity=146)[0]
identity_results = identity.results.all()
context['identity'] = identity_results
identity_ids = identity_results.values_list('id', flat=True)
nice_busy_ids = identity_results.values_list('nices__nice_id', flat=True).distinct()
contains = self.get_object().searches.filter(similarity=100)[0]
contains_results = contains.results.all().exclude(id__in=identity_ids)
context['contains'] = contains_results
contains_ids = contains_results.values_list('id', flat=True)
similar = self.get_object().searches.filter(similarity=97)[0]
context['similar'] = similar.results.all().exclude(id__in=contains_ids | identity_ids)
context['nice_busy'] = Nice.objects.filter(nice_id__in=nice_busy_ids).order_by('nice_id')
context['nice_available'] = Nice.objects.filter(nice_id__in=[x for x in range(1,46) if x not in nice_busy_ids]).order_by('nice_id')
return context
class IndexView(generic.ListView):
template_name = 'trademark/index.html'
context_object_name = 'trademarks'
def get_queryset(self):
return []
return Keyword.objects.all()
@ -30,12 +55,66 @@ class Search(generic.View):
# def get(self, request):
# <view logic>
# return HttpResponse('result')
@never_cache
def get(self, request, slug):
keyword = get_object_or_404(Keyword, slug=slug)
identity = keyword.searches.filter(similarity=146)[0]
contains = keyword.searches.filter(similarity=100)[0]
similar = keyword.searches.filter(similarity=97)[0]
response = {
'identity': {
'id': identity.id,
'status': identity.status,
'nices': identity.nices.count(),
'count': identity.results.all().count()
},
'contains': {
'id': contains.id,
'status': contains.status,
'count': contains.results.all().count()
},
'similar': {
'id': similar.id,
'status': similar.status,
'count': similar.results.all().count()
},
'status': 'ok'
}
return HttpResponse(json.dumps(response), content_type='application/json')
try:
ids = [str(key) for key in keyword.searches.all().values_list('search_id', flat=True)]
return HttpResponse(json.dumps({ 'search_ids': ids, 'status': 'finished' }), content_type='application/json')
identity = keyword.searches.filter(similarity=146)[0]
contains = keyword.searches.filter(similarity=100)[0]
similar = keyword.searches.filter(similarity=97)[0]
response = {
'identity': {
'id': identity.id,
'status': identity.status,
'nices': identity.nices,
'count': identity.results.all().count()
},
'contains': {
'id': contains.id,
'status': contains.status,
'count': contains.results.all().count()
},
'similar': {
'id': similar.id,
'status': similar.status,
'count': similar.results.all().count()
},
'status': 'ok'
}
return HttpResponse(json.dumps(response), content_type='application/json')
except:
return HttpResponse(json.dumps({ 'status': 'error', 'description': 'Request not found', 'slug': slug }), content_type="application/json")
@ -44,9 +123,37 @@ class Search(generic.View):
keyword = request.POST.get('keyword', '')
if keyword:
k = Keyword.objects.get_or_create(request=keyword)
k.save()
k, created = Keyword.objects.get_or_create(request=keyword)
else:
return HttpResponse(json.dumps({ 'status': 'error', 'description': 'Empty request', 'ext': json.dump(request.POST)}), content_type="application/json")
return HttpResponse(json.dumps({ 'status': 'error', 'description': 'Empty request'}), content_type="application/json")
identity = k.searches.filter(similarity=146)[0]
contains = k.searches.filter(similarity=100)[0]
similar = k.searches.filter(similarity=97)[0]
response = {
'identity': {
'id': identity.id,
'status': identity.status,
'nices': identity.nices.count(),
'count': identity.results.all().count()
},
'contains': {
'id': contains.id,
'status': contains.status,
'count': contains.results.all().count()
},
'similar': {
'id': similar.id,
'status': similar.status,
'count': similar.results.all().count()
},
'slug': k.slug,
'status': 'ok'
}
return HttpResponse(json.dumps(response), content_type="application/json")
return HttpResponse(json.dumps({ 'status': 'ok' }), content_type="application/json")

@ -121,6 +121,8 @@ detectRegion = function() {
};
$(function() {
var csrftoken = getCookie('csrftoken');
$( "[href^=mailto]" ).click(function() {
yaCounter950321.reachGoal('EmailClick');
ga('send', 'event', 'Communication', 'email', document.title);
@ -136,6 +138,18 @@ $(function() {
ga('send', 'event', 'Promo', 'click', document.title);
});
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
detectRegion();

@ -30,8 +30,11 @@
@import 'nice.less';
@import 'search.less';
.container {
width: 100%;
padding-left: 25px;
padding-right: 30px;
}

@ -0,0 +1,171 @@
.trademark-search {
.trademark-search-form {
margin-bottom: 5px;
}
.trademark-search-field {
margin-left: -13px;
}
example {
font-size: 12px;
margin: 2px 0 5px 0;
}
}
.trademark-search-results {
.trademark-search-result {
margin-bottom: 15px;
margin-right: 5px;
text-align: center;
p {
margin-top: 10px;
border-top: 1px solid black;
width: 80%;
margin: 18px auto 0;
padding-top: 7px;
}
.btn-xs {
margin-right: 5px;
margin-top: 3px;
}
}
}
.trademark-search-available-classes {
.btn-xs {
width: 26px;
margin-bottom: 3px;
}
}
.trademark-search-nice-busy, .trademark-register-block {
border-radius: 5px;
padding: 15px 15px 10px;
margin-left: -15px;
margin-top: 30px;
.description {
margin: 5px 0;
}
.price {
display: block;
margin-top: 8px;
font-size: larger;
font-weight: bold;
}
}
.trademark-register-block {
background-color: #E8EEFC;
}
.trademark-search-nice-busy {
background-color: rgba(237, 208, 208, 0.36);
padding: 1px 15px;
h2 {
margin-top: 10px;
}
}
.trademark-search-loading {
display: none;
border: 1px solid silver;
border-radius: 6px;
background: white;
margin-left: -14px;
.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);
}
}
Loading…
Cancel
Save