Skip to content

Commit

Permalink
remove debug line and add helper to generate string evaluation of Dja…
Browse files Browse the repository at this point in the history
…ngo ORM/QS
  • Loading branch information
0xGosu committed Dec 19, 2020
1 parent 15d920e commit 6e5459c
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 8 deletions.
2 changes: 1 addition & 1 deletion nameko_django/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.1.3
1.1.4
32 changes: 32 additions & 0 deletions nameko_django/helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# helper.py
#
#
# Created by vincenttran on 2020-12-18.
# Copyright (c) 2020 vincenttran. All rights reserved.
#
from __future__ import unicode_literals

from django.db.models import QuerySet
from django.db.models.base import ModelBase
from six import string_types
import re


def DjangoORM(ORM_Model, pk):
if not isinstance(ORM_Model, ModelBase):
raise TypeError('%s must be a Django ORM Class of type django.db.models.base.ModelBase')
return "<{}.{}.{}>".format(ORM_Model._meta.app_label, ORM_Model._meta.model.__name__, pk)


def DjangoQS(ORM_Model, raw_query):
if not isinstance(ORM_Model, ModelBase):
raise TypeError('%s must be a Django ORM Class of type django.db.models.base.ModelBase')
if isinstance(raw_query, string_types):
if len(raw_query) == 0 or re.search(r'^\s*SELECT\s+$', raw_query, re.I):
raise ValueError('raw_query must not be empty nor start with SELECT')
else:
raise TypeError('raw_query must be a string type')
return "({}.{}: {})".format(ORM_Model._meta.app_label, ORM_Model._meta.model.__name__, raw_query)
6 changes: 1 addition & 5 deletions nameko_django/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def encode_nondefault_object(obj):
return ExtType(ExternalType.ORM_INSTANCE, pickle.dumps(obj, -1))
elif isinstance(obj, QuerySet):
return ExtType(ExternalType.ORM_QUERYSET, pickle.dumps((obj.model, obj.query), -1))
logger.debug("unknown type obj=%s", obj)
# logger.debug("unknown type obj=%s", obj)
return obj


Expand All @@ -111,15 +111,13 @@ def django_ext_hook(code, data):


def decode_dict_object(dict_obj):
logger.debug("decode dict obj=%s", dict_obj)
return {
key: decode_single_object(value)
for key, value in dict_obj.items()
}


def decode_list_object(list_obj):
logger.debug("decode list obj=%s", list_obj)
return [decode_single_object(value) for value in list_obj]


Expand All @@ -139,7 +137,6 @@ def decode_list_object(list_obj):
def decode_single_object(obj):
if obj is None:
return
logger.debug("decode single obj=%s", obj)
if isinstance(obj, string_types):
datetime_obj = None
lenobj = len(obj)
Expand Down Expand Up @@ -172,7 +169,6 @@ def decode_single_object(obj):


def dumps(o):
# logger.debug("dumps obj=%s", o)
return packb(o, strict_types=True, default=encode_nondefault_object, use_bin_type=True)


Expand Down
39 changes: 37 additions & 2 deletions tests/test_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,21 @@
from django.test.utils import override_settings
from mock import call, patch
import pytest
from nameko_django.serializer import dumps, loads
from nameko_django.serializer import dumps, loads, DEFAULT_DATETIME_TIMEZONE_STRING_FORMAT
from nameko_django.helper import DjangoORM, DjangoQS
from datetime import datetime, date, time, timedelta
from decimal import Decimal
from aenum import Enum, IntEnum, Constant
from collections import namedtuple, defaultdict, OrderedDict
from django.utils.timezone import FixedOffset

try:
# this only available in python3
from datetime import timezone as py3timezone

FixedOffset = (lambda d, name: py3timezone(timedelta(d), name=name))
except ImportError:
from django.utils.timezone import FixedOffset

from django.utils import timezone
from nose import tools
from django.db.models import ObjectDoesNotExist
Expand Down Expand Up @@ -342,3 +351,29 @@ def test_django_orm_queryset_eval_with_db(admin_user):
u = dec_data.first()
assert u.username == admin_user.username
assert u.email == admin_user.email


@pytest.mark.django_db
def test_django_orm_eval_with_db_using_helper(admin_user):
from django.contrib.auth.models import User
enc_data = dumps(DjangoORM(User, admin_user.id))
dec_data = loads(enc_data)
u = dec_data
logger.debug("admin_user.id=%s", admin_user.id)
assert u.username == admin_user.username
assert u.email == admin_user.email


@pytest.mark.django_db
def test_django_orm_queryset_with_db_using_helper():
from django.contrib.auth.models import User
test_user_qs = User.objects.all().filter(last_login__isnull=False, id__gt=1000,
date_joined__gt='2018-11-22 00:47:14.263837+00:00')
raw_qs = DjangoQS(User, "last_login notnull and id > 1000 and date_joined > '2018-11-22 00:47:14.263837+00:00'")
enc_data = dumps(raw_qs)
dec_data = loads(enc_data)
qs1 = test_user_qs.query
qs2 = dec_data.query
logger.debug("%s <> %s", qs1, qs2)
assert qs1.model._meta.db_table == qs2.model._meta.db_table
assert len(test_user_qs) == len(dec_data)

0 comments on commit 6e5459c

Please sign in to comment.