portal: refactor group views into module

This commit is contained in:
Iain Learmonth 2022-05-04 13:17:01 +01:00
parent a1aa252bc0
commit ef1f3208fc
6 changed files with 94 additions and 79 deletions

View file

@ -9,11 +9,14 @@ from app.models.bridges import BridgeConf, Bridge
from app.models.alarms import Alarm from app.models.alarms import Alarm
from app import Origin, Proxy from app import Origin, Proxy
from app.models.base import Group, MirrorList from app.models.base import Group, MirrorList
from app.portal.forms import EditGroupForm, NewGroupForm, NewOriginForm, EditOriginForm, LifecycleForm, \ from app.portal.forms import NewOriginForm, EditOriginForm, LifecycleForm, \
NewBridgeConfForm, EditBridgeConfForm, NewMirrorListForm NewBridgeConfForm, EditBridgeConfForm, NewMirrorListForm
from app.portal.group import group, NewGroupForm, EditGroupForm
portal = Blueprint("portal", __name__, template_folder="templates", static_folder="static") portal = Blueprint("portal", __name__, template_folder="templates", static_folder="static")
portal.register_blueprint(group, url_prefix="/group")
@portal.app_template_filter("mirror_expiry") @portal.app_template_filter("mirror_expiry")
def calculate_mirror_expiry(s: datetime) -> str: def calculate_mirror_expiry(s: datetime) -> str:
@ -43,64 +46,6 @@ def portal_home():
lastweek=lastweek, proxies=proxies) lastweek=lastweek, proxies=proxies)
@portal.route("/groups")
def view_groups():
groups = Group.query.order_by(Group.group_name).all()
return render_template("list.html.j2",
section="group",
title="Groups",
item="group",
items=groups,
new_link=url_for("portal.new_group"))
@portal.route("/group/new", methods=['GET', 'POST'])
def new_group():
form = NewGroupForm()
if form.validate_on_submit():
group = Group()
group.group_name = form.group_name.data
group.description = form.description.data
group.eotk = form.eotk.data
group.created = datetime.utcnow()
group.updated = datetime.utcnow()
try:
db.session.add(group)
db.session.commit()
flash(f"Created new group {group.group_name}.", "success")
return redirect(url_for("portal.edit_group", group_id=group.id))
except exc.SQLAlchemyError as e:
print(e)
flash("Failed to create new group.", "danger")
return redirect(url_for("portal.view_groups"))
return render_template("new.html.j2", section="group", form=form)
@portal.route('/group/edit/<group_id>', methods=['GET', 'POST'])
def edit_group(group_id):
group = Group.query.filter(Group.id == group_id).first()
if group is None:
return Response(render_template("error.html.j2",
section="group",
header="404 Group Not Found",
message="The requested group could not be found."),
status=404)
form = EditGroupForm(description=group.description,
eotk=group.eotk)
if form.validate_on_submit():
group.description = form.description.data
group.eotk = form.eotk.data
group.updated = datetime.utcnow()
try:
db.session.commit()
flash("Saved changes to group.", "success")
except exc.SQLAlchemyError:
flash("An error occurred saving the changes to the group.", "danger")
return render_template("group.html.j2",
section="group",
group=group, form=form)
@portal.route("/origin/new", methods=['GET', 'POST']) @portal.route("/origin/new", methods=['GET', 'POST'])
@portal.route("/origin/new/<group_id>", methods=['GET', 'POST']) @portal.route("/origin/new/<group_id>", methods=['GET', 'POST'])
def new_origin(group_id=None): def new_origin(group_id=None):

View file

@ -3,19 +3,6 @@ from wtforms import StringField, SubmitField, SelectField, BooleanField, Integer
from wtforms.validators import DataRequired, NumberRange from wtforms.validators import DataRequired, NumberRange
class NewGroupForm(FlaskForm):
group_name = StringField("Short Name", validators=[DataRequired()])
description = StringField("Description", validators=[DataRequired()])
eotk = BooleanField("Deploy EOTK instances?")
submit = SubmitField('Save Changes', render_kw={"class": "btn btn-success"})
class EditGroupForm(FlaskForm):
description = StringField('Description', validators=[DataRequired()])
eotk = BooleanField("Deploy EOTK instances?")
submit = SubmitField('Save Changes', render_kw={"class": "btn btn-success"})
class NewOriginForm(FlaskForm): class NewOriginForm(FlaskForm):
domain_name = StringField('Domain Name', validators=[DataRequired()]) domain_name = StringField('Domain Name', validators=[DataRequired()])
description = StringField('Description', validators=[DataRequired()]) description = StringField('Description', validators=[DataRequired()])

83
app/portal/group.py Normal file
View file

@ -0,0 +1,83 @@
from datetime import datetime
from flask import render_template, url_for, flash, redirect, Response, Blueprint
from flask_wtf import FlaskForm
from sqlalchemy import exc
from wtforms import StringField, BooleanField, SubmitField
from wtforms.validators import DataRequired
from app.extensions import db
from app.models.base import Group
group = Blueprint("group", __name__)
class NewGroupForm(FlaskForm):
group_name = StringField("Short Name", validators=[DataRequired()])
description = StringField("Description", validators=[DataRequired()])
eotk = BooleanField("Deploy EOTK instances?")
submit = SubmitField('Save Changes', render_kw={"class": "btn btn-success"})
class EditGroupForm(FlaskForm):
description = StringField('Description', validators=[DataRequired()])
eotk = BooleanField("Deploy EOTK instances?")
submit = SubmitField('Save Changes', render_kw={"class": "btn btn-success"})
@group.route("/list")
def group_list():
groups = Group.query.order_by(Group.group_name).all()
return render_template("list.html.j2",
section="group",
title="Groups",
item="group",
items=groups,
new_link=url_for("portal.group.group_new"))
@group.route("/new", methods=['GET', 'POST'])
def group_new():
form = NewGroupForm()
if form.validate_on_submit():
group = Group()
group.group_name = form.group_name.data
group.description = form.description.data
group.eotk = form.eotk.data
group.created = datetime.utcnow()
group.updated = datetime.utcnow()
try:
db.session.add(group)
db.session.commit()
flash(f"Created new group {group.group_name}.", "success")
return redirect(url_for("portal.group.group_edit", group_id=group.id))
except exc.SQLAlchemyError as e:
print(e)
flash("Failed to create new group.", "danger")
return redirect(url_for("portal.group.group_list"))
return render_template("new.html.j2", section="group", form=form)
@group.route('/edit/<group_id>', methods=['GET', 'POST'])
def group_edit(group_id):
group = Group.query.filter(Group.id == group_id).first()
if group is None:
return Response(render_template("error.html.j2",
section="group",
header="404 Group Not Found",
message="The requested group could not be found."),
status=404)
form = EditGroupForm(description=group.description,
eotk=group.eotk)
if form.validate_on_submit():
group.description = form.description.data
group.eotk = form.eotk.data
group.updated = datetime.utcnow()
try:
db.session.commit()
flash("Saved changes to group.", "success")
except exc.SQLAlchemyError:
flash("An error occurred saving the changes to the group.", "danger")
return render_template("group.html.j2",
section="group",
group=group, form=form)

View file

@ -72,7 +72,7 @@
<ul class="nav flex-column"> <ul class="nav flex-column">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link{% if section == "group" %} active{% endif %}" <a class="nav-link{% if section == "group" %} active{% endif %}"
href="{{ url_for("portal.view_groups") }}"> href="{{ url_for("portal.group.group_list") }}">
Groups Groups
</a> </a>
</li> </li>

View file

@ -10,7 +10,7 @@
<h3 class="h4 card-header">Groups</h3> <h3 class="h4 card-header">Groups</h3>
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Active Groups: {{ groups | count }}</h5> <h5 class="card-title">Active Groups: {{ groups | count }}</h5>
<p class="card-text">{% for group in groups %}<a href="{{ url_for("portal.edit_group", group_id=group.id) }}" title="{{ group.description }}">{{ group.group_name }}</a>{{ ", " if not loop.last else "" }}{% endfor %}</p> <p class="card-text">{% for group in groups %}<a href="{{ url_for("portal.group.group_edit", group_id=group.id) }}" title="{{ group.description }}">{{ group.group_name }}</a>{{ ", " if not loop.last else "" }}{% endfor %}</p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -45,7 +45,7 @@
<td>{{ group.description }}</td> <td>{{ group.description }}</td>
<td>{% if group.eotk %}✅{% else %}❌{% endif %}</td> <td>{% if group.eotk %}✅{% else %}❌{% endif %}</td>
<td>{{ group.origins | length }}</td> <td>{{ group.origins | length }}</td>
<td><a href="{{ url_for("portal.edit_group", group_id=group.id) }}" class="btn btn-primary btn-sm">View/Edit</a></td> <td><a href="{{ url_for("portal.group.group_edit", group_id=group.id) }}" class="btn btn-primary btn-sm">View/Edit</a></td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@ -77,7 +77,7 @@
<td>{{ origin.description }}</td> <td>{{ origin.description }}</td>
<td>{% if origin.auto_rotation %}✅{% else %}❌{% endif %}</td> <td>{% if origin.auto_rotation %}✅{% else %}❌{% endif %}</td>
<td> <td>
<a href="{{ url_for("portal.edit_group", group_id=origin.group.id) }}">{{ origin.group.group_name }}</a> <a href="{{ url_for("portal.group.group_edit", group_id=origin.group.id) }}">{{ origin.group.group_name }}</a>
</td> </td>
<td> <td>
<a href="{{ url_for("portal.edit_origin", origin_id=origin.id) }}" <a href="{{ url_for("portal.edit_origin", origin_id=origin.id) }}"
@ -116,7 +116,7 @@
<a href="{{ url_for("portal.edit_origin", origin_id=proxy.origin.id) }}">{{ proxy.origin.domain_name }}</a> <a href="{{ url_for("portal.edit_origin", origin_id=proxy.origin.id) }}">{{ proxy.origin.domain_name }}</a>
</td> </td>
<td> <td>
<a href="{{ url_for("portal.edit_group", group_id=proxy.origin.group.id) }}">{{ proxy.origin.group.group_name }}</a> <a href="{{ url_for("portal.group.group_edit", group_id=proxy.origin.group.id) }}">{{ proxy.origin.group.group_name }}</a>
</td> </td>
<td>{{ proxy.provider }}</td> <td>{{ proxy.provider }}</td>
<td> <td>
@ -175,7 +175,7 @@
{% if not bridgeconf.destroyed %} {% if not bridgeconf.destroyed %}
<tr class="align-middle"> <tr class="align-middle">
<td> <td>
<a href="{{ url_for("portal.edit_group", group_id=bridgeconf.group.id) }}">{{ bridgeconf.group.group_name }}</a> <a href="{{ url_for("portal.group.group_edit", group_id=bridgeconf.group.id) }}">{{ bridgeconf.group.group_name }}</a>
</td> </td>
<td>{{ bridgeconf.provider }}</td> <td>{{ bridgeconf.provider }}</td>
<td>{{ bridgeconf.method }}</td> <td>{{ bridgeconf.method }}</td>
@ -212,7 +212,7 @@
{% if not bridge.destroyed %} {% if not bridge.destroyed %}
<tr class="align-middle{% if bridge.deprecated %} bg-warning{% endif %}"> <tr class="align-middle{% if bridge.deprecated %} bg-warning{% endif %}">
<td> <td>
<a href="{{ url_for("portal.edit_group", group_id=bridge.conf.group.id) }}">{{ bridge.conf.group.group_name }}</a> <a href="{{ url_for("portal.group.group_edit", group_id=bridge.conf.group.id) }}">{{ bridge.conf.group.group_name }}</a>
</td> </td>
<td>{{ bridge.conf.description }} ({{ bridge.conf.provider }}/{{ bridge.conf.method }})</td> <td>{{ bridge.conf.description }} ({{ bridge.conf.provider }}/{{ bridge.conf.method }})</td>
<td> <td>