gosora/routes/panel/settings.go
Azareal 5705252029 Add UseConvos permission.
Use UseConvos permission instead of ban flags in convo perm checks.
Stop users without the UseConvos permission from editing convo replies, although they can still delete them for privacy reasons.

Shorten some things and reduce the amount of boilerplate.
Add a few misc parser test cases.
Fix footer and tweak indentation.
2019-10-06 10:34:09 +10:00

115 lines
3.2 KiB
Go

package panel
import (
"database/sql"
"net/http"
"strconv"
"strings"
c "github.com/Azareal/Gosora/common"
p "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 := p.GetAllSettingPhrases()
var settingList []*c.PanelSetting
for _, settingPtr := range settings {
s := settingPtr.Copy()
if s.Type == "list" {
llist := settingPhrases[s.Name+"_label"]
labels := strings.Split(llist, ",")
conv, err := strconv.Atoi(s.Content)
if err != nil {
return c.LocalError("The setting '"+s.Name+"' can't be converted to an integer", w, r, user)
}
s.Content = labels[conv-1]
// TODO: Localise this
} else if s.Type == "bool" {
if s.Content == "1" {
s.Content = "Yes"
} else {
s.Content = "No"
}
} else if s.Type == "html-attribute" {
s.Type = "textarea"
}
settingList = append(settingList, &c.PanelSetting{s, p.GetSettingPhrase(s.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 := p.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, p.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
}