Skip to content

Commit

Permalink
Merge pull request #1890 from SEED-platform/dependabot/pip/requiremen…
Browse files Browse the repository at this point in the history
…ts/djangorestframework-3.9.1

Bump djangorestframework from 3.5.4 to 3.9.1 in /requirements
  • Loading branch information
nllong committed Jun 11, 2019
2 parents d7de46c + d009b78 commit 55690de
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 72 deletions.
5 changes: 1 addition & 4 deletions requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@ pytz==2018.7
django-pint==0.4

# API
# Do not upgrade to DRF 3.6.x+. There are some changes and it seems to break a few things. So far
# the issues are:
# - can't set attributes in Mock
djangorestframework==3.5.4
djangorestframework==3.9.4
# simplejson dependency needs to be installed via github due to a pip segfault with Python 3.6.7
-e git+https://github.com/simplejson/simplejson@v3.16.1#egg=simplejson
django-rest-swagger==2.2.0
Expand Down
27 changes: 8 additions & 19 deletions seed/exception_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,12 @@
provides function for handling exceptions not otherwise handled by DRF
"""

# Imports from Standard Library

# Imports from Third Party Modules

# Imports from Django
from django.db.models.deletion import ProtectedError
from rest_framework.views import exception_handler
from rest_framework import status
from rest_framework.compat import set_rollback
from rest_framework.response import Response
from django.utils import six
from django.utils.translation import ugettext_lazy as _
# Local Imports

# Constants

# Data Structure Definitions

# Private Functions

# Public Classes and Functions
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import exception_handler


def custom_exception_handler(exc, context):
Expand All @@ -46,6 +31,10 @@ def custom_exception_handler(exc, context):
'related objects still exist')
data = {'detail': six.text_type(msg)}

set_rollback()
# Set Rollback removed in https://www.django-rest-framework.org/community/release-notes/#374. The
# method is now handled in the views exception_handler which is called above
# in exception_handler(exc, context)

# set_rollback()
return Response(data, status=status.HTTP_400_BAD_REQUEST)
return response
64 changes: 25 additions & 39 deletions seed/serializers/properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
required approvals from the U.S. Department of Energy) and contributors.
All rights reserved. # NOQA
:author Paul Munday <paul@paulmunday.net>
:author Nicholas Long <nicholas.long@nrel.gov>
"""
import json
from collections import OrderedDict

import pytz
from django.db import models
from django.utils.timezone import make_naive
from past.builtins import basestring
from rest_framework import serializers
from rest_framework.fields import empty
Expand Down Expand Up @@ -104,6 +105,9 @@ def to_representation(self, data):


class PropertySerializer(serializers.ModelSerializer):
# The created and updated fields are in UTC time and need to be casted accordingly in this format
created = serializers.DateTimeField("%Y-%m-%dT%H:%M:%S.%fZ", default_timezone=pytz.utc)
updated = serializers.DateTimeField("%Y-%m-%dT%H:%M:%S.%fZ", default_timezone=pytz.utc)

class Meta:
model = Property
Expand Down Expand Up @@ -147,6 +151,13 @@ class PropertyStateSerializer(serializers.ModelSerializer):
source_eui_modeled = PintQuantitySerializerField(allow_null=True)
site_eui_weather_normalized = PintQuantitySerializerField(allow_null=True)

# support naive datetime objects
generation_date = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)
recent_sale_date = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)
release_date = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)
analysis_start_time = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)
analysis_end_time = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)

# to support the old state serializer method with the PROPERTY_STATE_FIELDS variables
import_file_id = serializers.IntegerField(allow_null=True, read_only=True)
organization_id = serializers.IntegerField()
Expand Down Expand Up @@ -177,22 +188,6 @@ def to_representation(self, data):

result['extra_data'] = prepopulated_extra_data

# for datetime to be isoformat and remove timezone data
if data.generation_date:
result['generation_date'] = make_naive(data.generation_date).isoformat()

if data.recent_sale_date:
result['recent_sale_date'] = make_naive(data.recent_sale_date).isoformat()

if data.release_date:
result['release_date'] = make_naive(data.release_date).isoformat()

if data.analysis_start_time:
result['analysis_start_time'] = make_naive(data.analysis_start_time).isoformat()

if data.analysis_end_time:
result['analysis_end_time'] = make_naive(data.analysis_end_time).isoformat()

return result


Expand All @@ -214,6 +209,14 @@ class PropertyStateWritableSerializer(serializers.ModelSerializer):
import_file_id = serializers.IntegerField(allow_null=True, read_only=True)
organization_id = serializers.IntegerField(read_only=True)

# support naive datetime objects
# support naive datetime objects
generation_date = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)
recent_sale_date = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)
release_date = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)
analysis_start_time = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)
analysis_end_time = serializers.DateTimeField('%Y-%m-%dT%H:%M:%S', allow_null=True)

# support the pint objects
conditioned_floor_area = PintQuantitySerializerField(allow_null=True, required=False)
gross_floor_area = PintQuantitySerializerField(allow_null=True, required=False)
Expand All @@ -229,33 +232,13 @@ class Meta:
fields = '__all__'
model = PropertyState

def to_representation(self, data):
"""Overwritten to handle time conversion"""
result = super(PropertyStateWritableSerializer, self).to_representation(data)
# for datetime to be isoformat and remove timezone data
if data.generation_date:
result['generation_date'] = make_naive(data.generation_date).isoformat()

if data.recent_sale_date:
result['recent_sale_date'] = make_naive(data.recent_sale_date).isoformat()

if data.release_date:
result['release_date'] = make_naive(data.release_date).isoformat()

if data.analysis_start_time:
result['analysis_start_time'] = make_naive(data.analysis_start_time).isoformat()

if data.analysis_end_time:
result['analysis_end_time'] = make_naive(data.analysis_end_time).isoformat()

return result


class PropertyViewSerializer(serializers.ModelSerializer):
# list of status labels (rather than the join field)
labels = PropertyLabelsField(read_only=True, many=True)

state = PropertyStateSerializer()
property = PropertySerializer()

class Meta:
model = PropertyView
Expand Down Expand Up @@ -613,7 +596,10 @@ def unflatten_values(vdict, fkeys):
:param fkeys: field names for foreign key (e.g. state for state__city)
:type fkeys: list
"""
assert set(list(vdict.keys())).isdisjoint(set(fkeys)), "unflatten_values: {} has fields named in {}".format(vdict, fkeys)
assert set(
list(vdict.keys())
).isdisjoint(set(fkeys)), "unflatten_values: {} has fields named in {}".format(vdict, fkeys)

idents = tuple(["{}__".format(fkey) for fkey in fkeys])
newdict = vdict.copy()
for key, val in vdict.items():
Expand Down
4 changes: 1 addition & 3 deletions seed/tests/test_certification_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,9 @@ def test_update(self, mock_url_model):

def test_validate(self):
"""Test (overriden) validate method"""
serializer = GreenAssessmentPropertySerializer()
# add context
mock_request = mock.MagicMock()
mock_request.user = self.user
serializer.context = {'request': mock_request}
serializer = GreenAssessmentPropertySerializer(context={'request': mock_request})

# assert raises error if rating and metric supplied
data = self.data.copy()
Expand Down
6 changes: 2 additions & 4 deletions seed/tests/test_properties_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -367,9 +367,8 @@ def test_update_put(self, mock_serializer):
'property': 4
}

serializer = PropertyViewAsStateSerializer()
serializer = PropertyViewAsStateSerializer(context={'request': mock_request})
mock_request.METHOD = 'PUT'
serializer.context = {'request': mock_request}
serializer.update(self.property_view, data)
mock_serializer.assert_called_with(
data={'test': 3}
Expand All @@ -389,8 +388,7 @@ def test_update_patch(self, mock_serializer):
'state': {'test': 3},
'property': 4
}
serializer = PropertyViewAsStateSerializer()
serializer.context = {'request': mock_request}
serializer = PropertyViewAsStateSerializer(context={'request': mock_request})
serializer.update(self.property_view, data)
mock_serializer.assert_called_with(
self.property_state,
Expand Down
7 changes: 4 additions & 3 deletions seed/tests/test_property_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,10 @@ def test_get_and_edit_properties(self):
# make sure the address was updated and that the datetimes were modified
self.assertEqual(data['status'], 'success')
self.assertEqual(data['state']['address_line_1'], '742 Evergreen Terrace')
self.assertEqual(datetime.strptime(db_created_time, "%Y-%m-%dT%H:%M:%S.%fZ").replace(microsecond=0),
datetime.strptime(data['property']['created'], "%Y-%m-%dT%H:%M:%S.%fZ").replace(
microsecond=0))
self.assertEqual(
datetime.strptime(db_created_time, "%Y-%m-%dT%H:%M:%S.%fZ").replace(microsecond=0),
datetime.strptime(data['property']['created'], "%Y-%m-%dT%H:%M:%S.%fZ").replace(microsecond=0)
)
self.assertGreater(datetime.strptime(data['property']['updated'], "%Y-%m-%dT%H:%M:%S.%fZ"),
datetime.strptime(db_updated_time, "%Y-%m-%dT%H:%M:%S.%fZ"))

Expand Down

0 comments on commit 55690de

Please sign in to comment.