gosora/routes/panel/settings.go
Azareal a8e1076f7c Do proper averaging and collect more samples for the memory analytics pane.
Added an ETag for the alerts endpoint when you're not logged to save bandwidth.
The Page Manager now uses dyntmpl.
The Setting Manager now uses dyntmpl.
The Word Filter Manager now uses dyntmpl.
Fixed the padding on the noavatar alerts for Nox.

Tweaked the panel_word_filters_to phrase.
Tweaked the panel_statistics_memory_head phrase.
Added the panel_statistics_memory_chart_aria phrase.
Added the panel_statistics_memory_table_aria phrase.
Added the panel_statistics_memory_no_memory phrase.
2019-05-02 09:14:07 +10:00

114 lines
3.3 KiB
Go

package panel
import (
"database/sql"
"net/http"
"strconv"
"strings"
c "github.com/Azareal/Gosora/common"
"github.com/Azareal/Gosora/common/phrases"
)
func Settings(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "settings", "settings")
if ferr != nil {
return ferr
}
if !user.Perms.EditSettings {
return c.NoPermissions(w, r, user)
}
// TODO: What if the list gets too long? How should we structure this?
settings, err := basePage.Settings.BypassGetAll()
if err != nil {
return c.InternalError(err, w, r)
}
settingPhrases := phrases.GetAllSettingPhrases()
var settingList []*c.PanelSetting
for _, settingPtr := range settings {
setting := settingPtr.Copy()
if setting.Type == "list" {
llist := settingPhrases[setting.Name+"_label"]
labels := strings.Split(llist, ",")
conv, err := strconv.Atoi(setting.Content)
if err != nil {
return c.LocalError("The setting '"+setting.Name+"' can't be converted to an integer", w, r, user)
}
setting.Content = labels[conv-1]
} else if setting.Type == "bool" {
if setting.Content == "1" {
setting.Content = "Yes"
} else {
setting.Content = "No"
}
} else if setting.Type == "html-attribute" {
setting.Type = "textarea"
}
settingList = append(settingList, &c.PanelSetting{setting, phrases.GetSettingPhrase(setting.Name)})
}
pi := c.PanelPage{basePage, tList, settingList}
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage,"","","panel_settings",&pi})
}
func SettingEdit(w http.ResponseWriter, r *http.Request, user c.User, sname string) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "edit_setting", "settings")
if ferr != nil {
return ferr
}
if !user.Perms.EditSettings {
return c.NoPermissions(w, r, user)
}
setting, err := basePage.Settings.BypassGet(sname)
if err == sql.ErrNoRows {
return c.LocalError("The setting you want to edit doesn't exist.", w, r, user)
} else if err != nil {
return c.InternalError(err, w, r)
}
var itemList []c.OptionLabel
if setting.Type == "list" {
llist := phrases.GetSettingPhrase(setting.Name + "_label")
conv, err := strconv.Atoi(setting.Content)
if err != nil {
return c.LocalError("The value of this setting couldn't be converted to an integer", w, r, user)
}
for index, label := range strings.Split(llist, ",") {
itemList = append(itemList, c.OptionLabel{
Label: label,
Value: index + 1,
Selected: conv == (index + 1),
})
}
} else if setting.Type == "html-attribute" {
setting.Type = "textarea"
}
pSetting := &c.PanelSetting{setting, phrases.GetSettingPhrase(setting.Name)}
pi := c.PanelSettingPage{basePage, itemList, pSetting}
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage,"","","panel_setting",&pi})
}
func SettingEditSubmit(w http.ResponseWriter, r *http.Request, user c.User, sname string) c.RouteError {
headerLite, ferr := c.SimplePanelUserCheck(w, r, &user)
if ferr != nil {
return ferr
}
if !user.Perms.EditSettings {
return c.NoPermissions(w, r, user)
}
scontent := c.SanitiseBody(r.PostFormValue("setting-value"))
rerr := headerLite.Settings.Update(sname, scontent)
if rerr != nil {
return rerr
}
http.Redirect(w, r, "/panel/settings/", http.StatusSeeOther)
return nil
}