Fix modpanel torrent edit (#328)
* Fix modpanel torrent edits breaking torrents * Fix hash not being monospace anymore * Fix modpanel torrent edit strings * Fix modpanel torrent edit creating a new user (wtf GORM)
Cette révision appartient à :
Parent
70795078df
révision
7bc395068d
6 fichiers modifiés avec 91 ajouts et 39 suppressions
|
@ -1,5 +1,3 @@
|
||||||
// hurry mod panel to get it faaaaaaaaaaaast
|
|
||||||
|
|
||||||
package router
|
package router
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -9,9 +7,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/ewhal/nyaa/config"
|
|
||||||
"github.com/ewhal/nyaa/db"
|
"github.com/ewhal/nyaa/db"
|
||||||
"github.com/ewhal/nyaa/model"
|
"github.com/ewhal/nyaa/model"
|
||||||
"github.com/ewhal/nyaa/service"
|
"github.com/ewhal/nyaa/service"
|
||||||
|
@ -186,6 +182,7 @@ func CommentsListPanel(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TorrentEditModPanel(w http.ResponseWriter, r *http.Request) {
|
func TorrentEditModPanel(w http.ResponseWriter, r *http.Request) {
|
||||||
currentUser := GetUser(r)
|
currentUser := GetUser(r)
|
||||||
if userPermission.HasAdmin(currentUser) {
|
if userPermission.HasAdmin(currentUser) {
|
||||||
|
@ -197,7 +194,6 @@ func TorrentEditModPanel(w http.ResponseWriter, r *http.Request) {
|
||||||
uploadForm := NewUploadForm()
|
uploadForm := NewUploadForm()
|
||||||
uploadForm.Name = torrentJson.Name
|
uploadForm.Name = torrentJson.Name
|
||||||
uploadForm.Category = torrentJson.Category + "_" + torrentJson.SubCategory
|
uploadForm.Category = torrentJson.Category + "_" + torrentJson.SubCategory
|
||||||
uploadForm.Magnet = string(torrentJson.Magnet)
|
|
||||||
uploadForm.Status = torrentJson.Status
|
uploadForm.Status = torrentJson.Status
|
||||||
uploadForm.Description = string(torrentJson.Description)
|
uploadForm.Description = string(torrentJson.Description)
|
||||||
htv := PanelTorrentEdVbs{uploadForm, NewSearchForm(), currentUser, form.NewErrors(), form.NewInfos(), r.URL}
|
htv := PanelTorrentEdVbs{uploadForm, NewSearchForm(), currentUser, form.NewErrors(), form.NewInfos(), r.URL}
|
||||||
|
@ -209,11 +205,11 @@ func TorrentEditModPanel(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TorrentPostEditModPanel(w http.ResponseWriter, r *http.Request) {
|
func TorrentPostEditModPanel(w http.ResponseWriter, r *http.Request) {
|
||||||
currentUser := GetUser(r)
|
currentUser := GetUser(r)
|
||||||
if userPermission.HasAdmin(currentUser) {
|
if !userPermission.HasAdmin(currentUser) {
|
||||||
if config.UploadsDisabled {
|
http.Error(w, "admins only", http.StatusForbidden)
|
||||||
http.Error(w, "Error uploads are disabled", http.StatusInternalServerError)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var uploadForm UploadForm
|
var uploadForm UploadForm
|
||||||
|
@ -222,32 +218,25 @@ func TorrentPostEditModPanel(w http.ResponseWriter, r *http.Request) {
|
||||||
infos := form.NewInfos()
|
infos := form.NewInfos()
|
||||||
torrent, _ := torrentService.GetTorrentById(id)
|
torrent, _ := torrentService.GetTorrentById(id)
|
||||||
if (torrent.ID > 0) {
|
if (torrent.ID > 0) {
|
||||||
// validation is done in ExtractInfo()
|
errUp := uploadForm.ExtractEditInfo(r)
|
||||||
errUp := uploadForm.ExtractInfo(r)
|
|
||||||
if errUp != nil {
|
if errUp != nil {
|
||||||
err["errors"] = append(err["errors"], "Failed to upload!")
|
err["errors"] = append(err["errors"], "Failed to update torrent!")
|
||||||
|
}
|
||||||
|
if (len(err) == 0) {
|
||||||
|
// update some (but not all!) values
|
||||||
|
torrent.Name = uploadForm.Name
|
||||||
|
torrent.Category = uploadForm.CategoryID
|
||||||
|
torrent.SubCategory = uploadForm.SubCategoryID
|
||||||
|
torrent.Status = uploadForm.Status
|
||||||
|
torrent.Description = uploadForm.Description
|
||||||
|
torrent.Uploader = nil // GORM will create a new user otherwise (wtf?!)
|
||||||
|
db.ORM.Save(&torrent)
|
||||||
|
infos["infos"] = append(infos["infos"], "Torrent details updated.")
|
||||||
}
|
}
|
||||||
if (len(err) > 0) {
|
|
||||||
//add to db and redirect depending on result
|
|
||||||
torrent.Name= uploadForm.Name
|
|
||||||
torrent.Category= uploadForm.CategoryID
|
|
||||||
torrent.SubCategory=uploadForm.SubCategoryID
|
|
||||||
torrent.Status= uploadForm.Status
|
|
||||||
torrent.Hash= uploadForm.Infohash
|
|
||||||
torrent.Date= time.Now()
|
|
||||||
torrent.Filesize= uploadForm.Filesize
|
|
||||||
torrent.Description= uploadForm.Description
|
|
||||||
db.ORM.Save(&torrent)
|
|
||||||
infos["infos"] = append(infos["infos"], "Torrent details updated!")
|
|
||||||
}
|
}
|
||||||
}
|
languages.SetTranslationFromRequest(panelTorrentEd, r, "en-us")
|
||||||
languages.SetTranslationFromRequest(panelTorrentEd, r, "en-us")
|
htv := PanelTorrentEdVbs{uploadForm, NewSearchForm(), currentUser, err, infos, r.URL}
|
||||||
htv := PanelTorrentEdVbs{uploadForm, NewSearchForm(), currentUser, err, infos, r.URL}
|
_ = panelTorrentEd.ExecuteTemplate(w, "admin_index.html", htv)
|
||||||
_ = panelTorrentEd.ExecuteTemplate(w, "admin_index.html", htv)
|
|
||||||
} else {
|
|
||||||
http.Error(w, "admins only", http.StatusForbidden)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func CommentDeleteModPanel(w http.ResponseWriter, r *http.Request) {
|
func CommentDeleteModPanel(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
|
@ -193,6 +193,36 @@ func (f *UploadForm) ExtractInfo(r *http.Request) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *UploadForm) ExtractEditInfo(r *http.Request) error {
|
||||||
|
f.Name = r.FormValue(UploadFormName)
|
||||||
|
f.Category = r.FormValue(UploadFormCategory)
|
||||||
|
f.Description = r.FormValue(UploadFormDescription)
|
||||||
|
f.Status, _ = strconv.Atoi(r.FormValue(UploadFormStatus))
|
||||||
|
|
||||||
|
// trim whitespace
|
||||||
|
f.Name = util.TrimWhitespaces(f.Name)
|
||||||
|
f.Description = p.Sanitize(util.TrimWhitespaces(f.Description))
|
||||||
|
|
||||||
|
catsSplit := strings.Split(f.Category, "_")
|
||||||
|
// need this to prevent out of index panics
|
||||||
|
if len(catsSplit) == 2 {
|
||||||
|
CatID, err := strconv.Atoi(catsSplit[0])
|
||||||
|
if err != nil {
|
||||||
|
return ErrInvalidTorrentCategory
|
||||||
|
}
|
||||||
|
SubCatID, err := strconv.Atoi(catsSplit[1])
|
||||||
|
if err != nil {
|
||||||
|
return ErrInvalidTorrentCategory
|
||||||
|
}
|
||||||
|
|
||||||
|
f.CategoryID = CatID
|
||||||
|
f.SubCategoryID = SubCatID
|
||||||
|
} else {
|
||||||
|
return ErrInvalidTorrentCategory
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func WriteTorrentToDisk(file multipart.File, name string, fullpath *string) error {
|
func WriteTorrentToDisk(file multipart.File, name string, fullpath *string) error {
|
||||||
_, seekErr := file.Seek(0, io.SeekStart)
|
_, seekErr := file.Seek(0, io.SeekStart)
|
||||||
if seekErr != nil {
|
if seekErr != nil {
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<label for="name">{{T "name"}}</label>
|
<label for="name">{{T "name"}}</label>
|
||||||
<input type="text" name="name" class="form-control" placeholder="File Name" value="{{.Name}}" required>
|
<input type="text" name="name" class="form-control" placeholder="File Name" value="{{.Name}}" required>
|
||||||
</div>
|
</div>
|
||||||
|
<!--
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="torrent">{{T "torrent_file"}}</label>
|
<label for="torrent">{{T "torrent_file"}}</label>
|
||||||
<input type="file" name="torrent" id="torrent" accept=".torrent">
|
<input type="file" name="torrent" id="torrent" accept=".torrent">
|
||||||
|
@ -21,7 +22,7 @@
|
||||||
<label for="magnet">{{T "magnet_link"}}</label>
|
<label for="magnet">{{T "magnet_link"}}</label>
|
||||||
<input type="text" name="magnet" class="form-control"
|
<input type="text" name="magnet" class="form-control"
|
||||||
style="width:60rem" placeholder="{{T "magnet_link"}}" value="{{.Magnet}}">
|
style="width:60rem" placeholder="{{T "magnet_link"}}" value="{{.Magnet}}">
|
||||||
</div>
|
</div>-->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="c">{{T "category"}}</label>
|
<label for="c">{{T "category"}}</label>
|
||||||
<select name="c" class="form-control input-sm">
|
<select name="c" class="form-control input-sm">
|
||||||
|
@ -47,11 +48,11 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="Status">{{T "torrent_status"}}</label>
|
<label for="Status">{{T "torrent_status"}}</label>
|
||||||
<select name="status" class="form-control input-sm">
|
<select name="status" class="form-control input-sm">
|
||||||
<option value="0" {{if eq .Status 0}}selected{{end}}>{{T "mark_as_hidden"}}</option>
|
<option value="0" {{if eq .Status 0}}selected{{end}}>{{T "torrent_status_hidden"}}</option>
|
||||||
<option value="1" {{if eq .Status 1}}selected{{end}}>{{T "mark_as_normal"}}</option>
|
<option value="1" {{if eq .Status 1}}selected{{end}}>{{T "torrent_status_normal"}}</option>
|
||||||
<option value="2" {{if eq .Status 2}}selected{{end}}>{{T "mark_as_remake"}}</option>
|
<option value="2" {{if eq .Status 2}}selected{{end}}>{{T "torrent_status_remake"}}</option>
|
||||||
<option value="3" {{if eq .Status 3}}selected{{end}}>{{T "mark_as_trusted"}}</option>
|
<option value="3" {{if eq .Status 3}}selected{{end}}>{{T "trusted"}}</option>
|
||||||
<option value="4" {{if eq .Status 4}}selected{{end}}>{{T "mark_as_aplus"}}</option>
|
<option value="4" {{if eq .Status 4}}selected{{end}}>A+</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -63,4 +64,4 @@
|
||||||
<button type="submit" class="btn btn-success">{{T "save_changes"}}</button>
|
<button type="submit" class="btn btn-success">{{T "save_changes"}}</button>
|
||||||
</form>
|
</form>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<h4>{{T "hash"}}</h4>
|
<h4>{{T "hash"}}</h4>
|
||||||
<p>{{.Hash}}</p>
|
<p class="torrent-hash">{{.Hash}}</p>
|
||||||
<hr>
|
<hr>
|
||||||
<h4>{{T "date"}}</h4>
|
<h4>{{T "date"}}</h4>
|
||||||
<p class="date-full">{{.Date}}</p>
|
<p class="date-full">{{.Date}}</p>
|
||||||
|
|
|
@ -574,5 +574,21 @@
|
||||||
{
|
{
|
||||||
"id": "email_changed",
|
"id": "email_changed",
|
||||||
"translation": "E-Mail erfolgreich geändert! Bitte bestätige die Änderung mit dem Bestätigungs-Link (an %s gesendet)"
|
"translation": "E-Mail erfolgreich geändert! Bitte bestätige die Änderung mit dem Bestätigungs-Link (an %s gesendet)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "torrent_status",
|
||||||
|
"translation": "Torrent-Status"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "torrent_status_hidden",
|
||||||
|
"translation": "Versteckt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "torrent_status_normal",
|
||||||
|
"translation": "Normal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "torrent_status_remake",
|
||||||
|
"translation": "Remake"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -582,5 +582,21 @@
|
||||||
{
|
{
|
||||||
"id": "email_changed",
|
"id": "email_changed",
|
||||||
"translation": "Email changed successfully! You will have, however, to confirm it by clicking to the link sent to: %s"
|
"translation": "Email changed successfully! You will have, however, to confirm it by clicking to the link sent to: %s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "torrent_status",
|
||||||
|
"translation": "Torrent status"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "torrent_status_hidden",
|
||||||
|
"translation": "Hidden"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "torrent_status_normal",
|
||||||
|
"translation": "Normal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "torrent_status_remake",
|
||||||
|
"translation": "Remake"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
Référencer dans un nouveau ticket