parent
d08cd19c32
commit
7439ff1de0
17 changed files with 720 additions and 78 deletions
@ -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 |
||||
@ -1,6 +1,11 @@ |
||||
{% extends 'base.html' %} |
||||
|
||||
{% block content %} |
||||
{% block trademark_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 %} |
||||
@ -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…
Reference in new issue