From a43739bb925f1c7b825ded7da41c728066e39c90 Mon Sep 17 00:00:00 2001 From: Neha shah Date: Thu, 7 Jun 2012 17:29:39 +0530 Subject: Init.py functions made convention compliant.Metaweblog functions take input at list.URLs in demo changed to default django-xmlrpc.Bug in Rss feed fixed.setup.py bug fixed --- gstudio/xmlrpc/__init__.py | 49 +++--- gstudio/xmlrpc/metaweblog.py | 185 ++++++++++++-------- gstudio/xmlrpc/rpc/.gitignore | 16 -- gstudio/xmlrpc/rpc/LICENSE | 24 --- gstudio/xmlrpc/rpc/MANIFEST.in | 3 - gstudio/xmlrpc/rpc/README.rst | 36 ---- gstudio/xmlrpc/rpc/__init__.py | 44 ----- gstudio/xmlrpc/rpc/decorators.py | 175 ------------------- gstudio/xmlrpc/rpc/dispatcher.py | 76 -------- gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mo | Bin 1030 -> 0 bytes gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po | 49 ------ gstudio/xmlrpc/rpc/setup.py | 31 ---- gstudio/xmlrpc/rpc/templates/xmlrpc_get.html | 26 --- gstudio/xmlrpc/rpc/views.py | 192 --------------------- 14 files changed, 134 insertions(+), 772 deletions(-) delete mode 100644 gstudio/xmlrpc/rpc/.gitignore delete mode 100644 gstudio/xmlrpc/rpc/LICENSE delete mode 100644 gstudio/xmlrpc/rpc/MANIFEST.in delete mode 100644 gstudio/xmlrpc/rpc/README.rst delete mode 100644 gstudio/xmlrpc/rpc/__init__.py delete mode 100644 gstudio/xmlrpc/rpc/decorators.py delete mode 100644 gstudio/xmlrpc/rpc/dispatcher.py delete mode 100644 gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mo delete mode 100644 gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po delete mode 100644 gstudio/xmlrpc/rpc/setup.py delete mode 100644 gstudio/xmlrpc/rpc/templates/xmlrpc_get.html delete mode 100644 gstudio/xmlrpc/rpc/views.py (limited to 'gstudio/xmlrpc') diff --git a/gstudio/xmlrpc/__init__.py b/gstudio/xmlrpc/__init__.py index 318e6d9f..9dd4ca22 100644 --- a/gstudio/xmlrpc/__init__.py +++ b/gstudio/xmlrpc/__init__.py @@ -82,53 +82,50 @@ GSTUDIO_XMLRPC_METAWEBLOG = [ 'metaWeblog.get_nbh'), ('gstudio.xmlrpc.metaweblog.new_media_object', 'metaWeblog.newMediaObject'), - ('gstudio.xmlrpc.metaweblog.getNodetype', + ('gstudio.xmlrpc.metaweblog.get_nodetype', 'metaWeblog.getNodetype'), - ('gstudio.xmlrpc.metaweblog.nidExists', + ('gstudio.xmlrpc.metaweblog.nid_exists', 'metaWeblog.nidExists'), - ('gstudio.xmlrpc.metaweblog.getinfoFromSSID', + ('gstudio.xmlrpc.metaweblog.get_info_fromSSID', 'metaWeblog.getinfoFromSSID'), - ('gstudio.xmlrpc.metaweblog.getNeighbourhood', + ('gstudio.xmlrpc.metaweblog.get_neighbourhood', 'metaWeblog.getNeighbourhood'), - ('gstudio.xmlrpc.metaweblog.getAll', + ('gstudio.xmlrpc.metaweblog.get_all', 'metaWeblog.getAll'), - ('gstudio.xmlrpc.metaweblog.getDatatype', + ('gstudio.xmlrpc.metaweblog.get_datatype', 'metaWeblog.getDatatype'), - ('gstudio.xmlrpc.metaweblog.getAttributevalues', + ('gstudio.xmlrpc.metaweblog.get_attributevalues', 'metaWeblog.getAttributevalues'), - ('gstudio.xmlrpc.metaweblog.getSubjecttypes', + ('gstudio.xmlrpc.metaweblog.get_subjecttypes', 'metaWeblog.getSubjecttypes'), - ('gstudio.xmlrpc.metaweblog.getAttributeType', + ('gstudio.xmlrpc.metaweblog.get_attributeType', 'metaWeblog.getAttributeType'), - ('gstudio.xmlrpc.metaweblog.getRoles', + ('gstudio.xmlrpc.metaweblog.get_roles', 'metaWeblog.getRoles'), - ('gstudio.xmlrpc.metaweblog.getSubtypes', + ('gstudio.xmlrpc.metaweblog.get_subtypes', 'metaWeblog.getSubtypes'), - ('gstudio.xmlrpc.metaweblog.getAllSubtypes', + ('gstudio.xmlrpc.metaweblog.get_all_subtypes', 'metaWeblog.getAllSubtypes'), - ('gstudio.xmlrpc.metaweblog.getRestrictions', + ('gstudio.xmlrpc.metaweblog.get_restrictions', 'metaWeblog.getRestrictions'), - ('gstudio.xmlrpc.metaweblog.getlatestSSID', + ('gstudio.xmlrpc.metaweblog.get_latest_SSID', 'metaWeblog.getlatestSSID'), - ('gstudio.xmlrpc.metaweblog.getAllSnapshots', + ('gstudio.xmlrpc.metaweblog.get_all_snapshots', 'metaWeblog.getAllSnapshots'), - ('gstudio.xmlrpc.metaweblog.setAttributetype', + ('gstudio.xmlrpc.metaweblog.set_attributetype', 'metaWeblog.setAttributetype'), - ('gstudio.xmlrpc.metaweblog.setRelationtype', + ('gstudio.xmlrpc.metaweblog.set_relationtype', 'metaWeblog.setRelationtype'), - ('gstudio.xmlrpc.metaweblog.setObjecttype', + ('gstudio.xmlrpc.metaweblog.set_objecttype', 'metaWeblog.setObjecttype'), - ('gstudio.xmlrpc.metaweblog.setObject', + ('gstudio.xmlrpc.metaweblog.set_object', 'metaWeblog.setObject'), - ('gstudio.xmlrpc.metaweblog.setAttribute', + ('gstudio.xmlrpc.metaweblog.set_attribute', 'metaWeblog.setAttribute'), - ('gstudio.xmlrpc.metaweblog.setRelation', + ('gstudio.xmlrpc.metaweblog.set_relation', 'metaWeblog.setRelation'), - ('gstudio.xmlrpc.metaweblog.getGbobjectNeighbourhood', - 'metaWeblog.getGbobjectNeighbourhood') - - - + ('gstudio.xmlrpc.metaweblog.get_gbobject_neighbourhood', + 'metaWeblog.getGbobjectNeighbourhood') ] diff --git a/gstudio/xmlrpc/metaweblog.py b/gstudio/xmlrpc/metaweblog.py index 4dd1fe1a..6990ca12 100644 --- a/gstudio/xmlrpc/metaweblog.py +++ b/gstudio/xmlrpc/metaweblog.py @@ -381,27 +381,38 @@ def new_media_object(blog_id, username, password, media): return {'url': default_storage.url(path)} # Get functions start from here -@xmlrpc_func(returns='string', args='int') -def getNodetype(ssid): - """Returns the nodetype of given nid """ +@xmlrpc_func(returns='string', args=['int']) +def get_nodetype(nid): + """Returns the nodetype of given nid + => metaWeblog.getNodetype(nid)""" try : - g = Nodetype.objects.get(id=ssid) - return (g.ref._meta.module_name) - except Nodetype.DoesNotExist : - return "Node with the given nid does not exist" + p = NID.objects.get(id = nid) + try : + g = Nodetype.objects.get(id=nid) + return (g.ref._meta.module_name) + except Nodetype.DoesNotExist : + return "Not of Type Nodetype " + except NID.DoesNotExist : + return "Node Does Not Exist" -@xmlrpc_func(returns='int', args='string') -def nidExists(nid): - """Returns 1 if a node with given id exists, else returns a 0 """ - try: - p = Nodetype.objects.get(title = nid) - return 1 - except Nodetype.DoesNotExist: - return 0 - -@xmlrpc_func(returns='struct',args=['string']) -def getinfoFromSSID(ssid_list) : - """Given a list of ssids, it returns entire information of each ssid inside a dictionary with all the dictionaries contained within a list """ +@xmlrpc_func(returns='int', args=['string']) +def nid_exists(nid): + """Returns 1 if a node with given id exists, else returns a 0 + => metaWeblog.nidExists(nodetypetitle)""" + try : + p = NID.objects.get(title = nid) + try: + p = Nodetype.objects.get(title = nid) + return 1 + except Nodetype.DoesNotExist: + return 0 + except NID.DoesNotExist : + return "Node Does Not Exist" + +@xmlrpc_func(returns='struct',args=['struct']) +def get_info_fromSSID(ssid_list) : + """Given a list of nids, it returns entire information of each ssid inside a dictionary with all the dictionaries contained within a list + => metaWeblog.getinfoFromSSID(nidlist)""" lst = [] for ssid in ssid_list : try : @@ -411,13 +422,15 @@ def getinfoFromSSID(ssid_list) : nbh = p.ref.get_nbh lst.append(str(nbh)) except Nodetype.DoesNotExist : - lst.append("Not of type Nodetype") + lst.append('Not of type Nodetype') except NID.DoesNotExist : - lst.append("Node Does Not Exist") + lst.append('Node Does Not Exist' ) return lst -@xmlrpc_func(returns='struct', args=['string','string']) -def getNeighbourhood(ssid_list, get_what): +@xmlrpc_func(returns='struct', args=['struct','string']) +def get_neighbourhood(ssid_list, get_what): + """ Given a list of nids,it returns the neighbourhood(nbh/rendered) of the Nodetype + => metaWeblog.getNeighbourhood(nidlist,nbh/rendered_nbh)""" d = {} for ssid in ssid_list: try: @@ -436,8 +449,10 @@ def getNeighbourhood(ssid_list, get_what): d[str(ssid)] = "Node Does Not Exist" return d -@xmlrpc_func(returns='struct', args=['string','string']) -def getGbobjectNeighbourhood(ssid_list, get_what): +@xmlrpc_func(returns='struct', args=['struct','string']) +def get_gbobject_neighbourhood(ssid_list, get_what): + """ Given a list of nids,it returns the neighbourhood(nbh/rendered) of the Gbobject + => metaWeblog.getGbobjectNeighbourhood(nidlist,nbh/rendered_nbh)""" d = {} for ssid in ssid_list: try: @@ -458,10 +473,11 @@ def getGbobjectNeighbourhood(ssid_list, get_what): -@xmlrpc_func(returns='struct', args=['string']) +@xmlrpc_func(returns='struct', args=['struct']) -def getAttributeType(subjecttypelist): - """given the list of subjecttype inids the method returns all the attributetypes attached. """ +def get_attributeType(subjecttypelist): + """given the list of subjecttype inids the method returns all the attributetypes attached. + => metaWeblog.getAttributeType(subjecttypeidlist)""" d = {} for s in subjecttypelist : try : @@ -479,10 +495,11 @@ def getAttributeType(subjecttypelist): return d # Get all function for getting all nodetypes -@xmlrpc_func(returns='struct', args='string') +@xmlrpc_func(returns='struct', args=['string']) -def getAll(nodetype): - """Given a class name it returns all the nids corresponding to their class name.""" +def get_all(nodetype): + """Given a class name it returns all the nids corresponding to their class name. + => metaWeblog.getAll(classname)""" d = {} try : p = eval(nodetype) @@ -494,10 +511,11 @@ def getAll(nodetype): return d -@xmlrpc_func(returns='struct', args=['string']) +@xmlrpc_func(returns='struct', args=['struct']) -def getDatatype(attrtype_ssid_list) : - """Given a list of attributessids, it returns its datatypes """ +def get_datatype(attrtype_ssid_list) : + """Given a list of attributessids, it returns its datatypes. + => metaWeblog.getDatatype(attrtypenidlist)""" d = {} for l in attrtype_ssid_list : try : @@ -515,8 +533,9 @@ def getDatatype(attrtype_ssid_list) : @xmlrpc_func(returns='struct', args=['string']) -def getAttributevalues(Attrssidlist) : - """Given a list of attributessid, it returns their values """ +def get_attributevalues(Attrssidlist) : + """Given a list of attributessid, it returns their values + => metaWeblog.getAttributevalues(attrnidlist)""" d = {} for l in Attrssidlist : try : @@ -531,9 +550,10 @@ def getAttributevalues(Attrssidlist) : d[str(l)] = "Node Does Not Exist" return d -@xmlrpc_func(returns='struct', args='string') -def getSubjecttypes( AttributeTypeNid ): - """Given an attributetypenid, it returns the subjecttype participating in the attributetype """ +@xmlrpc_func(returns='struct', args=['string']) +def get_subjecttypes( AttributeTypeNid ): + """Given an attributetypenid, it returns the subjecttype participating in the attributetype. + => metaWeblog.getSubjecttypes(attributetypenid)""" try : d = {} t = NID.objects.get(id = AttributeTypeNid) @@ -549,10 +569,11 @@ def getSubjecttypes( AttributeTypeNid ): return "Node does not exist" return d -@xmlrpc_func(returns='struct', args='string') +@xmlrpc_func(returns='struct', args=['string']) -def getRoles(relationtypenid) : - """given a relationtype nid this method returns the roles participating in the relationtype """ +def get_roles(relationtypenid) : + """given a relationtype nid this method returns the roles participating in the relationtype. + => metaWeblog.getRoles(relationtypenid)""" try : t = NID.objects.get(id = relationtypenid) k = t.ref._meta.module_name @@ -572,10 +593,11 @@ def getRoles(relationtypenid) : return "Node Does Not Exist " return d -@xmlrpc_func(returns='struct', args='string') +@xmlrpc_func(returns='struct', args=['string']) -def getSubtypes(nodeid) : - """Returns only the immediate subtype of the node specified""" +def get_subtypes(nodeid) : + """Returns only the immediate subtype of the node specified. + => metaWeblog.getSubtypes(Nodetypeid)""" try : y = NID.objects.get(id = nodeid) try : @@ -590,10 +612,11 @@ def getSubtypes(nodeid) : return " Node Does not exist" return l -@xmlrpc_func(returns='struct', args='string') +@xmlrpc_func(returns='struct', args=['string']) -def getAllSubtypes(nodeid) : - """Returns all the 'subtypes' of the node specified""" +def get_all_subtypes(nodeid) : + """Returns all the 'subtypes' of the node specified + => metaWeblog.getAllSubtypes(Nodetypenid)""" try : l = [] p = NID.objects.get(id = nodeid) @@ -608,10 +631,11 @@ def getAllSubtypes(nodeid) : return "Node Does not Exist" return l -@xmlrpc_func(returns=['struct'], args=['string']) +@xmlrpc_func(returns=['struct'], args=['struct']) -def getRestrictions(ATlist) : - """Given a list of attributetype ssids, this method returns all the restrictions that the attributetypes have """ +def get_restrictions(ATlist) : + """Given a list of attributetype nids, this method returns all the restrictions that the attributetypes have. + => metaWeblog.getRestrictions(Attributetypenids)""" d = {} ft = [] for a in ATlist : @@ -632,10 +656,11 @@ def getRestrictions(ATlist) : d[str(a)] = "Node Does Not Exist" return d -@xmlrpc_func(returns='int', args='string') +@xmlrpc_func(returns='int', args=['string']) -def getlatestSSID(nid) : - """Given the id, this method will return the latest ssid of the given id """ +def get_latest_SSID(nid) : + """Given the nid, this method will return the latest ssid of the given id + => metaWeblog.getlatestSSID(nid)""" try : p = NID.objects.get(id = nid) n = p.get_ssid @@ -648,9 +673,10 @@ def getlatestSSID(nid) : except NID.DoesNotExist: return "Node Does Not exist" -@xmlrpc_func(returns='struct', args='int') -def getAllSnapshots(nid) : - """Given the id, this method will return all the ssids of the given id """ +@xmlrpc_func(returns='struct', args=['int']) +def get_all_snapshots(nid) : + """Given the id, this method will return all the ssids of the given id. + => metaWeblog.getAllSnapshots(nid)""" try : p = NID.objects.get(id = nid) n = p.get_ssid @@ -660,8 +686,9 @@ def getAllSnapshots(nid) : # Set functions begin from here @xmlrpc_func(returns='string', args=['struct','string']) -def setAttributetype(d,objid) : - +def set_attributetype(d,objid) : + """ Given a dictionary of title,slug,applicable_nodetype,objectid,it creates an Attributetype for that Objecttypeid + => metaWeblog.setAttributetype(d['title' = '',slug = '',applicable_nodetype = ''],objecttypeid)""" try : p = NID.objects.get(id = objid) t = p.ref._meta.module_name @@ -676,7 +703,7 @@ def setAttributetype(d,objid) : else : r = r + 1 if r == y : - w = Attributetype(title = d['title'],applicable_nodetypes = d['nodetype'],subjecttype_id = objid,slug = d['slug']) + w = Attributetype(title = d['title'],applicable_nodetypes = d['applicable_nodetype'],subjecttype_id = objid,slug = d['slug']) w.save() return w.id else : @@ -688,7 +715,9 @@ def setAttributetype(d,objid) : @xmlrpc_func(returns='int', args=['struct','string']) -def setRelationtype(d,uid) : +def set_relationtype(d,uid) : + """ Given a objecttypeid and a dictionary of title,slug,inverse,right_subjecttype_id,it creates an Relationtype for that Objecttype + => metaWeblog.setRelationtype(d['title' = '', slug = '', right_subjecttype_id = '', inverse = ''],objecttypeid)""" try : k = NID.objects.get(id = uid) @@ -715,8 +744,9 @@ def setRelationtype(d,uid) : @xmlrpc_func(returns='int', args=['struct','string']) -def setObjecttype(d) : - +def set_objecttype(d) : + """ Given a dictionary of title,slug,it creates a Objecttype + => metaWeblog.setObjecttype(d['title' = '', slug = ''],objecttypeid)""" k = Objecttype.objects.all() u = len(k) r = 0 @@ -735,7 +765,9 @@ def setObjecttype(d) : @xmlrpc_func(returns='int', args=['struct','string']) -def setObject(d,o) : +def set_object(d,o) : + """ Given a objecttypeid and a dictionary of title,slug,it creates an Object for that objecttypeid + => metaWeblog.setAttributetype(d['title' = '',slug = ''],objecttypeid)""" try : k = NID.objects.get(id = o) @@ -765,28 +797,31 @@ def setObject(d,o) : @xmlrpc_func(returns='int', args=['struct','string']) -def setAttribute(d,objid) : +def set_attribute(d,objid) : + """ Given a objecttypeid and dictionary of attributetypetitle,subject_id,svalue,it creates an Attribute for the Attributetype of that objecttypeid + => metaWeblog.setAttributetype(d['attributetypetitle' = '',subject_id = '',svalue = ''],objecttypeid)""" try : k = NID.objects.get(id = objid) t = k.ref._meta.module_name if t == 'objecttype' or t == 'metatype' : - p = Attributetype.objects.filter(subjecttype_id = objid) - s = [] - for i in p : - if (str(i.title) == d['attributetype']) : - s = Attribute(attributetype_id = i.id,subject_id = d['subject_id'],svalue = d['svalue']) - s.save() - return s.id + p = Attributetype.objects.filter(subjecttype_id = objid) + s = [] + for i in p : + if (str(i.title) == d['attributetypetitle']) : + s = Attribute(attributetype_id = i.id,subject_id = d['subject_id'],svalue = d['svalue']) + s.save() + return s.id else : return " The objectid entered is not a objecttype or metatype" except NID.DoesNotExist: return "Node does not Exist" - @xmlrpc_func(returns='int', args=['struct','string','string']) -def setRelation(d,obj1,obj2) : +def set_relation(d,obj1,obj2) : + """ Given objecttype1id and objecttype2id between whose relation is to be established and dictionary of relationtypename,left_subject_id,right_subject_id,it creates a relation between objects of the two objecttype specfied + => metaWeblog.setRelation(d['relationtypename' = '',left_subject_id = '',right_subject_id = ''],objecttypeid1,objecttypeid2)""" try : p = Relationtype.objects.filter(left_subjecttype_id = obj1,right_subjecttype_id = obj2) s = [] @@ -798,6 +833,8 @@ def setRelation(d,obj1,obj2) : except Relationtype.DoesNotExist : return "Relationtype Does Not Exist" + + diff --git a/gstudio/xmlrpc/rpc/.gitignore b/gstudio/xmlrpc/rpc/.gitignore deleted file mode 100644 index 7b4dcf61..00000000 --- a/gstudio/xmlrpc/rpc/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -*~ -*.pyc -TODO.txt -README.html -bin -lib -dist -eggs -parts -build -include -downloads -src_eggs -develop-eggs -.installed.cfg -django_xmlrpc.egg-info/ \ No newline at end of file diff --git a/gstudio/xmlrpc/rpc/LICENSE b/gstudio/xmlrpc/rpc/LICENSE deleted file mode 100644 index 8efdc935..00000000 --- a/gstudio/xmlrpc/rpc/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2007-2008, Graham Binns -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of this application nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY GRAHAM BINNS ''AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL GRAHAM BINNS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/gstudio/xmlrpc/rpc/MANIFEST.in b/gstudio/xmlrpc/rpc/MANIFEST.in deleted file mode 100644 index 2f4671ba..00000000 --- a/gstudio/xmlrpc/rpc/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -include README.rst -recursive-include django_xmlrpc/locale * -recursive-include django_xmlrpc/templates *.html diff --git a/gstudio/xmlrpc/rpc/README.rst b/gstudio/xmlrpc/rpc/README.rst deleted file mode 100644 index bcf4ac0a..00000000 --- a/gstudio/xmlrpc/rpc/README.rst +++ /dev/null @@ -1,36 +0,0 @@ -============== -Django XML-RPC -============== - -django_xmlrpc offers a means by which a Django developer can expose their views (or indeed any other function) using XML-RPC. - -This is a fork of the version hosted at : https://code.launchpad.net/~aartemenko/django-xmlrpc/svetlyak40wt compatible with Django > 1.1. - -.. contents:: - -Installation -============ - -You could retrieve the last sources from http://github.com/Fantomas42/django-xmlrpc and run the installation script :: - - $> python setup.py install - -or use pip :: - - $> pip install -e git://github.com/Fantomas42/django-xmlrpc.git#egg=django-xmlrpc - -Usage -===== - -Register **django_xmlrpc** in your INSTALLED_APPS section of your project' settings. - -Then register methods you want to handle like this in your project' settings. :: - - >>> XMLRPC_METHODS = (('path.to.your.method', 'Method name'), - ... ('path.to.your.othermethod', 'Other Method name'),) - -Finally we need to register the url of the XML-RPC server. -Insert something like this in your project's urls.py: :: - - >>> url(r'^xmlrpc/$', 'django_xmlrpc.views.handle_xmlrpc', name='xmlrpc'), - diff --git a/gstudio/xmlrpc/rpc/__init__.py b/gstudio/xmlrpc/rpc/__init__.py deleted file mode 100644 index 1d58f713..00000000 --- a/gstudio/xmlrpc/rpc/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -"""__init__ module for the django_xmlrpc package - -Authors:: - Graham Binns - Julien Fache - -Credit must go to Brendan W. McAdams , who -posted the original SimpleXMLRPCDispatcher to the Django wiki: -http://code.djangoproject.com/wiki/XML-RPC - -New BSD License -=============== -Copyright (c) 2007, Graham Binns http://launchpad.net/~codedragon - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -""" -VERSION = (0, 1, 1) -__version__ = '.'.join(map(str, VERSION)) - -from views import xmlrpcdispatcher diff --git a/gstudio/xmlrpc/rpc/decorators.py b/gstudio/xmlrpc/rpc/decorators.py deleted file mode 100644 index 4218a4fd..00000000 --- a/gstudio/xmlrpc/rpc/decorators.py +++ /dev/null @@ -1,175 +0,0 @@ -"""Offers decorators to make the use of django_xmlrpc a great deal simpler - -Authors:: - Graham Binns, - Reza Mohammadi - -Credit must go to Brendan W. McAdams , who -posted the original SimpleXMLRPCDispatcher to the Django wiki: -http://code.djangoproject.com/wiki/XML-RPC - -New BSD License -=============== -Copyright (c) 2007, Graham Binns http://launchpad.net/~codedragon - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -""" -from xmlrpclib import Fault -from django.contrib.auth import authenticate -from django.utils.translation import gettext as _ - - -# Some constants for your pleasure -#XXX: Any standardization? -AUTHENTICATION_FAILED_CODE = 81 -PERMISSION_DENIED_CODE = 82 - - -class AuthenticationFailedException(Fault): - """An XML-RPC fault to be raised when a permission_required authentication - check fails - - Author - """ - def __init__(self): - Fault.__init__(self, AUTHENTICATION_FAILED_CODE, - _('Username and/or password is incorrect')) - - -class PermissionDeniedException(Fault): - """An XML-RPC fault to be raised when a permission_required permission - check fails - """ - def __init__(self): - Fault.__init__(self, PERMISSION_DENIED_CODE, _('Permission denied')) - - -def xmlrpc_method(returns='string', args=None, name=None): - """Adds a signature to an XML-RPC function and register - it with the dispatcher. - - returns - The return type of the function. This can either be a string - description (e.g. 'string') or a type (e.g. str, bool) etc. - - args - A list of the types of the arguments that the function accepts. These - can be strings or types or a mixture of the two e.g. - [str, bool, 'string'] - """ - # Args should be a list - if args is None: - args = [] - - def _xmlrpc_func(func): - """Inner function for XML-RPC method decoration. Adds a signature to - the method passed to it. - - func - The function to add the signature to - """ - # If name is not None, register the method with the dispatcher. - from django_xmlrpc.views import xmlrpcdispatcher - if name is not None: - xmlrpcdispatcher.register_function(func, name) - - # Add a signature to the function - func._xmlrpc_signature = { - 'returns': returns, - 'args': args - } - return func - - return _xmlrpc_func - -xmlrpc_func = xmlrpc_method - - -# Don't use this decorator when your service is going to be -# available in an unencrpted/untrusted network. -# Configure HTTPS transport for your web server. -def permission_required(perm=None): - """Decorator for authentication. Uses Django's built in authentication - framework to provide authenticated-only and permission-related access - to XML-RPC methods - - perm - The permission (as a string) that the user must hold to be able to - call the function that is decorated with permission_required. - """ - def _dec(func): - """An inner decorator. Adds the lookup code for the permission passed - in the outer method to the function passed to it. - - func - The function to add the permission check to - """ - def __authenticated_call(username, password, *args): - """Inner inner decorator. Adds username and password parameters to - a given XML-RPC function for authentication and permission - checking purposes and modifies the method signature appropriately - - username - The username used for authentication - - password - The password used for authentication - """ - try: - user = authenticate(username=username, password=password) - if not user: - raise AuthenticationFailedException - if perm and not user.has_perm(perm): - raise PermissionDeniedException - except AuthenticationFailedException: - raise - except PermissionDeniedException: - raise - except: - raise AuthenticationFailedException - return func(user, *args) - - # Update the function's XML-RPC signature, if the method has one - if hasattr(func, '_xmlrpc_signature'): - sig = func._xmlrpc_signature - - # We just stick two string args on the front of sign['args'] to - # represent username and password - sig['args'] = (['string'] * 2) + sig['args'] - __authenticated_call._xmlrpc_signature = sig - - # Update the function's docstring - if func.__doc__: - __authenticated_call.__doc__ = func.__doc__ + \ - "\nNote: Authentication is required.""" - if perm: - __authenticated_call.__doc__ += ' this function requires ' \ - + '"%s" permission.' % perm - - return __authenticated_call - - return _dec diff --git a/gstudio/xmlrpc/rpc/dispatcher.py b/gstudio/xmlrpc/rpc/dispatcher.py deleted file mode 100644 index f4014578..00000000 --- a/gstudio/xmlrpc/rpc/dispatcher.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Offers a simple XML-RPC dispatcher for django_xmlrpc - -Author:: - Graham Binns - -Credit must go to Brendan W. McAdams , who -posted the original SimpleXMLRPCDispatcher to the Django wiki: -http://code.djangoproject.com/wiki/XML-RPC - -New BSD License -=============== -Copyright (c) 2007, Graham Binns http://launchpad.net/~codedragon - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -""" -from inspect import getargspec -from SimpleXMLRPCServer import SimpleXMLRPCDispatcher -from django.conf import settings - - -# If we need to debug, now we know -DEBUG = hasattr(settings, 'XMLRPC_DEBUG') and settings.XMLRPC_DEBUG - - -class DjangoXMLRPCDispatcher(SimpleXMLRPCDispatcher): - """A simple XML-RPC dispatcher for Django. - - Subclassess SimpleXMLRPCServer.SimpleXMLRPCDispatcher for the purpose of - overriding certain built-in methods (it's nicer than monkey-patching them, - that's for sure). - """ - - def system_methodSignature(self, method): - """Returns the signature details for a specified method - - method - The name of the XML-RPC method to get the details for - """ - # See if we can find the method in our funcs dict - # TODO: Handle this better: We really should return something more - # formal than an AttributeError - func = self.funcs[method] - - try: - sig = func._xmlrpc_signature - except: - sig = { - 'returns': 'string', - 'args': ['string' for arg in getargspec(func)[0]], - } - - return [sig['returns']] + sig['args'] diff --git a/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mo b/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mo deleted file mode 100644 index 06035ed2..00000000 Binary files a/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mo and /dev/null differ diff --git a/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po b/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index 091e086f..00000000 --- a/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,49 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: django-xmlrpc\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-31 15:33+0200\n" -"PO-Revision-Date: 2010-07-31 15:50+0100\n" -"Last-Translator: Fantomas \n" -"Language-Team: Fantomas42 \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: French\n" -"X-Poedit-Country: FRANCE\n" -"X-Poedit-SourceCharset: utf-8\n" - -#: decorators.py:60 -msgid "Username and/or password is incorrect" -msgstr "Nom d'utilisateur et/ou mot de passe incorrect" - -#: decorators.py:68 -msgid "Permission denied" -msgstr "Permission refusée" - -#: templates/xmlrpc_get.html:4 -#: templates/xmlrpc_get.html.py:7 -msgid "XML-RPC Service" -msgstr "Service XML-RPC" - -#: templates/xmlrpc_get.html:9 -msgid "You need to invoke this service using an XML-RPC Client." -msgstr "Vous devez invoquer ce service en utilisant un client XML-RPC." - -#: templates/xmlrpc_get.html:11 -msgid "The following methods are available :" -msgstr "Les méthodes suivantes sont disponibles :" - -#: templates/xmlrpc_get.html:17 -msgid "Types of argument" -msgstr "Types d'argument" - -#: templates/xmlrpc_get.html:19 -msgid "Type of return" -msgstr "Type de retour" - diff --git a/gstudio/xmlrpc/rpc/setup.py b/gstudio/xmlrpc/rpc/setup.py deleted file mode 100644 index 10b4b920..00000000 --- a/gstudio/xmlrpc/rpc/setup.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -from setuptools import setup, find_packages - -setup(name = 'django-xmlrpc', - version = '0.1.4', - - description = 'XML-RPC Server App for the Django framework.', - long_description=open(os.path.join('README.rst')).read(), - keywords = 'django, service, xmlrpc', - - author = 'Graham Binns', - author_email = 'graham.binns@gmail.com', - maintainer = 'Fantomas42', - maintainer_email = 'fantomas42@gmail.com', - url = 'http://github.com/Fantomas42/django-xmlrpc', - - packages = find_packages(), - classifiers=[ - 'Framework :: Django', - 'Development Status :: 5 - Production/Stable', - 'Environment :: Web Environment', - 'Programming Language :: Python', - 'Intended Audience :: Developers', - 'Operating System :: OS Independent', - 'Topic :: Software Development :: Libraries :: Python Modules',], - - license = 'New BSD License', - include_package_data = True, - zip_safe=False - ) - diff --git a/gstudio/xmlrpc/rpc/templates/xmlrpc_get.html b/gstudio/xmlrpc/rpc/templates/xmlrpc_get.html deleted file mode 100644 index 4c9fdfc6..00000000 --- a/gstudio/xmlrpc/rpc/templates/xmlrpc_get.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load i18n %} - -{% block title %}{% trans "XML-RPC Service" %}{% endblock %} - -{% block content %} -

{% trans "XML-RPC Service" %}

- -

{% trans "You need to invoke this service using an XML-RPC Client." %}

- -

{% trans "The following methods are available :" %}

- -{% for m in methods %} -
-

{{ m.0 }}

-
- {% trans "Types of argument" %}{{ m.1.args|length|pluralize }} : {{ m.1.args }} -
- {% trans "Type of return" %} : {{ m.1.returns }} -
-
{{ m.2 }}
-
-
-{% endfor %} -{% endblock %} - diff --git a/gstudio/xmlrpc/rpc/views.py b/gstudio/xmlrpc/rpc/views.py deleted file mode 100644 index 1edfa37e..00000000 --- a/gstudio/xmlrpc/rpc/views.py +++ /dev/null @@ -1,192 +0,0 @@ -"""Uses SimpleXMLRPCServer's SimpleXMLRPCDispatcher to serve XML-RPC requests - -Authors:: - Graham Binns - Reza Mohammadi - Julien Fache - -Credit must go to Brendan W. McAdams , who -posted the original SimpleXMLRPCDispatcher to the Django wiki: -http://code.djangoproject.com/wiki/XML-RPC - -New BSD License -=============== -Copyright (c) 2007, Graham Binns http://launchpad.net/~codedragon - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -""" -import sys - -import django -from django.conf import settings -from django.template import RequestContext -from django.shortcuts import render_to_response -from django.core.exceptions import ImproperlyConfigured -from django.http import HttpResponse, HttpResponseServerError -from gstudio.xmlrpc.metaweblog import * -from django.utils.datastructures import SortedDict -try: - from django.views.decorators.csrf import csrf_exempt -except ImportError: - from django.contrib.csrf.middleware import csrf_exempt - -from dispatcher import DjangoXMLRPCDispatcher -from decorators import xmlrpc_func - - -# We create a local DEBUG variable from the data in settings. -DEBUG = hasattr(settings, 'XMLRPC_DEBUG') and settings.XMLRPC_DEBUG - -# Declare xmlrpcdispatcher correctly depending on our python version -if sys.version_info[:3] >= (2, 5,): - xmlrpcdispatcher = DjangoXMLRPCDispatcher(allow_none=True, encoding=None) -else: - xmlrpcdispatcher = DjangoXMLRPCDispatcher() - - -def request_datas(request): - if django.VERSION[1] > 3: - return request.body - return request.raw_post_data - - -@xmlrpc_func(returns='string', args=['string']) -def test_xmlrpc(text): - """Simply returns the args passed to it as a string""" - return "Here's a response! %s" % str(text) - - -@csrf_exempt -def handle_xmlrpc(request): - """Handles XML-RPC requests. All XML-RPC calls should be forwarded here - - request - The HttpRequest object that carries the XML-RPC call. If this is a - GET request, nothing will happen (we only accept POST requests) - """ - if request.method == "POST": - if DEBUG: - print request_datas(request) - try: - response = HttpResponse(content_type='text/xml') - response.write( - xmlrpcdispatcher._marshaled_dispatch(request_datas(request))) - if DEBUG: - print response - return response - except: - return HttpResponseServerError() - else: - methods = xmlrpcdispatcher.system_listMethods() - method_list = [] - - for method in methods: - sig_ = xmlrpcdispatcher.system_methodSignature(method) - sig = { - 'returns': sig_[0], - 'args': ", ".join(sig_[1:]), - } - - # this just reads your docblock, so fill it in! - method_help = xmlrpcdispatcher.system_methodHelp(method) - - method_list.append((method, sig, method_help)) - - if hasattr(settings, 'XMLRPC_GET_TEMPLATE'): - # This behaviour is deprecated - if settings.DEBUG: - print "Use of settings.XMLRPC_GET_TEMPLATE is deprecated " \ - + "Please update your code to use django_xmlrpc/templates" - template = settings.XMLRPC_GET_TEMPLATE - else: - template = 'xmlrpc_get.html' - return render_to_response(template, {'methods': method_list}, - context_instance=RequestContext(request)) - - -# Load up any methods that have been registered with the server in settings -if hasattr(settings, 'XMLRPC_METHODS'): - for path, name in settings.XMLRPC_METHODS: - # if "path" is actually a function, just add it without fuss - if callable(path): - xmlrpcdispatcher.register_function(path, name) - continue - - # Otherwise we try and find something that we can call - i = path.rfind('.') - module, attr = path[:i], path[i + 1:] - - try: - mod = __import__(module, globals(), locals(), [attr]) - except ImportError, ex: - raise ImproperlyConfigured("Error registering XML-RPC method: " \ - + "module %s can't be imported" % module) - - try: - func = getattr(mod, attr) - except AttributeError: - raise ImproperlyConfigured('Error registering XML-RPC method: ' \ - + 'module %s doesn\'t define a method "%s"' % (module, attr)) - - if not callable(func): - raise ImproperlyConfigured('Error registering XML-RPC method: ' \ - + '"%s" is not callable in module %s' % (attr, module)) - - #xmlrpcdispatcher.register_function(func, name) - xmlrpcdispatcher.register_function(getNodetype,'getNodetype') - xmlrpcdispatcher.register_function(nidExists,'nidExists') - xmlrpcdispatcher.register_function(getinfoFromSSID,'getinfoFromSSID') - xmlrpcdispatcher.register_function(getNeighbourhood,'getNeighbourhood') - xmlrpcdispatcher.register_function(get_nbh,'get_nbh') - xmlrpcdispatcher.register_function(getAll,'getAll') - xmlrpcdispatcher.register_function(getDatatype,'getDatatype') - xmlrpcdispatcher.register_function(getAttributevalues,'getAttributevalues') - xmlrpcdispatcher.register_function(getSubjecttypes,'getSubjecttypes') - xmlrpcdispatcher.register_function(getAttributeType,'getAttributeType') - xmlrpcdispatcher.register_function(getRoles,'getRoles') - xmlrpcdispatcher.register_function(getSubtypes,'getSubtypes') - xmlrpcdispatcher.register_function(getAllSubtypes,'getAllSubtypes') - xmlrpcdispatcher.register_function(getRestrictions,'getRestrictions') - xmlrpcdispatcher.register_function(getlatestSSID,'getlatestSSID') - xmlrpcdispatcher.register_function(getAllSnapshots,'getAllSnapshots') - xmlrpcdispatcher.register_function(setAttributetype,'setAttributetype') - xmlrpcdispatcher.register_function(setRelationtype,'setRelationtype') - xmlrpcdispatcher.register_function(setObjecttype,'setObjecttype') - xmlrpcdispatcher.register_function(setObject,'setObject') - xmlrpcdispatcher.register_function(setAttribute,'setAttribute') - xmlrpcdispatcher.register_function(setRelation,'setRelation') - xmlrpcdispatcher.register_function(getGbobjectNeighbourhood,'getGbobjectNeighbourhood') - - - - - - -# Finally, register the introspection and multicall methods with the XML-RPC -# namespace -xmlrpcdispatcher.register_introspection_functions() -xmlrpcdispatcher.register_multicall_functions() -- cgit v1.2.3-70-g09d2