From 8e4fc8f217c021bc272724c0758fb66bdd16a45f Mon Sep 17 00:00:00 2001 From: Michael Ziegler Date: Wed, 15 Jul 2009 21:23:46 +0200 Subject: [PATCH] saving settings to Murmur works! (: --- cli.py | 107 +++++++++++++++++++++++++++++++++--------- pyweb/mumble/forms.py | 7 +-- 2 files changed, 89 insertions(+), 25 deletions(-) diff --git a/cli.py b/cli.py index 748d6d2..5f94f5f 100755 --- a/cli.py +++ b/cli.py @@ -41,8 +41,10 @@ os.environ['DJANGO_SETTINGS_MODULE'] = 'pyweb.settings' import locale import curses +from curses.textpad import Textbox from django.db.models.fields.related import ForeignKey +from django.db import models from mumble.models import * from mumble.forms import * @@ -254,24 +256,6 @@ class BaseWindow( object ): return; -class FormEditor( object ): - def __init__( self, win, form ): - self.win = win; - self.form = form; - - def draw( self ): - curr_y = 1; - - for fname in self.form.fields: - field = self.form.fields[fname]; - value = unicode( getattr( self.form.data, fname ) ); - - self.win.addstr( curr_y, 1, field.label.encode(locale.getpreferredencoding()) ); - self.win.addstr( curr_y, 30, value.encode(locale.getpreferredencoding()) ); - - curr_y += 1; - - class WndChannels( BaseWindow ): tabName = 'Channels'; @@ -290,16 +274,95 @@ class WndChannels( BaseWindow ): self.mm.rootchan.visit( self.printItem ); -class WndSettings( BaseWindow, FormEditor ): +class WndSettings( BaseWindow ): tabName = 'Server settings'; + blacklist = ( 'id', 'sslkey', 'sslcrt' ); + def __init__( self, parentwin, mumble, pos_x, pos_y ): BaseWindow.__init__( self, parentwin, mumble, pos_x, pos_y ); - FormEditor.__init__( self, self.win, MumbleAdminForm( mumble ) ); + self.form = MumbleAdminForm( instance=mumble ); + + self.editors = {}; + self.fields = [ mf for mf in mumble._meta.fields if mf.name not in self.blacklist ]; + + def getFieldHeight( self, field ): + if isinstance( field, models.TextField ): + return 10; + return 1; + + def getFieldYPos( self, field ): + ypos = 3; + for curr_field in self.fields: + if curr_field is field: + return ypos; + ypos += self.getFieldHeight( curr_field ); + raise ReferenceError( "Field not found!" ); def draw( self ): - FormEditor.draw( self ); - + curr_y = 3; + + for field in self.fields: + value = unicode( getattr( self.mm, field.name ) ); + + self.win.addstr( curr_y, 1, field.verbose_name.encode(locale.getpreferredencoding()) ); + + height = self.getFieldHeight( field ); + winsize = self.win.getmaxyx(); + + editwin = self.win.subwin( height, winsize[1]-31, self.pos[1] + curr_y, self.pos[0] + 30 ); + editwin.keypad(1); + editwin.addstr( value.encode(locale.getpreferredencoding()) ); + editbox = Textbox( editwin ); + + self.editors[field.name] = ( editwin, editbox ); + + curr_y += height; + + def enter( self ): + self.selIdx = 0; + self.selMax = len( self.fields ) - 1; + + while( True ): + # Highlight selected field label + field = self.fields[self.selIdx]; + + self.win.addstr( + self.getFieldYPos(field), 1, + field.verbose_name.encode(locale.getpreferredencoding()), + curses.A_STANDOUT + ); + self.win.refresh(); + + key = self.win.getch(); + + if key == curses.KEY_UP and self.selIdx > 0: + self.selIdx -= 1; + + elif key == curses.KEY_DOWN and self.selIdx < self.selMax: + self.selIdx += 1; + + elif key in ( ord('q'), ord('Q') ): + return; + + elif key in ( ord('s'), ord('S') ): + try: + self.mm.save(); + except Exception, instance: + msg = unicode( instance ); + else: + msg = "Your settings have been saved."; + self.win.addstr( 1, 5, msg.encode(locale.getpreferredencoding()) ); + + elif key in ( curses.KEY_RIGHT, curses.KEY_ENTER, ord('\n') ): + self.editors[field.name][1].edit(); + setattr( self.mm, field.name, field.to_python( self.editors[field.name][1].gather().strip() ) ); + self.editors[field.name][0].refresh(); + + self.win.addstr( + self.getFieldYPos(field), 1, + field.verbose_name.encode(locale.getpreferredencoding()) + ); class WndUsers( BaseWindow ): tabName = 'Registered users'; diff --git a/pyweb/mumble/forms.py b/pyweb/mumble/forms.py index ba66454..64f1a5a 100644 --- a/pyweb/mumble/forms.py +++ b/pyweb/mumble/forms.py @@ -14,19 +14,20 @@ * GNU General Public License for more details. """ -from django import forms +from django import forms from django.forms import Form, ModelForm from models import * + class MumbleAdminForm( ModelForm ): """ A Mumble Server admin form intended to be used by the server hoster. """ - class Meta: model = Mumble; exclude = ( 'sslcrt', 'sslkey' ); + class MumbleForm( ModelForm ): """ The Mumble Server admin form that allows to configure settings which do not necessarily @@ -38,7 +39,7 @@ class MumbleForm( ModelForm ): class Meta: model = Mumble; exclude = ( 'dbus', 'booted', 'addr', 'port', 'users', 'bwidth', 'sslcrt', 'sslkey', ); - + class MumbleUserForm( ModelForm ): """The user registration form used to register an account."""