getting close to edit working
This commit is contained in:
parent
9c127555eb
commit
4e632602f4
108
news/news.go
108
news/news.go
|
@ -37,6 +37,12 @@ type NewsContainer struct {
|
||||||
Children map[int]*NewsContainer
|
Children map[int]*NewsContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func New(id int) *News {
|
||||||
|
news := &News{}
|
||||||
|
news.id = id
|
||||||
|
return news
|
||||||
|
}
|
||||||
|
|
||||||
// Insert News item into DB
|
// Insert News item into DB
|
||||||
func (news *News) Insert(db *sql.DB) error {
|
func (news *News) Insert(db *sql.DB) error {
|
||||||
_, err := db.Exec("INSERT INTO news (url, title, category_id, notes) VALUES($1, $2, $3, $4)", news.Url, news.Title, news.Category_id, news.Notes)
|
_, err := db.Exec("INSERT INTO news (url, title, category_id, notes) VALUES($1, $2, $3, $4)", news.Url, news.Title, news.Category_id, news.Notes)
|
||||||
|
@ -76,6 +82,54 @@ func Get(db *sql.DB, id int) (*News, error) {
|
||||||
return news, err
|
return news, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load and return in NewsContainer format all the unexported news items
|
||||||
|
func LoadPage(db *sql.DB, offset, amount int) ([]*News, int, error) {
|
||||||
|
categories.LoadCategories(db) // required by addContainer
|
||||||
|
|
||||||
|
rows, err := db.Query("SELECT "+SQL_NEWS_FIELDS+" FROM news WHERE exported is null order by timestamp DESC")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("DB errpr reading LoadPage news: ", err)
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
return convertSqlToNews(rows)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load and return in NewsContainer format all the unexported news items
|
||||||
|
func Unexported(db *sql.DB) (map[int]*NewsContainer, int, error) {
|
||||||
|
categories.LoadCategories(db) // required by addContainer
|
||||||
|
|
||||||
|
rows, err := db.Query("SELECT "+SQL_NEWS_FIELDS+" FROM news WHERE exported is null order by category_id ASC")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("DB errpr reading unexported news: ", err)
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
return convertSqlToNewsContainer(rows)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper fn - formating - math
|
||||||
|
func (this *NewsContainer) HeaderDepth(start int) int {
|
||||||
|
return start + this.Category.Depth()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark the current batch (news.exported is null) as exported in this batch (exported = now())
|
||||||
|
func MarkExported(db *sql.DB) error {
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
|
_, err := db.Exec("UPDATE news SET exported=$1 WHERE exported is null", now)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("DB errror: news.MarkExported():", err)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (news *News) Id() int {
|
||||||
|
return news.id
|
||||||
|
}
|
||||||
|
|
||||||
func nullStringToString(str *sql.NullString) string {
|
func nullStringToString(str *sql.NullString) string {
|
||||||
if str.Valid {
|
if str.Valid {
|
||||||
return str.String
|
return str.String
|
||||||
|
@ -107,42 +161,6 @@ func addContainer(category_id int, flat, tree map[int]*NewsContainer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load and return in NewsContainer format all the unexported news items
|
|
||||||
func LoadPage(db *sql.DB, offset, amount int) ([]*News, int, error) {
|
|
||||||
categories.LoadCategories(db) // required by addContainer
|
|
||||||
|
|
||||||
rows, err := db.Query("SELECT "+SQL_NEWS_FIELDS+" FROM news WHERE exported is null order by timestamp DESC")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("DB errpr reading LoadPage news: ", err)
|
|
||||||
return nil, 0, err
|
|
||||||
}
|
|
||||||
defer rows.Close()
|
|
||||||
|
|
||||||
return convertSqlToNews(rows)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load and return in NewsContainer format all the unexported news items
|
|
||||||
func Unexported(db *sql.DB) (map[int]*NewsContainer, int, error) {
|
|
||||||
categories.LoadCategories(db) // required by addContainer
|
|
||||||
|
|
||||||
rows, err := db.Query("SELECT "+SQL_NEWS_FIELDS+" FROM news WHERE exported is null order by category_id ASC")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("DB errpr reading unexported news: ", err)
|
|
||||||
return nil, 0, err
|
|
||||||
}
|
|
||||||
defer rows.Close()
|
|
||||||
|
|
||||||
return convertSqlToNewsContainer(rows)
|
|
||||||
}
|
|
||||||
|
|
||||||
//id int
|
|
||||||
//Url string
|
|
||||||
//Title string
|
|
||||||
//Category_id int
|
|
||||||
//Date time.Time
|
|
||||||
//Notes string
|
|
||||||
//Expoerted bool
|
|
||||||
//SQL_NEWS_FIELDS = "id, url, title, category_id, timestamp, notes, exported"
|
|
||||||
func scanNews(rows *sql.Rows) (*News, error) {
|
func scanNews(rows *sql.Rows) (*News, error) {
|
||||||
news := &News{}
|
news := &News{}
|
||||||
var url, title, notes sql.NullString
|
var url, title, notes sql.NullString
|
||||||
|
@ -207,22 +225,4 @@ func convertSqlToNewsContainer(rows *sql.Rows) (map[int]*NewsContainer, int, err
|
||||||
return newsTree, count, nil
|
return newsTree, count, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper fn - formating - math
|
|
||||||
func (this *NewsContainer) HeaderDepth(start int) int {
|
|
||||||
return start + this.Category.Depth()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark the current batch (news.exported is null) as exported in this batch (exported = now())
|
|
||||||
func MarkExported(db *sql.DB) error {
|
|
||||||
now := time.Now()
|
|
||||||
|
|
||||||
_, err := db.Exec("UPDATE news SET exported=$1 WHERE exported is null", now)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("DB errror: news.MarkExported():", err)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (news *News) Id() int {
|
|
||||||
return news.id
|
|
||||||
}
|
|
||||||
|
|
|
@ -146,7 +146,7 @@ func addFormHandler(w http.ResponseWriter, r *http.Request, user *user.User, ses
|
||||||
|
|
||||||
popup := r.URL.Query().Get("popup")
|
popup := r.URL.Query().Get("popup")
|
||||||
|
|
||||||
ShowTemplate("add", w, map[string]interface{}{"user": user, "flashes": flashes, "link": url, "categories": categories.CategoriesTree, "title": title, "popup": popup})
|
ShowTemplate("post", w, map[string]interface{}{"user": user, "flashes": flashes, "link": url, "categories": categories.CategoriesTree, "title": title, "popup": popup})
|
||||||
}
|
}
|
||||||
|
|
||||||
func addPostHandler(w http.ResponseWriter, r *http.Request, user *user.User, session *sessions.Session) {
|
func addPostHandler(w http.ResponseWriter, r *http.Request, user *user.User, session *sessions.Session) {
|
||||||
|
@ -158,7 +158,10 @@ func addPostHandler(w http.ResponseWriter, r *http.Request, user *user.User, ses
|
||||||
popup := r.FormValue("popup")
|
popup := r.FormValue("popup")
|
||||||
category_id, err := strconv.Atoi(r.FormValue("category"))
|
category_id, err := strconv.Atoi(r.FormValue("category"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
category_id = -1
|
var flashes = make(map[string]interface{})
|
||||||
|
flashes["error"] = []string{ "Category required: " +err.Error() }
|
||||||
|
ShowTemplate("post", w, map[string]interface{}{"user": user, "flashes": flashes, "link": news.Url, "categories": categories.CategoriesTree, "title": news.Title, "popup": popup, "notes": news.Notes, "category_id": news.Category_id})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
news.Category_id = category_id
|
news.Category_id = category_id
|
||||||
|
|
||||||
|
@ -166,7 +169,8 @@ func addPostHandler(w http.ResponseWriter, r *http.Request, user *user.User, ses
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var flashes = make(map[string]interface{})
|
var flashes = make(map[string]interface{})
|
||||||
flashes["error"] = []string{ "Error saving news: "+err.Error() }
|
flashes["error"] = []string{ "Error saving news: "+err.Error() }
|
||||||
ShowTemplate("add", w, map[string]interface{}{"user": user, "flashes": flashes, "link": news.Url, "categories": categories.CategoriesTree, "title": news.Title, "popup": popup, "notes": news.Notes, "category_id": news.Category_id})
|
ShowTemplate("post", w, map[string]interface{}{"user": user, "flashes": flashes, "link": news.Url, "categories": categories.CategoriesTree, "title": news.Title, "popup": popup, "notes": news.Notes, "category_id": news.Category_id})
|
||||||
|
return
|
||||||
} else {
|
} else {
|
||||||
session.AddFlash("Added news \""+news.Title+"\"", flash_info)
|
session.AddFlash("Added news \""+news.Title+"\"", flash_info)
|
||||||
session.Save(r, w)
|
session.Save(r, w)
|
||||||
|
@ -178,13 +182,11 @@ func addPostHandler(w http.ResponseWriter, r *http.Request, user *user.User, ses
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
func editFormHandler(w http.ResponseWriter, r *http.Request, user *user.User, session *sessions.Session) {
|
func editFormHandler(w http.ResponseWriter, r *http.Request, user *user.User, session *sessions.Session) {
|
||||||
categories.LoadCategories(db)
|
categories.LoadCategories(db)
|
||||||
|
|
||||||
flashes := GetFlashes(session)
|
flashes := GetFlashes(session)
|
||||||
|
|
||||||
|
|
||||||
id, idErr := strconv.Atoi(r.FormValue("id"))
|
id, idErr := strconv.Atoi(r.FormValue("id"))
|
||||||
if idErr != nil {
|
if idErr != nil {
|
||||||
session.AddFlash("Could not understand news id", flash_err)
|
session.AddFlash("Could not understand news id", flash_err)
|
||||||
|
@ -201,23 +203,39 @@ func editFormHandler(w http.ResponseWriter, r *http.Request, user *user.User, se
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
session.Save(r, w)
|
session.Save(r, w)
|
||||||
ShowTemplate("add", w, map[string]interface{}{"user": user, "flashes": flashes, "categories": categories.CategoriesTree, "link": newsItem.Url, "title": newsItem.Title, "notes": newsItem.Notes, "popup": false, "category": newsItem.Category_id})
|
ShowTemplate("post", w, map[string]interface{}{"user": user, "flashes": flashes, "categories": categories.CategoriesTree, "link": newsItem.Url, "title": newsItem.Title, "notes": newsItem.Notes, "popup": false, "category": newsItem.Category_id, "id": newsItem.Id()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func editPostHandler(w http.ResponseWriter, r *http.Request, user *user.User, session *sessions.Session) {
|
func editPostHandler(w http.ResponseWriter, r *http.Request, user *user.User, session *sessions.Session) {
|
||||||
news := news.News{}
|
news_id, err := strconv.Atoi(r.FormValue("id"))
|
||||||
|
if err != nil {
|
||||||
|
session.AddFlash("Error trying to save news item", flash_err)
|
||||||
|
session.Save(r, w)
|
||||||
|
http.Redirect(w, r, "/news", http.StatusFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
news := news.New(news_id)
|
||||||
|
|
||||||
news.Title = r.FormValue("title")
|
news.Title = r.FormValue("title")
|
||||||
news.Notes = r.FormValue("notes")
|
news.Notes = r.FormValue("notes")
|
||||||
news.Url = r.FormValue("link")
|
news.Url = r.FormValue("link")
|
||||||
|
|
||||||
popup := r.FormValue("popup")
|
popup := r.FormValue("popup")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
category_id, err := strconv.Atoi(r.FormValue("category"))
|
category_id, err := strconv.Atoi(r.FormValue("category"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
category_id = -1
|
var flashes = make(map[string]interface{})
|
||||||
|
flashes["error"] = []string{ "Category required: " +err.Error() }
|
||||||
|
ShowTemplate("post", w, map[string]interface{}{"user": user, "flashes": flashes, "link": news.Url, "categories": categories.CategoriesTree, "title": news.Title, "popup": popup, "notes": news.Notes, "category_id": news.Category_id})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
news.Category_id = category_id
|
news.Category_id = category_id
|
||||||
|
|
||||||
err = news.Insert(db)
|
err = news.Insert(db)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
{{template "flashes" .}}
|
{{template "flashes" .}}
|
||||||
<form class="form-add" action="/add" method="post" role="form" class="container col-form">
|
<form class="form-add" action="/add" method="post" role="form" class="container col-form">
|
||||||
<input type="hidden" name="popup" value="{{.popup}}" />
|
<input type="hidden" name="popup" value="{{.popup}}" />
|
||||||
|
<input type="hidden" name="id" value="{{.id}}" />
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-2">Link:</div><div class="col-xs-10"><input type="text" class="form-control" name="link" placeholder="Link" value="{{.link}}"/></div>
|
<div class="col-xs-2">Link:</div><div class="col-xs-10"><input type="text" class="form-control" name="link" placeholder="Link" value="{{.link}}"/></div>
|
||||||
<div class="col-xs-2">Title:</div><div class="col-xs-10"><input type="text" class="form-control" name="title" placeholder="Title" value="{{.title}}"/></div>
|
<div class="col-xs-2">Title:</div><div class="col-xs-10"><input type="text" class="form-control" name="title" placeholder="Title" value="{{.title}}"/></div>
|
||||||
|
@ -10,7 +11,7 @@
|
||||||
<select class="form-control add-category" name="category" placeholder="Category">
|
<select class="form-control add-category" name="category" placeholder="Category">
|
||||||
<option value="-1">-- Pick a Category --</option>
|
<option value="-1">-- Pick a Category --</option>
|
||||||
{{range $category := .categories}}
|
{{range $category := .categories}}
|
||||||
{{template "option-category" $category}}
|
{{template "option-category" dict "category" $category "category_id" .category_id}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -23,8 +24,8 @@
|
||||||
|
|
||||||
|
|
||||||
{{define "option-category"}}
|
{{define "option-category"}}
|
||||||
<option value="{{.Id}}">{{.ToString}}</option>
|
<option value="{{$category.Id}}" {{if eq $category.Id $category_id}}selected="true"{{end}} >{{$category.ToString}}</option>
|
||||||
{{range $child := .Children}}
|
{{range $child := $category.Children}}
|
||||||
{{template "option-category" $child}}
|
{{template "option-category" dict "category" $child "category_id" .category_id}}
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
Loading…
Reference in New Issue