mirror of
https://github.com/cwinfo/powerdns-admin.git
synced 2025-06-16 13:06:06 +00:00
Merge pull request #1422 from corubba/feature/dashboard-tab-cleanup
Clean up dashboard zone tabs
This commit is contained in:
@ -1,10 +1,10 @@
|
||||
import datetime
|
||||
from flask import Blueprint, render_template, url_for, current_app, request, jsonify, redirect, g, session
|
||||
from collections import namedtuple
|
||||
from flask import Blueprint, render_template, url_for, current_app, request, jsonify, redirect, g, session, abort
|
||||
from flask_login import login_required, current_user, login_manager
|
||||
from sqlalchemy import not_
|
||||
|
||||
from ..decorators import operator_role_required
|
||||
from ..lib.utils import customBoxes
|
||||
from ..models.user import User, Anonymous
|
||||
from ..models.account import Account
|
||||
from ..models.account_user import AccountUser
|
||||
@ -21,6 +21,31 @@ dashboard_bp = Blueprint('dashboard',
|
||||
url_prefix='/dashboard')
|
||||
|
||||
|
||||
class ZoneTabs:
|
||||
"""Config data for the zone tabs on the dashboard."""
|
||||
|
||||
TabInfo = namedtuple('TabInfo', ['display_name', 'filter_pattern'])
|
||||
"""Info about a single tab.
|
||||
|
||||
`display_name` is the name on the tab.
|
||||
`filter_pattern` is a SQL LIKE pattern , which is case-insensitively matched against the zone
|
||||
name (without the final root-dot).
|
||||
|
||||
If a filter is present, the tab will show zones that match the filter.
|
||||
If no filter is present, the tab will show zones that are not matched by any other tab filter.
|
||||
"""
|
||||
|
||||
tabs = {
|
||||
'forward': TabInfo("", None),
|
||||
'reverse_ipv4': TabInfo("in-addr.arpa", '%.in-addr.arpa'),
|
||||
'reverse_ipv6': TabInfo("ip6.arpa", '%.ip6.arpa'),
|
||||
}
|
||||
"""Dict of unique tab id to a TabInfo."""
|
||||
|
||||
order = ['forward', 'reverse_ipv4', 'reverse_ipv6']
|
||||
"""List of tab ids in the order they will appear."""
|
||||
|
||||
|
||||
@dashboard_bp.before_request
|
||||
def before_request():
|
||||
# Check if user is anonymous
|
||||
@ -41,9 +66,12 @@ def before_request():
|
||||
session.modified = True
|
||||
|
||||
|
||||
@dashboard_bp.route('/domains-custom/<path:boxId>', methods=['GET'])
|
||||
@dashboard_bp.route('/domains-custom/<path:tab_id>', methods=['GET'])
|
||||
@login_required
|
||||
def domains_custom(boxId):
|
||||
def domains_custom(tab_id):
|
||||
if tab_id not in ZoneTabs.tabs:
|
||||
abort(404)
|
||||
|
||||
if current_user.role.name in ['Administrator', 'Operator']:
|
||||
domains = Domain.query
|
||||
else:
|
||||
@ -83,14 +111,15 @@ def domains_custom(boxId):
|
||||
if order_by:
|
||||
domains = domains.order_by(*order_by)
|
||||
|
||||
if boxId == "reverse":
|
||||
for boxId in customBoxes.order:
|
||||
if boxId == "reverse": continue
|
||||
domains = domains.filter(
|
||||
not_(Domain.name.ilike(customBoxes.boxes[boxId][1])))
|
||||
if ZoneTabs.tabs[tab_id].filter_pattern:
|
||||
# If the tab has a filter, use only that
|
||||
domains = domains.filter(Domain.name.ilike(ZoneTabs.tabs[tab_id].filter_pattern))
|
||||
else:
|
||||
domains = domains.filter(Domain.name.ilike(
|
||||
customBoxes.boxes[boxId][1]))
|
||||
# If the tab has no filter, use all the other filters in negated form
|
||||
for tab_info in ZoneTabs.tabs.values():
|
||||
if not tab_info.filter_pattern:
|
||||
continue
|
||||
domains = domains.filter(not_(Domain.name.ilike(tab_info.filter_pattern)))
|
||||
|
||||
total_count = domains.count()
|
||||
|
||||
@ -207,7 +236,7 @@ def dashboard():
|
||||
|
||||
# Add custom boxes to render_template
|
||||
return render_template('dashboard.html',
|
||||
custom_boxes=customBoxes,
|
||||
zone_tabs=ZoneTabs,
|
||||
domain_count=domain_count,
|
||||
user_num=user_num,
|
||||
history_number=history_number,
|
||||
|
Reference in New Issue
Block a user