Add folders management
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
72adc1f8c0
commit
4e90a95a0e
@ -11,7 +11,7 @@ from .config import app, auth, logger, scheduler, ADMIN_USERNAME, ADMIN_PASSWORD
|
||||
CLOUDPROXY_ENDPOINT
|
||||
from .connectors import get_instance, run_all
|
||||
from .connectors.core import ConnectorLang, ConnectorReturn
|
||||
from .forms import SearchForm, DeleteForm, EditForm
|
||||
from .forms import SearchForm, DeleteForm, EditForm, FolderDeleteForm, FolderEditForm
|
||||
|
||||
if MYSQL_ENABLED:
|
||||
from .config import db
|
||||
@ -146,6 +146,50 @@ def admin():
|
||||
return render_template('admin/list.html', search_form=SearchForm(), folders=folders, action_form=form)
|
||||
|
||||
|
||||
@app.route('/admin/folder', methods=['GET', 'POST'])
|
||||
@mysql_required
|
||||
@auth.login_required
|
||||
def folder_list():
|
||||
form = FolderDeleteForm(request.form)
|
||||
|
||||
if form.validate_on_submit():
|
||||
folder = AnimeFolder.query.filter_by(id=form.id.data).first()
|
||||
if folder:
|
||||
form.message = '%s has been successfully deleted' % folder.name
|
||||
db.session.delete(folder)
|
||||
db.session.commit()
|
||||
else:
|
||||
form._errors = {'id': ['Id %s was not found in the database' % form.id.data]}
|
||||
|
||||
folders = AnimeFolder.query.all()
|
||||
|
||||
return render_template('admin/folder/list.html', search_form=SearchForm(), folders=folders, action_form=form)
|
||||
|
||||
|
||||
@app.route('/admin/folder/edit', methods=['GET', 'POST'])
|
||||
@app.route('/admin/folder/edit/<int:folder_id>', methods=['GET', 'POST'])
|
||||
@mysql_required
|
||||
@auth.login_required
|
||||
def folder_edit(folder_id=None):
|
||||
if folder_id:
|
||||
folder = AnimeFolder.query.filter_by(id=folder_id).first()
|
||||
else:
|
||||
folder = utils.clean_model(AnimeFolder())
|
||||
|
||||
form = FolderEditForm(request.form, id=folder.id, name=folder.name, path=folder.path)
|
||||
|
||||
if form.validate_on_submit():
|
||||
# Folder
|
||||
folder.id = folder_id
|
||||
folder.name = form.name.data
|
||||
folder.path = form.path.data
|
||||
db.session.add(folder)
|
||||
db.session.commit()
|
||||
return redirect(url_for('folder_list'))
|
||||
|
||||
return render_template('admin/folder/edit.html', search_form=SearchForm(), action_form=form)
|
||||
|
||||
|
||||
@app.route('/admin/edit', methods=['GET', 'POST'])
|
||||
@app.route('/admin/edit/<int:link_id>', methods=['GET', 'POST'])
|
||||
@mysql_required
|
||||
@ -160,25 +204,30 @@ def admin_edit(link_id=None):
|
||||
link.vf = False
|
||||
|
||||
folders = AnimeFolder.query.all()
|
||||
form = EditForm(request.form, folder=link.title.folder.id, name=link.title.name, link=link.link, season=link.season,
|
||||
keyword=link.title.keyword)
|
||||
form = EditForm(
|
||||
request.form,
|
||||
id=link.id,
|
||||
folder=link.title.folder.id,
|
||||
name=link.title.name,
|
||||
link=link.link,
|
||||
season=link.season,
|
||||
keyword=link.title.keyword
|
||||
)
|
||||
form.folder.choices = [('', '')] + [(g.id, g.name) for g in folders]
|
||||
|
||||
if form.validate_on_submit():
|
||||
# Instance for VF tag
|
||||
instance = get_instance(form.link.data)
|
||||
# Title
|
||||
link = AnimeLink.query.filter_by(id=form.id.data).first()
|
||||
link = link if link else AnimeLink()
|
||||
title = AnimeTitle.query.filter_by(id=link.title_id).first()
|
||||
title = title if title else AnimeTitle.query.filter_by(name=form.name.data).first()
|
||||
title = AnimeTitle.query.filter_by(name=form.name.data).first()
|
||||
title = title if title else AnimeTitle()
|
||||
title.folder_id = form.folder.data
|
||||
title.name = form.name.data
|
||||
title.keyword = form.keyword.data.lower() if form.keyword.data else title.keyword
|
||||
title.keyword = form.keyword.data.lower()
|
||||
db.session.add(title)
|
||||
db.session.commit()
|
||||
# Link
|
||||
link.id = link_id
|
||||
link.title_id = title.id
|
||||
link.link = form.link.data
|
||||
link.season = form.season.data
|
||||
@ -189,7 +238,7 @@ def admin_edit(link_id=None):
|
||||
remove_garbage(link)
|
||||
return redirect(url_for('admin'))
|
||||
|
||||
return render_template('admin/edit.html', search_form=SearchForm(), link=link, folders=folders, action_form=form)
|
||||
return render_template('admin/edit.html', search_form=SearchForm(), folders=folders, action_form=form)
|
||||
|
||||
|
||||
@scheduler.task('interval', id='flaredestroyy', days=1)
|
||||
|
@ -5,7 +5,7 @@ class AnimeFolder(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String(length=100, collation='utf8mb4_general_ci'), unique=True, nullable=False)
|
||||
path = db.Column(db.String(length=100, collation='utf8mb4_general_ci'))
|
||||
titles = db.relationship("AnimeTitle", backref="folder")
|
||||
titles = db.relationship("AnimeTitle", backref="folder", cascade='all,delete-orphan')
|
||||
|
||||
|
||||
class AnimeTitle(db.Model):
|
||||
@ -13,7 +13,7 @@ class AnimeTitle(db.Model):
|
||||
name = db.Column(db.String(length=100, collation='utf8mb4_general_ci'), unique=True, nullable=False)
|
||||
keyword = db.Column(db.Text(collation='utf8mb4_general_ci'), nullable=False)
|
||||
folder_id = db.Column(db.Integer, db.ForeignKey('anime_folder.id'))
|
||||
links = db.relationship('AnimeLink', backref="title")
|
||||
links = db.relationship('AnimeLink', backref="title", cascade='all,delete-orphan')
|
||||
|
||||
|
||||
class AnimeLink(db.Model):
|
||||
|
@ -121,4 +121,10 @@ label.checkbox {
|
||||
.table.is-hoverable tbody tr:not(.is-selected):hover {
|
||||
background-color: #333 !important;
|
||||
}
|
||||
|
||||
.select > select {
|
||||
border-color: #363636 !important;
|
||||
background-color: #0a0a0a !important;
|
||||
color: #dbdbdb !important;
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,8 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}- Admin Edit {{ link.name }}{% endblock %}
|
||||
{% block title %}- Admin Edit {{ action_form.name.data }}{% endblock %}
|
||||
{% block body %}
|
||||
<form method="post">
|
||||
{{ action_form.csrf_token }}
|
||||
{{ action_form.id(value=link.id) }}
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-body">
|
||||
@ -22,7 +21,7 @@
|
||||
<datalist id="animes">
|
||||
{% for folder in folders %}
|
||||
{% for title in folder.titles %}
|
||||
<option {{ 'selected' if title.id == link.title.id }}
|
||||
<option {{ 'selected' if title.name == action_form.name.data }}
|
||||
data-folder="{{ title.folder.id }}" value="{{ title.name }}"
|
||||
data-keyword="{{ title.keyword }}">
|
||||
{% endfor %}
|
||||
@ -76,7 +75,7 @@
|
||||
<datalist id="keywords">
|
||||
{% for folder in folders %}
|
||||
{% for title in folder.titles %}
|
||||
<option {{ 'selected' if title.keyword == link.title.keyword }}
|
||||
<option {{ 'selected' if title.keyword == action_form.keyword.data }}
|
||||
value="{{ title.keyword }}">
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
33
pynyaata/templates/admin/folder/edit.html
Normal file
33
pynyaata/templates/admin/folder/edit.html
Normal file
@ -0,0 +1,33 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}- Folder Edit {{ action_form.name.data }}{% endblock %}
|
||||
{% block body %}
|
||||
<form method="post">
|
||||
{{ action_form.csrf_token }}
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-body">
|
||||
<div class="field column is-6">
|
||||
<div class="control is-expanded">
|
||||
{{ action_form.name(class='input', placeholder='Name') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field column">
|
||||
<div class="control is-expanded">
|
||||
{{ action_form.path(class='input', placeholder='Path') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-body">
|
||||
<div class="field column">
|
||||
<div class="control is-expanded">
|
||||
<input class="button is-info" type="submit">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
42
pynyaata/templates/admin/folder/list.html
Normal file
42
pynyaata/templates/admin/folder/list.html
Normal file
@ -0,0 +1,42 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}- Folder List{% endblock %}
|
||||
{% block add_button %}
|
||||
<a class="navbar-item has-tooltip-bottom has-tooltip-hidden-desktop" data-tooltip="Add folder"
|
||||
href="{{ url_for('folder_edit') }}">
|
||||
<i class="fa fa-plus"></i><i> </i>
|
||||
<span class="is-hidden-mobile">Add folder</span>
|
||||
</a>
|
||||
{% endblock %}
|
||||
{% block body %}
|
||||
<table class="table is-bordered is-striped is-narrow is-fullwidth is-hoverable is-size-7">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Path</th>
|
||||
<th>Tools</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
{% for folder in folders %}
|
||||
<tr>
|
||||
<td>{{ folder.name }}</td>
|
||||
<td>{{ folder.path }}</td>
|
||||
<td>
|
||||
<a href="{{ url_for('folder_edit', folder_id=folder.id) }}">
|
||||
<i class="fa fa-pencil"></i>
|
||||
</a>
|
||||
<i> </i>
|
||||
<form method="post">
|
||||
{{ action_form.id(value=folder.id) }}
|
||||
<button class="fa fa-trash fa-button"
|
||||
onclick="return confirm('Are you sure you want to delete this item ?')">
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock %}
|
@ -5,6 +5,10 @@
|
||||
<i class="fa fa-plus"></i><i> </i>
|
||||
<span class="is-hidden-mobile">Add entry</span>
|
||||
</a>
|
||||
<a class="navbar-item has-tooltip-bottom has-tooltip-hidden-desktop" data-tooltip="Manage folders" href="{{ url_for('folder_list') }}">
|
||||
<i class="fa fa-folder-open"></i><i> </i>
|
||||
<span class="is-hidden-mobile">Manage folders</span>
|
||||
</a>
|
||||
{% endblock %}
|
||||
{% block body %}
|
||||
<div class="level-right quick-scroll">
|
||||
|
Reference in New Issue
Block a user