mirror of
https://github.com/cwinfo/powerdns-admin.git
synced 2025-02-03 15:36:17 +00:00
Add initial support for PDNS-Admin settings management.
This commit is contained in:
parent
7c5814beed
commit
98ddd7302b
@ -957,3 +957,22 @@ class Setting(db.Model):
|
|||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def toggle(self, setting):
|
||||||
|
setting = str(setting)
|
||||||
|
current_setting = Setting.query.filter(Setting.name==setting).first()
|
||||||
|
try:
|
||||||
|
if current_setting:
|
||||||
|
if current_setting.value == "True":
|
||||||
|
current_setting.value = "False"
|
||||||
|
else:
|
||||||
|
current_setting.value = "True"
|
||||||
|
db.session.commit()
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
logging.error('Setting %s does not exist' % setting)
|
||||||
|
return False
|
||||||
|
except:
|
||||||
|
logging.error('Cannot toggle setting %s' % setting)
|
||||||
|
logging.debug(traceback.format_exec())
|
||||||
|
db.session.rollback()
|
||||||
|
return False
|
137
app/templates/admin_settings.html
Normal file
137
app/templates/admin_settings.html
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
{% extends "base.html" %} {% block title %}
|
||||||
|
<title>DNS Control Panel - Settings</title>
|
||||||
|
{% endblock %} {% block dashboard_stat %}
|
||||||
|
<!-- Content Header (Page header) -->
|
||||||
|
<section class="content-header">
|
||||||
|
<h1>
|
||||||
|
Settings <small>PowerDNS-Admin settings</small>
|
||||||
|
</h1>
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li><a href="{{ url_for('dashboard') }}"><i
|
||||||
|
class="fa fa-dashboard"></i> Home</a></li>
|
||||||
|
<li class="active">Settings</li>
|
||||||
|
</ol>
|
||||||
|
</section>
|
||||||
|
{% endblock %} {% block content %}
|
||||||
|
<section class="content">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="box">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title">Settings Management</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<table id="tbl_settings" class="table table-bordered table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
<th>Change</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for setting in settings %}
|
||||||
|
<tr class="odd ">
|
||||||
|
<td>{{ setting.name }}</td>
|
||||||
|
<td>{{ setting.value }}</td>
|
||||||
|
<td width="6%">
|
||||||
|
{% if setting.value == "True" or setting.value == "False" %}
|
||||||
|
<button type="button" class="btn btn-flat btn-warning setting-toggle-button" id="{{ setting.name }}">
|
||||||
|
Toggle <i class="fa fa-info"></i>
|
||||||
|
</button>
|
||||||
|
{% else %}
|
||||||
|
<button type="button" class="btn btn-flat btn-warning setting-edit-button" id="{{ setting.name }}">
|
||||||
|
Edit <i class="fa fa-info"></i>
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!-- /.box-body -->
|
||||||
|
</div>
|
||||||
|
<!-- /.box -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
||||||
|
{% block extrascripts %}
|
||||||
|
<script>
|
||||||
|
// set up history data table
|
||||||
|
$("#tbl_settings").DataTable({
|
||||||
|
"paging" : true,
|
||||||
|
"lengthChange" : false,
|
||||||
|
"searching" : true,
|
||||||
|
"ordering" : true,
|
||||||
|
"info" : true,
|
||||||
|
"autoWidth" : false
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".setting-toggle-button").click(function() {
|
||||||
|
var setting = $(this).prop('id');
|
||||||
|
applyChanges('','/admin/setting/' + setting + '/toggle')
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: allow editing of value field
|
||||||
|
$(".setting-edit-button").click(function() {
|
||||||
|
var setting = $(this).prop('id');
|
||||||
|
applyChanges('','/admin/setting/' + setting + '/edit')
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
|
{% block modals %}
|
||||||
|
<!-- Clear History Confirmation Box -->
|
||||||
|
<div class="modal fade modal-warning" id="modal_clear_history">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal"
|
||||||
|
aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
<h4 class="modal-title">Confirmation</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<p>Are you sure you want to remove all history?</p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default pull-left"
|
||||||
|
data-dismiss="modal">Close</button>
|
||||||
|
<button type="button" class="btn btn-danger" onclick="applyChanges('', '/admin/history');location.reload();">Clear
|
||||||
|
History</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.modal-content -->
|
||||||
|
</div>
|
||||||
|
<!-- /.modal-dialog -->
|
||||||
|
</div>
|
||||||
|
<div class="modal fade" id="modal_history_info">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal"
|
||||||
|
aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
<h4 class="modal-title">History Details</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<p></p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default pull-right"
|
||||||
|
data-dismiss="modal">Close</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.modal-content -->
|
||||||
|
</div>
|
||||||
|
<!-- /.modal-dialog -->
|
||||||
|
</div>
|
||||||
|
<!-- /.modal -->
|
||||||
|
{% endblock %}
|
@ -38,7 +38,7 @@
|
|||||||
<![endif]-->
|
<![endif]-->
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
<body class="hold-transition skin-blue sidebar-mini">
|
<body class="hold-transition skin-blue sidebar-mini {% if not fullscreen_layout_setting %}layout-boxed{% endif %}">
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
{% block pageheader %}
|
{% block pageheader %}
|
||||||
<header class="main-header">
|
<header class="main-header">
|
||||||
@ -128,6 +128,7 @@
|
|||||||
<li><a href="{{ url_for('admin') }}"><i class="fa fa-circle-o"></i> <span>Admin Console</span></a></li>
|
<li><a href="{{ url_for('admin') }}"><i class="fa fa-circle-o"></i> <span>Admin Console</span></a></li>
|
||||||
<li><a href="{{ url_for('admin_manageuser') }}"><i class="fa fa-circle-o"></i> <span>User</span></a></li>
|
<li><a href="{{ url_for('admin_manageuser') }}"><i class="fa fa-circle-o"></i> <span>User</span></a></li>
|
||||||
<li><a href="{{ url_for('admin_history') }}"><i class="fa fa-circle-o"></i> <span>History</span></a></li>
|
<li><a href="{{ url_for('admin_history') }}"><i class="fa fa-circle-o"></i> <span>History</span></a></li>
|
||||||
|
<li><a href="{{ url_for('admin_settings') }}"><i class="fa fa-circle-o"></i> <span>Settings</span></a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</section>
|
</section>
|
||||||
<!-- /.sidebar -->
|
<!-- /.sidebar -->
|
||||||
|
23
app/views.py
23
app/views.py
@ -11,11 +11,17 @@ from werkzeug import secure_filename
|
|||||||
from lib import utils
|
from lib import utils
|
||||||
from app import app, login_manager
|
from app import app, login_manager
|
||||||
from .models import User, Role, Domain, DomainUser, Record, Server, History, Anonymous, Setting
|
from .models import User, Role, Domain, DomainUser, Record, Server, History, Anonymous, Setting
|
||||||
|
from distutils.util import strtobool
|
||||||
|
|
||||||
jinja2.filters.FILTERS['display_record_name'] = utils.display_record_name
|
jinja2.filters.FILTERS['display_record_name'] = utils.display_record_name
|
||||||
jinja2.filters.FILTERS['display_master_name'] = utils.display_master_name
|
jinja2.filters.FILTERS['display_master_name'] = utils.display_master_name
|
||||||
jinja2.filters.FILTERS['display_second_to_time'] = utils.display_time
|
jinja2.filters.FILTERS['display_second_to_time'] = utils.display_time
|
||||||
|
|
||||||
|
@app.context_processor
|
||||||
|
def inject_fullscreen_layout_setting():
|
||||||
|
fullscreen_layout_setting = Setting.query.filter(Setting.name == 'fullscreen_layout').first()
|
||||||
|
return dict(fullscreen_layout_setting=strtobool(fullscreen_layout_setting.value))
|
||||||
|
|
||||||
# START USER AUTHENTICATION HANDLER
|
# START USER AUTHENTICATION HANDLER
|
||||||
@app.before_request
|
@app.before_request
|
||||||
def before_request():
|
def before_request():
|
||||||
@ -438,6 +444,23 @@ def admin_history():
|
|||||||
histories = History.query.all()
|
histories = History.query.all()
|
||||||
return render_template('admin_history.html', histories=histories)
|
return render_template('admin_history.html', histories=histories)
|
||||||
|
|
||||||
|
@app.route('/admin/settings', methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
@admin_role_required
|
||||||
|
def admin_settings():
|
||||||
|
if request.method == 'GET':
|
||||||
|
settings = Setting.query.filter(Setting.name != 'maintenance')
|
||||||
|
return render_template('admin_settings.html', settings=settings)
|
||||||
|
|
||||||
|
@app.route('/admin/setting/<string:setting>/toggle', methods=['POST'])
|
||||||
|
@login_required
|
||||||
|
@admin_role_required
|
||||||
|
def admin_settings_toggle(setting):
|
||||||
|
result = Setting().toggle(setting)
|
||||||
|
if (result):
|
||||||
|
return make_response(jsonify( { 'status': 'ok', 'msg': 'Toggled setting successfully.' } ), 200)
|
||||||
|
else:
|
||||||
|
return make_response(jsonify( { 'status': 'error', 'msg': 'Can toggle setting.' } ), 500)
|
||||||
|
|
||||||
@app.route('/user/profile', methods=['GET', 'POST'])
|
@app.route('/user/profile', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
|
@ -10,9 +10,11 @@ db.create_all()
|
|||||||
admin_role = Role('Administrator', 'Administrator')
|
admin_role = Role('Administrator', 'Administrator')
|
||||||
user_role = Role('User', 'User')
|
user_role = Role('User', 'User')
|
||||||
maintenance_setting = Setting('maintenance', 'False')
|
maintenance_setting = Setting('maintenance', 'False')
|
||||||
|
fullscreen_layout_setting = Setting('fullscreen_layout', 'True')
|
||||||
db.session.add(admin_role)
|
db.session.add(admin_role)
|
||||||
db.session.add(user_role)
|
db.session.add(user_role)
|
||||||
db.session.add(maintenance_setting)
|
db.session.add(maintenance_setting)
|
||||||
|
db.session.add(fullscreen_layout_setting)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
|
if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
|
||||||
api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
|
api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user