|
@@ -4,10 +4,11 @@ import six
|
|
from django.db import models
|
|
from django.db import models
|
|
from django.utils import timezone
|
|
from django.utils import timezone
|
|
|
|
|
|
|
|
+from sentry.constants import ObjectStatus
|
|
from sentry.db.models import (
|
|
from sentry.db.models import (
|
|
BoundedPositiveIntegerField,
|
|
BoundedPositiveIntegerField,
|
|
FlexibleForeignKey,
|
|
FlexibleForeignKey,
|
|
- ArrayField,
|
|
|
|
|
|
+ JSONField,
|
|
Model,
|
|
Model,
|
|
sane_repr,
|
|
sane_repr,
|
|
)
|
|
)
|
|
@@ -20,10 +21,6 @@ class TypesClass(object):
|
|
def as_choices(cls):
|
|
def as_choices(cls):
|
|
return [(k, six.text_type(v)) for k, v in cls.TYPES]
|
|
return [(k, six.text_type(v)) for k, v in cls.TYPES]
|
|
|
|
|
|
- @classmethod
|
|
|
|
- def as_text_choices(cls):
|
|
|
|
- return [(six.text_type(v), six.text_type(v)) for _, v in cls.TYPES]
|
|
|
|
-
|
|
|
|
@classmethod
|
|
@classmethod
|
|
def get_type_name(cls, num):
|
|
def get_type_name(cls, num):
|
|
for id, name in cls.TYPES:
|
|
for id, name in cls.TYPES:
|
|
@@ -37,46 +34,60 @@ class TypesClass(object):
|
|
return id
|
|
return id
|
|
|
|
|
|
|
|
|
|
-class DashboardWidgetDisplayTypes(TypesClass):
|
|
|
|
|
|
+class WidgetDisplayTypes(TypesClass):
|
|
LINE_CHART = 0
|
|
LINE_CHART = 0
|
|
AREA_CHART = 1
|
|
AREA_CHART = 1
|
|
STACKED_AREA_CHART = 2
|
|
STACKED_AREA_CHART = 2
|
|
BAR_CHART = 3
|
|
BAR_CHART = 3
|
|
- TABLE = 4
|
|
|
|
|
|
+ PIE_CHART = 4
|
|
|
|
+ TABLE = 5
|
|
|
|
+ WORLD_MAP = 6
|
|
|
|
+ PERCENTAGE_AREA_CHART = 7
|
|
TYPES = [
|
|
TYPES = [
|
|
(LINE_CHART, "line"),
|
|
(LINE_CHART, "line"),
|
|
(AREA_CHART, "area"),
|
|
(AREA_CHART, "area"),
|
|
(STACKED_AREA_CHART, "stacked_area"),
|
|
(STACKED_AREA_CHART, "stacked_area"),
|
|
(BAR_CHART, "bar"),
|
|
(BAR_CHART, "bar"),
|
|
|
|
+ (PIE_CHART, "pie"),
|
|
(TABLE, "table"),
|
|
(TABLE, "table"),
|
|
|
|
+ (WORLD_MAP, "world_map"),
|
|
|
|
+ (PERCENTAGE_AREA_CHART, "percentage_area_chart"),
|
|
]
|
|
]
|
|
TYPE_NAMES = [t[1] for t in TYPES]
|
|
TYPE_NAMES = [t[1] for t in TYPES]
|
|
|
|
|
|
|
|
|
|
-class DashboardWidgetQuery(Model):
|
|
|
|
|
|
+class WidgetDataSourceTypes(TypesClass):
|
|
|
|
+ DISCOVER_SAVED_SEARCH = 0
|
|
|
|
+ TYPES = [(DISCOVER_SAVED_SEARCH, "discover_saved_search")]
|
|
|
|
+ TYPE_NAMES = [t[1] for t in TYPES]
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class WidgetDataSource(Model):
|
|
"""
|
|
"""
|
|
- A query in a dashboard widget.
|
|
|
|
|
|
+ A dashboard widget.
|
|
"""
|
|
"""
|
|
|
|
|
|
__core__ = True
|
|
__core__ = True
|
|
|
|
|
|
- widget = FlexibleForeignKey("sentry.DashboardWidget")
|
|
|
|
|
|
+ widget = FlexibleForeignKey("sentry.Widget")
|
|
|
|
+ type = BoundedPositiveIntegerField(choices=WidgetDataSourceTypes.as_choices())
|
|
name = models.CharField(max_length=255)
|
|
name = models.CharField(max_length=255)
|
|
- fields = ArrayField()
|
|
|
|
- conditions = models.TextField()
|
|
|
|
- interval = models.CharField(max_length=10)
|
|
|
|
|
|
+ data = JSONField(default={}) # i.e. saved discover query
|
|
order = BoundedPositiveIntegerField()
|
|
order = BoundedPositiveIntegerField()
|
|
date_added = models.DateTimeField(default=timezone.now)
|
|
date_added = models.DateTimeField(default=timezone.now)
|
|
|
|
+ status = BoundedPositiveIntegerField(
|
|
|
|
+ default=ObjectStatus.VISIBLE, choices=ObjectStatus.as_choices()
|
|
|
|
+ )
|
|
|
|
|
|
class Meta:
|
|
class Meta:
|
|
app_label = "sentry"
|
|
app_label = "sentry"
|
|
- db_table = "sentry_dashboardwidgetquery"
|
|
|
|
|
|
+ db_table = "sentry_widgetdatasource"
|
|
unique_together = (("widget", "name"), ("widget", "order"))
|
|
unique_together = (("widget", "name"), ("widget", "order"))
|
|
|
|
|
|
__repr__ = sane_repr("widget", "type", "name")
|
|
__repr__ = sane_repr("widget", "type", "name")
|
|
|
|
|
|
|
|
|
|
-class DashboardWidget(Model):
|
|
|
|
|
|
+class Widget(Model):
|
|
"""
|
|
"""
|
|
A dashboard widget.
|
|
A dashboard widget.
|
|
"""
|
|
"""
|
|
@@ -86,12 +97,16 @@ class DashboardWidget(Model):
|
|
dashboard = FlexibleForeignKey("sentry.Dashboard")
|
|
dashboard = FlexibleForeignKey("sentry.Dashboard")
|
|
order = BoundedPositiveIntegerField()
|
|
order = BoundedPositiveIntegerField()
|
|
title = models.CharField(max_length=255)
|
|
title = models.CharField(max_length=255)
|
|
- display_type = BoundedPositiveIntegerField(choices=DashboardWidgetDisplayTypes.as_choices())
|
|
|
|
|
|
+ display_type = BoundedPositiveIntegerField(choices=WidgetDisplayTypes.as_choices())
|
|
|
|
+ display_options = JSONField(default={})
|
|
date_added = models.DateTimeField(default=timezone.now)
|
|
date_added = models.DateTimeField(default=timezone.now)
|
|
|
|
+ status = BoundedPositiveIntegerField(
|
|
|
|
+ default=ObjectStatus.VISIBLE, choices=ObjectStatus.as_choices()
|
|
|
|
+ )
|
|
|
|
|
|
class Meta:
|
|
class Meta:
|
|
app_label = "sentry"
|
|
app_label = "sentry"
|
|
- db_table = "sentry_dashboardwidget"
|
|
|
|
|
|
+ db_table = "sentry_widget"
|
|
unique_together = (("dashboard", "order"), ("dashboard", "title"))
|
|
unique_together = (("dashboard", "order"), ("dashboard", "title"))
|
|
|
|
|
|
__repr__ = sane_repr("dashboard", "title")
|
|
__repr__ = sane_repr("dashboard", "title")
|