257 lines
6.0 KiB
Go
257 lines
6.0 KiB
Go
package models
|
|
|
|
import (
|
|
"bytes"
|
|
"image"
|
|
"image/color"
|
|
_ "image/jpeg"
|
|
_ "image/png"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"path"
|
|
|
|
. "git.andr3h3nriqu3s.com/andr3/fyp/logic/models/utils"
|
|
. "git.andr3h3nriqu3s.com/andr3/fyp/logic/utils"
|
|
)
|
|
|
|
func loadBaseImage(c *Context, id string) {
|
|
// TODO handle more types than png
|
|
infile, err := os.Open(path.Join("savedData", id, "baseimage.png"))
|
|
if err != nil {
|
|
c.Logger.Errorf("Failed to read image for model with id %s\n", id)
|
|
c.Logger.Error(err)
|
|
ModelUpdateStatus(c, id, FAILED_PREPARING)
|
|
return
|
|
}
|
|
defer infile.Close()
|
|
|
|
src, format, err := image.Decode(infile)
|
|
if err != nil {
|
|
c.Logger.Errorf("Failed to decode image for model with id %s\n", id)
|
|
c.Logger.Error(err)
|
|
ModelUpdateStatus(c, id, FAILED_PREPARING)
|
|
return
|
|
}
|
|
switch format {
|
|
case "png":
|
|
case "jpeg":
|
|
default:
|
|
ModelUpdateStatus(c, id, FAILED_PREPARING)
|
|
c.Logger.Error("Found unkown format '%s'\n", "format", format)
|
|
panic("Handle diferent files than .png")
|
|
}
|
|
|
|
var model_color string
|
|
|
|
bounds := src.Bounds()
|
|
width, height := bounds.Max.X, bounds.Max.Y
|
|
|
|
switch src.ColorModel() {
|
|
case color.Gray16Model:
|
|
fallthrough
|
|
case color.GrayModel:
|
|
model_color = "greyscale"
|
|
case color.NRGBAModel:
|
|
fallthrough
|
|
case color.YCbCrModel:
|
|
model_color = "rgb"
|
|
default:
|
|
c.Logger.Error("Do not know how to handle this color model")
|
|
|
|
if src.ColorModel() == color.RGBA64Model {
|
|
c.Logger.Error("Color is rgb")
|
|
} else if src.ColorModel() == color.NRGBA64Model {
|
|
c.Logger.Error("Color is nrgb 64")
|
|
} else if src.ColorModel() == color.AlphaModel {
|
|
c.Logger.Error("Color is alpha")
|
|
} else if src.ColorModel() == color.CMYKModel {
|
|
c.Logger.Error("Color is cmyk")
|
|
} else {
|
|
c.Logger.Error("Other so assuming color")
|
|
}
|
|
|
|
ModelUpdateStatus(c, id, FAILED_PREPARING)
|
|
return
|
|
}
|
|
|
|
// Note: this also updates the status to 2
|
|
_, err = c.Db.Exec("update models set width=$1, height=$2, color_mode=$3, format=$4, status=$5 where id=$6", width, height, model_color, format, CONFIRM_PRE_TRAINING, id)
|
|
if err != nil {
|
|
c.Logger.Error("Could not update model")
|
|
c.Logger.Error(err)
|
|
ModelUpdateStatus(c, id, -1)
|
|
return
|
|
}
|
|
}
|
|
|
|
func handleAdd(handle *Handle) {
|
|
handle.GetHTML("/models/add", AnswerTemplate("models/add.html", nil, 1))
|
|
handle.Post("/models/add", func(w http.ResponseWriter, r *http.Request, c *Context) *Error {
|
|
if !CheckAuthLevel(1, w, r, c) {
|
|
return nil
|
|
}
|
|
|
|
if c.Mode == JSON {
|
|
read_form, err := r.MultipartReader()
|
|
if err != nil {
|
|
return c.JsonErrorBadRequest(err, "Please provide a valid multipart Reader request")
|
|
}
|
|
|
|
var name string
|
|
var file []byte
|
|
|
|
for {
|
|
part, err_part := read_form.NextPart()
|
|
if err_part == io.EOF {
|
|
break
|
|
} else if err_part != nil {
|
|
return &Error{Code: http.StatusBadRequest}
|
|
}
|
|
if part.FormName() == "name" {
|
|
buf := new(bytes.Buffer)
|
|
buf.ReadFrom(part)
|
|
name = buf.String()
|
|
}
|
|
if part.FormName() == "file" {
|
|
buf := new(bytes.Buffer)
|
|
buf.ReadFrom(part)
|
|
file = buf.Bytes()
|
|
}
|
|
}
|
|
|
|
if name == "" || len(file) == 0 {
|
|
return c.JsonBadRequest("Name is empty or file is empty")
|
|
}
|
|
|
|
row, err := handle.Db.Query("select id from models where name=$1 and user_id=$2;", name, c.User.Id)
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
|
|
if row.Next() {
|
|
return c.JsonBadRequest("Model with that name already exists!")
|
|
}
|
|
|
|
row, err = handle.Db.Query("insert into models (user_id, name) values ($1, $2) returning id", c.User.Id, name)
|
|
if err != nil || !row.Next() {
|
|
return c.Error500(err)
|
|
}
|
|
|
|
var id string
|
|
err = row.Scan(&id)
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
|
|
// TODO mk this path configurable
|
|
dir_path := path.Join("savedData", id)
|
|
|
|
err = os.Mkdir(dir_path, os.ModePerm)
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
|
|
f, err := os.Create(path.Join(dir_path, "baseimage.png"))
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
defer f.Close()
|
|
|
|
f.Write(file)
|
|
|
|
c.Logger.Warn("Created model with id %s! Started to proccess image!\n", "id", id)
|
|
go loadBaseImage(c, id)
|
|
|
|
return c.SendJSON(id)
|
|
}
|
|
|
|
read_form, err := r.MultipartReader()
|
|
if err != nil {
|
|
LoadBasedOnAnswer(c.Mode, w, "models/add.html", c.AddMap(nil))
|
|
return nil
|
|
}
|
|
|
|
var name string
|
|
var file []byte
|
|
|
|
for {
|
|
part, err_part := read_form.NextPart()
|
|
if err_part == io.EOF {
|
|
break
|
|
} else if err_part != nil {
|
|
return &Error{Code: http.StatusBadRequest}
|
|
}
|
|
if part.FormName() == "name" {
|
|
buf := new(bytes.Buffer)
|
|
buf.ReadFrom(part)
|
|
name = buf.String()
|
|
}
|
|
if part.FormName() == "file" {
|
|
buf := new(bytes.Buffer)
|
|
buf.ReadFrom(part)
|
|
file = buf.Bytes()
|
|
}
|
|
}
|
|
|
|
if name == "" || len(file) == 0 {
|
|
LoadBasedOnAnswer(c.Mode, w, "models/add.html", c.AddMap(nil))
|
|
return nil
|
|
}
|
|
|
|
row, err := handle.Db.Query("select id from models where name=$1 and user_id=$2;", name, c.User.Id)
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
|
|
if row.Next() {
|
|
LoadBasedOnAnswer(c.Mode, w, "models/add.html", c.AddMap(AnyMap{
|
|
"NameFoundError": true,
|
|
"Name": name,
|
|
}))
|
|
return nil
|
|
}
|
|
|
|
_, err = handle.Db.Exec("insert into models (user_id, name) values ($1, $2)", c.User.Id, name)
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
|
|
row, err = handle.Db.Query("select id from models where name=$1 and user_id=$2;", name, c.User.Id)
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
|
|
if !row.Next() {
|
|
return &Error{Code: http.StatusInternalServerError}
|
|
}
|
|
|
|
var id string
|
|
err = row.Scan(&id)
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
|
|
// TODO mk this path configurable
|
|
dir_path := path.Join("savedData", id)
|
|
|
|
err = os.Mkdir(dir_path, os.ModePerm)
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
f, err := os.Create(path.Join(dir_path, "baseimage.png"))
|
|
if err != nil {
|
|
return c.Error500(err)
|
|
}
|
|
defer f.Close()
|
|
|
|
f.Write(file)
|
|
|
|
c.Logger.Warn("Created model with id %s! Started to proccess image!\n", "id", id)
|
|
go loadBaseImage(c, id)
|
|
|
|
Redirect("/models/edit?id="+id, c.Mode, w, r)
|
|
return nil
|
|
})
|
|
}
|