Skip to content
This repository has been archived by the owner on Sep 28, 2022. It is now read-only.

Commit

Permalink
Merge pull request #72 from postatum/98384898_refactoring
Browse files Browse the repository at this point in the history
Refactoring
  • Loading branch information
jstoiko committed Jul 16, 2015
2 parents d50c46b + f9086a7 commit cd5b5e1
Show file tree
Hide file tree
Showing 22 changed files with 170 additions and 156 deletions.
6 changes: 2 additions & 4 deletions nefertari/elasticsearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
'_fields',
'_count',
'_sort',
'_raw_terms',
'_search_fields',
'_refresh_index',
]
Expand Down Expand Up @@ -449,11 +448,10 @@ def build_search_params(self, params):
index=self.index_name,
doc_type=self.doc_type
)
_raw_terms = params.pop('q', '')

if 'body' not in params:
query_string = build_qs(
params.remove(RESERVED),
params.get('_raw_terms', ''))
query_string = build_qs(params.remove(RESERVED), _raw_terms)
if query_string:
_params['body'] = {
'query': {
Expand Down
2 changes: 1 addition & 1 deletion nefertari/json_httpexceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,6 @@ def __init__(self, *args, **kwargs):
super(JHTTPCreated, self).__init__(*args, **kwargs)

if resource and 'location' in kwargs:
resource['self'] = kwargs['location']
resource['_self'] = kwargs['location']

create_json_response(**resp_kwargs)
6 changes: 3 additions & 3 deletions nefertari/polymorphic.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ def index(self, collections):


class add_url_polymorphic(PolymorphicHelperMixin, wrappers.add_object_url):
""" Wrapper that adds 'self' to each object in results
""" Wrapper that adds '_self' to each object in results
For each object in `result['data']` adds a uri which points
to current object
Expand All @@ -211,11 +211,11 @@ def get_models_map(self):
def _set_object_self(self, obj):
""" Override to generate urls instead of just concatenating.
'self' key is not set for singular resources.
'_self' key is not set for singular resources.
"""
type_, obj_id = obj['_type'], obj['id']
resource = self.model_resources[type_]
obj['self'] = self.request.route_url(
obj['_self'] = self.request.route_url(
resource.uid, **{resource.id_name: obj_id})

def __call__(self, **kwargs):
Expand Down
15 changes: 9 additions & 6 deletions nefertari/renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from datetime import date, datetime

from nefertari import wrappers
from nefertari.utils import get_json_encoder
from nefertari.json_httpexceptions import JHTTPOk, JHTTPCreated

log = logging.getLogger(__name__)
Expand Down Expand Up @@ -42,8 +43,9 @@ def _set_content_type(self, system):
def _render_response(self, value, system):
""" Render a response """
view = system['view']
enc_class = getattr(
view, '_json_encoder', _JSONEncoder) or _JSONEncoder
enc_class = getattr(view, '_json_encoder', None)
if enc_class is None:
enc_class = get_json_encoder()
return json.dumps(value, cls=enc_class)

def __call__(self, value, system):
Expand Down Expand Up @@ -75,8 +77,9 @@ class DefaultResponseRendererMixin(object):
"""
def _get_common_kwargs(self, system):
""" Get kwargs common for all methods. """
enc_class = getattr(
system['view'], '_json_encoder', _JSONEncoder) or _JSONEncoder
enc_class = getattr(system['view'], '_json_encoder', None)
if enc_class is None:
enc_class = get_json_encoder()
return {
'request': system['request'],
'encoder': enc_class,
Expand All @@ -86,8 +89,8 @@ def _get_create_update_kwargs(self, value, common_kw):
""" Get kwargs common to create, update, replace. """
kw = common_kw.copy()
kw['body'] = value
if 'self' in value:
kw['headers'] = [('Location', value['self'])]
if '_self' in value:
kw['headers'] = [('Location', value['_self'])]
return kw

def render_create(self, value, system, common_kw):
Expand Down
15 changes: 0 additions & 15 deletions nefertari/scaffolds/nefertari_starter/+package+/views/base.py_tmpl

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import logging

from {{package}}.views.base import BaseView
from nefertari.view import BaseView

from {{package}}.models import Item

log = logging.getLogger(__name__)
Expand Down Expand Up @@ -36,8 +37,7 @@ class ItemsView(BaseView):

def delete_many(self):
es_items = self.get_collection_es()
items = self.Model.filter_objects(
es_items, _limit=self._query_params['_limit'])
items = self.Model.filter_objects(es_items)

if self.needs_confirmation():
return items
Expand All @@ -46,8 +46,7 @@ class ItemsView(BaseView):

def update_many(self):
es_items = self.get_collection_es()
items = self.Model.filter_objects(
es_items, _limit=self._query_params['_limit'])
items = self.Model.filter_objects(es_items)

return self.Model._update_many(
items, self._json_params, self._query_params)
2 changes: 1 addition & 1 deletion nefertari/scripts/post2api.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def load_singular_objects(inputfile, destination):

for parent in parent_objects:
print(parent_route)
parent_url = parent['self'].replace(query_string, '')
parent_url = parent['_self'].replace(query_string, '')
singular_url = parent_url + '/' + singlular_field
child = json_data.pop()
data = json.dumps(child, default=_jdefault)
Expand Down
13 changes: 10 additions & 3 deletions nefertari/utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,22 @@
import six
from pyramid.config import Configurator

from nefertari.renderers import _JSONEncoder


log = logging.getLogger(__name__)


def get_json_encoder():
try:
from nefertari import engine
return engine.JSONEncoder
except AttributeError:
from nefertari.renderers import _JSONEncoder
return _JSONEncoder


def json_dumps(body, encoder=None):
if encoder is None:
encoder = _JSONEncoder
encoder = get_json_encoder()
return json.dumps(body, cls=encoder)


Expand Down
14 changes: 5 additions & 9 deletions nefertari/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ def view_mapper_wrapper(context, request):
class BaseView(OptionsViewMixin):
"""Base class for nefertari views.
"""

__view_mapper__ = ViewMapper
_default_renderer = 'nefertari_json'
_json_encoder = None
Expand Down Expand Up @@ -177,14 +176,7 @@ def get_collection_es(self):
results for default response renderers to work properly.
"""
from nefertari.elasticsearch import ES
search_params = []
if 'q' in self._query_params:
search_params.append(self._query_params.pop('q'))
self._raw_terms = ' AND '.join(search_params)

return ES(self.Model.__name__).get_collection(
_raw_terms=self._raw_terms,
**self._query_params)
return ES(self.Model.__name__).get_collection(**self._query_params)

def fill_null_values(self, model_cls=None):
""" Fill missing model fields in JSON with {key: None}.
Expand All @@ -205,7 +197,11 @@ def fill_null_values(self, model_cls=None):
def set_public_limits(self):
""" Set public limits if auth is enabled and user is not
authenticated.
Also sets default limit for GET, HEAD requests.
"""
if self.request.method.upper() in ['GET', 'HEAD']:
self._query_params.process_int_param('_limit', 20)
if self._auth_enabled and not getattr(self.request, 'user', None):
wrappers.set_public_limits(self)

Expand Down
9 changes: 1 addition & 8 deletions nefertari/view_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,13 +201,6 @@ def aggregate(self):
self.check_aggregations_privacy(aggregations_params)
self.stub_wrappers()

search_params = []
if 'q' in self._query_params:
search_params.append(self._query_params.pop('q'))
_raw_terms = ' AND '.join(search_params)

return ES(self.view.Model.__name__).aggregate(
_aggregations_params=aggregations_params,
_raw_terms=_raw_terms,
**self._query_params
)
**self._query_params)
10 changes: 5 additions & 5 deletions nefertari/wrappers.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ class apply_privacy(object):
calling 'is_admin()' method on 'self.request.user'.
If this wrapper is called without request, no filtering is performed.
Fields visible to all types of users: 'self', '_type'.
Fields visible to all types of users: '_self', '_type'.
"""
def __init__(self, request):
self.request = request
Expand Down Expand Up @@ -143,7 +143,7 @@ def _filter_fields(self, data):
fields &= public_fields

fields.add('_type')
fields.add('self')
fields.add('_self')
return data.subset(fields)

def __call__(self, **kwargs):
Expand Down Expand Up @@ -224,7 +224,7 @@ def __call__(self, **kwargs):


class add_object_url(object):
""" Add 'self' to each object in results
""" Add '_self' to each object in results
For each object in `result['data']` adds a uri which points
to current object
Expand All @@ -243,12 +243,12 @@ def is_singular(self):
return self._is_singular

def _set_object_self(self, obj):
""" Add 'self' key value to :obj: dict. """
""" Add '_self' key value to :obj: dict. """
location = self.request.path_url
obj_id = urllib.parse.quote(str(obj['id']))
if not self.is_singular and not location.endswith(obj_id):
location += '/{}'.format(obj_id)
obj.setdefault('self', location)
obj.setdefault('_self', location)

def __call__(self, **kwargs):
result = kwargs['result']
Expand Down
6 changes: 6 additions & 0 deletions tests/test_authentication/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ def engine_mock(request):
import nefertari
from mock import Mock

original_engine = nefertari.engine
nefertari.engine = Mock()
nefertari.engine.BaseDocument = object

def clear():
nefertari.engine = original_engine
request.addfinalizer(clear)

return nefertari.engine
1 change: 1 addition & 0 deletions tests/test_authentication/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ def test_create_account(self, mock_get, engine_mock):
@patch(mixin_path + 'get_or_create')
def test_create_account_bad_request(self, mock_get, engine_mock):
from nefertari.authentication import models
engine_mock.mock_add_spec([])
mock_get.side_effect = JHTTPBadRequest
with pytest.raises(JHTTPBadRequest) as ex:
models.AuthModelDefaultMixin.create_account({'email': 3})
Expand Down
2 changes: 1 addition & 1 deletion tests/test_elasticsearch.py
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,7 @@ def test_get_by_ids_not_found_not_raise(self, mock_mget):
def test_build_search_params_no_body(self):
obj = es.ES('Foo', 'foondex')
params = obj.build_search_params(
{'foo': 1, 'zoo': 2, '_raw_terms': ' AND q:5', '_limit': 10}
{'foo': 1, 'zoo': 2, 'q': ' AND q:5', '_limit': 10}
)
assert sorted(params.keys()) == sorted([
'body', 'doc_type', 'from_', 'size', 'index'])
Expand Down
2 changes: 1 addition & 1 deletion tests/test_json_httpexceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,5 +134,5 @@ def test_jhttpcreated(self, mock_create):
location='http://example.com/1',
encoder=1)
mock_create.assert_called_once_with(
obj=resp, resource={'foo': 'bar', 'self': 'http://example.com/1'},
obj=resp, resource={'foo': 'bar', '_self': 'http://example.com/1'},
request=None, encoder=1, body=None)
13 changes: 8 additions & 5 deletions tests/test_polymorphic.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import pytest
from mock import Mock, patch

from nefertari import polymorphic
from nefertari.renderers import _JSONEncoder


class TestPolymorphicHelperMixin(object):
Expand Down Expand Up @@ -105,9 +105,12 @@ def test_set_collections_acl_has_aces(self, mock_coll, mock_res,

class TestPolymorphicESView(object):

class DummyPolymorphicESView(polymorphic.PolymorphicESView):
_json_encoder = _JSONEncoder

def _dummy_view(self):
request = Mock(content_type='', method='', accept=[''], user=None)
return polymorphic.PolymorphicESView(
return self.DummyPolymorphicESView(
context={}, request=request,
_json_params={'foo': 'bar'},
_query_params={'foo1': 'bar1'})
Expand Down Expand Up @@ -191,7 +194,7 @@ def test_set_object_self(self):
wrapper.model_resources = {'Story': resource1}
obj = {'_type': 'Story', 'id': 4}
wrapper._set_object_self(obj)
assert obj == {'_type': 'Story', 'id': 4, 'self': 'foobar'}
assert obj == {'_type': 'Story', 'id': 4, '_self': 'foobar'}
wrapper.request.route_url.assert_called_once_with(
'mystories', story_id=4)

Expand All @@ -204,8 +207,8 @@ def test_call(self, mock_map):
wrapper.request.route_url.return_value = 'foobar'
obj = {'_type': 'Story', 'id': 4}
assert wrapper(result=obj) == {
'_type': 'Story', 'id': 4, 'self': 'foobar'}
'_type': 'Story', 'id': 4, '_self': 'foobar'}

obj = {'data': [{'_type': 'Story', 'id': 4}]}
assert wrapper(result=obj) == {
'data': [{'_type': 'Story', 'id': 4, 'self': 'foobar'}]}
'data': [{'_type': 'Story', 'id': 4, '_self': 'foobar'}]}
8 changes: 4 additions & 4 deletions tests/test_renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,24 +160,24 @@ def test_render_create(self, mock_resp):
system = self._system_mocks()
system['view']._resource.id_name = 'story_id'
system['view']._resource.uid = 'user:stories'
value = {'id': 1, 'q': 'd', 'self': 'google.com'}
value = {'id': 1, 'q': 'd', '_self': 'google.com'}
mixin = renderers.DefaultResponseRendererMixin()
mixin.render_create(value, system, {'a': 'b'})
mock_resp.assert_called_once_with(
a='b', body={'q': 'd', 'self': 'google.com', 'id': 1},
a='b', body={'q': 'd', '_self': 'google.com', 'id': 1},
headers=[('Location', 'google.com')])

@mock.patch('nefertari.renderers.JHTTPOk')
def test_render_update(self, mock_resp):
system = self._system_mocks()
system['view']._resource.id_name = 'story_id'
system['view']._resource.uid = 'user:stories'
value = {'id': 1, 'q': 'd', 'self': 'google.com'}
value = {'id': 1, 'q': 'd', '_self': 'google.com'}
mixin = renderers.DefaultResponseRendererMixin()
mixin.render_update(value, system, {'a': 'b'})
mock_resp.assert_called_once_with(
"Updated", a='b',
body={'q': 'd', 'self': 'google.com', 'id': 1},
body={'q': 'd', '_self': 'google.com', 'id': 1},
headers=[('Location', 'google.com')])

def test_render_replace(self):
Expand Down

0 comments on commit cd5b5e1

Please sign in to comment.