Merge remote-tracking branch 'refs/remotes/origin/master' into delete-button
Cette révision appartient à :
révision
21a2e70692
10 fichiers modifiés avec 151 ajouts et 97 suppressions
|
@ -123,3 +123,10 @@ a:hover {
|
|||
#mainmenu a.nightswitch {
|
||||
background-image: url(/img/moon.png);
|
||||
}
|
||||
|
||||
/* Force images on description to fit width */
|
||||
#description img {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
|
|
@ -104,7 +104,8 @@ td {
|
|||
|
||||
.comment-row td:first-of-type {
|
||||
vertical-align: top;
|
||||
text-align: right;
|
||||
text-align: left;
|
||||
color:#bbb;
|
||||
}
|
||||
|
||||
/* Table style & fixes */
|
||||
|
@ -339,3 +340,10 @@ footer {
|
|||
color: #616161;
|
||||
text-shadow: -1px -1px #999999;
|
||||
}
|
||||
|
||||
/* Force images on description to fit width */
|
||||
#description img {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
package router
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"html"
|
||||
"html/template"
|
||||
"net/http"
|
||||
|
@ -10,6 +11,7 @@ import (
|
|||
"strconv"
|
||||
|
||||
"github.com/ewhal/nyaa/model"
|
||||
"github.com/ewhal/nyaa/service"
|
||||
"github.com/ewhal/nyaa/service/comment"
|
||||
"github.com/ewhal/nyaa/service/report"
|
||||
"github.com/ewhal/nyaa/service/torrent"
|
||||
|
@ -50,6 +52,7 @@ func IndexModPanel(w http.ResponseWriter, r *http.Request) {
|
|||
users, _ := userService.RetrieveUsersForAdmin(offset, 0)
|
||||
comments, _ := commentService.GetAllComments(offset, 0, "", "")
|
||||
torrentReports, _, _ := reportService.GetAllTorrentReports(offset, 0)
|
||||
fmt.Println(torrentReports)
|
||||
|
||||
languages.SetTranslationFromRequest(panelIndex, r, "en-us")
|
||||
htv := PanelIndexVbs{torrents, torrentReports, users, comments, NewSearchForm(), currentUser, r.URL}
|
||||
|
@ -246,6 +249,13 @@ func TorrentDeleteModPanel(w http.ResponseWriter, r *http.Request) {
|
|||
if userPermission.HasAdmin(currentUser) {
|
||||
_ = form.NewErrors()
|
||||
_, _ = torrentService.DeleteTorrent(id)
|
||||
|
||||
//delete reports of torrent
|
||||
whereParams := serviceBase.CreateWhereParams("torrent_id = ?", id)
|
||||
reports, _, _ := reportService.GetTorrentReportsOrderBy(&whereParams, "", 0, 0)
|
||||
for _, report := range reports {
|
||||
reportService.DeleteTorrentReport(report.ID)
|
||||
}
|
||||
url, _ := Router.Get("mod_tlist").URL()
|
||||
http.Redirect(w, r, url.String()+"?deleted", http.StatusSeeOther)
|
||||
} else {
|
||||
|
|
|
@ -59,6 +59,7 @@ type UserProfileEditVariables struct {
|
|||
UserForm userForms.UserForm
|
||||
FormErrors map[string][]string
|
||||
FormInfos map[string][]string
|
||||
Languages map[string]string
|
||||
Search SearchForm
|
||||
Navigation Navigation
|
||||
User *model.User
|
||||
|
|
|
@ -115,7 +115,8 @@ func UserDetailsHandler(w http.ResponseWriter, r *http.Request) {
|
|||
languages.SetTranslationFromRequest(viewProfileEditTemplate, r, "en-us")
|
||||
searchForm := NewSearchForm()
|
||||
searchForm.HideAdvancedSearch = true
|
||||
htv := UserProfileEditVariables{&userProfile, b, form.NewErrors(), form.NewInfos(), searchForm, Navigation{}, currentUser, r.URL, mux.CurrentRoute(r)}
|
||||
availableLanguages := languages.GetAvailableLanguages()
|
||||
htv := UserProfileEditVariables{&userProfile, b, form.NewErrors(), form.NewInfos(), availableLanguages, searchForm, Navigation{}, currentUser, r.URL, mux.CurrentRoute(r)}
|
||||
err := viewProfileEditTemplate.ExecuteTemplate(w, "index.html", htv)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
|
@ -158,7 +159,8 @@ func UserProfileFormHandler(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
}
|
||||
}
|
||||
htv := UserProfileEditVariables{&userProfile, b, err, infos, NewSearchForm(), Navigation{}, currentUser, r.URL, mux.CurrentRoute(r)}
|
||||
availableLanguages := languages.GetAvailableLanguages()
|
||||
htv := UserProfileEditVariables{&userProfile, b, err, infos, availableLanguages, NewSearchForm(), Navigation{}, currentUser, r.URL, mux.CurrentRoute(r)}
|
||||
errorTmpl := viewProfileEditTemplate.ExecuteTemplate(w, "index.html", htv)
|
||||
if errorTmpl != nil {
|
||||
http.Error(w, errorTmpl.Error(), http.StatusInternalServerError)
|
||||
|
|
|
@ -19,7 +19,7 @@ func CreateTorrentReport(torrentReport model.TorrentReport) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func DeleteTorrentReport(id int) (error, int) {
|
||||
func DeleteTorrentReport(id uint) (error, int) {
|
||||
var torrentReport model.TorrentReport
|
||||
if db.ORM.First(&torrentReport, id).RecordNotFound() {
|
||||
return errors.New("Trying to delete a torrent report that does not exists."), http.StatusNotFound
|
||||
|
|
|
@ -23,7 +23,10 @@
|
|||
<div class="col-lg-8">
|
||||
<div class="ui-select">
|
||||
<select id="language" name="language" class="form-control">
|
||||
<option value="en-us" {{ if eq .Language "en-us" }}selected{{end}}>{{T "english"}} ({{ T "default" }})</option>
|
||||
{{ $userLanguage := .Language }}
|
||||
{{ range $tag, $translatedName := $.Languages }}
|
||||
<option value="{{ $tag }}" {{ if or (eq $userLanguage $tag) (and (eq $userLanguage "") (eq $tag "en-us")) }}selected{{end}}>{{ $translatedName }} {{if eq $tag "en-us"}}({{ T "default" }}){{end}}</option>
|
||||
{{ end }}
|
||||
</select>
|
||||
</div>
|
||||
{{ range (index $.FormErrors "language")}}
|
||||
|
|
|
@ -1,100 +1,100 @@
|
|||
{{define "title"}}{{.Torrent.Name}}{{end}}
|
||||
{{define "contclass"}}cont-view{{end}}
|
||||
{{define "content"}}
|
||||
<div class="blockBody">
|
||||
{{with .Torrent}}
|
||||
<hr>
|
||||
<table class="table table-borderless">
|
||||
<tr {{if eq .Status 2}}class="remake"{{end}}
|
||||
{{if eq .Status 3}}class="trusted"{{end}}
|
||||
{{if eq .Status 4}}class="aplus"{{end}}>
|
||||
<td>{{T "name"}}</td>
|
||||
<td>
|
||||
{{.Name}}
|
||||
<img style="float:right" src="{{$.URL.Parse (printf "/img/torrents/%s.png" .SubCategory) }}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{T "hash"}}</td>
|
||||
<td class="torrent-hash">{{.Hash}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{T "date"}}</td>
|
||||
<td class="date-full">{{.Date}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{T "size"}}</td>
|
||||
<td>{{.Filesize}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Uploader</td>
|
||||
<td>
|
||||
<a href="{{$.URL.Parse (printf "/user/%d/-" .UploaderID) }}">{{.UploaderName}}</a>
|
||||
{{if ne .OldUploader ""}}
|
||||
({{.OldUploader}})
|
||||
{{end}}
|
||||
</td>
|
||||
{{if ne .WebsiteLink ""}}
|
||||
<tr>
|
||||
<td>{{T "Link"}}</td>
|
||||
<td><a href="{{.WebsiteLink}}">{{.WebsiteLink}}</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
<tr>
|
||||
<td>{{T "links"}}</td>
|
||||
<td>
|
||||
<a aria-label="Magnet Button" href="{{.Magnet}}" type="button" class="btn btn-success download-btn">
|
||||
<span class="glyphicon glyphicon-magnet" aria-hidden="true"></span> Download!
|
||||
</a>
|
||||
<a style="padding-left: 0.5em"></a>
|
||||
<a aria-label="Torrent file" href="{{.TorrentLink}}" type="button" class="btn btn-success download-btn">
|
||||
<span class="glyphicon glyphicon-floppy-save" aria-hidden="true"></span> Torrent file
|
||||
</a>
|
||||
<a aria-label="Report button" href="{{.TorrentLink}}" type="button" data-toggle="modal" data-target="#reportModal" class="btn btn-danger download-btn">
|
||||
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Report!
|
||||
</a>
|
||||
<div class="blockBody">
|
||||
{{with .Torrent}}
|
||||
<hr>
|
||||
<div class="content" style="margin-bottom: 2em;">
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h3 style="word-break:break-all" {{if eq .Status 2}}class="remake" {{end}} {{if eq .Status 3}}class="trusted" {{end}} {{if eq .Status 4}}class="aplus"{{end}}>{{.Name}}</h3>
|
||||
<div class="uploaded_by">
|
||||
<img style="float:left; margin-right: 1em;" src="{{$.URL.Parse (printf "/img/torrents/%s.png" .SubCategory) }}">
|
||||
<h4>Uploaded by <a href="{{$.URL.Parse (printf "/user/%d/-" .UploaderID) }}">{{.UploaderName}}</a></h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<a style="margin: 5px;" aria-label="Magnet Button" href="{{.Magnet}}" type="button" class="btn btn-lg btn-success download-btn">
|
||||
<span class="glyphicon glyphicon-magnet" aria-hidden="true"></span> Download!
|
||||
</a>
|
||||
{{if ne .TorrentLink ""}}
|
||||
<a style="margin: 5px;" aria-label="Torrent file" href="{{.TorrentLink}}" type="button" class="btn btn-lg btn-success download-btn">
|
||||
<span class="glyphicon glyphicon-floppy-save" aria-hidden="true"></span> Torrent file
|
||||
</a>
|
||||
<a style="margin: 5px;" aria-label="Report button" href="{{.TorrentLink}}" type="button" data-toggle="modal" data-target="#reportModal" class="btn btn-danger btn-lg download-btn">
|
||||
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Report!
|
||||
</a> {{end}}
|
||||
|
||||
{{ if HasAdmin $.User}}
|
||||
<a href="{{ genRoute "mod_tdelete" }}?id={{ .ID }}" class="btn btn-danger btn-lg" onclick="if (!confirm('Are you sure?')) return false;"><i class="glyphicon glyphicon-trash"></i>{{ T "delete" }}</a>
|
||||
{{end}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{T "description"}}</td>
|
||||
<td>{{.Description}}</td>
|
||||
</tr>
|
||||
<tr style="height:2em">
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{T "comments"}}</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
{{ range $index, $element := .Comments }}
|
||||
<tr class="comment-row" id="comment_{{$index}}">
|
||||
<td>
|
||||
<a href="#comment_{{$index}}">{{$index}}</a> {{.Username}}
|
||||
</td>
|
||||
<td>{{.Content}}</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</table>
|
||||
{{end}}
|
||||
<form method="post">
|
||||
<div class="form-group">
|
||||
{{/* There should be a better way to use translation on this... */}}
|
||||
<label for="comment">{{ if gt .User.ID 0}} {{T "submit_a_comment_as_username" .User.Username}} {{else}} {{T "submit_a_comment_as_anonymous"}} {{end}}</label>
|
||||
<textarea name="comment" class="form-control" rows="5"></textarea>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h4>{{T "hash"}}</h4>
|
||||
<p>{{.Hash}}</p>
|
||||
<hr>
|
||||
<h4>{{T "date"}}</h4>
|
||||
<p>{{.Date}}</p>
|
||||
<hr>
|
||||
<h4>{{T "size"}}</h4>
|
||||
<p>{{.Filesize}}</p>
|
||||
<hr>
|
||||
{{if ne .WebsiteLink ""}}
|
||||
<h4>{{T "Link"}}</h4>
|
||||
<p><a href="{{.WebsiteLink}}">{{.WebsiteLink}}</a></p>
|
||||
<hr>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{with .Captcha}} {{block "captcha" .}}{{end}} {{end}}
|
||||
<input type="submit" value="{{T " submit "}}">
|
||||
</form>
|
||||
<div class="row" id="description">
|
||||
<div class="col-md-12">
|
||||
<h4>{{T "description"}}</h4>
|
||||
<div style="word-break:break-all;">{{.Description}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" id="comments">
|
||||
<div class="col-md-12">
|
||||
<h4>{{T "comments"}}</h4>
|
||||
{{ range $index, $element := .Comments }}
|
||||
<div class="row comment-row" id="comment_{{$index}}">
|
||||
<div class="col-md-4">
|
||||
<a href="#comment_{{$index}}">{{$index}}</a> {{.Username}}
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
{{.Content}}
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="row" style="margin-bottom: 2em;">
|
||||
<div class="col-md-12">
|
||||
<form method="post">
|
||||
<div class="form-group">
|
||||
{{/* There should be a better way to use translation on this... */}}
|
||||
<label for="comment">{{ if gt .User.ID 0}} {{T "submit_a_comment_as_username" .User.Username}} {{else}} {{T "submit_a_comment_as_anonymous"}} {{end}}</label>
|
||||
<textarea name="comment" class="form-control" rows="5"></textarea>
|
||||
</div>
|
||||
{{with .Captcha}} {{block "captcha" .}}{{end}} {{end}}
|
||||
<input type="submit" value="{{T " submit "}}">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{with .Torrent}}
|
||||
<div id="reportModal" class="modal fade" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
|
||||
<!-- Modal content-->
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
|
@ -106,15 +106,14 @@
|
|||
<form method="post" action="/report/{{.ID}}">
|
||||
<input type="radio" name="report_type" value="illegal"> Illegal content <br/>
|
||||
<input type="radio" name="report_type" value="spam"> Spam / garbage
|
||||
{{end}}
|
||||
{{with .Captcha}} {{block "captcha" .}}{{end}} {{end}}
|
||||
<button type="submit" class="btn btn-default">Report!</button>
|
||||
{{end}}
|
||||
{{with .Captcha}} {{block "captcha" .}}{{end}} {{end}}
|
||||
<button type="submit" class="btn btn-default">Report!</button>
|
||||
</form> <br />
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
},
|
||||
{
|
||||
"id":"signup_box_title",
|
||||
"translation": "Iscriviti <small>È gratuito e lo sara per sempre.</small>"
|
||||
"translation": "Iscriviti <small>È gratuito e lo sarà per sempre.</small>"
|
||||
},
|
||||
{
|
||||
"id":"username",
|
||||
|
@ -269,7 +269,7 @@
|
|||
},
|
||||
{
|
||||
"id": "answer_is_nyaa_db_lost",
|
||||
"translation": "Abbiamo un database dei torrent di nyaa fino al <s>5 Aprile/s> 1° Maggio. Questo vuol dire che quasi niente è andato perduto."
|
||||
"translation": "Abbiamo un database dei torrent di nyaa fino al <s>5 Aprile</s> 1° Maggio. Questo vuol dire che quasi niente è andato perduto."
|
||||
},
|
||||
{
|
||||
"id": "answer_is_sukebei_db_lost",
|
||||
|
|
|
@ -3,6 +3,7 @@ package languages
|
|||
import (
|
||||
"fmt"
|
||||
"github.com/nicksnyder/go-i18n/i18n"
|
||||
"github.com/ewhal/nyaa/service/user"
|
||||
"html/template"
|
||||
"net/http"
|
||||
)
|
||||
|
@ -33,6 +34,22 @@ func TfuncWithFallback(language string, languages ...string) (i18n.TranslateFunc
|
|||
}, nil
|
||||
}
|
||||
|
||||
func GetAvailableLanguages() (languages map[string]string) {
|
||||
languages = make(map[string]string)
|
||||
var T i18n.TranslateFunc
|
||||
for _, languageTag := range i18n.LanguageTags() {
|
||||
T, _ = i18n.Tfunc(languageTag)
|
||||
/* Translation files should have an ID with the translated language name.
|
||||
If they don't, just use the languageTag */
|
||||
if languageName := T("language_name"); languageName != "language_name" {
|
||||
languages[languageTag] = languageName;
|
||||
} else {
|
||||
languages[languageTag] = languageTag
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func SetTranslation(tmpl *template.Template, language string, languages ...string) i18n.TranslateFunc {
|
||||
T, _ := TfuncWithFallback(language, languages...)
|
||||
tmpl.Funcs(map[string]interface{}{
|
||||
|
@ -44,12 +61,19 @@ func SetTranslation(tmpl *template.Template, language string, languages ...strin
|
|||
}
|
||||
|
||||
func SetTranslationFromRequest(tmpl *template.Template, r *http.Request, defaultLanguage string) i18n.TranslateFunc {
|
||||
userLanguage := ""
|
||||
user, _, err := userService.RetrieveCurrentUser(r)
|
||||
if err == nil {
|
||||
userLanguage = user.Language;
|
||||
}
|
||||
|
||||
cookie, err := r.Cookie("lang")
|
||||
cookieLanguage := ""
|
||||
if err == nil {
|
||||
cookieLanguage = cookie.Value
|
||||
}
|
||||
|
||||
// go-i18n supports the format of the Accept-Language header, thankfully.
|
||||
headerLanguage := r.Header.Get("Accept-Language")
|
||||
return SetTranslation(tmpl, cookieLanguage, headerLanguage, defaultLanguage)
|
||||
return SetTranslation(tmpl, userLanguage, cookieLanguage, headerLanguage, defaultLanguage)
|
||||
}
|
||||
|
|
Référencer dans un nouveau ticket