Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
.idea/
.idea/*
*.pyc
*.db
*.db
.env/*
local_settings.py
8 changes: 8 additions & 0 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ message: "ok"
"code": 2
}

Дописал возможность заказывать результат в разном формате (был только json, добавил xml)

http://127.0.0.1:8000/?phone=89024453043&p=xml
http://127.0.0.1:8000/?phone=89024453043&p=json

+ exception если нет нужного формата
+ вынес response в декоратор

Парсинг базы с Россвязи запускается так:

cd codeparser; scrapy crawl codes
Expand Down
10 changes: 10 additions & 0 deletions codes/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# coding: utf-8

from django.contrib import admin

from codes.models import Operator


class OperatorAdmin(admin.ModelAdmin):
pass
admin.site.register(Operator, OperatorAdmin)
3 changes: 3 additions & 0 deletions codes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ class Operator(models.Model):
class Meta:
ordering = ['region_code', 'number_end_range']

def __unicode__(self):
return self.name

@staticmethod
def _get_cleaned_number(number):
cleaned = re.sub(r'\D', r'', number)
Expand Down
9 changes: 5 additions & 4 deletions codes/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from utils import response_json
from utils import response_by_wish
from utils.exceptions import OperatorNotFoundException, InvalidNumberException
from models import Operator
from forms import PhoneForm


@response_by_wish
def show_operator(request):
try:
if request.method != 'POST':
Expand Down Expand Up @@ -36,9 +37,9 @@ def show_operator(request):
raise InvalidNumberException

except (OperatorNotFoundException, InvalidNumberException), e:
return response_json({'status': 1, 'message': e.msg, 'code':e.code})
response = {'status': 1, 'message': e.msg, 'code':e.code}

except Exception, e:
return response_json({'status': 1, 'message': e})
response = {'status': 1, 'message': e}

return response_json(response)
return response
5 changes: 5 additions & 0 deletions settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,8 @@
},
}
}

try:
from local_settings import *
except ImportError:
pass
4 changes: 4 additions & 0 deletions urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin

admin.autodiscover()


urlpatterns = patterns('',
url(r'^$', 'codes.views.show_operator'),
url(r'^admin/', include(admin.site.urls)),
)
45 changes: 42 additions & 3 deletions utils/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,44 @@
import json
# coding: utf-8
from django.http import HttpResponse

def response_json(response_dict):
return HttpResponse(json.dumps(response_dict), mimetype='application/javascript')
from utils.exceptions import ParserNotFound

import json

from xml_parser import xml_parser


PARSERS = {
'json': {
'func': json.dumps,
'mimetype': 'application/javascript',
},
'xml': {
'func': xml_parser,
'mimetype': 'application/xml',
},
}


def response_by_wish(view):

def http_response_data(parser, response):
parsed_data = parser['func'](response)
kwargs = {'mimetype': parser['mimetype']}
return parsed_data, kwargs

def responser(*args, **kwargs):
# get request
request = args[0]
# get response
response = view(request)
# get parser name. `json` by default
p = request.GET.get('p', 'json') or 'json'
try:
parser = PARSERS[p]
except KeyError:
raise ParserNotFound
parsed_data, kwargs = http_response_data(parser, response)
return HttpResponse(parsed_data, **kwargs)

return responser
9 changes: 9 additions & 0 deletions utils/exceptions.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@

class InvalidNumberException(Exception):

code = 1
msg = 'Invalid number.'


class OperatorNotFoundException(Exception):

code = 2
msg = 'Operator not found.'


class ParserNotFound(Exception):

code = 3
msg = 'Parser not found.'
17 changes: 17 additions & 0 deletions utils/xml_parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# coding: utf-8
from lxml import etree


def append_node(root_node, key, value):
child = etree.Element(key)
if isinstance(value, int):
value = str(value)
child.text = value
root_node.append(child)


def xml_parser(response):
root = etree.Element('root')
map(lambda x: append_node(root, *x), response.items())
return etree.tostring(root, pretty_print=True)