diff --git a/.gitignore b/.gitignore index 2b8bfc0..8e602f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ .idea/ .idea/* *.pyc -*.db \ No newline at end of file +*.db +.env/* +local_settings.py \ No newline at end of file diff --git a/README b/README index a02e600..6f29225 100644 --- a/README +++ b/README @@ -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 diff --git a/codes/admin.py b/codes/admin.py new file mode 100644 index 0000000..ad83526 --- /dev/null +++ b/codes/admin.py @@ -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) \ No newline at end of file diff --git a/codes/models.py b/codes/models.py index 43309e4..7b1bb59 100644 --- a/codes/models.py +++ b/codes/models.py @@ -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) diff --git a/codes/views.py b/codes/views.py index bf6d26d..fd7972f 100644 --- a/codes/views.py +++ b/codes/views.py @@ -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': @@ -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 diff --git a/settings.py b/settings.py index 8a933bc..99d0db6 100644 --- a/settings.py +++ b/settings.py @@ -146,3 +146,8 @@ }, } } + +try: + from local_settings import * +except ImportError: + pass \ No newline at end of file diff --git a/urls.py b/urls.py index 39ba0ba..9f99435 100644 --- a/urls.py +++ b/urls.py @@ -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)), ) diff --git a/utils/__init__.py b/utils/__init__.py index cb1fa34..af50eb1 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -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 diff --git a/utils/exceptions.py b/utils/exceptions.py index 84444c9..d93f1dc 100644 --- a/utils/exceptions.py +++ b/utils/exceptions.py @@ -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.' \ No newline at end of file diff --git a/utils/xml_parser.py b/utils/xml_parser.py new file mode 100644 index 0000000..0193084 --- /dev/null +++ b/utils/xml_parser.py @@ -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) +