mirror of
https://gitlab.com/SIGBUS/nyaa.git
synced 2024-12-22 09:00:00 +00:00
Restructure upload.html and edit.html as well as route logic
Rename variables and reformats user/admin logic Add an is_trusted field to upload and edit forms Restructure fields on upload and edit pages Add simple styling for checkboxes Add titles (mouseover) for checkboxes with crude explanations Show Anonymous checkbox during upload and check & disable it for guests Show Trusted checkbox for users at or above Trusted level Adjust description field rendering to show field label above it Add title (mouseover) for edit icon on torrent page Show uploader for admins on anonymous torrents Show uploader for admins when editing others' torrents
This commit is contained in:
parent
2ccf23a1f3
commit
b9d88e8960
|
@ -153,6 +153,7 @@ class EditForm(FlaskForm):
|
|||
is_remake = BooleanField('Remake')
|
||||
is_anonymous = BooleanField('Anonymous')
|
||||
is_complete = BooleanField('Complete')
|
||||
is_trusted = BooleanField('Trusted')
|
||||
|
||||
information = StringField('Information', [
|
||||
Length(max=255, message='Information must be at most %(max)d characters long.')
|
||||
|
@ -200,6 +201,7 @@ class UploadForm(FlaskForm):
|
|||
is_remake = BooleanField('Remake')
|
||||
is_anonymous = BooleanField('Anonymous')
|
||||
is_complete = BooleanField('Complete')
|
||||
is_trusted = BooleanField('Trusted')
|
||||
|
||||
information = StringField('Information', [
|
||||
Length(max=255, message='Information must be at most %(max)d characters long.')
|
||||
|
|
|
@ -275,7 +275,7 @@ def view_user(user_name):
|
|||
db.session.add(user)
|
||||
db.session.commit()
|
||||
|
||||
return flask.redirect('/user/' + user.username)
|
||||
return flask.redirect(flask.url_for('view_user', user_name=user.username))
|
||||
|
||||
user_level = ['Regular', 'Trusted', 'Moderator', 'Administrator'][user.level]
|
||||
|
||||
|
@ -579,16 +579,17 @@ def upload():
|
|||
def view_torrent(torrent_id):
|
||||
torrent = models.Torrent.by_id(torrent_id)
|
||||
|
||||
viewer = flask.g.user
|
||||
|
||||
if not torrent:
|
||||
flask.abort(404)
|
||||
|
||||
if torrent.deleted and (not flask.g.user or not flask.g.user.is_admin):
|
||||
# Only allow admins see deleted torrents
|
||||
if torrent.deleted and not (viewer and viewer.is_admin):
|
||||
flask.abort(404)
|
||||
|
||||
if flask.g.user:
|
||||
can_edit = flask.g.user is torrent.user or flask.g.user.is_admin
|
||||
else:
|
||||
can_edit = False
|
||||
# Only allow owners and admins to edit torrents
|
||||
can_edit = viewer and (viewer is torrent.user or viewer.is_admin)
|
||||
|
||||
files = None
|
||||
if torrent.filelist:
|
||||
|
@ -596,6 +597,7 @@ def view_torrent(torrent_id):
|
|||
|
||||
return flask.render_template('view.html', torrent=torrent,
|
||||
files=files,
|
||||
viewer=viewer,
|
||||
can_edit=can_edit)
|
||||
|
||||
|
||||
|
@ -604,15 +606,18 @@ def edit_torrent(torrent_id):
|
|||
torrent = models.Torrent.by_id(torrent_id)
|
||||
form = forms.EditForm(flask.request.form)
|
||||
form.category.choices = _create_upload_category_choices()
|
||||
category = str(torrent.main_category_id) + "_" + str(torrent.sub_category_id)
|
||||
|
||||
editor = flask.g.user
|
||||
|
||||
if not torrent:
|
||||
flask.abort(404)
|
||||
|
||||
if torrent.deleted and (not flask.g.user or not flask.g.user.is_admin):
|
||||
# Only allow admins edit deleted torrents
|
||||
if torrent.deleted and not (editor and editor.is_admin):
|
||||
flask.abort(404)
|
||||
|
||||
if not flask.g.user or (flask.g.user is not torrent.user and not flask.g.user.is_admin):
|
||||
# Only allow torrent owners or admins edit torrents
|
||||
if not editor or not (editor is torrent.user or editor.is_admin):
|
||||
flask.abort(403)
|
||||
|
||||
if flask.request.method == 'POST' and form.validate():
|
||||
|
@ -622,36 +627,43 @@ def edit_torrent(torrent_id):
|
|||
torrent.display_name = (form.display_name.data or '').strip()
|
||||
torrent.information = (form.information.data or '').strip()
|
||||
torrent.description = (form.description.data or '').strip()
|
||||
if flask.g.user.is_admin:
|
||||
torrent.deleted = form.is_deleted.data
|
||||
|
||||
torrent.hidden = form.is_hidden.data
|
||||
torrent.remake = form.is_remake.data
|
||||
torrent.complete = form.is_complete.data
|
||||
torrent.anonymous = form.is_anonymous.data
|
||||
|
||||
if editor.is_trusted:
|
||||
torrent.trusted = form.is_trusted.data
|
||||
if editor.is_admin:
|
||||
torrent.deleted = form.is_deleted.data
|
||||
|
||||
db.session.commit()
|
||||
|
||||
flask.flash(flask.Markup(
|
||||
'Torrent has been successfully edited! Changes might take a few minutes to show up.'), 'info')
|
||||
|
||||
return flask.redirect('/view/' + str(torrent_id))
|
||||
return flask.redirect(flask.url_for('view_torrent', torrent_id=torrent.id))
|
||||
else:
|
||||
# Setup form with pre-formatted form.
|
||||
form.category.data = category
|
||||
form.display_name.data = torrent.display_name
|
||||
form.information.data = torrent.information
|
||||
form.description.data = torrent.description
|
||||
form.is_hidden.data = torrent.hidden
|
||||
if flask.g.user.is_admin:
|
||||
if flask.request.method != 'POST':
|
||||
# Fill form data only if the POST didn't fail
|
||||
form.category.data = torrent.sub_category.id_as_string
|
||||
form.display_name.data = torrent.display_name
|
||||
form.information.data = torrent.information
|
||||
form.description.data = torrent.description
|
||||
|
||||
form.is_hidden.data = torrent.hidden
|
||||
form.is_remake.data = torrent.remake
|
||||
form.is_complete.data = torrent.complete
|
||||
form.is_anonymous.data = torrent.anonymous
|
||||
|
||||
form.is_trusted.data = torrent.trusted
|
||||
form.is_deleted.data = torrent.deleted
|
||||
form.is_remake.data = torrent.remake
|
||||
form.is_complete.data = torrent.complete
|
||||
form.is_anonymous.data = torrent.anonymous
|
||||
|
||||
return flask.render_template('edit.html',
|
||||
form=form,
|
||||
torrent=torrent,
|
||||
admin=flask.g.user.is_admin)
|
||||
editor=editor)
|
||||
|
||||
|
||||
@app.route('/view/<int:torrent_id>/magnet')
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
{% macro render_field(field) %}
|
||||
{% macro render_field(field, render_label=True) %}
|
||||
{% if field.errors %}
|
||||
<div class="form-group has-error">
|
||||
{% else %}
|
||||
<div class="form-group">
|
||||
{% endif %}
|
||||
{% if render_label %}
|
||||
{{ field.label(class='control-label') }}
|
||||
{% endif %}
|
||||
{{ field(title=field.description,**kwargs) | safe }}
|
||||
{% if field.errors %}
|
||||
<div class="help-block">
|
||||
|
@ -27,33 +29,33 @@
|
|||
|
||||
{% macro render_markdown_editor(field, field_name='') %}
|
||||
{% if field.errors %}
|
||||
<div class="form-group has-error">
|
||||
<div class="form-group has-error">
|
||||
{% else %}
|
||||
<div class="form-group">
|
||||
<div class="form-group">
|
||||
{% endif %}
|
||||
<div class="markdown-editor" id="{{ field_name }}-markdown-editor" data-field-name="{{ field_name }}">
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="active">
|
||||
<a href="#{{ field_name }}-tab" aria-controls="" role="tab" data-toggle="tab">
|
||||
Write
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="#{{ field_name }}-preview" id="{{ field_name }}-preview-tab" aria-controls="preview" role="tab" data-toggle="tab">
|
||||
Preview
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="{{ field_name }}-tab" data-markdown-target="#{{ field_name }}-markdown-target">
|
||||
{{ render_field(field, class_='form-control markdown-source') }}
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="{{ field_name }}-preview">
|
||||
{{ field.label(class='control-label') }}
|
||||
<div class="well" id="{{ field_name }}-markdown-target"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="markdown-editor" id="{{ field_name }}-markdown-editor" data-field-name="{{ field_name }}">
|
||||
{{ field.label(class='control-label') }}
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li role="presentation" class="active">
|
||||
<a href="#{{ field_name }}-tab" aria-controls="" role="tab" data-toggle="tab">
|
||||
Write
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="#{{ field_name }}-preview" id="{{ field_name }}-preview-tab" aria-controls="preview" role="tab" data-toggle="tab">
|
||||
Preview
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="{{ field_name }}-tab" data-markdown-target="#{{ field_name }}-markdown-target">
|
||||
{{ render_field(field, False, class_='form-control markdown-source') }}
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="{{ field_name }}-preview">
|
||||
<div class="well" id="{{ field_name }}-markdown-target"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
|
|
|
@ -4,79 +4,73 @@
|
|||
{% from "_formhelpers.html" import render_field %}
|
||||
{% from "_formhelpers.html" import render_markdown_editor %}
|
||||
|
||||
<h1>Edit Torrent</h1>
|
||||
{% set torrent_url = url_for('view_torrent', torrent_id=torrent.id) %}
|
||||
<h1>
|
||||
Edit Torrent <a href="{{ torrent_url }}">#{{torrent.id}}</a>
|
||||
{% if (torrent.user != None) and (torrent.user != editor) %}
|
||||
(by <a href="{{ url_for('view_user', user_name=torrent.user.username) }}">{{ torrent.user.username }}</a>)
|
||||
{% endif %}
|
||||
</h1>
|
||||
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
{{ form.csrf_token }}
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
{{ render_field(form.category, class_='form-control')}}
|
||||
<div class="col-md-6">
|
||||
{{ render_field(form.display_name, class_='form-control', placeholder='Display name') }}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
{{ render_field(form.category, class_='form-control')}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
{{ render_field(form.display_name, class_='form-control', placeholder='Display name') }}
|
||||
<div class="col-md-4">
|
||||
{{ render_field(form.information, class_='form-control', placeholder='Your website or IRC channel') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<label class="control-label">Torrent flags</label>
|
||||
<div>
|
||||
{% if editor.is_admin %}
|
||||
<label class="btn btn-primary">
|
||||
{{ form.is_deleted }}
|
||||
Deleted
|
||||
</label>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
{{ render_field(form.information, class_='form-control', placeholder='Your website or IRC channel') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
{{ render_markdown_editor(form.description, field_name='description') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if admin %}
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
{{ form.is_deleted }}
|
||||
Deleted
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
<label class="btn btn-default" style="background-color: darkgray; border-color: #ccc;" title="Hide torrent from listing">
|
||||
{{ form.is_hidden }}
|
||||
Hidden
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
<label class="btn btn-danger" title="This torrent is derived from another release">
|
||||
{{ form.is_remake }}
|
||||
Remake
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
<label class="btn btn-primary" title="This torrent is a complete batch (eg. season)">
|
||||
{{ form.is_complete }}
|
||||
Complete
|
||||
</label>
|
||||
|
||||
{# Only allow changing anonymous status when an uploader exists #}
|
||||
{% if torrent.uploader_id %}
|
||||
<label class="btn btn-primary" title="Upload torrent anonymously (don't display your username)">
|
||||
{{ form.is_anonymous }}
|
||||
Anonymous
|
||||
</label>
|
||||
{% endif %}
|
||||
{% if editor.is_trusted %}
|
||||
<label class="btn btn-success" title="Mark torrent trusted">
|
||||
{{ form.is_trusted }}
|
||||
Trusted
|
||||
</label>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
{{ form.is_anonymous }}
|
||||
Anonymous
|
||||
</label>
|
||||
<div class="col-md-12">
|
||||
{{ render_markdown_editor(form.description, field_name='description') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -16,68 +16,57 @@
|
|||
<form method="POST" enctype="multipart/form-data">
|
||||
{% if config.ENFORCE_MAIN_ANNOUNCE_URL %}<p><strong>Important:</strong> Please include <kbd>{{config.MAIN_ANNOUNCE_URL}}</kbd> in your trackers</p>{% endif %}
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
{{ render_upload(form.torrent_file, accept=".torrent") }}
|
||||
<div class="col-md-6">
|
||||
{{ render_upload(form.torrent_file, accept=".torrent") }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
{{ render_field(form.category, class_='form-control')}}
|
||||
<div class="col-md-6">
|
||||
{{ render_field(form.display_name, class_='form-control', placeholder='Display name') }}
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
{{ render_field(form.category, class_='form-control')}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
{{ render_field(form.display_name, class_='form-control', placeholder='Display name') }}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<div class="row form-group">
|
||||
<div class="col-md-4">
|
||||
{{ render_field(form.information, class_='form-control', placeholder='Your website or IRC channel') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
{{ render_markdown_editor(form.description, field_name='description') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
<div class="col-md-8">
|
||||
<label class="control-label">Torrent flags</label>
|
||||
<div>
|
||||
<label class="btn btn-default" style="background-color: darkgray; border-color: #ccc;" title="Hide torrent from listing">
|
||||
{{ form.is_hidden }}
|
||||
Hidden
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
<label class="btn btn-danger" title="This torrent is derived from another release">
|
||||
{{ form.is_remake }}
|
||||
Remake
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
<label class="btn btn-primary" title="This torrent is a complete batch (eg. season)">
|
||||
{{ form.is_complete }}
|
||||
Complete
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label>
|
||||
{{ form.is_anonymous }}
|
||||
<label class="btn btn-primary" title="Upload torrent anonymously (don't display your username)">
|
||||
{{ form.is_anonymous(disabled=(False if user else ""), checked=(False if user else "")) }}
|
||||
Anonymous
|
||||
</label>
|
||||
{% if user.is_trusted %}
|
||||
<label class="btn btn-success" title="Mark torrent trusted">
|
||||
{{ form.is_trusted(checked="") }}
|
||||
Trusted
|
||||
</label>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{{ render_markdown_editor(form.description, field_name='description') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<div class="panel-heading"{% if torrent.hidden %} style="background-color: darkgray;"{% endif %}>
|
||||
<h3 class="panel-title">
|
||||
{% if can_edit %}
|
||||
<a href="{{ request.url }}/edit"><i class="fa fa-fw fa-pencil"></i></a>
|
||||
<a href="{{ request.url }}/edit" title="Edit torrent"><i class="fa fa-fw fa-pencil"></i></a>
|
||||
{% endif %}
|
||||
{{ torrent.display_name }}
|
||||
</h3>
|
||||
|
@ -23,7 +23,14 @@
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-1">Submitter:</div>
|
||||
<div class="col-md-5">{% if not torrent.anonymous and torrent.user %}<a href="{{ url_for('view_user', user_name=torrent.user.username) }}">{{ torrent.user.username }}</a>{% else %}Anonymous{% endif %}</div>
|
||||
<div class="col-md-5">
|
||||
{% set user_url = torrent.user and url_for('view_user', user_name=torrent.user.username) %}
|
||||
{%- if not torrent.anonymous and torrent.user -%}
|
||||
<a href="{{ user_url }}">{{ torrent.user.username }}</a>
|
||||
{%- else -%}
|
||||
Anonymous {% if torrent.user and (viewer == torrent.user or viewer.is_admin) %}(<a href="{{ user_url }}">{{ torrent.user.username }}</a>){% endif %}
|
||||
{%- endif -%}
|
||||
</div>
|
||||
|
||||
<div class="col-md-1">Seeders:</div>
|
||||
<div class="col-md-5"><span style="color: green;">{% if config.ENABLE_SHOW_STATS %}{{ torrent.stats.seed_count }}{% else %}Coming soon{% endif %}</span></div>
|
||||
|
|
Loading…
Reference in a new issue