mirror of
https://github.com/Yubico/yubiadmin.git
synced 2025-02-20 14:54:30 +01:00
Introduced forms.
This commit is contained in:
parent
9dccc5cf01
commit
dd1beb1282
@ -1,7 +1,28 @@
|
||||
{% extends "content.html" %}
|
||||
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{{ content }}
|
||||
<div class="navbar">
|
||||
<div class="navbar-inner">
|
||||
<ul class="nav">
|
||||
{% for sect in module.sections %}
|
||||
<li {% if sect.name == section.name %}class="active"{% endif %}>
|
||||
<a href="/{{ module.name }}/{{ sect.name }}">{{ sect.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if errors %}
|
||||
<div class="alert alert-error">
|
||||
<p>Errors:</p>
|
||||
<ul>
|
||||
{% for error in errors %}
|
||||
<li>{{ error }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{{ page }}
|
||||
{% endblock %}
|
||||
|
@ -6,7 +6,7 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>{% block title %}YubiAuth{% endblock %}</title>
|
||||
<title>{{ title|default('YubiADMIN') }}</title>
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
<ul class="nav nav-list">
|
||||
<li class="nav-header">Modules</li>
|
||||
{% for mod in modules %}
|
||||
<li {% if mod.name == module.name %}class="active"{% endif %} >
|
||||
<li {% if module is defined and mod.name == module.name %}class="active"{% endif %} >
|
||||
<a href="/{{ mod.name }}">{{ mod.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
@ -23,24 +23,10 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="span9">
|
||||
<div class="navbar">
|
||||
<div class="navbar-inner">
|
||||
<a class="brand" href="#">{{ title }}</a>
|
||||
<ul class="nav">
|
||||
{% for sect in module.sections %}
|
||||
<li {% if sect.name == section.name %}class="active"{% endif %}>
|
||||
<a href="/{{ module.name }}/{{ sect.name }}">{{ sect.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% block content %}
|
||||
<p>Stuff goes here</p>
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
|
103
templates/forms.html
Normal file
103
templates/forms.html
Normal file
@ -0,0 +1,103 @@
|
||||
{%- macro form_field_label(field) -%}
|
||||
<label for="{{ field.id }}">{{ field.label.text }}
|
||||
{%- if field.flags.required -%}
|
||||
<abbr title="This field is required!">*</abbr>
|
||||
{%- endif %}</label>
|
||||
{% endmacro %}
|
||||
|
||||
{%- macro form_field_description(field) -%}
|
||||
{% if field.description %}
|
||||
<span class="descr">{{ field.description }}</span>
|
||||
{% endif %}
|
||||
{%- endmacro -%}
|
||||
|
||||
{%- macro form_field_errors(field) -%}
|
||||
{% if field.errors %}
|
||||
<div>
|
||||
{%- for error in field.errors -%}
|
||||
<span class="label important">{{ error }}</span>
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
{% endif %}
|
||||
{%- endmacro -%}
|
||||
|
||||
{%- macro form_field_boolean(field) -%}
|
||||
<div class="input">
|
||||
<label>
|
||||
{{ field(**kwargs) }}
|
||||
<span>{{ field.label.text }}</span>
|
||||
{{ form_field_description(field) }}
|
||||
{{ form_field_errors(field) }}
|
||||
</label>
|
||||
</div>
|
||||
{%- endmacro -%}
|
||||
|
||||
{%- macro action_buttons(submit_title="Save", cancel_title="Reset form", submit_class="btn-primary") -%}
|
||||
<div class="form-actions">
|
||||
<input type="submit" class="btn {{submit_class}}" value="{{submit_title}}">
|
||||
|
||||
<button type="reset" class="btn">{{cancel_title}}</button>
|
||||
</div>
|
||||
{%- endmacro -%}
|
||||
|
||||
{%- macro form_field(field) -%}
|
||||
<div class="clearfix">
|
||||
{% if field.type == 'HiddenField' %}
|
||||
{{ field() }}
|
||||
{% else %}
|
||||
{% if field.type == 'BooleanField' %}
|
||||
{{ form_field_boolean(field, **kwargs) }}
|
||||
{% else%}
|
||||
{{ form_field_label(field) }}
|
||||
<div class="input" id="{{field.id}}-div">
|
||||
{% if field.type == 'RadioField' %}
|
||||
{{ field(class='radio-group', **kwargs) }}
|
||||
{% else %}
|
||||
{{ field(**kwargs) }}
|
||||
{% endif %}
|
||||
{{ form_field_description(field) }}
|
||||
{{ form_field_errors(field) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{%- endmacro -%}
|
||||
|
||||
{%- macro form_fields(fields, class=None, legend=None) -%}
|
||||
<fieldset {% if class %}class="{{class}}"{% endif %}>
|
||||
{% if legend %}
|
||||
<legend>{{legend}}</legend>
|
||||
{% endif %}
|
||||
{% for field in fields %}
|
||||
{% if field.type == 'HiddenField' %}
|
||||
{{ field() }}
|
||||
{% else %}
|
||||
{{ form_field(field) }}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</fieldset>
|
||||
{%- endmacro -%}
|
||||
|
||||
{%- macro form_fieldset(fieldset) -%}
|
||||
<fieldset>
|
||||
{% if fieldset.legend %}
|
||||
<legend>{{fieldset.legend}}</legend>
|
||||
{% endif %}
|
||||
{% for field in fieldset %}
|
||||
{% if field.type == 'HiddenField' %}
|
||||
{{ field() }}
|
||||
{% else %}
|
||||
{{ form_field(field) }}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</fieldset>
|
||||
{%- endmacro -%}
|
||||
|
||||
{%- macro render_form(fieldsets, action) -%}
|
||||
<form action="{{ action }}" method="post">
|
||||
{% for fieldset in fieldsets %}
|
||||
{{ form_fieldset(fieldset) }}
|
||||
{% endfor %}
|
||||
{{ action_buttons() }}
|
||||
</form>
|
||||
{%- endmacro -%}
|
@ -1,3 +1,3 @@
|
||||
<h2>General settings</h2>
|
||||
{% from "forms.html" import render_form %}
|
||||
|
||||
<p>This is where general settings go.</p>
|
||||
{{ render_form(fieldsets, '/val/general') }}
|
||||
|
3
templates/val/syncpool.html
Normal file
3
templates/val/syncpool.html
Normal file
@ -0,0 +1,3 @@
|
||||
<h2>KSM settings</h2>
|
||||
|
||||
<p>This is where general settings go.</p>
|
@ -33,13 +33,17 @@ class YubiAdmin(object):
|
||||
def __init__(self, env):
|
||||
self.env = env
|
||||
self.apps = {}
|
||||
self.template = env.get_template('app_base.html')
|
||||
for app in apps:
|
||||
app_data = inspect_app(app)
|
||||
self.apps[app_data['name']] = (app, app_data)
|
||||
self.modules = [data for (_, data) in self.apps.values()]
|
||||
|
||||
@cherrypy.expose
|
||||
def default(self, module_name, section_name=None, **kwargs):
|
||||
def default(self, module_name=None, section_name=None, **kwargs):
|
||||
if not module_name:
|
||||
tmpl = self.env.get_template('index.html')
|
||||
return tmpl.render(modules=self.modules)
|
||||
|
||||
app, module = self.apps[module_name]
|
||||
if not section_name:
|
||||
section_name = module['sections'][0]['name']
|
||||
@ -48,13 +52,19 @@ class YubiAdmin(object):
|
||||
(module_name, section_name))
|
||||
section = next(section for section in module['sections']
|
||||
if section['name'] == section_name)
|
||||
data = {
|
||||
'modules': [data for (_, data) in self.apps.values()],
|
||||
|
||||
data = app.__getattribute__(section_name)(**kwargs)
|
||||
page = tmpl.render(**data)
|
||||
|
||||
data.update({
|
||||
'modules': self.modules,
|
||||
'module': module,
|
||||
'section': section,
|
||||
'content': render_section(app, section_name, tmpl, **kwargs)
|
||||
}
|
||||
return self.template.render(**data)
|
||||
'title': '%s - %s' % (module_name, section_name),
|
||||
'page': page
|
||||
})
|
||||
tmpl = env.get_template('app_base.html')
|
||||
return tmpl.render(**data)
|
||||
|
||||
if __name__ == '__main__':
|
||||
cwd = os.path.dirname(__file__)
|
||||
|
@ -11,13 +11,7 @@ class YubikeyKsm(object):
|
||||
"""
|
||||
|
||||
name = 'ksm'
|
||||
sections = ['general', 'database', 'ksms']
|
||||
|
||||
def general(self):
|
||||
"""
|
||||
General
|
||||
"""
|
||||
return {}
|
||||
sections = ['database']
|
||||
|
||||
def database(self):
|
||||
"""
|
||||
@ -25,10 +19,4 @@ class YubikeyKsm(object):
|
||||
"""
|
||||
return {}
|
||||
|
||||
def ksms(self):
|
||||
"""
|
||||
Key Store Modules
|
||||
"""
|
||||
return {}
|
||||
|
||||
app = YubikeyKsm()
|
||||
|
@ -1,23 +1,42 @@
|
||||
from wtforms import Form, IntegerField
|
||||
|
||||
__all__ = [
|
||||
'app'
|
||||
]
|
||||
|
||||
|
||||
class MiscForm(Form):
|
||||
legend = 'Misc'
|
||||
default_timeout = IntegerField('Default Timeout')
|
||||
|
||||
|
||||
class SyncLevelsForm(Form):
|
||||
legend = 'Sync Levels'
|
||||
sync_default = IntegerField('Default')
|
||||
sync_secure = IntegerField('Secure')
|
||||
sync_fast = IntegerField('Fast')
|
||||
|
||||
|
||||
class YubikeyVal(object):
|
||||
"""
|
||||
YubiKey Validation server
|
||||
YubiKey Validation Server
|
||||
|
||||
YubiKey OTP validation server
|
||||
"""
|
||||
|
||||
name = 'val'
|
||||
sections = ['general', 'database', 'ksms']
|
||||
sections = ['general', 'database', 'syncpool', 'ksms']
|
||||
|
||||
def general(self):
|
||||
def general(self, **kwargs):
|
||||
"""
|
||||
General
|
||||
"""
|
||||
return {}
|
||||
if kwargs:
|
||||
# Save
|
||||
print kwargs
|
||||
return {
|
||||
'fieldsets': [SyncLevelsForm(kwargs), MiscForm(kwargs)]
|
||||
}
|
||||
|
||||
def database(self):
|
||||
"""
|
||||
@ -25,6 +44,12 @@ class YubikeyVal(object):
|
||||
"""
|
||||
return {}
|
||||
|
||||
def syncpool(self):
|
||||
"""
|
||||
Sync pool
|
||||
"""
|
||||
return {}
|
||||
|
||||
def ksms(self):
|
||||
"""
|
||||
Key Store Modules
|
||||
|
Loading…
x
Reference in New Issue
Block a user