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 %} |
||||||
{% 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" %} |
{% 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