summaryrefslogtreecommitdiff
path: root/gstudio
diff options
context:
space:
mode:
authoramita singh <amitacr@gmail.com>2012-06-06 16:02:54 +0530
committeramita singh <amitacr@gmail.com>2012-06-06 16:02:54 +0530
commitf2b5e44148129add4f3d8d2ca14f6412fb84de04 (patch)
tree2b3f78ef41c88a66984e5ebd430c8427c51affbd /gstudio
parent25a00deee21e5693bca8d158bd1df77dd9063f16 (diff)
parenta1cd248231180ba82206c6a456345834b519a889 (diff)
downloadgnowsys-f2b5e44148129add4f3d8d2ca14f6412fb84de04.tar.gz
dump_all_rdf.py dumps the rdf of all the objects in one file and fstore_rdf_import imports the rdf to the 4store
Diffstat (limited to 'gstudio')
-rw-r--r--gstudio/fstore_rdf_import.py187
-rw-r--r--gstudio/models.py71
-rw-r--r--gstudio/templates/gstudio/skeleton.html194
-rw-r--r--gstudio/xmlrpc/__init__.py59
-rw-r--r--gstudio/xmlrpc/decorators.py175
-rw-r--r--gstudio/xmlrpc/dispatcher.py78
-rw-r--r--gstudio/xmlrpc/metaweblog.py484
-rw-r--r--gstudio/xmlrpc/rpc/.gitignore16
-rw-r--r--gstudio/xmlrpc/rpc/LICENSE24
-rw-r--r--gstudio/xmlrpc/rpc/MANIFEST.in3
-rw-r--r--gstudio/xmlrpc/rpc/README.rst36
-rw-r--r--gstudio/xmlrpc/rpc/__init__.py44
-rw-r--r--gstudio/xmlrpc/rpc/decorators.py175
-rw-r--r--gstudio/xmlrpc/rpc/dispatcher.py76
-rw-r--r--gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mobin0 -> 1030 bytes
-rw-r--r--gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po49
-rw-r--r--gstudio/xmlrpc/rpc/setup.py31
-rw-r--r--gstudio/xmlrpc/rpc/templates/xmlrpc_get.html26
-rw-r--r--gstudio/xmlrpc/rpc/views.py20
-rw-r--r--gstudio/xmlrpc/views.py193
20 files changed, 1735 insertions, 206 deletions
diff --git a/gstudio/fstore_rdf_import.py b/gstudio/fstore_rdf_import.py
new file mode 100644
index 00000000..ea48548f
--- /dev/null
+++ b/gstudio/fstore_rdf_import.py
@@ -0,0 +1,187 @@
+
+import rdflib
+from rdflib.graph import ConjunctiveGraph as Graph
+from rdflib import plugin
+from rdflib.store import Store, NO_STORE, VALID_STORE
+from rdflib.namespace import Namespace
+from rdflib.term import Literal
+from rdflib.term import URIRef
+from tempfile import mkdtemp
+from gstudio.models import *
+from objectapp.models import *
+import settings
+import os.path
+
+from pprint import pprint
+
+import subprocess
+from HTTP4Store import HTTP4Store
+
+
+def rdf_all(notation='xml'):
+ """
+ Funtion takes title of node, and rdf notation.
+ """
+ valid_formats = ["xml", "n3", "ntriples", "trix"]
+ default_graph_uri = "http://gstudio.gnowledge.org/rdfstore"
+
+ configString = "/var/tmp/rdfstore"
+
+ # Get the IOMemory plugin.
+ store = plugin.get('IOMemory', Store)('rdfstore')
+
+
+
+ # Open previously created store, or create it if it doesn't exist yet
+ graph = Graph(store="IOMemory",
+ identifier = URIRef(default_graph_uri))
+ path = mkdtemp()
+ rt = graph.open(path, create=False)
+ if rt == NO_STORE:
+
+ graph.open(path, create=True)
+ else:
+ assert rt == VALID_STORE, "The underlying store is corrupt"
+
+
+ # Now we'll add some triples to the graph & commit the changes
+
+ graph.bind("gstudio", "http://gnowledge.org/")
+ exclusion_fields = ["id", "rght", "node_ptr_id", "image", "lft", "_state", "_altnames_cache", "_tags_cache", "nid_ptr_id", "_mptt_cached_fields"]
+
+ for node in NID.objects.all():
+ node_dict=node.ref.__dict__
+ node_type = node.reftype
+ try:
+
+ if (node_type=='Gbobject'):
+ node=Gbobject.objects.get(title=node)
+
+ elif (node_type=='None'):
+ node=Gbobject.objects.get(title=node)
+
+ elif (node_type=='Processes'):
+ node=Gbobject.objects.get(title=node)
+
+ elif (node_type=='System'):
+ node=Gbobject.objects.get(title=node)
+
+ elif (node_type=='Objecttype'):
+ node=Objecttype.objects.get(title=node)
+
+ elif (node_type=='Attributetype'):
+ node=Attributetype.objects.get(title=node)
+
+ elif (node_type=='Complement'):
+ node=Complement.objects.get(title=node)
+
+ elif (node_type=='Union'):
+ node=Union.objects.get(title=node)
+
+ elif (node_type=='Intersection'):
+ node=Intersection.objects.get(title=node)
+
+ elif (node_type=='Expression'):
+ node=Expression.objects.get(title=node)
+
+ elif (node_type=='Processtype'):
+ node=Processtype.objects.get(title=node)
+
+ elif (node_type=='Systemtype'):
+ node=Systemtype.objects.get(title=node)
+
+ elif (node_type=='AttributeSpecification'):
+ node=AttributeSpecification.objects.get(title=node)
+
+ elif (node_type=='RelationSpecification'):
+ node=RelationSpecification.objects.get(title=node)
+ rdflib=link(node)
+ url_addr=link1(node)
+ fstore_dump(url_addr)
+ if(node_type=='Attribute'):
+ node=Attribute.objects.get(title=node)
+ rdflib = Namespace('http://sbox.gnowledge.org/gstudio/')
+
+ elif(node_type=='Relationtype' ):
+ node=Relationtype.objects.get(title=node)
+ rdflib = Namespace('http://sbox.gnowledge.org/gstudio/')
+
+ elif(node_type=='Metatype'):
+ node=Metatype.objects.get(title=node)
+ rdflib = Namespace('http://sbox.gnowledge.org/gstudio/')
+ url_addr='http://sbox.gnowledge.org/gstudio/'
+ fstore_dump(url_addr)
+ except:
+ if(node_type=='Attribute'):
+ rdflib= Namespace('http://sbox.gnowledge.org/gstudio/')
+
+ if(node_type=='Relationtype' ):
+ rdflib= Namespace('http://sbox.gnowledge.org/gstudio/')
+
+ if(node_type=='Metatype'):
+ rdflib= Namespace('http://sbox.gnowledge.org/gstudio/')
+
+
+ subject=str(node_dict['id'])
+ for key in node_dict:
+ if key not in exclusion_fields:
+ predicate=str(key)
+ pobject=str(node_dict[predicate])
+ graph.add((rdflib[subject], rdflib[predicate], Literal(pobject)))
+
+ rdf_code=graph.serialize(format=notation)
+ #path to store the rdf in a file
+
+ #x = os.path.join(os.path.dirname(__file__), 'rdffiles.rdf')
+
+ graph.commit()
+ graph.close()
+
+
+
+#provides the url address of particular node.
+def link(node):
+ node_url=node.get_absolute_url()
+ site_addr= node.sites.all()
+ a=site_addr[0]
+ host_name=a.name
+
+ link='http://'
+ #Concatenating the above variables will give the url address.
+
+ url_addr=link+host_name+node_url
+ rdflib=Namespace(url_addr)
+ return rdflib
+
+def link1(node):
+ node_url=node.get_absolute_url()
+ site_addr= node.sites.all()
+ a=site_addr[0]
+ host_name=a.name
+
+ link='http://'
+ #Concatenating the above variables will give the url address.
+
+ url_addr=link+host_name+node_url
+
+ return url_addr
+
+def fstore_dump(url_addr):
+
+ store = HTTP4Store('http://localhost:8067')
+ status = store.status()
+ response = store.add_from_uri('http://example.com/nodetypes/2012/05/25/mouse/')
+ return response
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gstudio/models.py b/gstudio/models.py
index 995ecaf9..6dc7983a 100644
--- a/gstudio/models.py
+++ b/gstudio/models.py
@@ -893,8 +893,7 @@ class Nodetype(Node):
def get_graph_json(self):
- # predicate_id={"plural":"a1","altnames":"a2","contains_members":"a3","contains_subtypes":"a4","prior_nodes":"a5", "posterior_nodes":"a6"}
- g_json = {}
+ g_json = {}
g_json["node_metadata"]= []
g_json["relations"]=[]
@@ -903,72 +902,57 @@ class Nodetype(Node):
global attr_counter
nbh = self.get_nbh
predicate_id = {}
-
+
for key in nbh.keys():
val = str(counter) + "a"
predicate_id[key] = val
- counter = counter + 1
- #print predicate_id
+ counter = counter + 1
-
-
- this_node = {"_id":str(self.id),"title":self.title,"screen_name":self.title, "url":self.get_absolute_url(),"expanded":"true"}
+ this_node = {"_id":str(self.id),"title":self.title,"screen_name":self.title, "url":self.get_absolute_url(),"refType":self.reftype}
g_json["node_metadata"].append(this_node)
for key in predicate_id.keys():
if nbh[key]:
try:
- #g_json[str(key)]=[]
- #g_json["relations"].append(key)
-
g_json["node_metadata"].append({"_id":str(predicate_id[key]),"screen_name":key})
-
- #g_json[str(key)].append({"from":self.id , "to":predicate_id[key],"value":1, "level":1 })
-
g_json["relations"].append({"from":self.id ,"type":str(key),"value":1,"to":predicate_id[key] })
if not isinstance(nbh[key],basestring):
- for item in nbh[key]:
- if item.reftype!="Relation":
- # create nodes
+
+ for item in nbh[key]:
+ if item.reftype=="Relationtype":
+ if item.left_subjecttype.id==self.id:
+ flag=1
+ elif item.right_subjecttype.id==self.id:
+ flag=0
+ # create nodes
- g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title,"title":self.title, "url":item.get_absolute_url(),"expanded":"false"})
-
+ g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title,"title":self.title, "url":item.get_absolute_url(),"refType":item.reftype,"inverse":item.inverse,"flag":flag})
- # g_json[str(key)].append({"from":predicate_id[key] , "to":item.id ,"value":1 })
+
+ g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title,"title":self.title, "url":item.get_absolute_url(),"refType":item.reftype})
#create links
- g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item.id })
-
- else:
-
- if item.left_subject.id==self.id:
- item1=item.right_subject
- elif item.right_subject.id==self.id:
- item1=item.left_subject
-
- g_json["node_metadata"].append({"_id":str(item1.id),"screen_name":item1.title,"title":self.title, "url":item1.get_absolute_url(),"expanded":"false"})
-
- # g_json[str(key)].append({"from":predicate_id[key] , "to":item.id ,"value":1 })
- #create links
- g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item1.id })
-
+ g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item.id })
+
+
else:
- #value={nbh["plural"]:"a4",nbh["altnames"]:"a5"}
- #this_node[str(key)]=nbh[key] key, nbh[key]
- #for item in value.keys():
+
g_json["node_metadata"].append({"_id":(str(attr_counter)+"a"),"screen_name":nbh[key]})
- #g_json[str(key)].append({"from":predicate_id[key] , "to":attr_counter ,"value":1, "level":2 })
- g_json["relations"].append({"from":predicate_id[key] ,"type":str(key) ,"value":1,"to":(str(attr_counter)+"a")})
+ g_json["relations"].append({"from":predicate_id[key] ,"type":str(key) ,"value":1,"to":(str(attr_counter)+"a")})
attr_counter-=1
except:
pass
- #print g_json
+
- return json.dumps(g_json)
-
+
+ return json.dumps(g_json)
+
+
+
+
@property
def get_possible_attributes(self):
"""
@@ -1900,7 +1884,6 @@ class Relationtype(Nodetype):
nbh['plural'] = self.plural
nbh['contains_subtypes'] = Nodetype.objects.filter(parent=self.id)
- # get all the objects inheriting this OT
nbh['contains_members'] = self.member_objects.all()
nbh['prior_nodes'] = self.prior_nodes.all()
nbh['posterior_nodes'] = self.posterior_nodes.all()
diff --git a/gstudio/templates/gstudio/skeleton.html b/gstudio/templates/gstudio/skeleton.html
index ad6cf4a3..6991304f 100644
--- a/gstudio/templates/gstudio/skeleton.html
+++ b/gstudio/templates/gstudio/skeleton.html
@@ -178,8 +178,8 @@
function init(a,b)
{
+
-
nodes_by_id = _.reduce(a, function(acc, n) {
acc[n._id] = n;
return acc;
@@ -198,11 +198,14 @@ function init(a,b)
return nodes_by_id[e.from] && nodes_by_id[e.to]&& e.type!="title" && e.type!="content"
}).value();
-
+
}
$(function fgraph() {
-
+neighbour_node= new Array();
+clicked_node=new Array();
+prev_node=new Array();
+neighbour_node= neighbour_node.concat({{object.id}});
$.getJSON('/nodetypes/graphs/graph_json/' + {{object.id}}, function (json1) {
metadata=json1.node_metadata;
@@ -338,29 +341,128 @@ function load(key)
.attr("fill", "#6D6666");
-
-$(window).bind('keydown',function(event){
- if(17==event.keyCode){
- new_g.on("click",function(d){
- if(d._id>0 && d.expanded=="false")
- {
- d3.select("#amazingViz").remove();
- d.expanded="true";
- $.getJSON('/nodetypes/graphs/graph_json/' + d._id , function (json2) {
- new_metadata=json2.node_metadata;
- new_relations=json2.relations;
- new_relnset=json2.relset
- metadata=_.union(new_metadata,metadata);
- relations=_.union(new_relations,relations);
- init(metadata,relations);
- load(d._id)
- })
+$(window).bind('keydown',function(event) {
+ if(event.keyCode==17){
+
+ new_g.on("click",function(d){
+
+
+
+
+ if(d._id>0 && d.expanded=="true" && d._id!= {{object.id}})
+ {
+
+ $.getJSON('/nodetypes/graphs/graph_json/' + d._id , function (json2) {
+ new_metadata=json2.node_metadata;
+
+ });
+
+ _.filter(new_metadata, function(e){if(e._id>0)
+ {
+ clicked_node=clicked_node.concat(e._id) ;
+ }
+ });
+
+
+ index = _.indexOf(neighbour_node , d._id);
+ prev_node=neighbour_node.slice(0,index);
+
+ neighbour_node = _.difference(neighbour_node,clicked_node) ;
+
+ neighbour_node= neighbour_node.concat(prev_node);
+ neighbour_node = _.uniq(neighbour_node);
+ metadata=[]
+ relations=[]
+ metadata1=[]
+ relations1=[]
+ for(i=0;i<(neighbour_node.length);i++)
+ {
+
+ d3.select("#amazingViz").remove();
+ g=neighbour_node[i]
+
+
+
+ $.ajax({
+ async:false,
+ url:'/nodetypes/graphs/graph_json/' + g ,
+ datatype:'json',
+ success:function (json2) {
+ new_metadata=json2.node_metadata;
+ new_relations=json2.relations;
+ metadata=_.union(new_metadata,metadata);
+
+ relations=_.union(new_relations,relations);
+ relations= check_Relationtype(metadata,relations);
+ }});
+
}
-
- });
+ _.each(metadata, function(m){
+
+ for(i=0;i<neighbour_node.length;i++)
+ {
+ if(m._id==neighbour_node[i])
+ {m.expanded="true";}
+ else
+ {m.expanded="false";}
+ }
+
+
+ });
+
+ init(metadata,relations);
+ load({{object.id}}) ;
-}
+
+
+ }
+
+
+
+
+ else if(d._id>0 && d._id!= {{object.id}})
+ {
+
+ neighbour_node =neighbour_node.concat(d._id);
+
+ d3.select("#amazingViz").remove();
+
+ $.ajax({
+ async:false,
+ url:'/nodetypes/graphs/graph_json/' + d._id ,
+ datatype:'json',
+ success:function (json2) {
+
+ new_metadata=json2.node_metadata;
+ new_relations=json2.relations;
+
+ metadata=_.union(new_metadata,metadata);
+ relations=_.union(new_relations,relations);
+ relations= check_Relationtype(metadata,relations);
+ _.each(metadata, function(m){
+
+ for(i=0;i<neighbour_node.length;i++)
+ {
+ if(m._id==neighbour_node[i])
+ m.expanded="true";
+ }
+ });
+
+
+ }});
+ console.log(metadata);
+ init(metadata,relations);
+ load({{object.id}});
+
+
+
+
+ }
});
+}
+
+});
+
@@ -370,15 +472,7 @@ $(window).bind('keydown',function(event){
});
- /*new_g.append("svg:ellipse")
- .attr("cx", function(d) { return d.x - w/2.0 +15; })
- .attr("cy", function(d) { return d.y - h/2.0 +15 ; })
- .call(force.drag)
- .attr("rx", function(d) { return ((d.screen_name).length) +10 })
- .attr("ry", function(d) { if (d._id==key) return 8; else if (isNaN(d._id) || (d._id)<0) return 1; else return 7 });
- //.style("fill", function color(d) { if (d._id==key) return "red"; else if (isNaN(d._id) || (d._id)<0) return "white" ; else return "green"});*/
-
-
+
@@ -389,8 +483,7 @@ $(window).bind('keydown',function(event){
.attr("dy", ".35em")
.attr("text-anchor","middle")
- // .attr("style",function text(d) { if ((d._id)>0) return "font-size:9.00pt;fill:blue;" ; else return "font-size:9.00pt;fill:black;"})
-
+
.text(function(d) {
return d.screen_name;
});
@@ -423,7 +516,7 @@ $(window).bind('keydown',function(event){
.style("fill-opacity", ".2")
.style("stroke", "#666")
.style("stroke-width", "1.5px")
- .style("fill", function color(d) {var e=(d._id).charAt(0); if (d.expanded=="true") return "red"; else return "none"});
+ .style("fill", function(d) {if ((d.expanded=="true" && d.refType=="Objecttype") ||(d._id=={{object.id}}) ) return "blue"; else if(d.expanded=="true" && d.refType=="Gbobject") return "red"; else return "none"});
@@ -462,9 +555,38 @@ $(window).bind('keydown',function(event){
}
+function check_Relationtype(metadata,relations)
+{
+
+
+ _.each(metadata,function(d){
+ if (d.refType=="Relationtype")
+ {
+ a=d.inverse;
+ if (d.flag==1)
+ {
+ relations= _.reject(relations,function(e)
+ {
+ return e.type==a
+ });
+ }
+ else if (d.flag==0)
+ {
+ relations= _.reject(relations,function(e)
+ {
+ return e.type==d.screen_name
+ });
+ }
+ }
+
+ });
+return relations;
+
+
+}
+
});
-//fgraph({{object.id}});
</script>
diff --git a/gstudio/xmlrpc/__init__.py b/gstudio/xmlrpc/__init__.py
index afb41e6f..318e6d9f 100644
--- a/gstudio/xmlrpc/__init__.py
+++ b/gstudio/xmlrpc/__init__.py
@@ -54,6 +54,7 @@ GSTUDIO_XMLRPC_PINGBACK = [
('gstudio.xmlrpc.pingback.pingback_extensions_get_pingbacks',
'pingback.extensions.getPingbacks')]
+# The tuple has been modified to include entries for get and set functions
GSTUDIO_XMLRPC_METAWEBLOG = [
('gstudio.xmlrpc.metaweblog.get_users_blogs',
'blogger.getUsersBlogs'),
@@ -82,35 +83,53 @@ GSTUDIO_XMLRPC_METAWEBLOG = [
('gstudio.xmlrpc.metaweblog.new_media_object',
'metaWeblog.newMediaObject'),
('gstudio.xmlrpc.metaweblog.getNodetype',
- 'metaweblog.getNodetype'),
+ 'metaWeblog.getNodetype'),
('gstudio.xmlrpc.metaweblog.nidExists',
- 'metaweblog.nidExists'),
+ 'metaWeblog.nidExists'),
('gstudio.xmlrpc.metaweblog.getinfoFromSSID',
- 'metaweblog.getinfoFromSSID'),
- #('gstudio.xmlrpc.metaweblog.getNeighbourhood',
- #'metaweblog.getNeighbourhood'),
- # ('gstudio.xmlrpc.metaweblog.getallNodes',
- # 'metaweblog.getallNodes'),
+ 'metaWeblog.getinfoFromSSID'),
+ ('gstudio.xmlrpc.metaweblog.getNeighbourhood',
+ 'metaWeblog.getNeighbourhood'),
+ ('gstudio.xmlrpc.metaweblog.getAll',
+ 'metaWeblog.getAll'),
('gstudio.xmlrpc.metaweblog.getDatatype',
- 'metaweblog.getDatatype'),
+ 'metaWeblog.getDatatype'),
('gstudio.xmlrpc.metaweblog.getAttributevalues',
- 'metaweblog.getAttributevalues'),
+ 'metaWeblog.getAttributevalues'),
('gstudio.xmlrpc.metaweblog.getSubjecttypes',
- 'metaweblog.getSubjecttypes'),
- #('gstudio.xmlrpc.metaweblog.getAttributeType',
- #'metaweblog.getAttributeType'),
+ 'metaWeblog.getSubjecttypes'),
+ ('gstudio.xmlrpc.metaweblog.getAttributeType',
+ 'metaWeblog.getAttributeType'),
('gstudio.xmlrpc.metaweblog.getRoles',
- 'metaweblog.getRoles'),
+ 'metaWeblog.getRoles'),
('gstudio.xmlrpc.metaweblog.getSubtypes',
- 'metaweblog.getSubtypes'),
- #('gstudio.xmlrpc.metaweblog.Suballtypes',
- #'metaweblog.Suballtypes'),
+ 'metaWeblog.getSubtypes'),
+ ('gstudio.xmlrpc.metaweblog.getAllSubtypes',
+ 'metaWeblog.getAllSubtypes'),
('gstudio.xmlrpc.metaweblog.getRestrictions',
- 'metaweblog.getRestrictions'),
+ 'metaWeblog.getRestrictions'),
('gstudio.xmlrpc.metaweblog.getlatestSSID',
- 'metaweblog.getlatestSSID'),
- ('gstudio.xmlrpc.metaweblog.getAllSnapshots',
- 'metaweblog.getAllSnapshots')
+ 'metaWeblog.getlatestSSID'),
+ ('gstudio.xmlrpc.metaweblog.getAllSnapshots',
+ 'metaWeblog.getAllSnapshots'),
+ ('gstudio.xmlrpc.metaweblog.setAttributetype',
+ 'metaWeblog.setAttributetype'),
+ ('gstudio.xmlrpc.metaweblog.setRelationtype',
+ 'metaWeblog.setRelationtype'),
+ ('gstudio.xmlrpc.metaweblog.setObjecttype',
+ 'metaWeblog.setObjecttype'),
+ ('gstudio.xmlrpc.metaweblog.setObject',
+ 'metaWeblog.setObject'),
+ ('gstudio.xmlrpc.metaweblog.setAttribute',
+ 'metaWeblog.setAttribute'),
+ ('gstudio.xmlrpc.metaweblog.setRelation',
+ 'metaWeblog.setRelation'),
+ ('gstudio.xmlrpc.metaweblog.getGbobjectNeighbourhood',
+ 'metaWeblog.getGbobjectNeighbourhood')
+
+
+
+
]
diff --git a/gstudio/xmlrpc/decorators.py b/gstudio/xmlrpc/decorators.py
new file mode 100644
index 00000000..5d13feaa
--- /dev/null
+++ b/gstudio/xmlrpc/decorators.py
@@ -0,0 +1,175 @@
+"""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 <brendan.mcadams@thewintergrp.com>, 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 <ORGANIZATION> 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 _
+
+# This file is needed to run XMLRPC !
+# 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/dispatcher.py b/gstudio/xmlrpc/dispatcher.py
new file mode 100644
index 00000000..28291845
--- /dev/null
+++ b/gstudio/xmlrpc/dispatcher.py
@@ -0,0 +1,78 @@
+"""Offers a simple XML-RPC dispatcher for django_xmlrpc
+
+Author::
+ Graham Binns
+
+Credit must go to Brendan W. McAdams <brendan.mcadams@thewintergrp.com>, 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 <ORGANIZATION> 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.
+"""
+# This file is needed to run XMLRPC
+
+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/metaweblog.py b/gstudio/xmlrpc/metaweblog.py
index 5b273ea3..4dd1fe1a 100644
--- a/gstudio/xmlrpc/metaweblog.py
+++ b/gstudio/xmlrpc/metaweblog.py
@@ -72,6 +72,9 @@ from gstudio.managers import DRAFT, PUBLISHED
from django_xmlrpc.decorators import xmlrpc_func
from django.utils.datastructures import SortedDict
from gstudio.models import *
+from django.contrib.auth.models import User
+
+
# http://docs.nucleuscms.org/blog/12#errorcodes
LOGIN_ERROR = 801
@@ -377,15 +380,15 @@ def new_media_object(blog_id, username, password, media):
ContentFile(media['bits'].data))
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 ssid """
+ """Returns the nodetype of given nid """
try :
g = Nodetype.objects.get(id=ssid)
return (g.ref._meta.module_name)
except Nodetype.DoesNotExist :
- return "Node with the given ssid does not exist"
+ return "Node with the given nid does not exist"
@xmlrpc_func(returns='int', args='string')
def nidExists(nid):
@@ -396,156 +399,439 @@ def nidExists(nid):
except Nodetype.DoesNotExist:
return 0
-
-@xmlrpc_func(returns=['struct'],args=['string'])
+@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 """
lst = []
for ssid in ssid_list :
+ try :
+ t = NID.objects.get(id = ssid)
try :
- p = Objecttype.objects.get(id = ssid)
+ p = Nodetype.objects.get(id = ssid)
nbh = p.ref.get_nbh
lst.append(str(nbh))
- except Objecttype.DoesNotExist :
- return "ssid",ssid,"Does not exist"
-
-
+ except Nodetype.DoesNotExist :
+ lst.append("Not of type Nodetype")
+ except NID.DoesNotExist :
+ lst.append("Node Does Not Exist")
return lst
+@xmlrpc_func(returns='struct', args=['string','string'])
+def getNeighbourhood(ssid_list, get_what):
+ d = {}
+ for ssid in ssid_list:
+ try:
+ p = NID.objects.get(id = ssid)
+ try :
+ t = Nodetype.objects.get(id = ssid)
+ if get_what=='rendered_nbh' :
+ nbh = p.ref.get_rendered_nbh
+ d[str(p.id)]= str(nbh)
+ elif get_what=='nbh':
+ nbh = p.ref.get_nbh
+ d[str(p.id)]= str(nbh)
+ except Nodetype.DoesNotExist :
+ d[str(ssid)] = "Not of type Nodetype"
+ except NID.DoesNotExist :
+ d[str(ssid)] = "Node Does Not Exist"
+ return d
+@xmlrpc_func(returns='struct', args=['string','string'])
+def getGbobjectNeighbourhood(ssid_list, get_what):
+ d = {}
+ for ssid in ssid_list:
+ try:
+ p = NID.objects.get(id = ssid)
+ try :
+ t = Gbobject.objects.get(id = ssid)
+ if get_what=='rendered_nbh' :
+ nbh = p.ref.get_rendered_nbh
+ d[str(p.id)]= str(nbh)
+ elif get_what=='nbh':
+ nbh = p.ref.get_nbh
+ d[str(p.id)]= str(nbh)
+ except Gbobject.DoesNotExist :
+ d[str(ssid)] = "Not of type Gboject"
+ except NID.DoesNotExist :
+ d[str(ssid)] = "Node Does Not Exist"
+ return d
-@xmlrpc_func(returns=['struct'], args=['string'])
+
+
+@xmlrpc_func(returns='struct', args=['string'])
+
+def getAttributeType(subjecttypelist):
+ """given the list of subjecttype inids the method returns all the attributetypes attached. """
+ d = {}
+ for s in subjecttypelist :
+ try :
+ l = []
+ p = NID.objects.get(id = s)
+ k = p.ref._meta.module_name
+ y = []
+ if( k == 'objecttype' or 'metatype' ) :
+ y = Attributetype.objects.filter(subjecttype_id = s)
+ for i in y :
+ l.append(str(i.id))
+ d[str(s)] = l
+ except NID.DoesNotExist :
+ d[str(s)] = "Node Does not Exist"
+ return d
+
+# Get all function for getting all nodetypes
+@xmlrpc_func(returns='struct', args='string')
+
+def getAll(nodetype):
+ """Given a class name it returns all the nids corresponding to their class name."""
+ d = {}
+ try :
+ p = eval(nodetype)
+ h = p.objects.all()
+ for i in h:
+ d[str(i.title)] = i.id
+ except NameError :
+ return "The class with the given name Does not exist"
+ return d
+
+
+@xmlrpc_func(returns='struct', args=['string'])
def getDatatype(attrtype_ssid_list) :
"""Given a list of attributessids, it returns its datatypes """
-
d = {}
- g = {}
for l in attrtype_ssid_list :
- p = NID.objects.get(id = l)
- n = p.ref._meta.module_name
- if n == 'attributetype' :
- ft = FIELD_TYPE_CHOICES[int(p.ref.dataType) - 1]
- d[str(p.id)] = ft[1]
- else :
- return " Node does not exist "
-
+ try :
+ p = NID.objects.get(id = l)
+ n = p.ref._meta.module_name
+ if n == 'attributetype' :
+ ft = FIELD_TYPE_CHOICES[int(p.ref.dataType) - 1]
+ d[str(p.id)] = ft[1]
+ else :
+ d[str(p.id)]= "Not a attributetype"
+ except NID.DoesNotExist :
+ d[str(l)] = "Node Does not Exist"
return d
-@xmlrpc_func(returns=['struct'], args=['string'])
+@xmlrpc_func(returns='struct', args=['string'])
def getAttributevalues(Attrssidlist) :
"""Given a list of attributessid, it returns their values """
-
d = {}
for l in Attrssidlist :
try :
- p = Attribute.objects.get(id = l)
- d[str(p.id)] = p.svalue
- except Attribute.DoesNotExist :
- return " Node does not exist"
-
+ p = NID.objects.get(id = l)
+ k = p.ref._meta.module_name
+ if ( k == 'attribute' ) :
+ t = Attribute.objects.get(id = l)
+ d[str(t.id)] = t.svalue
+ else :
+ d[str(l)] = "Not an Attribute"
+ except NID.DoesNotExist :
+ 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 """
- d ={}
- for l in AttributeTypeNid :
- try :
- p = Attributetype.objects.get(id = l)
- n = p.ref.subjecttype_id
- s = NID.objects.get(id = n)
- d[str(s.title)]= n
- d['applicable_nodetypes'] = p.applicable_nodetypes
- except Attribute.DoesNotExist:
- return " Node does not exist "
- return d
-
-
-
-
-
-
-@xmlrpc_func(returns=['struct'], args=['string'])
+@xmlrpc_func(returns='struct', args='string')
+def getSubjecttypes( AttributeTypeNid ):
+ """Given an attributetypenid, it returns the subjecttype participating in the attributetype """
+ try :
+ d = {}
+ t = NID.objects.get(id = AttributeTypeNid)
+ k = t.ref._meta.module_name
+ if k == 'attributetype' :
+ p = Attributetype.objects.get(id = AttributeTypeNid)
+ n = p.subjecttype_id
+ d['stid'] = str(n)
+ d['applicable_nodetypes'] = p.applicable_nodetypes
+ else :
+ return "Not an Attributetype"
+ except NID.DoesNotExist:
+ return "Node does not exist"
+ return d
+
+@xmlrpc_func(returns='struct', args='string')
def getRoles(relationtypenid) :
"""given a relationtype nid this method returns the roles participating in the relationtype """
-
- d = {}
- p = Relationtype.objects.get(nodetype_ptr_id = relationtypenid)
-
- d['cardinality1 '] = p.left_cardinality
- d['cardinality2'] = p.right_cardinality
- d['rtid'] = p.nodetype_ptr_id
- d['applicablenodetype1'] = p.left_applicable_nodetypes
- d['applicablenodetype2'] = p.right_applicable_nodetypes
- d['subjecttype1'] = p.left_subjecttype_id
- d['subjecttype2'] = p.right_subjecttype_id
+ try :
+ t = NID.objects.get(id = relationtypenid)
+ k = t.ref._meta.module_name
+ d = {}
+ if k == 'relationtype' :
+ p = Relationtype.objects.get(nodetype_ptr_id = relationtypenid)
+ d['cardinality1 '] = p.left_cardinality
+ d['cardinality2'] = p.right_cardinality
+ d['rtid'] = p.nodetype_ptr_id
+ d['applicablenodetype1'] = p.left_applicable_nodetypes
+ d['applicablenodetype2'] = p.right_applicable_nodetypes
+ d['subjecttype1'] = p.left_subjecttype_id
+ d['subjecttype2'] = p.right_subjecttype_id
+ else :
+ return "Not a Relationtype"
+ except NID.DoesNotExist :
+ 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"""
- i = 0
- l = []
- p = Objecttype.objects.get(id = nodeid)
- n = p.get_children()
- u = len(n)
- while u>0 :
- t = n[i].id
- l.append(str(t))
- i = i+1
- u = u-1
+ try :
+ y = NID.objects.get(id = nodeid)
+ try :
+ p = Nodetype.objects.get(id = nodeid)
+ n = p.get_children()
+ l = []
+ for i in n:
+ l.append(str(i.id))
+ except Nodetype.DoesNotExist :
+ return "Not of type nodetype"
+ except NID.DoesNotExist :
+ return " Node Does not exist"
return l
-
-
+@xmlrpc_func(returns='struct', args='string')
+
+def getAllSubtypes(nodeid) :
+ """Returns all the 'subtypes' of the node specified"""
+ try :
+ l = []
+ p = NID.objects.get(id = nodeid)
+ try :
+ k = Nodetype.objects.get(id = nodeid)
+ h = k.get_descendants()
+ for i in h :
+ l.append(str(i.id))
+ except Nodetype.DoesNotExist :
+ return "Not of type Nodetype"
+ except NID.DoesNotExist :
+ return "Node Does not Exist"
+ return l
@xmlrpc_func(returns=['struct'], args=['string'])
def getRestrictions(ATlist) :
"""Given a list of attributetype ssids, this method returns all the restrictions that the attributetypes have """
- u = {}
d = {}
- ft = []
+ ft = []
for a in ATlist :
- p = Attributetype.objects.get(id = a)
- ft = FIELD_TYPE_CHOICES[int(p.dataType)-1]
- u['datatype'] = ft[1]
- u['length'] = p.max_digits
- u['precision'] = p.decimal_places
- d[str(p.id)] = u
-
+ try :
+ k = NID.objects.get(id = a)
+ t = k.ref._meta.module_name
+ u = {}
+ if t == 'attributetype' :
+ p = Attributetype.objects.get(id = a)
+ ft = FIELD_TYPE_CHOICES[int(p.dataType)-1]
+ u['datatype'] = ft[1]
+ u['length'] = p.max_digits
+ u['precision'] = p.decimal_places
+ d[str(p.id)] = u
+ else :
+ d[str(a)] = "Not a Attributetype"
+ except NID.DoesNotExist :
+ d[str(a)] = "Node Does Not Exist"
return d
-@xmlrpc_func(returns='int', args='int')
+@xmlrpc_func(returns='int', args='string')
def getlatestSSID(nid) :
"""Given the id, this method will return the latest ssid of the given id """
+ try :
+ p = NID.objects.get(id = nid)
+ n = p.get_ssid
+ u = len(n)
+ if u == 0 :
+ return "No Snapshots created"
+ else :
+ r = n[u-1]
+ return r
+ 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 """
+ try :
+ p = NID.objects.get(id = nid)
+ n = p.get_ssid
+ except NID.DoesNotExist :
+ return "Node Does Not Exist"
+ return n
+
+# Set functions begin from here
+@xmlrpc_func(returns='string', args=['struct','string'])
+def setAttributetype(d,objid) :
+
+ try :
+ p = NID.objects.get(id = objid)
+ t = p.ref._meta.module_name
+ w = []
+ if t == 'objecttype' or t == 'metatype' :
+ u = Attributetype.objects.filter(subjecttype_id = objid)
+ y = len(u)
+ r = 0
+ for i in u :
+ if str(i.title) == d['title'] :
+ return "Attributetype:",d['title']," already exists"
+ else :
+ r = r + 1
+ if r == y :
+ w = Attributetype(title = d['title'],applicable_nodetypes = d['nodetype'],subjecttype_id = objid,slug = d['slug'])
+ w.save()
+ return w.id
+ else :
+ return "Not a objecttype"
+ except NID.DoesNotExist :
+ return "Node Does Not Exist"
+
+
+
+@xmlrpc_func(returns='int', args=['struct','string'])
+
+def setRelationtype(d,uid) :
+
+ try :
+ k = NID.objects.get(id = uid)
+ f = k.ref._meta.module_name
+ r = 0
+ t = []
+ if ( f == 'objecttype' or f == 'metatype') :
+ p = Relationtype.objects.filter(left_subjecttype_id = uid)
+ u = len(p)
+ for n in p :
+ if (str(n.title) == d['title']) :
+ return "Relationtype :",d['title'],"already exists for",n.title
+ else :
+ r = r + 1
+ if r == u :
+ t = Relationtype(title = d['title'],left_subjecttype_id = uid,right_subjecttype_id = d['right_subjecttype_id'],
+ slug = d['slug'],inverse = d['inverse'])
+ t.save()
+ return t.id
+ else :
+ return " Not of type Objecttype or Metatype"
+ except NID.DoesNotExist :
+ return " Node does not Exist"
+
+@xmlrpc_func(returns='int', args=['struct','string'])
+
+def setObjecttype(d) :
+
+ k = Objecttype.objects.all()
+ u = len(k)
+ r = 0
+ t = []
+ for n in k :
+ if (str(n.title) == d['title']) :
+ return "Objecttype",d['title'],"already exists"
+ else :
+ r = r + 1
+ if r == u :
+ t = Objecttype(title = d['title'], slug = d['slug'])
+ t.save()
+
+ return t.id
+
+
+@xmlrpc_func(returns='int', args=['struct','string'])
+
+def setObject(d,o) :
+
+ try :
+ k = NID.objects.get(id = o)
+ t = k.ref._meta.module_name
+ u = 0
+ r = 0
+ y = []
+ h = []
+ if (t == 'objecttype' or t =='metatype') :
+ p = Objecttype.objects.get(id = o)
+ h = p.get_members
+ u = len(h)
+ for i in h :
+ if(str(i.title) == d['title']) :
+ return "Object",d['title'],"already exists for",p.title
+ else :
+ r = r + 1
+ if r == u :
+ y = Gbobject(title = d['title'],slug = d['slug'])
+ y.save()
+ y.objecttypes.add(p)
+ return y.id
+ else :
+ return "Not of type Objecttype or metatype"
+ except NID.DoesNotExist :
+ return "Node does not exist"
+
+@xmlrpc_func(returns='int', args=['struct','string'])
+
+def setAttribute(d,objid) :
+ 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
+ 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) :
+ try :
+ p = Relationtype.objects.filter(left_subjecttype_id = obj1,right_subjecttype_id = obj2)
+ s = []
+ for i in p :
+ if (str(i.title) == d['relationtypename']) :
+ s = Relation(relationtype_id = i.id,left_subject_id = d['left_subject_id'],right_subject_id = d['right_subject_id'])
+ s.save()
+ return s.id
+ except Relationtype.DoesNotExist :
+ return "Relationtype Does Not Exist"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- p = NID.objects.get(id = nid)
- n = p.get_ssid
- u = len(n)
- r = n[u-1]
- return r
-@xmlrpc_func(returns=['struct'], args='int')
-def getAllSnapshots(nid) :
- """Given the id, this method will return all the ssids of the given id """
- p = NID.objects.get(id = nid)
- n = p.get_ssid
- return n
diff --git a/gstudio/xmlrpc/rpc/.gitignore b/gstudio/xmlrpc/rpc/.gitignore
new file mode 100644
index 00000000..7b4dcf61
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/.gitignore
@@ -0,0 +1,16 @@
+*~
+*.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
new file mode 100644
index 00000000..8efdc935
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/LICENSE
@@ -0,0 +1,24 @@
+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
new file mode 100644
index 00000000..2f4671ba
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/MANIFEST.in
@@ -0,0 +1,3 @@
+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
new file mode 100644
index 00000000..bcf4ac0a
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/README.rst
@@ -0,0 +1,36 @@
+==============
+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
new file mode 100644
index 00000000..1d58f713
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/__init__.py
@@ -0,0 +1,44 @@
+"""__init__ module for the django_xmlrpc package
+
+Authors::
+ Graham Binns
+ Julien Fache
+
+Credit must go to Brendan W. McAdams <brendan.mcadams@thewintergrp.com>, 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 <ORGANIZATION> 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
new file mode 100644
index 00000000..4218a4fd
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/decorators.py
@@ -0,0 +1,175 @@
+"""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 <brendan.mcadams@thewintergrp.com>, 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 <ORGANIZATION> 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
new file mode 100644
index 00000000..f4014578
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/dispatcher.py
@@ -0,0 +1,76 @@
+"""Offers a simple XML-RPC dispatcher for django_xmlrpc
+
+Author::
+ Graham Binns
+
+Credit must go to Brendan W. McAdams <brendan.mcadams@thewintergrp.com>, 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 <ORGANIZATION> 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
new file mode 100644
index 00000000..06035ed2
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po b/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 00000000..091e086f
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,49 @@
+# 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 <EMAIL@ADDRESS>, 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 <Fantomas42@gmail.com>\n"
+"Language-Team: Fantomas42 <fantomas42@gmail.com>\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
new file mode 100644
index 00000000..10b4b920
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/setup.py
@@ -0,0 +1,31 @@
+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
new file mode 100644
index 00000000..4c9fdfc6
--- /dev/null
+++ b/gstudio/xmlrpc/rpc/templates/xmlrpc_get.html
@@ -0,0 +1,26 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "XML-RPC Service" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "XML-RPC Service" %}</h2>
+
+<p>{% trans "You need to invoke this service using an XML-RPC Client." %}</p>
+
+<h3>{% trans "The following methods are available :" %}</h3>
+
+{% for m in methods %}
+<div class="functions">
+ <h4>{{ m.0 }}</h4>
+ <div class="function_desc">
+ <strong>{% trans "Types of argument" %}{{ m.1.args|length|pluralize }} :</strong> {{ m.1.args }}
+ <br />
+ <strong>{% trans "Type of return" %} :</strong> {{ m.1.returns }}
+ <br />
+ <pre class="function_doc">{{ m.2 }}</pre>
+ </div>
+</div>
+{% endfor %}
+{% endblock %}
+
diff --git a/gstudio/xmlrpc/rpc/views.py b/gstudio/xmlrpc/rpc/views.py
index 8c66b384..1edfa37e 100644
--- a/gstudio/xmlrpc/rpc/views.py
+++ b/gstudio/xmlrpc/rpc/views.py
@@ -156,24 +156,30 @@ if hasattr(settings, 'XMLRPC_METHODS'):
raise ImproperlyConfigured('Error registering XML-RPC method: ' \
+ '"%s" is not callable in module %s' % (attr, module))
- xmlrpcdispatcher.register_function(func, name)
+ #xmlrpcdispatcher.register_function(func, name)
xmlrpcdispatcher.register_function(getNodetype,'getNodetype')
- xmlrpcdispatcher.register_function(nidExists,'nidExists')
+ xmlrpcdispatcher.register_function(nidExists,'nidExists')
xmlrpcdispatcher.register_function(getinfoFromSSID,'getinfoFromSSID')
- #xmlrpcdispatcher.register_function(getNeighbourhood,'getNeighbourhood')
+ xmlrpcdispatcher.register_function(getNeighbourhood,'getNeighbourhood')
xmlrpcdispatcher.register_function(get_nbh,'get_nbh')
- #xmlrpcdispatcher.register_function(getallNodes,'getallNodes')
+ 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(getAttributeType,'getAttributeType')
xmlrpcdispatcher.register_function(getRoles,'getRoles')
xmlrpcdispatcher.register_function(getSubtypes,'getSubtypes')
- #xmlrpcdispatcher.register_function(Suballtypes,'Suballtypes')
+ 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')
diff --git a/gstudio/xmlrpc/views.py b/gstudio/xmlrpc/views.py
new file mode 100644
index 00000000..0bcd4f09
--- /dev/null
+++ b/gstudio/xmlrpc/views.py
@@ -0,0 +1,193 @@
+"""Uses SimpleXMLRPCServer's SimpleXMLRPCDispatcher to serve XML-RPC requests
+
+Authors::
+ Graham Binns
+ Reza Mohammadi
+ Julien Fache
+
+Credit must go to Brendan W. McAdams <brendan.mcadams@thewintergrp.com>, 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 <ORGANIZATION> 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)
+# Registration for Gnowsys-studio XMLRPC functions
+ 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()