import logging
import datetime
import decimal

import elasticsearch
from bson import ObjectId, DBRef

from nefertari.renderers import _JSONEncoder


log = logging.getLogger(__name__)


class JSONEncoder(_JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (ObjectId, DBRef)):
            return str(obj)
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        if isinstance(obj, (datetime.datetime, datetime.date)):
            return obj.strftime("%Y-%m-%dT%H:%M:%SZ")  # iso
        if isinstance(obj, datetime.time):
            return obj.strftime('%H:%M:%S')
        if isinstance(obj, datetime.timedelta):
            return obj.seconds

        if hasattr(obj, 'to_dict'):
            # If it got to this point, it means its a nested object.
            # outter objects would have been handled with DataProxy.
            return obj.to_dict(__nested=True)

        return super(JSONEncoder, self).default(obj)


class ESJSONSerializer(elasticsearch.serializer.JSONSerializer):
    def default(self, obj):
        if isinstance(obj, (ObjectId, DBRef)):
            return str(obj)
        if isinstance(obj, (datetime.datetime, datetime.date)):
            return obj.strftime("%Y-%m-%dT%H:%M:%SZ")  # iso
        if isinstance(obj, datetime.time):
            return obj.strftime('%H:%M:%S')
        if isinstance(obj, datetime.timedelta):
            return obj.seconds
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        try:
            return super(ESJSONSerializer, self).default(obj)
        except:
            import traceback
            log.error(traceback.format_exc())

import logging
import datetime
import decimal

import elasticsearch
from bson import ObjectId, DBRef

from nefertari.renderers import _JSONEncoder


log = logging.getLogger(__name__)


class JSONEncoderMixin(object):
    def default(self, obj):
        if isinstance(obj, (ObjectId, DBRef)):
            return str(obj)
        if isinstance(obj, (datetime.datetime, datetime.date)):
            return obj.strftime("%Y-%m-%dT%H:%M:%SZ")  # iso
        if isinstance(obj, datetime.time):
            return obj.strftime('%H:%M:%S')
        if isinstance(obj, datetime.timedelta):
            return obj.seconds
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        return super(JSONEncoderMixin, self).default(obj)


class JSONEncoder(JSONEncoderMixin, _JSONEncoder):
    def default(self, obj):
        if hasattr(obj, 'to_dict'):
            # If it got to this point, it means its a nested object.
            # outter objects would have been handled with DataProxy.
            return obj.to_dict(__nested=True)
        return super(JSONEncoder, self).default(obj)


class ESJSONSerializer(JSONEncoderMixin,
                       elasticsearch.serializer.JSONSerializer):
    def default(self, obj):
        try:
            return super(ESJSONSerializer, self).default(obj)
        except:
            import traceback
            log.error(traceback.format_exc())

Refactor encoders to have base class
Refactor encoders to have base class

  import logging
  import datetime
  import decimal
  
  import elasticsearch
  from bson import ObjectId, DBRef
  
  from nefertari.renderers import _JSONEncoder
  
  
  log = logging.getLogger(__name__)
  
  
+ class JSONEncoderMixin(object):
- class JSONEncoder(_JSONEncoder):
-     def default(self, obj):
-         if isinstance(obj, (ObjectId, DBRef)):
-             return str(obj)
-         if isinstance(obj, decimal.Decimal):
-             return float(obj)
-         if isinstance(obj, (datetime.datetime, datetime.date)):
-             return obj.strftime("%Y-%m-%dT%H:%M:%SZ")  # iso
-         if isinstance(obj, datetime.time):
-             return obj.strftime('%H:%M:%S')
-         if isinstance(obj, datetime.timedelta):
-             return obj.seconds
- 
-         if hasattr(obj, 'to_dict'):
-             # If it got to this point, it means its a nested object.
-             # outter objects would have been handled with DataProxy.
-             return obj.to_dict(__nested=True)
- 
-         return super(JSONEncoder, self).default(obj)
- 
- 
- class ESJSONSerializer(elasticsearch.serializer.JSONSerializer):
      def default(self, obj):
          if isinstance(obj, (ObjectId, DBRef)):
              return str(obj)
          if isinstance(obj, (datetime.datetime, datetime.date)):
              return obj.strftime("%Y-%m-%dT%H:%M:%SZ")  # iso
          if isinstance(obj, datetime.time):
              return obj.strftime('%H:%M:%S')
          if isinstance(obj, datetime.timedelta):
              return obj.seconds
          if isinstance(obj, decimal.Decimal):
              return float(obj)
+         return super(JSONEncoderMixin, self).default(obj)
+ 
+ 
+ class JSONEncoder(JSONEncoderMixin, _JSONEncoder):
+     def default(self, obj):
+         if hasattr(obj, 'to_dict'):
+             # If it got to this point, it means its a nested object.
+             # outter objects would have been handled with DataProxy.
+             return obj.to_dict(__nested=True)
+         return super(JSONEncoder, self).default(obj)
+ 
+ 
+ class ESJSONSerializer(JSONEncoderMixin,
+                        elasticsearch.serializer.JSONSerializer):
+     def default(self, obj):
          try:
              return super(ESJSONSerializer, self).default(obj)
          except:
              import traceback
              log.error(traceback.format_exc())
  
Refactor encoders to have base class
## Code Before:
import logging
import datetime
import decimal

import elasticsearch
from bson import ObjectId, DBRef

from nefertari.renderers import _JSONEncoder


log = logging.getLogger(__name__)


class JSONEncoder(_JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (ObjectId, DBRef)):
            return str(obj)
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        if isinstance(obj, (datetime.datetime, datetime.date)):
            return obj.strftime("%Y-%m-%dT%H:%M:%SZ")  # iso
        if isinstance(obj, datetime.time):
            return obj.strftime('%H:%M:%S')
        if isinstance(obj, datetime.timedelta):
            return obj.seconds

        if hasattr(obj, 'to_dict'):
            # If it got to this point, it means its a nested object.
            # outter objects would have been handled with DataProxy.
            return obj.to_dict(__nested=True)

        return super(JSONEncoder, self).default(obj)


class ESJSONSerializer(elasticsearch.serializer.JSONSerializer):
    def default(self, obj):
        if isinstance(obj, (ObjectId, DBRef)):
            return str(obj)
        if isinstance(obj, (datetime.datetime, datetime.date)):
            return obj.strftime("%Y-%m-%dT%H:%M:%SZ")  # iso
        if isinstance(obj, datetime.time):
            return obj.strftime('%H:%M:%S')
        if isinstance(obj, datetime.timedelta):
            return obj.seconds
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        try:
            return super(ESJSONSerializer, self).default(obj)
        except:
            import traceback
            log.error(traceback.format_exc())

## Instruction:
Refactor encoders to have base class
## Code After:
import logging
import datetime
import decimal

import elasticsearch
from bson import ObjectId, DBRef

from nefertari.renderers import _JSONEncoder


log = logging.getLogger(__name__)


class JSONEncoderMixin(object):
    def default(self, obj):
        if isinstance(obj, (ObjectId, DBRef)):
            return str(obj)
        if isinstance(obj, (datetime.datetime, datetime.date)):
            return obj.strftime("%Y-%m-%dT%H:%M:%SZ")  # iso
        if isinstance(obj, datetime.time):
            return obj.strftime('%H:%M:%S')
        if isinstance(obj, datetime.timedelta):
            return obj.seconds
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        return super(JSONEncoderMixin, self).default(obj)


class JSONEncoder(JSONEncoderMixin, _JSONEncoder):
    def default(self, obj):
        if hasattr(obj, 'to_dict'):
            # If it got to this point, it means its a nested object.
            # outter objects would have been handled with DataProxy.
            return obj.to_dict(__nested=True)
        return super(JSONEncoder, self).default(obj)


class ESJSONSerializer(JSONEncoderMixin,
                       elasticsearch.serializer.JSONSerializer):
    def default(self, obj):
        try:
            return super(ESJSONSerializer, self).default(obj)
        except:
            import traceback
            log.error(traceback.format_exc())
