parent
82a508dd06
commit
957fdfb72f
13 changed files with 645 additions and 0 deletions
@ -0,0 +1,8 @@ |
|||||||
|
#-*- coding: utf-8 -*- |
||||||
|
from django.apps import AppConfig |
||||||
|
|
||||||
|
|
||||||
|
class TrademarkConfig(AppConfig): |
||||||
|
name = 'trademark' |
||||||
|
verbose_name = "trademark" |
||||||
|
|
||||||
@ -0,0 +1,15 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from aldryn_apphooks_config.app_base import CMSConfigApp |
||||||
|
from cms.apphook_pool import apphook_pool |
||||||
|
from django.utils.translation import ugettext_lazy as _ |
||||||
|
|
||||||
|
from .models import TrademarkConfig |
||||||
|
|
||||||
|
|
||||||
|
class TrademarkApp(CMSConfigApp): |
||||||
|
app_config = TrademarkConfig |
||||||
|
name = _('Trademark') |
||||||
|
urls = ['trademark.urls'] |
||||||
|
app_name = 'trademark' |
||||||
|
|
||||||
|
apphook_pool.register(TrademarkApp) |
||||||
@ -0,0 +1,76 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from django import forms |
||||||
|
from django.conf import settings |
||||||
|
from django.db import models |
||||||
|
from django.utils.translation import ugettext_lazy as _ |
||||||
|
|
||||||
|
from aldryn_apphooks_config.utils import setup_config |
||||||
|
from aldryn_apphooks_config.models import AppHookConfig |
||||||
|
from app_data import AppDataForm |
||||||
|
from parler.models import TranslatableModel |
||||||
|
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), |
||||||
|
) |
||||||
|
|
||||||
|
# search_PAGINATE_BY |
||||||
|
paginate_by = models.PositiveIntegerField( |
||||||
|
_('Paginate size'), |
||||||
|
blank=False, |
||||||
|
default=5, |
||||||
|
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')) |
||||||
|
|
||||||
|
|
||||||
|
# class TrademarkConfigForm(AppDataForm): |
||||||
|
# default_published = forms.BooleanField( |
||||||
|
# label=_(u'Post published by default'), required=False, |
||||||
|
# initial=getattr(settings, 'search_DEFAULT_PUBLISHED', True)) |
||||||
|
# setup_config(searchConfigForm, searchConfig) |
||||||
@ -0,0 +1,100 @@ |
|||||||
|
#!/usr/bin/python |
||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
import urllib2 |
||||||
|
import json |
||||||
|
import threading |
||||||
|
import time |
||||||
|
|
||||||
|
class TrademarkSearchAPI(): |
||||||
|
login = "Zuykov" |
||||||
|
password = "Uodof8awdooLee9f" |
||||||
|
|
||||||
|
def __init__(self, *args, **options): |
||||||
|
pass |
||||||
|
|
||||||
|
def send_request(self, request): |
||||||
|
request['login'] = self.login |
||||||
|
request['password'] = self.password |
||||||
|
|
||||||
|
request_json = json.dumps(request, separators=(',', ':')) |
||||||
|
|
||||||
|
api_url = "https://api.poiskznakov.ru/" |
||||||
|
api_request = urllib2.Request(api_url , request_json, {'Content-Type': 'application/json'}) |
||||||
|
|
||||||
|
response = urllib2.urlopen(api_request) |
||||||
|
|
||||||
|
data = json.load(response) |
||||||
|
return data |
||||||
|
|
||||||
|
def search_trademark(self, keyword, similarity=100): |
||||||
|
request = { |
||||||
|
'module': 'search', |
||||||
|
'procedure': 'make_search', |
||||||
|
'search_type': 'wdesc', |
||||||
|
'search_string': str(keyword), |
||||||
|
'databases': [21], |
||||||
|
'use_translit': 'true', |
||||||
|
'skip_expired': 'false', |
||||||
|
} |
||||||
|
|
||||||
|
if similarity < 100: |
||||||
|
request['search_method'] = 'similarity' |
||||||
|
request['minimum_similarity'] = similarity |
||||||
|
else: |
||||||
|
request['search_method'] = 'containment' |
||||||
|
|
||||||
|
return self.send_request(request) |
||||||
|
|
||||||
|
def get_status(self, search_id): |
||||||
|
request = { |
||||||
|
'module': 'search', |
||||||
|
'procedure': 'check_status', |
||||||
|
'search_id': search_id |
||||||
|
} |
||||||
|
|
||||||
|
return self.send_request(request) |
||||||
|
|
||||||
|
def get_results(self, search_id): |
||||||
|
# Если не готов результат, то ничего не делаем |
||||||
|
status = self.get_status(search_id) |
||||||
|
print status |
||||||
|
|
||||||
|
if status['search_status'] != 'finished': |
||||||
|
print status |
||||||
|
return {} |
||||||
|
|
||||||
|
request = { |
||||||
|
'module': 'search', |
||||||
|
'procedure': 'get_result', |
||||||
|
'search_id': search_id, |
||||||
|
'databases': [21] |
||||||
|
} |
||||||
|
data = self.send_request(request) |
||||||
|
|
||||||
|
return data['records_list']['21']['records'] |
||||||
|
|
||||||
|
def get_details(self, ids, keys): |
||||||
|
request = { |
||||||
|
'module': 'detail', |
||||||
|
'procedure': 'get_detail_info', |
||||||
|
'marks': ids, |
||||||
|
'access_keys': keys |
||||||
|
} |
||||||
|
print ids |
||||||
|
print keys |
||||||
|
data = self.send_request(request) |
||||||
|
|
||||||
|
return data['records_list']['21']['records'] |
||||||
|
|
||||||
|
|
||||||
|
class SearchResultsThread(threading.Thread): |
||||||
|
def __init__(self, keyword, **kwargs): |
||||||
|
self.keyword = keyword |
||||||
|
super(SearchResultsThread, self).__init__(**kwargs) |
||||||
|
|
||||||
|
def run(self): |
||||||
|
loaded = False |
||||||
|
while not loaded: |
||||||
|
time.sleep(5) |
||||||
|
loaded = self.keyword.load_results() |
||||||
@ -0,0 +1,163 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
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): |
||||||
|
operations = [ |
||||||
|
migrations.CreateModel( |
||||||
|
name='Keyword', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
||||||
|
('request', models.CharField(max_length=200)), |
||||||
|
('slug', models.CharField(max_length=200)), |
||||||
|
('status', models.IntegerField(default=0)), |
||||||
|
('loaded', models.IntegerField(default=0)), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'keyword', |
||||||
|
'verbose_name_plural': 'keywords', |
||||||
|
}, |
||||||
|
bases=(models.Model,), |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='Nice', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
||||||
|
('nice_id', models.IntegerField()), |
||||||
|
('title', models.CharField(max_length=255)), |
||||||
|
('description', models.TextField()), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'nice', |
||||||
|
'verbose_name_plural': 'classes', |
||||||
|
}, |
||||||
|
bases=(models.Model,), |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='Owner', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
||||||
|
('title', models.CharField(max_length=255)), |
||||||
|
('country', models.CharField(max_length=4)), |
||||||
|
('address', models.CharField(max_length=255)), |
||||||
|
('legnat', models.CharField(max_length=255)), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'owner', |
||||||
|
'verbose_name_plural': 'owners', |
||||||
|
}, |
||||||
|
bases=(models.Model,), |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='Search', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
||||||
|
('search_id', models.CharField(max_length=100)), |
||||||
|
('similarity', models.IntegerField()), |
||||||
|
('status', models.CharField(max_length=20)), |
||||||
|
('loaded_at', models.DateField(auto_now_add=True)), |
||||||
|
('keyword', models.ForeignKey(related_name='searches', to='trademark.Keyword')), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'search', |
||||||
|
'verbose_name_plural': 'searches', |
||||||
|
}, |
||||||
|
bases=(models.Model,), |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='SearchResult', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
||||||
|
('similarity', models.IntegerField()), |
||||||
|
('search', models.ForeignKey(to='trademark.Search')), |
||||||
|
], |
||||||
|
options={ |
||||||
|
}, |
||||||
|
bases=(models.Model,), |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='Trademark', |
||||||
|
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()), |
||||||
|
('application_id', models.IntegerField()), |
||||||
|
('cert_id', models.IntegerField()), |
||||||
|
('image_url', models.URLField(blank=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)), |
||||||
|
('access_key', models.CharField(max_length=20)), |
||||||
|
('nices', models.ManyToManyField(to='trademark.Nice')), |
||||||
|
('owner', models.ForeignKey(to='trademark.Owner')), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'trademark', |
||||||
|
'verbose_name_plural': 'trademarks', |
||||||
|
}, |
||||||
|
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', |
||||||
|
field=models.ForeignKey(to='trademark.Trademark'), |
||||||
|
preserve_default=True, |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='search', |
||||||
|
name='results', |
||||||
|
field=models.ManyToManyField(to='trademark.Trademark', through='trademark.SearchResult'), |
||||||
|
preserve_default=True, |
||||||
|
), |
||||||
|
] |
||||||
@ -0,0 +1,212 @@ |
|||||||
|
#-*- coding: utf-8 -*- |
||||||
|
from django.db import models |
||||||
|
from django.db.models.signals import post_save, pre_save |
||||||
|
from django.dispatch import receiver |
||||||
|
|
||||||
|
from django.utils.translation import ugettext_lazy as _ |
||||||
|
|
||||||
|
from lib.poiskznakov import TrademarkSearchAPI, SearchResultsThread |
||||||
|
|
||||||
|
from unidecode import unidecode |
||||||
|
from django.template.defaultfilters import slugify |
||||||
|
from .cms_appconfig import TrademarkConfig |
||||||
|
|
||||||
|
|
||||||
|
TrademarkAPI = TrademarkSearchAPI() |
||||||
|
|
||||||
|
class Owner(models.Model): |
||||||
|
title = models.CharField(max_length=255) |
||||||
|
country = models.CharField(max_length=4) |
||||||
|
address = models.CharField(max_length=255) |
||||||
|
legnat = models.CharField(max_length=255) |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = _('owner') |
||||||
|
verbose_name_plural = _('owners') |
||||||
|
|
||||||
|
def __unicode__(self): # Python 3: def __str__(self): |
||||||
|
return self.title |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return self.title |
||||||
|
|
||||||
|
|
||||||
|
class Nice(models.Model): |
||||||
|
nice_id = models.IntegerField() |
||||||
|
title = models.CharField(max_length=255) |
||||||
|
description = models.TextField() |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = _('nice') |
||||||
|
verbose_name_plural = _('classes') |
||||||
|
|
||||||
|
def __unicode__(self): # Python 3: def __str__(self): |
||||||
|
return self.title |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return self.title |
||||||
|
|
||||||
|
|
||||||
|
class Trademark(models.Model): |
||||||
|
title = models.CharField(max_length=255) |
||||||
|
ext_id = models.IntegerField() |
||||||
|
application_id = models.IntegerField() |
||||||
|
cert_id = models.IntegerField() |
||||||
|
owner = models.ForeignKey(Owner) |
||||||
|
image_url = models.URLField(blank=True) |
||||||
|
nices = models.ManyToManyField(Nice) |
||||||
|
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) |
||||||
|
|
||||||
|
access_key = models.CharField(max_length=20) |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = _('trademark') |
||||||
|
verbose_name_plural = _('trademarks') |
||||||
|
|
||||||
|
def __unicode__(self): # Python 3: def __str__(self): |
||||||
|
return self.title |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return self.title |
||||||
|
|
||||||
|
|
||||||
|
class Keyword(models.Model): |
||||||
|
request = models.CharField(max_length=200) |
||||||
|
slug = models.CharField(max_length=200) |
||||||
|
status = models.IntegerField(default=0) |
||||||
|
loaded = models.IntegerField(default=0) |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = _('keyword') |
||||||
|
verbose_name_plural = _('keywords') |
||||||
|
|
||||||
|
def __unicode__(self): # Python 3: def __str__(self): |
||||||
|
return self.request |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return self.request |
||||||
|
|
||||||
|
def create_searches(self): |
||||||
|
contains = Search(keyword_id=self.id, similarity=100) |
||||||
|
similar = Search(keyword_id=self.id, similarity=97) |
||||||
|
searches = [contains, similar] |
||||||
|
|
||||||
|
for search in searches: |
||||||
|
search.save() |
||||||
|
search.send_request() |
||||||
|
|
||||||
|
def load_results(self): |
||||||
|
for search in self.searches.all(): |
||||||
|
if search.status != "finished": |
||||||
|
search.get_results() |
||||||
|
|
||||||
|
if len(self.searches.all()) == len(self.searches.filter(status="finished")): |
||||||
|
return True |
||||||
|
else: |
||||||
|
return False |
||||||
|
|
||||||
|
|
||||||
|
class Search(models.Model): |
||||||
|
keyword = models.ForeignKey(Keyword, related_name='searches') |
||||||
|
search_id = models.CharField(max_length=100) |
||||||
|
results = models.ManyToManyField(Trademark, through='SearchResult') |
||||||
|
similarity = models.IntegerField() |
||||||
|
status = models.CharField(max_length=20) |
||||||
|
loaded_at = models.DateField(auto_now_add=True) |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = _('search') |
||||||
|
verbose_name_plural = _('searches') |
||||||
|
|
||||||
|
def __unicode__(self): # Python 3: def __str__(self): |
||||||
|
return self.keyword.request |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return self.keyword.request |
||||||
|
|
||||||
|
def send_request(self): |
||||||
|
data = TrademarkAPI.search_trademark(keyword=self.keyword.request, similarity=self.similarity) |
||||||
|
|
||||||
|
self.search_id = data['search_id'] |
||||||
|
|
||||||
|
self.save() |
||||||
|
|
||||||
|
|
||||||
|
def get_results(self): |
||||||
|
results = TrademarkAPI.get_results(self.search_id) |
||||||
|
|
||||||
|
for key, trademark in results.iteritems(): |
||||||
|
owner, created = Owner.objects.get_or_create(title=trademark['owner'][0]['name']) |
||||||
|
|
||||||
|
instance, created = Trademark.objects.get_or_create( |
||||||
|
title=trademark['wdesc'], |
||||||
|
application_id=trademark['appnum'], |
||||||
|
cert_id=trademark['certnum'], |
||||||
|
owner=owner, |
||||||
|
image_url=trademark.get('image', ''), |
||||||
|
status=trademark['status'], |
||||||
|
|
||||||
|
application_at=trademark['dateapp'], |
||||||
|
registration_at=trademark['datereg'], |
||||||
|
|
||||||
|
ext_id=trademark['id'], |
||||||
|
access_key=trademark['access_key'] |
||||||
|
) |
||||||
|
|
||||||
|
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() |
||||||
|
|
||||||
|
trademark_ids = [int(ext_id) for ext_id in self.results.values_list('ext_id', flat=True)] |
||||||
|
trademark_keys = [str(key) for key in self.results.values_list('access_key', flat=True)] |
||||||
|
|
||||||
|
if len(trademark_ids) == 0: |
||||||
|
return |
||||||
|
|
||||||
|
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.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): |
||||||
|
search = models.ForeignKey(Search, on_delete=models.CASCADE) |
||||||
|
trademark = models.ForeignKey(Trademark, on_delete=models.CASCADE) |
||||||
|
similarity = models.IntegerField() |
||||||
|
|
||||||
|
|
||||||
|
@receiver(pre_save, sender=Keyword) |
||||||
|
def update_fields(sender, instance, **kwargs): |
||||||
|
if instance._state.adding is True: |
||||||
|
instance.slug = slugify(unidecode(instance.request)) |
||||||
|
|
||||||
|
instance.loaded = instance.loaded + 1 |
||||||
|
|
||||||
|
@receiver(post_save, sender=Keyword) |
||||||
|
def create_searches(sender, instance, created, **kwargs): |
||||||
|
if created: |
||||||
|
instance.create_searches() |
||||||
|
|
||||||
|
SearchResultsThread(instance).start() |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
|
||||||
|
{% block content %} |
||||||
|
{% block trademark_content %} |
||||||
|
{% endblock %} |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
{% extends "trademark/base.html" %} |
||||||
|
|
||||||
@ -0,0 +1,11 @@ |
|||||||
|
#-*- coding: utf-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'), |
||||||
|
) |
||||||
@ -0,0 +1,52 @@ |
|||||||
|
#-*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# from django.core.urlresolvers import reverse |
||||||
|
# from django.http import HttpResponseRedirect |
||||||
|
from django.shortcuts import get_object_or_404 |
||||||
|
from django.views import generic |
||||||
|
from django.http import HttpResponse |
||||||
|
import json |
||||||
|
|
||||||
|
from .models import * |
||||||
|
|
||||||
|
class SearchDetailView(generic.DetailView): |
||||||
|
model = Keyword |
||||||
|
context_object_name = 'post' |
||||||
|
template_name = 'trademark/search_detail.html' |
||||||
|
slug_field = 'slug' |
||||||
|
view_url_name = 'trademark:search-detail' |
||||||
|
|
||||||
|
|
||||||
|
class IndexView(generic.ListView): |
||||||
|
template_name = 'trademark/index.html' |
||||||
|
context_object_name = 'trademarks' |
||||||
|
|
||||||
|
def get_queryset(self): |
||||||
|
return [] |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Search(generic.View): |
||||||
|
# def get(self, request): |
||||||
|
# <view logic> |
||||||
|
# return HttpResponse('result') |
||||||
|
def get(self, request, slug): |
||||||
|
keyword = get_object_or_404(Keyword, slug=slug) |
||||||
|
|
||||||
|
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') |
||||||
|
except: |
||||||
|
return HttpResponse(json.dumps({ 'status': 'error', 'description': 'Request not found', 'slug': slug }), content_type="application/json") |
||||||
|
|
||||||
|
|
||||||
|
def post(self, request): |
||||||
|
keyword = request.POST.get('keyword', '') |
||||||
|
|
||||||
|
if keyword: |
||||||
|
k = Keyword.objects.get_or_create(request=keyword) |
||||||
|
k.save() |
||||||
|
else: |
||||||
|
return HttpResponse(json.dumps({ 'status': 'error', 'description': 'Empty request', 'ext': json.dump(request.POST)}), content_type="application/json") |
||||||
|
|
||||||
|
return HttpResponse(json.dumps({ 'status': 'ok' }), content_type="application/json") |
||||||
Loading…
Reference in new issue