mirror of https://github.com/grafana/grafana.git
LibraryPanels: Fixes "error while loading library panels" (#34278)
* LibraryPanels: Fixes error while loading library panels * Chore: fixes imports
This commit is contained in:
parent
8cfbee1e11
commit
592a3af40e
|
|
@ -6,11 +6,11 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/services/search"
|
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/api/dtos"
|
"github.com/grafana/grafana/pkg/api/dtos"
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
|
"github.com/grafana/grafana/pkg/services/search"
|
||||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||||
|
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||||
"github.com/grafana/grafana/pkg/util"
|
"github.com/grafana/grafana/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -23,13 +23,18 @@ SELECT DISTINCT
|
||||||
, u2.login AS updated_by_name
|
, u2.login AS updated_by_name
|
||||||
, u2.email AS updated_by_email
|
, u2.email AS updated_by_email
|
||||||
, (SELECT COUNT(connection_id) FROM ` + connectionTableName + ` WHERE element_id = le.id AND kind=1) AS connected_dashboards`
|
, (SELECT COUNT(connection_id) FROM ` + connectionTableName + ` WHERE element_id = le.id AND kind=1) AS connected_dashboards`
|
||||||
fromLibraryElementDTOWithMeta = `
|
|
||||||
FROM library_element AS le
|
|
||||||
LEFT JOIN user AS u1 ON le.created_by = u1.id
|
|
||||||
LEFT JOIN user AS u2 ON le.updated_by = u2.id
|
|
||||||
`
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func getFromLibraryElementDTOWithMeta(dialect migrator.Dialect) string {
|
||||||
|
user := dialect.Quote("user")
|
||||||
|
userJoin := `
|
||||||
|
FROM library_element AS le
|
||||||
|
LEFT JOIN ` + user + ` AS u1 ON le.created_by = u1.id
|
||||||
|
LEFT JOIN ` + user + ` AS u2 ON le.updated_by = u2.id
|
||||||
|
`
|
||||||
|
return userJoin
|
||||||
|
}
|
||||||
|
|
||||||
func syncFieldsWithModel(libraryElement *LibraryElement) error {
|
func syncFieldsWithModel(libraryElement *LibraryElement) error {
|
||||||
var model map[string]interface{}
|
var model map[string]interface{}
|
||||||
if err := json.Unmarshal(libraryElement.Model, &model); err != nil {
|
if err := json.Unmarshal(libraryElement.Model, &model); err != nil {
|
||||||
|
|
@ -61,12 +66,12 @@ func syncFieldsWithModel(libraryElement *LibraryElement) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLibraryElement(session *sqlstore.DBSession, uid string, orgID int64) (LibraryElementWithMeta, error) {
|
func getLibraryElement(dialect migrator.Dialect, session *sqlstore.DBSession, uid string, orgID int64) (LibraryElementWithMeta, error) {
|
||||||
elements := make([]LibraryElementWithMeta, 0)
|
elements := make([]LibraryElementWithMeta, 0)
|
||||||
sql := selectLibraryElementDTOWithMeta +
|
sql := selectLibraryElementDTOWithMeta +
|
||||||
", coalesce(dashboard.title, 'General') AS folder_name" +
|
", coalesce(dashboard.title, 'General') AS folder_name" +
|
||||||
", coalesce(dashboard.uid, '') AS folder_uid" +
|
", coalesce(dashboard.uid, '') AS folder_uid" +
|
||||||
fromLibraryElementDTOWithMeta +
|
getFromLibraryElementDTOWithMeta(dialect) +
|
||||||
" LEFT JOIN dashboard AS dashboard ON dashboard.id = le.folder_id" +
|
" LEFT JOIN dashboard AS dashboard ON dashboard.id = le.folder_id" +
|
||||||
" WHERE le.uid=? AND le.org_id=?"
|
" WHERE le.uid=? AND le.org_id=?"
|
||||||
sess := session.SQL(sql, uid, orgID)
|
sess := session.SQL(sql, uid, orgID)
|
||||||
|
|
@ -156,7 +161,7 @@ func (l *LibraryElementService) createLibraryElement(c *models.ReqContext, cmd C
|
||||||
// deleteLibraryElement deletes a library element.
|
// deleteLibraryElement deletes a library element.
|
||||||
func (l *LibraryElementService) deleteLibraryElement(c *models.ReqContext, uid string) error {
|
func (l *LibraryElementService) deleteLibraryElement(c *models.ReqContext, uid string) error {
|
||||||
return l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
|
return l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
|
||||||
element, err := getLibraryElement(session, uid, c.SignedInUser.OrgId)
|
element, err := getLibraryElement(l.SQLStore.Dialect, session, uid, c.SignedInUser.OrgId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -195,13 +200,13 @@ func (l *LibraryElementService) getLibraryElements(c *models.ReqContext, params
|
||||||
builder.Write(selectLibraryElementDTOWithMeta)
|
builder.Write(selectLibraryElementDTOWithMeta)
|
||||||
builder.Write(", 'General' as folder_name ")
|
builder.Write(", 'General' as folder_name ")
|
||||||
builder.Write(", '' as folder_uid ")
|
builder.Write(", '' as folder_uid ")
|
||||||
builder.Write(fromLibraryElementDTOWithMeta)
|
builder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect))
|
||||||
writeParamSelectorSQL(&builder, append(params, Pair{"folder_id", 0})...)
|
writeParamSelectorSQL(&builder, append(params, Pair{"folder_id", 0})...)
|
||||||
builder.Write(" UNION ")
|
builder.Write(" UNION ")
|
||||||
builder.Write(selectLibraryElementDTOWithMeta)
|
builder.Write(selectLibraryElementDTOWithMeta)
|
||||||
builder.Write(", dashboard.title as folder_name ")
|
builder.Write(", dashboard.title as folder_name ")
|
||||||
builder.Write(", dashboard.uid as folder_uid ")
|
builder.Write(", dashboard.uid as folder_uid ")
|
||||||
builder.Write(fromLibraryElementDTOWithMeta)
|
builder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect))
|
||||||
builder.Write(" INNER JOIN dashboard AS dashboard on le.folder_id = dashboard.id AND le.folder_id <> 0")
|
builder.Write(" INNER JOIN dashboard AS dashboard on le.folder_id = dashboard.id AND le.folder_id <> 0")
|
||||||
writeParamSelectorSQL(&builder, params...)
|
writeParamSelectorSQL(&builder, params...)
|
||||||
if c.SignedInUser.OrgRole != models.ROLE_ADMIN {
|
if c.SignedInUser.OrgRole != models.ROLE_ADMIN {
|
||||||
|
|
@ -299,7 +304,7 @@ func (l *LibraryElementService) getAllLibraryElements(c *models.ReqContext, quer
|
||||||
builder.Write(selectLibraryElementDTOWithMeta)
|
builder.Write(selectLibraryElementDTOWithMeta)
|
||||||
builder.Write(", 'General' as folder_name ")
|
builder.Write(", 'General' as folder_name ")
|
||||||
builder.Write(", '' as folder_uid ")
|
builder.Write(", '' as folder_uid ")
|
||||||
builder.Write(fromLibraryElementDTOWithMeta)
|
builder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect))
|
||||||
builder.Write(` WHERE le.org_id=? AND le.folder_id=0`, c.SignedInUser.OrgId)
|
builder.Write(` WHERE le.org_id=? AND le.folder_id=0`, c.SignedInUser.OrgId)
|
||||||
writeKindSQL(query, &builder)
|
writeKindSQL(query, &builder)
|
||||||
writeSearchStringSQL(query, l.SQLStore, &builder)
|
writeSearchStringSQL(query, l.SQLStore, &builder)
|
||||||
|
|
@ -310,7 +315,7 @@ func (l *LibraryElementService) getAllLibraryElements(c *models.ReqContext, quer
|
||||||
builder.Write(selectLibraryElementDTOWithMeta)
|
builder.Write(selectLibraryElementDTOWithMeta)
|
||||||
builder.Write(", dashboard.title as folder_name ")
|
builder.Write(", dashboard.title as folder_name ")
|
||||||
builder.Write(", dashboard.uid as folder_uid ")
|
builder.Write(", dashboard.uid as folder_uid ")
|
||||||
builder.Write(fromLibraryElementDTOWithMeta)
|
builder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect))
|
||||||
builder.Write(" INNER JOIN dashboard AS dashboard on le.folder_id = dashboard.id AND le.folder_id<>0")
|
builder.Write(" INNER JOIN dashboard AS dashboard on le.folder_id = dashboard.id AND le.folder_id<>0")
|
||||||
builder.Write(` WHERE le.org_id=?`, c.SignedInUser.OrgId)
|
builder.Write(` WHERE le.org_id=?`, c.SignedInUser.OrgId)
|
||||||
writeKindSQL(query, &builder)
|
writeKindSQL(query, &builder)
|
||||||
|
|
@ -424,7 +429,7 @@ func (l *LibraryElementService) patchLibraryElement(c *models.ReqContext, cmd pa
|
||||||
return LibraryElementDTO{}, err
|
return LibraryElementDTO{}, err
|
||||||
}
|
}
|
||||||
err := l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
|
err := l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
|
||||||
elementInDB, err := getLibraryElement(session, uid, c.SignedInUser.OrgId)
|
elementInDB, err := getLibraryElement(l.SQLStore.Dialect, session, uid, c.SignedInUser.OrgId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -508,7 +513,7 @@ func (l *LibraryElementService) patchLibraryElement(c *models.ReqContext, cmd pa
|
||||||
func (l *LibraryElementService) getConnections(c *models.ReqContext, uid string) ([]LibraryElementConnectionDTO, error) {
|
func (l *LibraryElementService) getConnections(c *models.ReqContext, uid string) ([]LibraryElementConnectionDTO, error) {
|
||||||
connections := make([]LibraryElementConnectionDTO, 0)
|
connections := make([]LibraryElementConnectionDTO, 0)
|
||||||
err := l.SQLStore.WithDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
|
err := l.SQLStore.WithDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
|
||||||
element, err := getLibraryElement(session, uid, c.SignedInUser.OrgId)
|
element, err := getLibraryElement(l.SQLStore.Dialect, session, uid, c.SignedInUser.OrgId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -516,7 +521,7 @@ func (l *LibraryElementService) getConnections(c *models.ReqContext, uid string)
|
||||||
builder := sqlstore.SQLBuilder{}
|
builder := sqlstore.SQLBuilder{}
|
||||||
builder.Write("SELECT lec.*, u1.login AS created_by_name, u1.email AS created_by_email")
|
builder.Write("SELECT lec.*, u1.login AS created_by_name, u1.email AS created_by_email")
|
||||||
builder.Write(" FROM " + connectionTableName + " AS lec")
|
builder.Write(" FROM " + connectionTableName + " AS lec")
|
||||||
builder.Write(" LEFT JOIN user AS u1 ON lec.created_by = u1.id")
|
builder.Write(" LEFT JOIN " + l.SQLStore.Dialect.Quote("user") + " AS u1 ON lec.created_by = u1.id")
|
||||||
builder.Write(" INNER JOIN dashboard AS dashboard on lec.connection_id = dashboard.id")
|
builder.Write(" INNER JOIN dashboard AS dashboard on lec.connection_id = dashboard.id")
|
||||||
builder.Write(` WHERE lec.element_id=?`, element.ID)
|
builder.Write(` WHERE lec.element_id=?`, element.ID)
|
||||||
if c.SignedInUser.OrgRole != models.ROLE_ADMIN {
|
if c.SignedInUser.OrgRole != models.ROLE_ADMIN {
|
||||||
|
|
@ -555,7 +560,7 @@ func (l *LibraryElementService) getElementsForDashboardID(c *models.ReqContext,
|
||||||
sql := selectLibraryElementDTOWithMeta +
|
sql := selectLibraryElementDTOWithMeta +
|
||||||
", coalesce(dashboard.title, 'General') AS folder_name" +
|
", coalesce(dashboard.title, 'General') AS folder_name" +
|
||||||
", coalesce(dashboard.uid, '') AS folder_uid" +
|
", coalesce(dashboard.uid, '') AS folder_uid" +
|
||||||
fromLibraryElementDTOWithMeta +
|
getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect) +
|
||||||
" LEFT JOIN dashboard AS dashboard ON dashboard.id = le.folder_id" +
|
" LEFT JOIN dashboard AS dashboard ON dashboard.id = le.folder_id" +
|
||||||
" INNER JOIN " + connectionTableName + " AS lce ON lce.element_id = le.id AND lce.kind=1 AND lce.connection_id=?"
|
" INNER JOIN " + connectionTableName + " AS lce ON lce.element_id = le.id AND lce.kind=1 AND lce.connection_id=?"
|
||||||
sess := session.SQL(sql, dashboardID)
|
sess := session.SQL(sql, dashboardID)
|
||||||
|
|
@ -610,7 +615,7 @@ func (l *LibraryElementService) connectElementsToDashboardID(c *models.ReqContex
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, elementUID := range elementUIDs {
|
for _, elementUID := range elementUIDs {
|
||||||
element, err := getLibraryElement(session, elementUID, c.SignedInUser.OrgId)
|
element, err := getLibraryElement(l.SQLStore.Dialect, session, elementUID, c.SignedInUser.OrgId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue