Files
grafana/pkg/models/dashboards.go
T

308 lines
6.8 KiB
Go
Raw Normal View History

2014-08-08 12:35:15 +02:00
package models
import (
"encoding/base64"
"fmt"
"strings"
2014-08-21 22:09:48 +02:00
"time"
"github.com/gosimple/slug"
2016-03-12 00:13:06 +01:00
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/setting"
2014-08-08 12:35:15 +02:00
)
const RootFolderName = "General"
const (
DashTypeDB = "db"
DashTypeSnapshot = "snapshot"
)
// Dashboard model
2014-08-08 12:35:15 +02:00
type Dashboard struct {
Id int64
Uid string
Slug string
OrgId int64
GnetId int64
Version int
PluginId string
2014-11-20 12:11:07 +01:00
Created time.Time
Updated time.Time
2014-08-21 22:09:48 +02:00
2015-12-18 01:52:05 -08:00
UpdatedBy int64
2016-01-27 22:00:24 -08:00
CreatedBy int64
2017-06-23 16:00:26 -04:00
FolderId int64
2017-03-27 14:36:28 +02:00
IsFolder bool
2022-07-18 15:14:58 +02:00
HasACL bool `xorm:"has_acl"`
2015-12-18 00:20:23 -08:00
2014-08-21 22:09:48 +02:00
Title string
2016-03-12 00:13:06 +01:00
Data *simplejson.Json
2014-08-21 22:09:48 +02:00
}
func (d *Dashboard) SetId(id int64) {
d.Id = id
d.Data.Set("id", id)
}
func (d *Dashboard) SetUid(uid string) {
d.Uid = uid
d.Data.Set("uid", uid)
}
func (d *Dashboard) SetVersion(version int) {
d.Version = version
d.Data.Set("version", version)
}
// GetDashboardIdForSavePermissionCheck return the dashboard id to be used for checking permission of dashboard
func (d *Dashboard) GetDashboardIdForSavePermissionCheck() int64 {
if d.Id == 0 {
return d.FolderId
}
return d.Id
}
// NewDashboard creates a new dashboard
2014-08-08 12:35:15 +02:00
func NewDashboard(title string) *Dashboard {
dash := &Dashboard{}
2016-03-12 00:13:06 +01:00
dash.Data = simplejson.New()
dash.Data.Set("title", title)
dash.Title = title
2015-11-20 04:37:24 -08:00
dash.Created = time.Now()
2015-11-20 04:52:50 -08:00
dash.Updated = time.Now()
dash.UpdateSlug()
2014-08-08 12:35:15 +02:00
return dash
}
// NewDashboardFolder creates a new dashboard folder
func NewDashboardFolder(title string) *Dashboard {
folder := NewDashboard(title)
2018-01-29 13:51:01 +01:00
folder.IsFolder = true
2018-08-20 15:33:49 +02:00
folder.Data.Set("schemaVersion", 17)
2018-01-29 13:51:01 +01:00
folder.Data.Set("version", 0)
folder.IsFolder = true
return folder
}
// GetTags turns the tags in data json into go string array
func (d *Dashboard) GetTags() []string {
return d.Data.Get("tags").MustStringArray()
}
2016-03-12 00:13:06 +01:00
func NewDashboardFromJson(data *simplejson.Json) *Dashboard {
2014-12-22 12:25:08 +01:00
dash := &Dashboard{}
2015-05-12 12:20:03 +02:00
dash.Data = data
2016-03-12 00:13:06 +01:00
dash.Title = dash.Data.Get("title").MustString()
2015-11-20 04:52:50 -08:00
dash.UpdateSlug()
update := false
2014-08-08 12:35:15 +02:00
2016-03-12 00:13:06 +01:00
if id, err := dash.Data.Get("id").Float64(); err == nil {
dash.Id = int64(id)
update = true
}
if uid, err := dash.Data.Get("uid").String(); err == nil {
dash.Uid = uid
update = true
}
if version, err := dash.Data.Get("version").Float64(); err == nil && update {
dash.Version = int(version)
dash.Updated = time.Now()
} else {
2016-03-12 00:13:06 +01:00
dash.Data.Set("version", 0)
2015-11-20 04:52:50 -08:00
dash.Created = time.Now()
dash.Updated = time.Now()
2014-08-08 12:35:15 +02:00
}
if gnetId, err := dash.Data.Get("gnetId").Float64(); err == nil {
dash.GnetId = int64(gnetId)
}
2014-12-22 12:25:08 +01:00
return dash
2014-08-08 12:35:15 +02:00
}
2018-04-13 18:40:14 +02:00
// GetDashboardModel turns the command into the saveable model
2015-05-12 12:20:03 +02:00
func (cmd *SaveDashboardCommand) GetDashboardModel() *Dashboard {
dash := NewDashboardFromJson(cmd.Dashboard)
userId := cmd.UserId
if userId == 0 {
userId = -1
}
2016-03-12 00:13:06 +01:00
dash.UpdatedBy = userId
2016-01-27 22:00:24 -08:00
dash.OrgId = cmd.OrgId
2016-07-08 12:26:51 +02:00
dash.PluginId = cmd.PluginId
2017-03-27 14:36:28 +02:00
dash.IsFolder = cmd.IsFolder
2017-06-23 16:00:26 -04:00
dash.FolderId = cmd.FolderId
2015-05-12 12:20:03 +02:00
dash.UpdateSlug()
return dash
}
// UpdateSlug updates the slug
func (d *Dashboard) UpdateSlug() {
title := d.Data.Get("title").MustString()
d.Slug = SlugifyTitle(title)
}
func SlugifyTitle(title string) string {
s := slug.Make(strings.ToLower(title))
if s == "" {
// If the dashboard name is only characters outside of the
// sluggable characters, the slug creation will return an
// empty string which will mess up URLs. This failsafe picks
// that up and creates the slug as a base64 identifier instead.
s = base64.RawURLEncoding.EncodeToString([]byte(title))
if slug.MaxLength != 0 && len(s) > slug.MaxLength {
s = s[:slug.MaxLength]
}
}
return s
}
2015-01-09 11:01:37 +01:00
// GetUrl return the html url for a folder if it's folder, otherwise for a dashboard
func (d *Dashboard) GetUrl() string {
return GetDashboardFolderUrl(d.IsFolder, d.Uid, d.Slug)
}
// GetDashboardFolderUrl return the html url for a folder if it's folder, otherwise for a dashboard
func GetDashboardFolderUrl(isFolder bool, uid string, slug string) string {
if isFolder {
return GetFolderUrl(uid, slug)
}
return GetDashboardUrl(uid, slug)
}
2020-12-15 19:09:04 +01:00
// GetDashboardUrl returns the HTML url for a dashboard.
func GetDashboardUrl(uid string, slug string) string {
return fmt.Sprintf("%s/d/%s/%s", setting.AppSubUrl, uid, slug)
}
// GetKioskModeDashboardUrl returns the HTML url for a dashboard in kiosk mode.
func GetKioskModeDashboardUrl(uid string, slug string, theme Theme) string {
return fmt.Sprintf("%s?kiosk&theme=%s", GetDashboardUrl(uid, slug), string(theme))
}
2020-12-15 19:09:04 +01:00
// GetFullDashboardUrl returns the full URL for a dashboard.
2018-02-01 13:32:00 +01:00
func GetFullDashboardUrl(uid string, slug string) string {
2018-03-27 20:24:11 +02:00
return fmt.Sprintf("%sd/%s/%s", setting.AppUrl, uid, slug)
2018-02-01 13:32:00 +01:00
}
2020-12-15 19:09:04 +01:00
// GetFolderUrl returns the HTML url for a folder.
func GetFolderUrl(folderUid string, slug string) string {
return fmt.Sprintf("%s/dashboards/f/%s/%s", setting.AppSubUrl, folderUid, slug)
}
type ValidateDashboardBeforeSaveResult struct {
IsParentFolderChanged bool
}
2015-01-09 11:01:37 +01:00
//
// COMMANDS
//
type SaveDashboardCommand struct {
Dashboard *simplejson.Json `json:"dashboard" binding:"Required"`
UserId int64 `json:"userId"`
Overwrite bool `json:"overwrite"`
Message string `json:"message"`
OrgId int64 `json:"-"`
RestoredFrom int `json:"-"`
PluginId string `json:"-"`
2017-06-23 16:00:26 -04:00
FolderId int64 `json:"folderId"`
FolderUid string `json:"folderUid"`
2017-06-09 23:19:58 +02:00
IsFolder bool `json:"isFolder"`
2015-01-09 11:01:37 +01:00
2017-11-23 11:29:06 +01:00
UpdatedAt time.Time
Result *Dashboard `json:"-"`
2015-01-09 11:01:37 +01:00
}
type TrimDashboardCommand struct {
Dashboard *simplejson.Json `json:"dashboard" binding:"Required"`
Meta *simplejson.Json `json:"meta"`
Result *Dashboard `json:"-"`
}
type DashboardProvisioning struct {
Id int64
DashboardId int64
Name string
ExternalId string
CheckSum string
Updated int64
}
2015-01-09 11:01:37 +01:00
type DeleteDashboardCommand struct {
Id int64
OrgId int64
ForceDeleteFolderRules bool
2015-01-09 11:01:37 +01:00
}
type DeleteOrphanedProvisionedDashboardsCommand struct {
ReaderNames []string
}
2015-01-09 11:01:37 +01:00
//
// QUERIES
//
type GetDashboardQuery struct {
Slug string // required if no Id or Uid is specified
Id int64 // optional if slug is set
Uid string // optional if slug is set
OrgId int64
2015-01-09 11:01:37 +01:00
Result *Dashboard
}
type DashboardTagCloudItem struct {
Term string `json:"term"`
Count int `json:"count"`
}
type GetDashboardTagsQuery struct {
OrgId int64
Result []*DashboardTagCloudItem
}
type GetDashboardsQuery struct {
DashboardIds []int64
DashboardUIds []string
Result []*Dashboard
}
type GetDashboardsByPluginIdQuery struct {
OrgId int64
PluginId string
Result []*Dashboard
}
2016-03-17 01:01:58 -07:00
type GetDashboardSlugByIdQuery struct {
Id int64
Result string
}
type GetDashboardsBySlugQuery struct {
OrgId int64
Slug string
Result []*Dashboard
}
2018-02-01 13:32:00 +01:00
type DashboardRef struct {
Uid string
Slug string
}
type GetDashboardRefByIdQuery struct {
2018-02-01 13:32:00 +01:00
Id int64
Result *DashboardRef
}