Convert router pages to Django forms

This commit is contained in:
Sunil Mohan Adapa 2014-05-11 19:43:55 +05:30
parent 2500e37e89
commit 5461694b10
2 changed files with 218 additions and 107 deletions

View File

@ -1,153 +1,150 @@
import cherrypy
from plugin_mount import PagePlugin, FormPlugin
from django import forms
from gettext import gettext as _
from plugin_mount import PagePlugin
from modules.auth import require
from forms import Form
import cfg
import util
class router(PagePlugin):
order = 9 # order of running init in PagePlugins
def __init__(self, *args, **kwargs):
self.register_page("router")
self.menu = cfg.main_menu.add_item("Router", "icon-retweet", "/router", 10)
self.menu.add_item("Wireless", "icon-signal", "/router/wireless", 12)
self.menu.add_item("Firewall", "icon-fire", "/router/firewall", 18)
self.menu.add_item("Hotspot and Mesh", "icon-map-marker", "/router/hotspot")
self.menu.add_item("Info", "icon-list-alt", "/router/info", 100)
class Router(PagePlugin):
"""Router page"""
order = 9 # order of running init in PagePlugins
def __init__(self, *args, **kwargs):
PagePlugin.__init__(self, args, kwargs)
self.register_page('router')
self.menu = cfg.main_menu.add_item('Router', 'icon-retweet', '/router',
10)
self.menu.add_item('Wireless', 'icon-signal', '/router/wireless', 12)
self.menu.add_item('Firewall', 'icon-fire', '/router/firewall', 18)
self.menu.add_item('Hotspot and Mesh', 'icon-map-marker',
'/router/hotspot')
self.menu.add_item('Info', 'icon-list-alt', '/router/info', 100)
@staticmethod
@cherrypy.expose
def index(self):
def index():
"""This isn't an internal redirect, because we need the url to
reflect that we've moved down into the submenu hierarchy.
Otherwise, it's hard to know which menu portion to make active
or expand or contract."""
raise cherrypy.HTTPRedirect(cfg.server_dir + '/router/setup')
@staticmethod
@cherrypy.expose
@require()
def wireless(self):
def wireless():
"""Serve the wireless page"""
return util.render_template(title="Wireless",
main="<p>wireless setup: essid, etc.</p>")
@staticmethod
@cherrypy.expose
@require()
def firewall(self):
def firewall():
"""Serve the firewall page"""
return util.render_template(title="Firewall",
main="<p>Iptables twiddling.</p>")
@staticmethod
@cherrypy.expose
@require()
def hotspot(self):
def hotspot():
"""Serve the hotspot page"""
return util.render_template(title="Hotspot and Mesh",
main="<p>connection sharing setup.</p>")
class setup(PagePlugin):
class WANForm(forms.Form): # pylint: disable-msg=W0232
"""WAN setup form"""
connection_type = forms.ChoiceField(
label=_('Connection Type'),
choices=[('dhcp', _('DHCP')), ('static_ip', _('Static IP'))])
wan_ip = forms.IPAddressField(label=_('WAN IP Address'), required=False)
subnet_mask = forms.IPAddressField(label=_('Subnet Mask'), required=False)
dns_1 = forms.IPAddressField(label=_('Static DNS 1'), required=False)
dns_2 = forms.IPAddressField(label=_('Static DNS 2'), required=False)
dns_3 = forms.IPAddressField(label=_('Static DNS 3'), required=False)
class Setup(PagePlugin):
"""Router setup page"""
def __init__(self, *args, **kwargs):
self.register_page("router.setup")
self.menu = cfg.html_root.router.menu.add_item("General Setup", "icon-cog", "/router/setup", 10)
self.menu.add_item("Dynamic DNS", "icon-flag", "/router/setup/ddns", 20)
self.menu.add_item("MAC Address Clone", "icon-barcode", "/router/setup/mac_address", 30)
PagePlugin.__init__(self, args, kwargs)
self.register_page('router.setup')
self.menu = cfg.html_root.router.menu.add_item(
'General Setup', 'icon-cog', '/router/setup', 10)
self.menu.add_item('Dynamic DNS', 'icon-flag', '/router/setup/ddns',
20)
self.menu.add_item('MAC Address Clone', 'icon-barcode',
'/router/setup/mac_address', 30)
@cherrypy.expose
@require()
def index(self):
parts = self.forms('/router/setup')
parts['title'] = "General Router Setup"
parts['sidebar_right']="""<strong>Introduction</strong><p>Your %s is a replacement for your
wireless router. By default, it should do everything your usual
router does. With the addition of some extra modules, its abilities
can rival those of high-end routers costing hundreds of dollars.</p>
""" % cfg.box_name + parts['sidebar_right']
if not cfg.users.expert():
parts['main'] += """<p>In basic mode, you don't need to do any
router setup before you can go online. Just plug your
%(product)s in to your cable or DSL modem and the router
will try to get you on the internet using DHCP.</p>
def index(self, **kwargs):
"""Return the setup page"""
status = self.get_status()
<p>If that fails, you might need to resort to the expert
options. Enable expert mode in the "%(product)s System /
Configure" menu.</p>""" % {'product':cfg.box_name}
form = None
messages = []
if kwargs:
form = WANForm(kwargs, prefix='router')
# pylint: disable-msg=E1101
if form.is_valid():
self._apply_changes(status, form.cleaned_data, messages)
status = self.get_status()
form = WANForm(initial=status, prefix='router')
else:
parts['main'] += "<p>router name, domain name, router IP, dhcp</p>"
return util.render_template(**parts)
form = WANForm(initial=status, prefix='router')
return util.render_template(template='router_setup',
title=_('General Router Setup'),
form=form, messages=messages)
@staticmethod
@cherrypy.expose
@require()
def ddns(self):
return util.render_template(title="Dynamic DNS", main="<p>Masquerade setup</p>")
def ddns():
"""Return the DDNS page"""
return util.render_template(title="Dynamic DNS",
main="<p>Masquerade setup</p>")
@staticmethod
@cherrypy.expose
@require()
def mac_address(self):
return util.render_template(title="MAC Address Cloning",
main="<p>Your router can pretend to have a different MAC address on any interface.</p>")
def mac_address():
"""Return the MAC address page"""
return util.render_template(
title="MAC Address Cloning",
main="<p>Your router can pretend to have a different MAC address \
on any interface.</p>")
@staticmethod
def get_status():
"""Return the current status"""
store = util.filedict_con(cfg.store_file, 'router')
return {'connection_type': store.get('connection_type', 'dhcp')}
class wan(FormPlugin, PagePlugin):
url = ["/router/setup"]
order = 10
js = """
<script type="text/javascript">
(function($) {
function hideshow_static() {
var show_or_hide = ($('#connect_type').val() == 'Static IP')
$('#static_ip_form').toggle(show_or_hide);
}
$(document).ready(function() {
$('#connect_type').change(hideshow_static);
hideshow_static();
});
})(jQuery);
</script>"""
def sidebar_right(self, *args, **kwargs):
side=''
if cfg.users.expert():
side += """<strong>WAN Connection Type</strong>
<h3>DHCP</h3><p>DHCP allows your router to automatically
connect with the upstream network. If you are unsure what
option to choose, stick with DHCP. It is usually
correct.
<h3>Static IP</h3><p>If you want to setup your connection
manually, you can enter static IP information. This option is
for those who know what they're doing. As such, it is only
available in expert mode.</p>"""
return side
def main(self, wan_ip0=0, wan_ip1=0, wan_ip2=0, wan_ip3=0,
subnet0=0, subnet1=0, subnet2=0, subnet3=0,
gateway0=0, gateway1=0, gateway2=0, gateway3=0,
dns10=0, dns11=0, dns12=0, dns13=0,
dns20=0, dns21=0, dns22=0, dns23=0,
dns30=0, dns31=0, dns32=0, dns33=0,
message=None, **kwargs):
if not cfg.users.expert():
return ''
@staticmethod
def _apply_changes(old_status, new_status, messages):
"""Apply the changes"""
print 'Apply changes - %s, %s', old_status, new_status
if old_status['connection_type'] == new_status['connection_type']:
return
store = util.filedict_con(cfg.store_file, 'router')
defaults = {'connect_type': 'DHCP'}
for key, value in defaults.items():
if not key in kwargs:
try:
kwargs[key] = store[key]
except KeyError:
store[key] = kwargs[key] = value
store['connection_type'] = new_status['connection_type']
form = Form(title="WAN Connection",
action=cfg.server_dir + "/router/setup/wan/index",
name="wan_connection_form",
message=message)
form.dropdown('Connection Type', vals=["DHCP", "Static IP"], id="connect_type")
form.html('<div id="static_ip_form">')
form.dotted_quad("WAN IP Address", name="wan_ip", quad=[wan_ip0, wan_ip1, wan_ip2, wan_ip3])
form.dotted_quad("Subnet Mask", name="subnet", quad=[subnet0, subnet1, subnet2, subnet3])
form.dotted_quad("Gateway", name="gateway", quad=[gateway0, gateway1, gateway2, gateway3])
form.dotted_quad("Static DNS 1", name="dns1", quad=[dns10, dns11, dns12, dns13])
form.dotted_quad("Static DNS 2", name="dns2", quad=[dns20, dns21, dns22, dns23])
form.dotted_quad("Static DNS 3", name="dns3", quad=[dns30, dns31, dns32, dns33])
form.html('</div>')
form.submit("Set Wan")
return form.render()
messages.append(('success', _('Connection type set')))
messages.append(('info', _('IP address settings unimplemented')))

View File

@ -0,0 +1,114 @@
{% extends "login_nav.html" %}
{% comment %}
#
# This file is part of Plinth.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
{% endcomment %}
{% block main_block %}
{% if cfg.users.expert %}
<h3>WAN Connection</h3>
{% for severity, message in messages %}
<div class='alert alert-{{ severity }}'>{{ message }}</div>
{% endfor %}
<form class="form" method="post">
{% csrf_token %}
{% include 'bootstrapform/field.html' with field=form.connection_type %}
<div id="static_ip_form"
style='display:
{% if form.connection_type.value = 'static_ip' %} block
{% else %} none {% endif %};'>
{% include 'bootstrapform/field.html' with field=form.wan_ip %}
{% include 'bootstrapform/field.html' with field=form.subnet_mask %}
{% include 'bootstrapform/field.html' with field=form.dns_1 %}
{% include 'bootstrapform/field.html' with field=form.dns_2 %}
{% include 'bootstrapform/field.html' with field=form.dns_3 %}
</div>
<input type="submit" class="btn-primary" value="Set WAN"/>
</form>
{% else %}
<p>In basic mode, you don't need to do any router setup before you
can go online. Just plug your {{ cfg.product_name }} in to your
cable or DSL modem and the router will try to get you on the
internet using DHCP.</p>
<p>If that fails, you might need to resort to the expert options.
Enable expert mode in the "{{ cfg.product_name }} / System /
Configure" menu.</p>
{% endif %}
{% endblock %}
{% block sidebar_right_block %}
<h3>Introduction</h3>
<p>Your {{ cfg.box_name }} is a replacement for your wireless
router. By default, it should do everything your usual router
does. With the addition of some extra modules, its abilities can
rival those of high-end routers costing hundreds of dollars.</p>
{% if cfg.users.expert %}
<h3>WAN Connection Type</h3>
<h3>DHCP</h3>
<p>DHCP allows your router to automatically connect with the
upstream network. If you are unsure what option to choose,
stick with DHCP. It is usually correct.</p>
<h3>Static IP</h3>
<p>If you want to setup your connection manually, you can enter
static IP information. This option is for those who know what
they're doing. As such, it is only available in expert
mode.</p>
{% endif %}
{% endblock %}
{% block js_block %}
{{ js|safe }}
<script type="text/javascript">
(function($) {
function hideshow_static() {
var value = $('#id_router-connection_type').val();
var show_or_hide = (value == 'static_ip');
$('#static_ip_form').toggle(show_or_hide);
}
$(document).ready(function() {
$('#id_router-connection_type').change(hideshow_static);
hideshow_static();
});
})(jQuery);
</script>
{% endblock %}