diff options
-rw-r--r-- | README.rst | 8 | ||||
-rw-r--r-- | demo/initial_data.json | 1 | ||||
-rw-r--r-- | demo/urls.py | 3 | ||||
-rw-r--r-- | gstudio/models.py | 1 | ||||
-rw-r--r-- | gstudio/xmlrpc/__init__.py | 59 | ||||
-rw-r--r-- | gstudio/xmlrpc/decorators.py | 175 | ||||
-rw-r--r-- | gstudio/xmlrpc/dispatcher.py | 78 | ||||
-rw-r--r-- | gstudio/xmlrpc/metaweblog.py | 484 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/.gitignore | 16 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/LICENSE | 24 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/MANIFEST.in | 3 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/README.rst | 36 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/__init__.py | 44 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/decorators.py | 175 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/dispatcher.py | 76 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mo | bin | 0 -> 1030 bytes | |||
-rw-r--r-- | gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.po | 49 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/setup.py | 31 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/templates/xmlrpc_get.html | 26 | ||||
-rw-r--r-- | gstudio/xmlrpc/rpc/views.py | 20 | ||||
-rw-r--r-- | gstudio/xmlrpc/views.py | 193 | ||||
-rw-r--r-- | majorproj/gnowsys-studio/gstudio/templates/gstudio/base.html | 110 | ||||
-rw-r--r-- | setup.py | 5 |
23 files changed, 1483 insertions, 134 deletions
@@ -54,10 +54,10 @@ To define binary relations (object properties) between classes and objects. e.g * Attribute Specification - To specify an attribute by a subject to say for example: - population of India, color of a flower etc. These do not yeild a - proposition but an expression, which can be used as a subject in - another sentence. + To specify an attribute by a subject to say for example: population + of India, color of a flower etc. These do not yeild a proposition + but an expression, which can be used as a subject in another + sentence. * Expression diff --git a/demo/initial_data.json b/demo/initial_data.json new file mode 100644 index 00000000..35eee683 --- /dev/null +++ b/demo/initial_data.json @@ -0,0 +1 @@ +[{"pk": 44, "model": "contenttypes.contenttype", "fields": {"model": "nodespecification", "name": "Node specification", "app_label": "gstudio"}}, {"pk": 62, "model": "contenttypes.contenttype", "fields": {"model": "arrowvisual", "name": "arrow visual", "app_label": "graphviz"}}, {"pk": 20, "model": "contenttypes.contenttype", "fields": {"model": "attribute", "name": "attribute", "app_label": "gstudio"}}, {"pk": 25, "model": "contenttypes.contenttype", "fields": {"model": "attributebigintegerfield", "name": "attribute big integer field", "app_label": "gstudio"}}, {"pk": 29, "model": "contenttypes.contenttype", "fields": {"model": "attributebooleanfield", "name": "attribute boolean field", "app_label": "gstudio"}}, {"pk": 21, "model": "contenttypes.contenttype", "fields": {"model": "attributecharfield", "name": "attribute char field", "app_label": "gstudio"}}, {"pk": 24, "model": "contenttypes.contenttype", "fields": {"model": "attributecommaseparatedintegerfield", "name": "attribute comma separated integer field", "app_label": "gstudio"}}, {"pk": 31, "model": "contenttypes.contenttype", "fields": {"model": "attributedatefield", "name": "attribute date field", "app_label": "gstudio"}}, {"pk": 32, "model": "contenttypes.contenttype", "fields": {"model": "attributedatetimefield", "name": "attribute date time field", "app_label": "gstudio"}}, {"pk": 27, "model": "contenttypes.contenttype", "fields": {"model": "attributedecimalfield", "name": "attribute decimal field", "app_label": "gstudio"}}, {"pk": 34, "model": "contenttypes.contenttype", "fields": {"model": "attributeemailfield", "name": "attribute email field", "app_label": "gstudio"}}, {"pk": 35, "model": "contenttypes.contenttype", "fields": {"model": "attributefilefield", "name": "attribute file field", "app_label": "gstudio"}}, {"pk": 36, "model": "contenttypes.contenttype", "fields": {"model": "attributefilepathfield", "name": "attribute file path field", "app_label": "gstudio"}}, {"pk": 28, "model": "contenttypes.contenttype", "fields": {"model": "attributefloatfield", "name": "attribute float field", "app_label": "gstudio"}}, {"pk": 37, "model": "contenttypes.contenttype", "fields": {"model": "attributeimagefield", "name": "attribute image field", "app_label": "gstudio"}}, {"pk": 23, "model": "contenttypes.contenttype", "fields": {"model": "attributeintegerfield", "name": "attribute integer field", "app_label": "gstudio"}}, {"pk": 39, "model": "contenttypes.contenttype", "fields": {"model": "attributeipaddressfield", "name": "attribute ip address field", "app_label": "gstudio"}}, {"pk": 30, "model": "contenttypes.contenttype", "fields": {"model": "attributenullbooleanfield", "name": "attribute null boolean field", "app_label": "gstudio"}}, {"pk": 26, "model": "contenttypes.contenttype", "fields": {"model": "attributepositiveintegerfield", "name": "attribute positive integer field", "app_label": "gstudio"}}, {"pk": 42, "model": "contenttypes.contenttype", "fields": {"model": "attributespecification", "name": "attribute specification", "app_label": "gstudio"}}, {"pk": 22, "model": "contenttypes.contenttype", "fields": {"model": "attributetextfield", "name": "attribute text field", "app_label": "gstudio"}}, {"pk": 33, "model": "contenttypes.contenttype", "fields": {"model": "attributetimefield", "name": "attribute time field", "app_label": "gstudio"}}, {"pk": 18, "model": "contenttypes.contenttype", "fields": {"model": "attributetype", "name": "attribute type", "app_label": "gstudio"}}, {"pk": 38, "model": "contenttypes.contenttype", "fields": {"model": "attributeurlfield", "name": "attribute url field", "app_label": "gstudio"}}, {"pk": 50, "model": "contenttypes.contenttype", "fields": {"model": "author", "name": "author", "app_label": "gstudio"}}, {"pk": 63, "model": "contenttypes.contenttype", "fields": {"model": "cacheimage", "name": "cache image", "app_label": "graphviz"}}, {"pk": 4, "model": "contenttypes.contenttype", "fields": {"model": "comment", "name": "comment", "app_label": "comments"}}, {"pk": 5, "model": "contenttypes.contenttype", "fields": {"model": "commentflag", "name": "comment flag", "app_label": "comments"}}, {"pk": 47, "model": "contenttypes.contenttype", "fields": {"model": "complement", "name": "complement", "app_label": "gstudio"}}, {"pk": 6, "model": "contenttypes.contenttype", "fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}}, {"pk": 13, "model": "contenttypes.contenttype", "fields": {"model": "edge", "name": "edge", "app_label": "gstudio"}}, {"pk": 45, "model": "contenttypes.contenttype", "fields": {"model": "expression", "name": "expression", "app_label": "gstudio"}}, {"pk": 60, "model": "contenttypes.contenttype", "fields": {"model": "graph", "name": "graph", "app_label": "graphviz"}}, {"pk": 2, "model": "contenttypes.contenttype", "fields": {"model": "group", "name": "group", "app_label": "auth"}}, {"pk": 58, "model": "contenttypes.contenttype", "fields": {"model": "ignoredobject", "name": "ignored object", "app_label": "djangoratings"}}, {"pk": 48, "model": "contenttypes.contenttype", "fields": {"model": "intersection", "name": "intersection", "app_label": "gstudio"}}, {"pk": 54, "model": "contenttypes.contenttype", "fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}}, {"pk": 14, "model": "contenttypes.contenttype", "fields": {"model": "metatype", "name": "metatype", "app_label": "gstudio"}}, {"pk": 11, "model": "contenttypes.contenttype", "fields": {"model": "nid", "name": "nid", "app_label": "gstudio"}}, {"pk": 12, "model": "contenttypes.contenttype", "fields": {"model": "node", "name": "node", "app_label": "gstudio"}}, {"pk": 15, "model": "contenttypes.contenttype", "fields": {"model": "nodetype", "name": "node type", "app_label": "gstudio"}}, {"pk": 61, "model": "contenttypes.contenttype", "fields": {"model": "nodevisual", "name": "node visual", "app_label": "graphviz"}}, {"pk": 51, "model": "contenttypes.contenttype", "fields": {"model": "gbobject", "name": "object", "app_label": "objectapp"}}, {"pk": 16, "model": "contenttypes.contenttype", "fields": {"model": "objecttype", "name": "object type", "app_label": "gstudio"}}, {"pk": 49, "model": "contenttypes.contenttype", "fields": {"model": "peer", "name": "peer", "app_label": "gstudio"}}, {"pk": 1, "model": "contenttypes.contenttype", "fields": {"model": "permission", "name": "permission", "app_label": "auth"}}, {"pk": 52, "model": "contenttypes.contenttype", "fields": {"model": "process", "name": "process", "app_label": "objectapp"}}, {"pk": 40, "model": "contenttypes.contenttype", "fields": {"model": "processtype", "name": "process type", "app_label": "gstudio"}}, {"pk": 59, "model": "contenttypes.contenttype", "fields": {"model": "registrationprofile", "name": "registration profile", "app_label": "registration"}}, {"pk": 19, "model": "contenttypes.contenttype", "fields": {"model": "relation", "name": "relation", "app_label": "gstudio"}}, {"pk": 43, "model": "contenttypes.contenttype", "fields": {"model": "relationspecification", "name": "relation specification", "app_label": "gstudio"}}, {"pk": 17, "model": "contenttypes.contenttype", "fields": {"model": "relationtype", "name": "relation type", "app_label": "gstudio"}}, {"pk": 56, "model": "contenttypes.contenttype", "fields": {"model": "score", "name": "score", "app_label": "djangoratings"}}, {"pk": 7, "model": "contenttypes.contenttype", "fields": {"model": "session", "name": "session", "app_label": "sessions"}}, {"pk": 57, "model": "contenttypes.contenttype", "fields": {"model": "similaruser", "name": "similar user", "app_label": "djangoratings"}}, {"pk": 8, "model": "contenttypes.contenttype", "fields": {"model": "site", "name": "site", "app_label": "sites"}}, {"pk": 53, "model": "contenttypes.contenttype", "fields": {"model": "system", "name": "system", "app_label": "objectapp"}}, {"pk": 41, "model": "contenttypes.contenttype", "fields": {"model": "systemtype", "name": "system type", "app_label": "gstudio"}}, {"pk": 9, "model": "contenttypes.contenttype", "fields": {"model": "tag", "name": "tag", "app_label": "tagging"}}, {"pk": 10, "model": "contenttypes.contenttype", "fields": {"model": "taggeditem", "name": "tagged item", "app_label": "tagging"}}, {"pk": 46, "model": "contenttypes.contenttype", "fields": {"model": "union", "name": "union", "app_label": "gstudio"}}, {"pk": 3, "model": "contenttypes.contenttype", "fields": {"model": "user", "name": "user", "app_label": "auth"}}, {"pk": 55, "model": "contenttypes.contenttype", "fields": {"model": "vote", "name": "vote", "app_label": "djangoratings"}}, {"pk": "857888a9f2aaefebc4099f683932361a", "model": "sessions.session", "fields": {"expire_date": "2012-06-01T02:34:30.271", "session_data": "N2E5ODhiMTY0M2E1ZDUxNDMwYmZmYjhhNWE5ZGVhNTU2M2M1ZTQ0MTqAAn1xAShVEl9hdXRoX3Vz\nZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHED\nVQ1fYXV0aF91c2VyX2lkcQRLAXUu\n"}}, {"pk": 1, "model": "sites.site", "fields": {"domain": "example.com", "name": "example.com"}}, {"pk": 189, "model": "auth.permission", "fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 54}}, {"pk": 190, "model": "auth.permission", "fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 54}}, {"pk": 191, "model": "auth.permission", "fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 54}}, {"pk": 1, "model": "auth.permission", "fields": {"codename": "add_group", "name": "Can add group", "content_type": 2}}, {"pk": 4, "model": "auth.permission", "fields": {"codename": "change_group", "name": "Can change group", "content_type": 2}}, {"pk": 7, "model": "auth.permission", "fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 2}}, {"pk": 2, "model": "auth.permission", "fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 1}}, {"pk": 5, "model": "auth.permission", "fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 1}}, {"pk": 8, "model": "auth.permission", "fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 1}}, {"pk": 55, "model": "auth.permission", "fields": {"codename": "add_author", "name": "Can add author", "content_type": 3}}, {"pk": 3, "model": "auth.permission", "fields": {"codename": "add_user", "name": "Can add user", "content_type": 3}}, {"pk": 95, "model": "auth.permission", "fields": {"codename": "change_author", "name": "Can change author", "content_type": 3}}, {"pk": 6, "model": "auth.permission", "fields": {"codename": "change_user", "name": "Can change user", "content_type": 3}}, {"pk": 147, "model": "auth.permission", "fields": {"codename": "delete_author", "name": "Can delete author", "content_type": 3}}, {"pk": 9, "model": "auth.permission", "fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 3}}, {"pk": 10, "model": "auth.permission", "fields": {"codename": "add_comment", "name": "Can add comment", "content_type": 4}}, {"pk": 16, "model": "auth.permission", "fields": {"codename": "can_moderate", "name": "Can moderate comments", "content_type": 4}}, {"pk": 12, "model": "auth.permission", "fields": {"codename": "change_comment", "name": "Can change comment", "content_type": 4}}, {"pk": 14, "model": "auth.permission", "fields": {"codename": "delete_comment", "name": "Can delete comment", "content_type": 4}}, {"pk": 11, "model": "auth.permission", "fields": {"codename": "add_commentflag", "name": "Can add comment flag", "content_type": 5}}, {"pk": 13, "model": "auth.permission", "fields": {"codename": "change_commentflag", "name": "Can change comment flag", "content_type": 5}}, {"pk": 15, "model": "auth.permission", "fields": {"codename": "delete_commentflag", "name": "Can delete comment flag", "content_type": 5}}, {"pk": 17, "model": "auth.permission", "fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 6}}, {"pk": 18, "model": "auth.permission", "fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 6}}, {"pk": 19, "model": "auth.permission", "fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 6}}, {"pk": 192, "model": "auth.permission", "fields": {"codename": "add_ignoredobject", "name": "Can add ignored object", "content_type": 58}}, {"pk": 196, "model": "auth.permission", "fields": {"codename": "change_ignoredobject", "name": "Can change ignored object", "content_type": 58}}, {"pk": 200, "model": "auth.permission", "fields": {"codename": "delete_ignoredobject", "name": "Can delete ignored object", "content_type": 58}}, {"pk": 193, "model": "auth.permission", "fields": {"codename": "add_score", "name": "Can add score", "content_type": 56}}, {"pk": 197, "model": "auth.permission", "fields": {"codename": "change_score", "name": "Can change score", "content_type": 56}}, {"pk": 201, "model": "auth.permission", "fields": {"codename": "delete_score", "name": "Can delete score", "content_type": 56}}, {"pk": 194, "model": "auth.permission", "fields": {"codename": "add_similaruser", "name": "Can add similar user", "content_type": 57}}, {"pk": 198, "model": "auth.permission", "fields": {"codename": "change_similaruser", "name": "Can change similar user", "content_type": 57}}, {"pk": 202, "model": "auth.permission", "fields": {"codename": "delete_similaruser", "name": "Can delete similar user", "content_type": 57}}, {"pk": 195, "model": "auth.permission", "fields": {"codename": "add_vote", "name": "Can add vote", "content_type": 55}}, {"pk": 199, "model": "auth.permission", "fields": {"codename": "change_vote", "name": "Can change vote", "content_type": 55}}, {"pk": 203, "model": "auth.permission", "fields": {"codename": "delete_vote", "name": "Can delete vote", "content_type": 55}}, {"pk": 207, "model": "auth.permission", "fields": {"codename": "add_arrowvisual", "name": "Can add arrow visual", "content_type": 62}}, {"pk": 211, "model": "auth.permission", "fields": {"codename": "change_arrowvisual", "name": "Can change arrow visual", "content_type": 62}}, {"pk": 215, "model": "auth.permission", "fields": {"codename": "delete_arrowvisual", "name": "Can delete arrow visual", "content_type": 62}}, {"pk": 208, "model": "auth.permission", "fields": {"codename": "add_cacheimage", "name": "Can add cache image", "content_type": 63}}, {"pk": 212, "model": "auth.permission", "fields": {"codename": "change_cacheimage", "name": "Can change cache image", "content_type": 63}}, {"pk": 216, "model": "auth.permission", "fields": {"codename": "delete_cacheimage", "name": "Can delete cache image", "content_type": 63}}, {"pk": 209, "model": "auth.permission", "fields": {"codename": "add_graph", "name": "Can add graph", "content_type": 60}}, {"pk": 213, "model": "auth.permission", "fields": {"codename": "change_graph", "name": "Can change graph", "content_type": 60}}, {"pk": 217, "model": "auth.permission", "fields": {"codename": "delete_graph", "name": "Can delete graph", "content_type": 60}}, {"pk": 210, "model": "auth.permission", "fields": {"codename": "add_nodevisual", "name": "Can add node visual", "content_type": 61}}, {"pk": 214, "model": "auth.permission", "fields": {"codename": "change_nodevisual", "name": "Can change node visual", "content_type": 61}}, {"pk": 218, "model": "auth.permission", "fields": {"codename": "delete_nodevisual", "name": "Can delete node visual", "content_type": 61}}, {"pk": 33, "model": "auth.permission", "fields": {"codename": "add_attribute", "name": "Can add attribute", "content_type": 20}}, {"pk": 101, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 20}}, {"pk": 169, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 20}}, {"pk": 73, "model": "auth.permission", "fields": {"codename": "change_attribute", "name": "Can change attribute", "content_type": 20}}, {"pk": 125, "model": "auth.permission", "fields": {"codename": "delete_attribute", "name": "Can delete attribute", "content_type": 20}}, {"pk": 34, "model": "auth.permission", "fields": {"codename": "add_attributebigintegerfield", "name": "Can add attribute big integer field", "content_type": 25}}, {"pk": 74, "model": "auth.permission", "fields": {"codename": "change_attributebigintegerfield", "name": "Can change attribute big integer field", "content_type": 25}}, {"pk": 126, "model": "auth.permission", "fields": {"codename": "delete_attributebigintegerfield", "name": "Can delete attribute big integer field", "content_type": 25}}, {"pk": 35, "model": "auth.permission", "fields": {"codename": "add_attributebooleanfield", "name": "Can add attribute boolean field", "content_type": 29}}, {"pk": 75, "model": "auth.permission", "fields": {"codename": "change_attributebooleanfield", "name": "Can change attribute boolean field", "content_type": 29}}, {"pk": 127, "model": "auth.permission", "fields": {"codename": "delete_attributebooleanfield", "name": "Can delete attribute boolean field", "content_type": 29}}, {"pk": 36, "model": "auth.permission", "fields": {"codename": "add_attributecharfield", "name": "Can add attribute char field", "content_type": 21}}, {"pk": 76, "model": "auth.permission", "fields": {"codename": "change_attributecharfield", "name": "Can change attribute char field", "content_type": 21}}, {"pk": 128, "model": "auth.permission", "fields": {"codename": "delete_attributecharfield", "name": "Can delete attribute char field", "content_type": 21}}, {"pk": 37, "model": "auth.permission", "fields": {"codename": "add_attributecommaseparatedintegerfield", "name": "Can add attribute comma separated integer field", "content_type": 24}}, {"pk": 77, "model": "auth.permission", "fields": {"codename": "change_attributecommaseparatedintegerfield", "name": "Can change attribute comma separated integer field", "content_type": 24}}, {"pk": 129, "model": "auth.permission", "fields": {"codename": "delete_attributecommaseparatedintegerfield", "name": "Can delete attribute comma separated integer field", "content_type": 24}}, {"pk": 38, "model": "auth.permission", "fields": {"codename": "add_attributedatefield", "name": "Can add attribute date field", "content_type": 31}}, {"pk": 78, "model": "auth.permission", "fields": {"codename": "change_attributedatefield", "name": "Can change attribute date field", "content_type": 31}}, {"pk": 130, "model": "auth.permission", "fields": {"codename": "delete_attributedatefield", "name": "Can delete attribute date field", "content_type": 31}}, {"pk": 39, "model": "auth.permission", "fields": {"codename": "add_attributedatetimefield", "name": "Can add attribute date time field", "content_type": 32}}, {"pk": 79, "model": "auth.permission", "fields": {"codename": "change_attributedatetimefield", "name": "Can change attribute date time field", "content_type": 32}}, {"pk": 131, "model": "auth.permission", "fields": {"codename": "delete_attributedatetimefield", "name": "Can delete attribute date time field", "content_type": 32}}, {"pk": 40, "model": "auth.permission", "fields": {"codename": "add_attributedecimalfield", "name": "Can add attribute decimal field", "content_type": 27}}, {"pk": 80, "model": "auth.permission", "fields": {"codename": "change_attributedecimalfield", "name": "Can change attribute decimal field", "content_type": 27}}, {"pk": 132, "model": "auth.permission", "fields": {"codename": "delete_attributedecimalfield", "name": "Can delete attribute decimal field", "content_type": 27}}, {"pk": 41, "model": "auth.permission", "fields": {"codename": "add_attributeemailfield", "name": "Can add attribute email field", "content_type": 34}}, {"pk": 81, "model": "auth.permission", "fields": {"codename": "change_attributeemailfield", "name": "Can change attribute email field", "content_type": 34}}, {"pk": 133, "model": "auth.permission", "fields": {"codename": "delete_attributeemailfield", "name": "Can delete attribute email field", "content_type": 34}}, {"pk": 42, "model": "auth.permission", "fields": {"codename": "add_attributefilefield", "name": "Can add attribute file field", "content_type": 35}}, {"pk": 82, "model": "auth.permission", "fields": {"codename": "change_attributefilefield", "name": "Can change attribute file field", "content_type": 35}}, {"pk": 134, "model": "auth.permission", "fields": {"codename": "delete_attributefilefield", "name": "Can delete attribute file field", "content_type": 35}}, {"pk": 43, "model": "auth.permission", "fields": {"codename": "add_attributefilepathfield", "name": "Can add attribute file path field", "content_type": 36}}, {"pk": 83, "model": "auth.permission", "fields": {"codename": "change_attributefilepathfield", "name": "Can change attribute file path field", "content_type": 36}}, {"pk": 135, "model": "auth.permission", "fields": {"codename": "delete_attributefilepathfield", "name": "Can delete attribute file path field", "content_type": 36}}, {"pk": 44, "model": "auth.permission", "fields": {"codename": "add_attributefloatfield", "name": "Can add attribute float field", "content_type": 28}}, {"pk": 84, "model": "auth.permission", "fields": {"codename": "change_attributefloatfield", "name": "Can change attribute float field", "content_type": 28}}, {"pk": 136, "model": "auth.permission", "fields": {"codename": "delete_attributefloatfield", "name": "Can delete attribute float field", "content_type": 28}}, {"pk": 45, "model": "auth.permission", "fields": {"codename": "add_attributeimagefield", "name": "Can add attribute image field", "content_type": 37}}, {"pk": 85, "model": "auth.permission", "fields": {"codename": "change_attributeimagefield", "name": "Can change attribute image field", "content_type": 37}}, {"pk": 137, "model": "auth.permission", "fields": {"codename": "delete_attributeimagefield", "name": "Can delete attribute image field", "content_type": 37}}, {"pk": 46, "model": "auth.permission", "fields": {"codename": "add_attributeintegerfield", "name": "Can add attribute integer field", "content_type": 23}}, {"pk": 86, "model": "auth.permission", "fields": {"codename": "change_attributeintegerfield", "name": "Can change attribute integer field", "content_type": 23}}, {"pk": 138, "model": "auth.permission", "fields": {"codename": "delete_attributeintegerfield", "name": "Can delete attribute integer field", "content_type": 23}}, {"pk": 47, "model": "auth.permission", "fields": {"codename": "add_attributeipaddressfield", "name": "Can add attribute ip address field", "content_type": 39}}, {"pk": 87, "model": "auth.permission", "fields": {"codename": "change_attributeipaddressfield", "name": "Can change attribute ip address field", "content_type": 39}}, {"pk": 139, "model": "auth.permission", "fields": {"codename": "delete_attributeipaddressfield", "name": "Can delete attribute ip address field", "content_type": 39}}, {"pk": 48, "model": "auth.permission", "fields": {"codename": "add_attributenullbooleanfield", "name": "Can add attribute null boolean field", "content_type": 30}}, {"pk": 88, "model": "auth.permission", "fields": {"codename": "change_attributenullbooleanfield", "name": "Can change attribute null boolean field", "content_type": 30}}, {"pk": 140, "model": "auth.permission", "fields": {"codename": "delete_attributenullbooleanfield", "name": "Can delete attribute null boolean field", "content_type": 30}}, {"pk": 49, "model": "auth.permission", "fields": {"codename": "add_attributepositiveintegerfield", "name": "Can add attribute positive integer field", "content_type": 26}}, {"pk": 89, "model": "auth.permission", "fields": {"codename": "change_attributepositiveintegerfield", "name": "Can change attribute positive integer field", "content_type": 26}}, {"pk": 141, "model": "auth.permission", "fields": {"codename": "delete_attributepositiveintegerfield", "name": "Can delete attribute positive integer field", "content_type": 26}}, {"pk": 50, "model": "auth.permission", "fields": {"codename": "add_attributespecification", "name": "Can add attribute specification", "content_type": 42}}, {"pk": 104, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 42}}, {"pk": 172, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 42}}, {"pk": 90, "model": "auth.permission", "fields": {"codename": "change_attributespecification", "name": "Can change attribute specification", "content_type": 42}}, {"pk": 142, "model": "auth.permission", "fields": {"codename": "delete_attributespecification", "name": "Can delete attribute specification", "content_type": 42}}, {"pk": 51, "model": "auth.permission", "fields": {"codename": "add_attributetextfield", "name": "Can add attribute text field", "content_type": 22}}, {"pk": 91, "model": "auth.permission", "fields": {"codename": "change_attributetextfield", "name": "Can change attribute text field", "content_type": 22}}, {"pk": 143, "model": "auth.permission", "fields": {"codename": "delete_attributetextfield", "name": "Can delete attribute text field", "content_type": 22}}, {"pk": 52, "model": "auth.permission", "fields": {"codename": "add_attributetimefield", "name": "Can add attribute time field", "content_type": 33}}, {"pk": 92, "model": "auth.permission", "fields": {"codename": "change_attributetimefield", "name": "Can change attribute time field", "content_type": 33}}, {"pk": 144, "model": "auth.permission", "fields": {"codename": "delete_attributetimefield", "name": "Can delete attribute time field", "content_type": 33}}, {"pk": 53, "model": "auth.permission", "fields": {"codename": "add_attributetype", "name": "Can add attribute type", "content_type": 18}}, {"pk": 99, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 18}}, {"pk": 167, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 18}}, {"pk": 93, "model": "auth.permission", "fields": {"codename": "change_attributetype", "name": "Can change attribute type", "content_type": 18}}, {"pk": 145, "model": "auth.permission", "fields": {"codename": "delete_attributetype", "name": "Can delete attribute type", "content_type": 18}}, {"pk": 54, "model": "auth.permission", "fields": {"codename": "add_attributeurlfield", "name": "Can add attribute url field", "content_type": 38}}, {"pk": 94, "model": "auth.permission", "fields": {"codename": "change_attributeurlfield", "name": "Can change attribute url field", "content_type": 38}}, {"pk": 146, "model": "auth.permission", "fields": {"codename": "delete_attributeurlfield", "name": "Can delete attribute url field", "content_type": 38}}, {"pk": 56, "model": "auth.permission", "fields": {"codename": "add_complement", "name": "Can add complement", "content_type": 47}}, {"pk": 108, "model": "auth.permission", "fields": {"codename": "change_complement", "name": "Can change complement", "content_type": 47}}, {"pk": 148, "model": "auth.permission", "fields": {"codename": "delete_complement", "name": "Can delete complement", "content_type": 47}}, {"pk": 57, "model": "auth.permission", "fields": {"codename": "add_edge", "name": "Can add edge", "content_type": 13}}, {"pk": 109, "model": "auth.permission", "fields": {"codename": "change_edge", "name": "Can change edge", "content_type": 13}}, {"pk": 149, "model": "auth.permission", "fields": {"codename": "delete_edge", "name": "Can delete edge", "content_type": 13}}, {"pk": 58, "model": "auth.permission", "fields": {"codename": "add_expression", "name": "Can add expression", "content_type": 45}}, {"pk": 107, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 45}}, {"pk": 175, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 45}}, {"pk": 110, "model": "auth.permission", "fields": {"codename": "change_expression", "name": "Can change expression", "content_type": 45}}, {"pk": 150, "model": "auth.permission", "fields": {"codename": "delete_expression", "name": "Can delete expression", "content_type": 45}}, {"pk": 59, "model": "auth.permission", "fields": {"codename": "add_intersection", "name": "Can add intersection", "content_type": 48}}, {"pk": 111, "model": "auth.permission", "fields": {"codename": "change_intersection", "name": "Can change intersection", "content_type": 48}}, {"pk": 151, "model": "auth.permission", "fields": {"codename": "delete_intersection", "name": "Can delete intersection", "content_type": 48}}, {"pk": 60, "model": "auth.permission", "fields": {"codename": "add_metatype", "name": "Can add metatype", "content_type": 14}}, {"pk": 112, "model": "auth.permission", "fields": {"codename": "change_metatype", "name": "Can change metatype", "content_type": 14}}, {"pk": 152, "model": "auth.permission", "fields": {"codename": "delete_metatype", "name": "Can delete metatype", "content_type": 14}}, {"pk": 61, "model": "auth.permission", "fields": {"codename": "add_nid", "name": "Can add nid", "content_type": 11}}, {"pk": 113, "model": "auth.permission", "fields": {"codename": "change_nid", "name": "Can change nid", "content_type": 11}}, {"pk": 153, "model": "auth.permission", "fields": {"codename": "delete_nid", "name": "Can delete nid", "content_type": 11}}, {"pk": 62, "model": "auth.permission", "fields": {"codename": "add_node", "name": "Can add node", "content_type": 12}}, {"pk": 114, "model": "auth.permission", "fields": {"codename": "change_node", "name": "Can change node", "content_type": 12}}, {"pk": 154, "model": "auth.permission", "fields": {"codename": "delete_node", "name": "Can delete node", "content_type": 12}}, {"pk": 32, "model": "auth.permission", "fields": {"codename": "add_nodespecification", "name": "Can add Node specification", "content_type": 44}}, {"pk": 106, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 44}}, {"pk": 174, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 44}}, {"pk": 72, "model": "auth.permission", "fields": {"codename": "change_nodespecification", "name": "Can change Node specification", "content_type": 44}}, {"pk": 124, "model": "auth.permission", "fields": {"codename": "delete_nodespecification", "name": "Can delete Node specification", "content_type": 44}}, {"pk": 63, "model": "auth.permission", "fields": {"codename": "add_nodetype", "name": "Can add node type", "content_type": 15}}, {"pk": 96, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 15}}, {"pk": 164, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 15}}, {"pk": 115, "model": "auth.permission", "fields": {"codename": "change_nodetype", "name": "Can change node type", "content_type": 15}}, {"pk": 155, "model": "auth.permission", "fields": {"codename": "delete_nodetype", "name": "Can delete node type", "content_type": 15}}, {"pk": 64, "model": "auth.permission", "fields": {"codename": "add_objecttype", "name": "Can add object type", "content_type": 16}}, {"pk": 97, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 16}}, {"pk": 165, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 16}}, {"pk": 116, "model": "auth.permission", "fields": {"codename": "change_objecttype", "name": "Can change object type", "content_type": 16}}, {"pk": 156, "model": "auth.permission", "fields": {"codename": "delete_objecttype", "name": "Can delete object type", "content_type": 16}}, {"pk": 65, "model": "auth.permission", "fields": {"codename": "add_peer", "name": "Can add peer", "content_type": 49}}, {"pk": 117, "model": "auth.permission", "fields": {"codename": "change_peer", "name": "Can change peer", "content_type": 49}}, {"pk": 157, "model": "auth.permission", "fields": {"codename": "delete_peer", "name": "Can delete peer", "content_type": 49}}, {"pk": 66, "model": "auth.permission", "fields": {"codename": "add_processtype", "name": "Can add process type", "content_type": 40}}, {"pk": 102, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 40}}, {"pk": 170, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 40}}, {"pk": 118, "model": "auth.permission", "fields": {"codename": "change_processtype", "name": "Can change process type", "content_type": 40}}, {"pk": 158, "model": "auth.permission", "fields": {"codename": "delete_processtype", "name": "Can delete process type", "content_type": 40}}, {"pk": 67, "model": "auth.permission", "fields": {"codename": "add_relation", "name": "Can add relation", "content_type": 19}}, {"pk": 100, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 19}}, {"pk": 168, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 19}}, {"pk": 119, "model": "auth.permission", "fields": {"codename": "change_relation", "name": "Can change relation", "content_type": 19}}, {"pk": 159, "model": "auth.permission", "fields": {"codename": "delete_relation", "name": "Can delete relation", "content_type": 19}}, {"pk": 68, "model": "auth.permission", "fields": {"codename": "add_relationspecification", "name": "Can add relation specification", "content_type": 43}}, {"pk": 105, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 43}}, {"pk": 173, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 43}}, {"pk": 120, "model": "auth.permission", "fields": {"codename": "change_relationspecification", "name": "Can change relation specification", "content_type": 43}}, {"pk": 160, "model": "auth.permission", "fields": {"codename": "delete_relationspecification", "name": "Can delete relation specification", "content_type": 43}}, {"pk": 69, "model": "auth.permission", "fields": {"codename": "add_relationtype", "name": "Can add relation type", "content_type": 17}}, {"pk": 98, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 17}}, {"pk": 166, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 17}}, {"pk": 121, "model": "auth.permission", "fields": {"codename": "change_relationtype", "name": "Can change relation type", "content_type": 17}}, {"pk": 161, "model": "auth.permission", "fields": {"codename": "delete_relationtype", "name": "Can delete relation type", "content_type": 17}}, {"pk": 70, "model": "auth.permission", "fields": {"codename": "add_systemtype", "name": "Can add system type", "content_type": 41}}, {"pk": 103, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 41}}, {"pk": 171, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 41}}, {"pk": 122, "model": "auth.permission", "fields": {"codename": "change_systemtype", "name": "Can change system type", "content_type": 41}}, {"pk": 162, "model": "auth.permission", "fields": {"codename": "delete_systemtype", "name": "Can delete system type", "content_type": 41}}, {"pk": 71, "model": "auth.permission", "fields": {"codename": "add_union", "name": "Can add union", "content_type": 46}}, {"pk": 123, "model": "auth.permission", "fields": {"codename": "change_union", "name": "Can change union", "content_type": 46}}, {"pk": 163, "model": "auth.permission", "fields": {"codename": "delete_union", "name": "Can delete union", "content_type": 46}}, {"pk": 176, "model": "auth.permission", "fields": {"codename": "add_gbobject", "name": "Can add object", "content_type": 51}}, {"pk": 179, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 51}}, {"pk": 187, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 51}}, {"pk": 181, "model": "auth.permission", "fields": {"codename": "change_gbobject", "name": "Can change object", "content_type": 51}}, {"pk": 184, "model": "auth.permission", "fields": {"codename": "delete_gbobject", "name": "Can delete object", "content_type": 51}}, {"pk": 177, "model": "auth.permission", "fields": {"codename": "add_process", "name": "Can add process", "content_type": 52}}, {"pk": 180, "model": "auth.permission", "fields": {"codename": "can_change_author", "name": "Can change author", "content_type": 52}}, {"pk": 188, "model": "auth.permission", "fields": {"codename": "can_view_all", "name": "Can view all", "content_type": 52}}, {"pk": 182, "model": "auth.permission", "fields": {"codename": "change_process", "name": "Can change process", "content_type": 52}}, {"pk": 185, "model": "auth.permission", "fields": {"codename": "delete_process", "name": "Can delete process", "content_type": 52}}, {"pk": 178, "model": "auth.permission", "fields": {"codename": "add_system", "name": "Can add system", "content_type": 53}}, {"pk": 183, "model": "auth.permission", "fields": {"codename": "change_system", "name": "Can change system", "content_type": 53}}, {"pk": 186, "model": "auth.permission", "fields": {"codename": "delete_system", "name": "Can delete system", "content_type": 53}}, {"pk": 204, "model": "auth.permission", "fields": {"codename": "add_registrationprofile", "name": "Can add registration profile", "content_type": 59}}, {"pk": 205, "model": "auth.permission", "fields": {"codename": "change_registrationprofile", "name": "Can change registration profile", "content_type": 59}}, {"pk": 206, "model": "auth.permission", "fields": {"codename": "delete_registrationprofile", "name": "Can delete registration profile", "content_type": 59}}, {"pk": 20, "model": "auth.permission", "fields": {"codename": "add_session", "name": "Can add session", "content_type": 7}}, {"pk": 21, "model": "auth.permission", "fields": {"codename": "change_session", "name": "Can change session", "content_type": 7}}, {"pk": 22, "model": "auth.permission", "fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 7}}, {"pk": 23, "model": "auth.permission", "fields": {"codename": "add_site", "name": "Can add site", "content_type": 8}}, {"pk": 24, "model": "auth.permission", "fields": {"codename": "change_site", "name": "Can change site", "content_type": 8}}, {"pk": 25, "model": "auth.permission", "fields": {"codename": "delete_site", "name": "Can delete site", "content_type": 8}}, {"pk": 26, "model": "auth.permission", "fields": {"codename": "add_tag", "name": "Can add tag", "content_type": 9}}, {"pk": 28, "model": "auth.permission", "fields": {"codename": "change_tag", "name": "Can change tag", "content_type": 9}}, {"pk": 30, "model": "auth.permission", "fields": {"codename": "delete_tag", "name": "Can delete tag", "content_type": 9}}, {"pk": 27, "model": "auth.permission", "fields": {"codename": "add_taggeditem", "name": "Can add tagged item", "content_type": 10}}, {"pk": 29, "model": "auth.permission", "fields": {"codename": "change_taggeditem", "name": "Can change tagged item", "content_type": 10}}, {"pk": 31, "model": "auth.permission", "fields": {"codename": "delete_taggeditem", "name": "Can delete tagged item", "content_type": 10}}, {"pk": 1, "model": "auth.group", "fields": {"name": "non_admin_user", "permissions": [33, 101, 169, 73, 125, 34, 74, 126, 35, 75, 127, 36, 76, 128, 37, 77, 129, 38, 78, 130, 39, 79, 131, 40, 80, 132, 41, 81, 133, 42, 82, 134, 43, 83, 135, 44, 84, 136, 45, 85, 137, 46, 86, 138, 47, 87, 139, 48, 88, 140, 49, 89, 141, 50, 104, 172, 90, 142, 51, 91, 143, 52, 92, 144, 53, 99, 167, 93, 145, 54, 94, 146, 56, 108, 148, 57, 109, 149, 58, 107, 175, 110, 150, 59, 111, 151, 60, 112, 152, 61, 113, 153, 62, 114, 154, 32, 106, 174, 72, 124, 63, 96, 164, 115, 155, 64, 97, 165, 116, 156, 65, 117, 157, 66, 102, 170, 118, 158, 67, 100, 168, 119, 159, 68, 105, 173, 120, 160, 69, 98, 166, 121, 161, 70, 103, 171, 122, 162, 71, 123, 163, 176, 179, 187, 181, 184, 177, 180, 188, 182, 185, 178, 183, 186]}}, {"pk": 1, "model": "auth.user", "fields": {"username": "kabir", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2012-05-18T02:34:30.168", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$10000$50O8oHOKIzTG$Q2ynJ/LFgWEPoueQhZSy97hDJ00eA+fbgzToDol+3U8=", "email": "kabir@gnowledge.org", "date_joined": "2012-05-18T02:33:16.103"}}, {"pk": 1, "model": "admin.logentry", "fields": {"action_flag": 1, "action_time": "2012-05-18T02:36:12.860", "object_repr": "non_admin_user", "object_id": "1", "change_message": "", "user": 1, "content_type": 2}}]
\ No newline at end of file diff --git a/demo/urls.py b/demo/urls.py index ee0bd7f8..ac101e78 100644 --- a/demo/urls.py +++ b/demo/urls.py @@ -92,7 +92,8 @@ urlpatterns = patterns( url(r'^nodetypes/', include('gstudio.urls')), url(r'^objects/', include('objectapp.urls')), url(r'^comments/', include('django.contrib.comments.urls')), - url(r'^xmlrpc/$', 'django_xmlrpc.views.handle_xmlrpc'), + #URL for XMLRPC + url(r'^xmlrpc/$', 'gstudio.xmlrpc.views.handle_xmlrpc'), url(r'^i18n/', include('django.conf.urls.i18n')), url(r'^admin/doc/', include('django.contrib.admindocs.urls')), url(r'^admin/gstudio/', include('gstudio.urls.ajaxurls')), diff --git a/gstudio/models.py b/gstudio/models.py index 57121947..6dc7983a 100644 --- a/gstudio/models.py +++ b/gstudio/models.py @@ -1884,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/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 Binary files differnew file mode 100644 index 00000000..06035ed2 --- /dev/null +++ b/gstudio/xmlrpc/rpc/locale/fr/LC_MESSAGES/django.mo 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() diff --git a/majorproj/gnowsys-studio/gstudio/templates/gstudio/base.html b/majorproj/gnowsys-studio/gstudio/templates/gstudio/base.html new file mode 100644 index 00000000..db8b28bb --- /dev/null +++ b/majorproj/gnowsys-studio/gstudio/templates/gstudio/base.html @@ -0,0 +1,110 @@ +{% extends "gstudio/skeleton.html" %} +{% load gstudio_tags i18n %} +{% load objectapp_tags i18n %} + + {% block meta %} + <meta name="generator" content="Objectapp {{ OBJECTAPP_VERSION }}" /> +{% endblock %} + +{% block link %} + <link rel="index" href="{% url objectapp_gbobject_archive_index %}" /> + <link rel="EditURI" type="application/rsd+xml" href="{% url objectapp_rsd %}" /> + <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="{% url objectapp_wlwmanifest %}" /> + <link rel="search" type="application/opensearchdescription+xml" title="Objectapp's Blog" href="{% url objectapp_opensearch %}" /> + <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of latest gbobjects" %}" href="{% url objectapp_gbobject_latest_feed %}" /> + <!-- {% get_archives_gbobjects "objectapp/tags/archives_gbobjects_link.html" %} --> +{% endblock %} + +{% block breadcrumbs %} + {% gstudio_breadcrumbs %} +{% endblock %} + +{% block sidebar %} + <img src="{{ STATIC_URL }}objectapp/img/rss.png" alt="?" width="20" height="" /> + <a href="{% url gstudio_nodetype_latest_feed %}" class="feeds"><h4>Rssfeed</h4></a> + +<div class="search"> + <h3>{% trans "Search" %}</h3> + <form method="get" id="searchform" action="{% url nodes_search %}"> + <p> + <input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''" /> + <input type="submit" class="submitbutton" value="OK" /> + <a title="{% trans 'You can use - to exclude words or phrases, "double quotes" for exact phrases and the AND/OR boolean operators combined with parenthesis for complex searchs.' %}"> + <img src="{{ STATIC_URL }}objectapp/img/help.png" alt="?" width="14" height="14" /> + </a> + </p> + </form> +</div> +<!-- +<div class="objecttypes"> + <h3>{% trans "Objecttypes" %}</h3> + {% get_objecttypes %} +</div> +--> +<div class="authors"> + <h3>{% trans "Authors" %}</h3> + {% get_authors %} +</div> +<div class="calendar"> + <h3>{% trans "Calendar" %}</h3> + {% get_calendar_gbobjects %} +</div> +<div class="tags"> + <h3>{% trans "Tags" %}</h3> + {% get_tag_cloud %} +</div> +<div class="recents"> + <h3>{% trans "Recent gbobjects" %}</h3> + {% get_recent_gbobjects 5 %} +</div> +<div class="comments"> + <h3>{% trans "Recent comments" %}</h3> + {% get_recent_comments 5 %} +</div> +<div class="linkbacks"> + <h3>{% trans "Recent linkbacks" %}</h3> + {% get_recent_linkbacks 5 %} +</div> +<div class="randoms"> + <h3>{% trans "Random gbobjects" %}</h3> + {% get_random_gbobjects 5 %} +</div> +<div class="populars"> + <h3>{% trans "Popular gbobjects" %}</h3> + {% get_popular_gbobjects 5 %} +</div> +<div class="archives"> + <h3>{% trans "Archives" %}</h3> + {% get_archives_gbobjects_tree %} +</div> +{% if user.is_authenticated %} +<div class="tools"> + <h3>{% trans "Tools" %}</h3> + <ul> + {% if perms.objectapp %} + <li> + <a href="{% url admin:app_list "objectapp" %}" title="{% trans "Dashboard" %}"> + {% trans "Dashboard" %} + </a> + </li> + {% endif %} + {% if perms.objectapp.add_gbobject %} + <li> + <a href="{% url admin:objectapp_gbobject_add %}" title="{% trans "Post an gbobject" %}"> + {% trans "Post an gbobject" %} + </a> + </li> + {% endif %} + {% block admin_tools %} + {% endblock %} + <li> + <a href="{% url admin:logout %}" title="{% trans "Log out" %}"> + {% trans "Log out" %} + </a> + </li> + </ul> +</div> +{% endif %} +{% endblock %} + + @@ -96,6 +96,7 @@ setup(name='django-gstudio', include_package_data=True, zip_safe=False, install_requires=['BeautifulSoup>=3.2.0', + 'django>=1.4', 'django-mptt>=0.4.2', 'django-tagging>=0.3.1', 'django-xmlrpc>=0.1.3', @@ -105,6 +106,6 @@ setup(name='django-gstudio', 'django-ratings>=0.3.6', 'rdflib>=3.0.0', 'django-registration>=0.8', - - + 'PIL>=1.1.7', + 'diff-match-patch>=20120106', ]) |