From 8ec67e9e0c5daf8012ff0ab6a2125d450b42d1c9 Mon Sep 17 00:00:00 2001 From: Michael Ziegler Date: Wed, 10 Mar 2010 20:47:26 +0100 Subject: [PATCH] add draft for an XML serialization for mumbleviewer-ng --- .hgignore | 1 + pyweb/mumble/mmobjects.py | 21 ++++++++++++++++++++- pyweb/mumble/models.py | 6 ++++++ pyweb/mumble/urls.py | 1 + pyweb/mumble/views.py | 11 +++++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/.hgignore b/.hgignore index ddef0ed..3077a1b 100644 --- a/.hgignore +++ b/.hgignore @@ -7,3 +7,4 @@ syntax: glob *~ .directory .secret.txt +htdocs/mviewtest diff --git a/pyweb/mumble/mmobjects.py b/pyweb/mumble/mmobjects.py index 59725e6..9caf33e 100644 --- a/pyweb/mumble/mmobjects.py +++ b/pyweb/mumble/mmobjects.py @@ -22,6 +22,7 @@ from time import time from django.utils.http import urlquote from django.conf import settings + def cmp_names( left, rite ): """ Compare two objects by their name property. """ return cmp( left.name, rite.name ); @@ -147,7 +148,18 @@ class mmChannel( object ): chandata['players'] = [ pl.asDict() for pl in self.players ]; chandata['subchans'] = [ sc.asDict() for sc in self.subchans ]; return chandata; - + + def asXml( self, parentnode ): + from xml.etree.cElementTree import SubElement + me = SubElement( parentnode, "item" , id=self.id, rel='channel' ) + content = SubElement( me, "content" ) + name = SubElement( content , "name" ) + name.text = self.name + + for sc in self.subchans: + sc.asXml(me) + for pl in self.players: + pl.asXml(me) @@ -234,6 +246,13 @@ class mmPlayer( object ): pldata['texture'] = self.mumbleuser.textureUrl; return pldata; + + def asXml( self, parentnode ): + from xml.etree.cElementTree import SubElement + me = SubElement( parentnode, "item" , id=self.id, rel='user' ) + content = SubElement( me, "content" ) + name = SubElement( content , "name" ) + name.text = self.name diff --git a/pyweb/mumble/models.py b/pyweb/mumble/models.py index c4444e6..7b1b09d 100644 --- a/pyweb/mumble/models.py +++ b/pyweb/mumble/models.py @@ -460,6 +460,12 @@ class Mumble( models.Model ): 'root': self.rootchan.asDict() }; + def asXml( self ): + from xml.etree.cElementTree import Element + root = Element("root") + self.rootchan.asXml(root) + return root + # "server" field protection def __setattr__( self, name, value ): if name == 'server': diff --git a/pyweb/mumble/urls.py b/pyweb/mumble/urls.py index 9857b49..a94a9fd 100644 --- a/pyweb/mumble/urls.py +++ b/pyweb/mumble/urls.py @@ -25,6 +25,7 @@ urlpatterns = patterns( ( r'(?P\d+)/texture.png', 'showTexture' ), ( r'murmur/tree/(?P\d+)', 'mmng_tree' ), + ( r'mumbleviewer/(?P\d+).xml', 'mumbleviewer_tree_xml' ), ( r'mobile/(?P\d+)', 'mobile_show' ), ( r'mobile/?$', 'mobile_mumbles' ), diff --git a/pyweb/mumble/views.py b/pyweb/mumble/views.py index 467e974..42ccb23 100644 --- a/pyweb/mumble/views.py +++ b/pyweb/mumble/views.py @@ -59,9 +59,11 @@ def redir( request ): else: return HttpResponseRedirect( reverse( mumbles ) ); + def mobile_mumbles( request ): return mumbles( request, mobile=True ); + def mumbles( request, mobile=False ): """ Display a list of all configured Mumble servers, or redirect if only one configured. """ mms = Mumble.objects.all().order_by( "name" ); @@ -382,3 +384,12 @@ def mmng_tree( request, server ): mimetype='text/javascript' ); + +def mumbleviewer_tree_xml( request, server ): + from xml.etree.cElementTree import tostring as xml_to_string + srv = get_object_or_404( Mumble, id=int(server) ); + return HttpResponse( + xml_to_string( srv.asXml(), encoding='utf-8' ), + mimetype='text/xml' + ); +