Browse Source

fix(api): can't compare datetime.datetime to NoneType (#21269)

Marcos Gaeta 4 years ago
parent
commit
36c577ad09
2 changed files with 23 additions and 17 deletions
  1. 13 14
      src/sentry/api/serializers/models/group.py
  2. 10 3
      tests/snuba/api/serializers/test_group.py

+ 13 - 14
src/sentry/api/serializers/models/group.py

@@ -90,30 +90,29 @@ class GroupSerializerBase(Serializer):
         """
         raise NotImplementedError
 
-    def _get_group_snuba_stats(self, item_list, seen_stats):
-        filter_keys = {}
-
+    @staticmethod
+    def _get_start_from_seen_stats(seen_stats):
         # Try to figure out what is a reasonable time frame to look into stats,
         # based on a given "seen stats".  We try to pick a day prior to the earliest last seen,
         # but it has to be at least 14 days, and not more than 90 days ago.
         # Fallback to the 30 days ago if we are not able to calculate the value.
         last_seen = None
         for item in seen_stats.values():
-            if last_seen is None or (
-                item["last_seen"] is not None and last_seen > item["last_seen"]
-            ):
+            if last_seen is None or (item["last_seen"] and last_seen > item["last_seen"]):
                 last_seen = item["last_seen"]
-        if last_seen is not None:
-            last_seen = last_seen - timedelta(days=1)
 
         if last_seen is None:
-            start = datetime.now(pytz.utc) - timedelta(days=30)
-        else:
-            start = max(
-                min(last_seen, datetime.now(pytz.utc) - timedelta(days=14)),
-                datetime.now(pytz.utc) - timedelta(days=90),
-            )
+            return datetime.now(pytz.utc) - timedelta(days=30)
 
+        return max(
+            min(last_seen - timedelta(days=1), datetime.now(pytz.utc) - timedelta(days=14)),
+            datetime.now(pytz.utc) - timedelta(days=90),
+        )
+
+    def _get_group_snuba_stats(self, item_list, seen_stats):
+        start = self._get_start_from_seen_stats(seen_stats)
+
+        filter_keys = {}
         for item in item_list:
             filter_keys.setdefault("project_id", []).append(item.project_id)
             filter_keys.setdefault("group_id", []).append(item.id)

+ 10 - 3
tests/snuba/api/serializers/test_group.py

@@ -2,13 +2,11 @@
 
 from __future__ import absolute_import
 
-from sentry.utils.compat import mock
+import pytz
 import six
 
 from datetime import timedelta
-
 from django.utils import timezone
-from sentry.utils.compat.mock import patch
 
 from sentry.api.serializers import serialize
 from sentry.api.serializers.models.group import (
@@ -30,6 +28,8 @@ from sentry.models import (
 )
 from sentry.testutils import APITestCase, SnubaTestCase
 from sentry.testutils.helpers.datetime import iso_format, before_now
+from sentry.utils.compat import mock
+from sentry.utils.compat.mock import patch
 
 
 class GroupSerializerSnubaTest(APITestCase, SnubaTestCase):
@@ -346,6 +346,13 @@ class GroupSerializerSnubaTest(APITestCase, SnubaTestCase):
         assert iso_format(result["firstSeen"]) == iso_format(self.week_ago)
         assert result["count"] == "1"
 
+    def test_get_start_from_seen_stats(self):
+        for days, expected in [(None, 30), (0, 14), (1000, 90)]:
+            last_seen = None if days is None else before_now(days=days).replace(tzinfo=pytz.UTC)
+            start = GroupSerializerSnuba._get_start_from_seen_stats({"": {"last_seen": last_seen}})
+
+            assert iso_format(start) == iso_format(before_now(days=expected))
+
 
 class StreamGroupSerializerTestCase(APITestCase, SnubaTestCase):
     def test_environment(self):