diff options
27 files changed, 2036 insertions, 259 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 0000000..35eee68 --- /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 ee0bd7f..ac101e7 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/fstore_rdf_import.py b/gstudio/fstore_rdf_import.py new file mode 100644 index 0000000..ea48548 --- /dev/null +++ b/gstudio/fstore_rdf_import.py @@ -0,0 +1,187 @@ + +import rdflib +from rdflib.graph import ConjunctiveGraph as Graph +from rdflib import plugin +from rdflib.store import Store, NO_STORE, VALID_STORE +from rdflib.namespace import Namespace +from rdflib.term import Literal +from rdflib.term import URIRef +from tempfile import mkdtemp +from gstudio.models import * +from objectapp.models import * +import settings +import os.path + +from pprint import pprint + +import subprocess +from HTTP4Store import HTTP4Store + + +def rdf_all(notation='xml'): + """ + Funtion takes title of node, and rdf notation. + """ + valid_formats = ["xml", "n3", "ntriples", "trix"] + default_graph_uri = "http://gstudio.gnowledge.org/rdfstore" + + configString = "/var/tmp/rdfstore" + + # Get the IOMemory plugin. + store = plugin.get('IOMemory', Store)('rdfstore') + + + + # Open previously created store, or create it if it doesn't exist yet + graph = Graph(store="IOMemory", + identifier = URIRef(default_graph_uri)) + path = mkdtemp() + rt = graph.open(path, create=False) + if rt == NO_STORE: + + graph.open(path, create=True) + else: + assert rt == VALID_STORE, "The underlying store is corrupt" + + + # Now we'll add some triples to the graph & commit the changes + + graph.bind("gstudio", "http://gnowledge.org/") + exclusion_fields = ["id", "rght", "node_ptr_id", "image", "lft", "_state", "_altnames_cache", "_tags_cache", "nid_ptr_id", "_mptt_cached_fields"] + + for node in NID.objects.all(): + node_dict=node.ref.__dict__ + node_type = node.reftype + try: + + if (node_type=='Gbobject'): + node=Gbobject.objects.get(title=node) + + elif (node_type=='None'): + node=Gbobject.objects.get(title=node) + + elif (node_type=='Processes'): + node=Gbobject.objects.get(title=node) + + elif (node_type=='System'): + node=Gbobject.objects.get(title=node) + + elif (node_type=='Objecttype'): + node=Objecttype.objects.get(title=node) + + elif (node_type=='Attributetype'): + node=Attributetype.objects.get(title=node) + + elif (node_type=='Complement'): + node=Complement.objects.get(title=node) + + elif (node_type=='Union'): + node=Union.objects.get(title=node) + + elif (node_type=='Intersection'): + node=Intersection.objects.get(title=node) + + elif (node_type=='Expression'): + node=Expression.objects.get(title=node) + + elif (node_type=='Processtype'): + node=Processtype.objects.get(title=node) + + elif (node_type=='Systemtype'): + node=Systemtype.objects.get(title=node) + + elif (node_type=='AttributeSpecification'): + node=AttributeSpecification.objects.get(title=node) + + elif (node_type=='RelationSpecification'): + node=RelationSpecification.objects.get(title=node) + rdflib=link(node) + url_addr=link1(node) + fstore_dump(url_addr) + if(node_type=='Attribute'): + node=Attribute.objects.get(title=node) + rdflib = Namespace('http://sbox.gnowledge.org/gstudio/') + + elif(node_type=='Relationtype' ): + node=Relationtype.objects.get(title=node) + rdflib = Namespace('http://sbox.gnowledge.org/gstudio/') + + elif(node_type=='Metatype'): + node=Metatype.objects.get(title=node) + rdflib = Namespace('http://sbox.gnowledge.org/gstudio/') + url_addr='http://sbox.gnowledge.org/gstudio/' + fstore_dump(url_addr) + except: + if(node_type=='Attribute'): + rdflib= Namespace('http://sbox.gnowledge.org/gstudio/') + + if(node_type=='Relationtype' ): + rdflib= Namespace('http://sbox.gnowledge.org/gstudio/') + + if(node_type=='Metatype'): + rdflib= Namespace('http://sbox.gnowledge.org/gstudio/') + + + subject=str(node_dict['id']) + for key in node_dict: + if key not in exclusion_fields: + predicate=str(key) + pobject=str(node_dict[predicate]) + graph.add((rdflib[subject], rdflib[predicate], Literal(pobject))) + + rdf_code=graph.serialize(format=notation) + #path to store the rdf in a file + + #x = os.path.join(os.path.dirname(__file__), 'rdffiles.rdf') + + graph.commit() + graph.close() + + + +#provides the url address of particular node. +def link(node): + node_url=node.get_absolute_url() + site_addr= node.sites.all() + a=site_addr[0] + host_name=a.name + + link='http://' + #Concatenating the above variables will give the url address. + + url_addr=link+host_name+node_url + rdflib=Namespace(url_addr) + return rdflib + +def link1(node): + node_url=node.get_absolute_url() + site_addr= node.sites.all() + a=site_addr[0] + host_name=a.name + + link='http://' + #Concatenating the above variables will give the url address. + + url_addr=link+host_name+node_url + + return url_addr + +def fstore_dump(url_addr): + + store = HTTP4Store('http://localhost:8067') + status = store.status() + response = store.add_from_uri('http://example.com/nodetypes/2012/05/25/mouse/') + return response + + + + + + + + + + + + + diff --git a/gstudio/models.py b/gstudio/models.py index 995ecaf..6dc7983 100644 --- a/gstudio/models.py +++ b/gstudio/models.py @@ -893,8 +893,7 @@ class Nodetype(Node): def get_graph_json(self): - # predicate_id={"plural":"a1","altnames":"a2","contains_members":"a3","contains_subtypes":"a4","prior_nodes":"a5", "posterior_nodes":"a6"} - g_json = {} + g_json = {} g_json["node_metadata"]= [] g_json["relations"]=[] @@ -903,72 +902,57 @@ class Nodetype(Node): global attr_counter nbh = self.get_nbh predicate_id = {} - + for key in nbh.keys(): val = str(counter) + "a" predicate_id[key] = val - counter = counter + 1 - #print predicate_id + counter = counter + 1 - - - this_node = {"_id":str(self.id),"title":self.title,"screen_name":self.title, "url":self.get_absolute_url(),"expanded":"true"} + this_node = {"_id":str(self.id),"title":self.title,"screen_name":self.title, "url":self.get_absolute_url(),"refType":self.reftype} g_json["node_metadata"].append(this_node) for key in predicate_id.keys(): if nbh[key]: try: - #g_json[str(key)]=[] - #g_json["relations"].append(key) - g_json["node_metadata"].append({"_id":str(predicate_id[key]),"screen_name":key}) - - #g_json[str(key)].append({"from":self.id , "to":predicate_id[key],"value":1, "level":1 }) - g_json["relations"].append({"from":self.id ,"type":str(key),"value":1,"to":predicate_id[key] }) if not isinstance(nbh[key],basestring): - for item in nbh[key]: - if item.reftype!="Relation": - # create nodes + + for item in nbh[key]: + if item.reftype=="Relationtype": + if item.left_subjecttype.id==self.id: + flag=1 + elif item.right_subjecttype.id==self.id: + flag=0 + # create nodes - g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title,"title":self.title, "url":item.get_absolute_url(),"expanded":"false"}) - + g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title,"title":self.title, "url":item.get_absolute_url(),"refType":item.reftype,"inverse":item.inverse,"flag":flag}) - # g_json[str(key)].append({"from":predicate_id[key] , "to":item.id ,"value":1 }) + + g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title,"title":self.title, "url":item.get_absolute_url(),"refType":item.reftype}) #create links - g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item.id }) - - else: - - if item.left_subject.id==self.id: - item1=item.right_subject - elif item.right_subject.id==self.id: - item1=item.left_subject - - g_json["node_metadata"].append({"_id":str(item1.id),"screen_name":item1.title,"title":self.title, "url":item1.get_absolute_url(),"expanded":"false"}) - - # g_json[str(key)].append({"from":predicate_id[key] , "to":item.id ,"value":1 }) - #create links - g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item1.id }) - + g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item.id }) + + else: - #value={nbh["plural"]:"a4",nbh["altnames"]:"a5"} - #this_node[str(key)]=nbh[key] key, nbh[key] - #for item in value.keys(): + g_json["node_metadata"].append({"_id":(str(attr_counter)+"a"),"screen_name":nbh[key]}) - #g_json[str(key)].append({"from":predicate_id[key] , "to":attr_counter ,"value":1, "level":2 }) - g_json["relations"].append({"from":predicate_id[key] ,"type":str(key) ,"value":1,"to":(str(attr_counter)+"a")}) + g_json["relations"].append({"from":predicate_id[key] ,"type":str(key) ,"value":1,"to":(str(attr_counter)+"a")}) attr_counter-=1 except: pass - #print g_json + - return json.dumps(g_json) - + + return json.dumps(g_json) + + + + @property def get_possible_attributes(self): """ @@ -1900,7 +1884,6 @@ class Relationtype(Nodetype): nbh['plural'] = self.plural nbh['contains_subtypes'] = Nodetype.objects.filter(parent=self.id) - # get all the objects inheriting this OT nbh['contains_members'] = self.member_objects.all() nbh['prior_nodes'] = self.prior_nodes.all() nbh['posterior_nodes'] = self.posterior_nodes.all() diff --git a/gstudio/templates/gstudio/skeleton.html b/gstudio/templates/gstudio/skeleton.html index ad6cf4a..6991304 100644 --- a/gstudio/templates/gstudio/skeleton.html +++ b/gstudio/templates/gstudio/skeleton.html @@ -178,8 +178,8 @@ function init(a,b) { + - nodes_by_id = _.reduce(a, function(acc, n) { acc[n._id] = n; return acc; @@ -198,11 +198,14 @@ function init(a,b) return nodes_by_id[e.from] && nodes_by_id[e.to]&& e.type!="title" && e.type!="content" }).value(); - + } $(function fgraph() { - +neighbour_node= new Array(); +clicked_node=new Array(); +prev_node=new Array(); +neighbour_node= neighbour_node.concat({{object.id}}); $.getJSON('/nodetypes/graphs/graph_json/' + {{object.id}}, function (json1) { metadata=json1.node_metadata; @@ -338,29 +341,128 @@ function load(key) .attr("fill", "#6D6666"); - -$(window).bind('keydown',function(event){ - if(17==event.keyCode){ - new_g.on("click",function(d){ - if(d._id>0 && d.expanded=="false") - { - d3.select("#amazingViz").remove(); - d.expanded="true"; - $.getJSON('/nodetypes/graphs/graph_json/' + d._id , function (json2) { - new_metadata=json2.node_metadata; - new_relations=json2.relations; - new_relnset=json2.relset - metadata=_.union(new_metadata,metadata); - relations=_.union(new_relations,relations); - init(metadata,relations); - load(d._id) - }) +$(window).bind('keydown',function(event) { + if(event.keyCode==17){ + + new_g.on("click",function(d){ + + + + + if(d._id>0 && d.expanded=="true" && d._id!= {{object.id}}) + { + + $.getJSON('/nodetypes/graphs/graph_json/' + d._id , function (json2) { + new_metadata=json2.node_metadata; + + }); + + _.filter(new_metadata, function(e){if(e._id>0) + { + clicked_node=clicked_node.concat(e._id) ; + } + }); + + + index = _.indexOf(neighbour_node , d._id); + prev_node=neighbour_node.slice(0,index); + + neighbour_node = _.difference(neighbour_node,clicked_node) ; + + neighbour_node= neighbour_node.concat(prev_node); + neighbour_node = _.uniq(neighbour_node); + metadata=[] + relations=[] + metadata1=[] + relations1=[] + for(i=0;i<(neighbour_node.length);i++) + { + + d3.select("#amazingViz").remove(); + g=neighbour_node[i] + + + + $.ajax({ + async:false, + url:'/nodetypes/graphs/graph_json/' + g , + datatype:'json', + success:function (json2) { + new_metadata=json2.node_metadata; + new_relations=json2.relations; + metadata=_.union(new_metadata,metadata); + + relations=_.union(new_relations,relations); + relations= check_Relationtype(metadata,relations); + }}); + } - - }); + _.each(metadata, function(m){ + + for(i=0;i<neighbour_node.length;i++) + { + if(m._id==neighbour_node[i]) + {m.expanded="true";} + else + {m.expanded="false";} + } + + + }); + + init(metadata,relations); + load({{object.id}}) ; -} + + + } + + + + + else if(d._id>0 && d._id!= {{object.id}}) + { + + neighbour_node =neighbour_node.concat(d._id); + + d3.select("#amazingViz").remove(); + + $.ajax({ + async:false, + url:'/nodetypes/graphs/graph_json/' + d._id , + datatype:'json', + success:function (json2) { + + new_metadata=json2.node_metadata; + new_relations=json2.relations; + + metadata=_.union(new_metadata,metadata); + relations=_.union(new_relations,relations); + relations= check_Relationtype(metadata,relations); + _.each(metadata, function(m){ + + for(i=0;i<neighbour_node.length;i++) + { + if(m._id==neighbour_node[i]) + m.expanded="true"; + } + }); + + + }}); + console.log(metadata); + init(metadata,relations); + load({{object.id}}); + + + + + } }); +} + +}); + @@ -370,15 +472,7 @@ $(window).bind('keydown',function(event){ }); - /*new_g.append("svg:ellipse") - .attr("cx", function(d) { return d.x - w/2.0 +15; }) - .attr("cy", function(d) { return d.y - h/2.0 +15 ; }) - .call(force.drag) - .attr("rx", function(d) { return ((d.screen_name).length) +10 }) - .attr("ry", function(d) { if (d._id==key) return 8; else if (isNaN(d._id) || (d._id)<0) return 1; else return 7 }); - //.style("fill", function color(d) { if (d._id==key) return "red"; else if (isNaN(d._id) || (d._id)<0) return "white" ; else return "green"});*/ - - + @@ -389,8 +483,7 @@ $(window).bind('keydown',function(event){ .attr("dy", ".35em") .attr("text-anchor","middle") - // .attr("style",function text(d) { if ((d._id)>0) return "font-size:9.00pt;fill:blue;" ; else return "font-size:9.00pt;fill:black;"}) - + .text(function(d) { return d.screen_name; }); @@ -423,7 +516,7 @@ $(window).bind('keydown',function(event){ .style("fill-opacity", ".2") .style("stroke", "#666") .style("stroke-width", "1.5px") - .style("fill", function color(d) {var e=(d._id).charAt(0); if (d.expanded=="true") return "red"; else return "none"}); + .style("fill", function(d) {if ((d.expanded=="true" && d.refType=="Objecttype") ||(d._id=={{object.id}}) ) return "blue"; else if(d.expanded=="true" && d.refType=="Gbobject") return "red"; else return "none"}); @@ -462,9 +555,38 @@ $(window).bind('keydown',function(event){ } +function check_Relationtype(metadata,relations) +{ + + + _.each(metadata,function(d){ + if (d.refType=="Relationtype") + { + a=d.inverse; + if (d.flag==1) + { + relations= _.reject(relations,function(e) + { + return e.type==a + }); + } + else if (d.flag==0) + { + relations= _.reject(relations,function(e) + { + return e.type==d.screen_name + }); + } + } + + }); +return relations; + + +} + }); -//fgraph({{object.id}}); </script> diff --git a/gstudio/xmlrpc/__init__.py b/gstudio/xmlrpc/__init__.py index afb41e6..318e6d9 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 0000000..5d13fea --- /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 0000000..2829184 --- /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 5b273ea..4dd1fe1 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 0000000..7b4dcf6 --- /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 0000000..8efdc93 --- /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 0000000..2f4671b --- /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 0000000..bcf4ac0 --- /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 0000000..1d58f71 --- /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 0000000..4218a4f --- /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 0000000..f401457 --- /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 0000000..06035ed --- /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 0000000..091e086 --- /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 0000000..10b4b92 --- /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 0000000..4c9fdfc --- /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 8c66b38..1edfa37 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 0000000..0bcd4f0 --- /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 0000000..db8b28b --- /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 %} + + diff --git a/objectapp/models.py b/objectapp/models.py index 0d96dc5..495ac82 100644 --- a/objectapp/models.py +++ b/objectapp/models.py @@ -450,11 +450,11 @@ class Gbobject(Node): def get_graph_json(self): - # predicate_id={"plural":"a1","altnames":"a2","contains_members":"a3","contains_subtypes":"a4","prior_nodes":"a5", "posterior_nodes":"a6"} + g_json = {} g_json["node_metadata"]= [] g_json["relations"]=[] - g_json["relset"]=[] + global counter global attr_counter @@ -469,52 +469,57 @@ class Gbobject(Node): - this_node = {"_id":str(self.id),"title":self.title,"screen_name":self.title, "url":self.get_absolute_url(),"expanded":"true"} + this_node = {"_id":str(self.id),"title":self.title,"screen_name":self.title, "url":self.get_absolute_url(),"refType":self.reftype} g_json["node_metadata"].append(this_node) - g_json["relset"].append(self.id) + for key in predicate_id.keys(): if nbh[key]: try: - #g_json[str(key)]=[] - #g_json["relations"].append(key) + g_json["node_metadata"].append({"_id":str(predicate_id[key]),"screen_name":key}) - #g_json[str(key)].append({"from":self.id , "to":predicate_id[key],"value":1, "level":1 }) + g_json["relations"].append({"from":self.id ,"type":str(key),"value":1,"to":predicate_id[key] }) + if not isinstance(nbh[key],basestring): for item in nbh[key]: - if item.reftype!="Relation": - # create nodes - - g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title,"title":self.title, "url":item.get_absolute_url(),"expanded":"false"}) - g_json["relset"].append(item.id) - # g_json[str(key)].append({"from":predicate_id[key] , "to":item.id ,"value":1 }) - #create links - g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item.id }) + if isinstance(item,unicode): + g_json["node_metadata"].append({"_id":(str(attr_counter)+"b"),"screen_name":str(item)}) + g_json["relations"].append({"from":predicate_id[key] ,"type":str(key) ,"value":1,"to":(str(attr_counter)+"b") }) + attr_counter-=1 + elif item.reftype!="Relation": + # create nodes + + g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title,"title":self.title, "url":item.get_absolute_url()}) + g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item.id }) + + + else: if item.left_subject.id==self.id: item1=item.right_subject + flag=1 + elif item.right_subject.id==self.id: item1=item.left_subject + flag=0 - g_json["node_metadata"].append({"_id":str(item1.id),"screen_name":item1.title,"title":self.title, "url":item1.get_absolute_url(),"expanded":"false"}) + + g_json["node_metadata"].append({"_id":str(item1.id),"screen_name":item1.title,"title":self.title, "url":item1.get_absolute_url(),"refType":item.reftype,"inverse":item.relationtype.inverse,"flag":flag}) - # g_json[str(key)].append({"from":predicate_id[key] , "to":item.id ,"value":1 }) - #create links + g_json["relations"].append({"from":predicate_id[key] ,"type":str(key), "value":1,"to":item1.id }) else: - #value={nbh["plural"]:"a4",nbh["altnames"]:"a5"} - #this_node[str(key)]=nbh[key] key, nbh[key] - #for item in value.keys(): - g_json["node_metadata"].append({"_id":(str(attr_counter)+"b"),"screen_name":nbh[key]}) - #g_json[str(key)].append({"from":predicate_id[key] , "to":attr_counter ,"value":1, "level":2 }) + + g_json["node_metadata"].append({"_id":(str(attr_counter)+"b"),"screen_name":nbh[key]}) g_json["relations"].append({"from":predicate_id[key] ,"type":str(key) ,"value":1,"to":(str(attr_counter)+"b") }) attr_counter-=1 - except: - pass + except EOFError: + print "Oops! That was no valid number. Try again..." + #print g_json return json.dumps(g_json) diff --git a/objectapp/templates/objectapp/skeleton.html b/objectapp/templates/objectapp/skeleton.html index d04b02f..78baf08 100644 --- a/objectapp/templates/objectapp/skeleton.html +++ b/objectapp/templates/objectapp/skeleton.html @@ -214,7 +214,10 @@ function init(a,b) } $(function fgraph() { - +neighbour_node= new Array(); +clicked_node=new Array(); +prev_node=new Array(); +neighbour_node= neighbour_node.concat({{object.id}}); $.getJSON('/nodetypes/graphs/graph_json/' + {{object.id}}, function (json1) { metadata=json1.node_metadata; @@ -350,26 +353,124 @@ var q = 110 + "%"; -$(window).bind('keydown',function(event){ - if(17==event.keyCode){ - new_g.on("click",function(d){ - if(d._id>0 && d.expanded=="false") - { - d3.select("#amazingViz").remove(); - d.expanded="true"; - $.getJSON('/nodetypes/graphs/graph_json/' + d._id , function (json2) { - new_metadata=json2.node_metadata; - new_relations=json2.relations; - metadata=_.union(new_metadata,metadata); - relations=_.union(new_relations,relations); - init(metadata,relations); - load(d._id) - }) - +$(window).bind('keydown',function(event) { + if(event.keyCode==17){ + + new_g.on("click",function(d){ + + + + + if(d._id>0 && d.expanded=="true") + { + + $.getJSON('/nodetypes/graphs/graph_json/' + d._id , function (json2) { + new_metadata=json2.node_metadata; + + }); + + _.filter(new_metadata, function(e){if(e._id>0) + { + clicked_node=clicked_node.concat(e._id) ; + } + }); + + + index = _.indexOf(neighbour_node , d._id); + prev_node=neighbour_node.slice(0,index); + + neighbour_node = _.difference(neighbour_node,clicked_node) ; + + neighbour_node= neighbour_node.concat(prev_node); + neighbour_node = _.uniq(neighbour_node); + metadata=[] + relations=[] + metadata1=[] + relations1=[] + for(i=0;i<(neighbour_node.length);i++) + { + + d3.select("#amazingViz").remove(); + g=neighbour_node[i] + + + + $.ajax({ + async:false, + url:'/nodetypes/graphs/graph_json/' + g , + datatype:'json', + success:function (json2) { + new_metadata=json2.node_metadata; + new_relations=json2.relations; + metadata=_.union(new_metadata,metadata); + + relations=_.union(new_relations,relations); + relations= check_Relation(metadata,relations); + + }}); + } - }); -} + _.each(metadata, function(m){ + + for(i=0;i<neighbour_node.length;i++) + { + if(m._id==neighbour_node[i]) + {m.expanded="true";} + else + {m.expanded="false";} + } + + + }); + + init(metadata,relations); + load({{object.id}}) ; + + + + } + + + + + else if(d._id>0) + { + + neighbour_node =neighbour_node.concat(d._id); + + d3.select("#amazingViz").remove(); + + $.getJSON('/nodetypes/graphs/graph_json/' + d._id , function (json2) { + new_metadata=json2.node_metadata; + new_relations=json2.relations; + + metadata=_.union(new_metadata,metadata); + relations=_.union(new_relations,relations); + relations= check_Relation(metadata,relations); + + _.each(metadata, function(m){ + + for(i=0;i<neighbour_node.length;i++) + { + if(m._id==neighbour_node[i]) + m.expanded="true"; + } + + + }); + + init(metadata,relations); + load({{object.id}}); + + + }); + + } }); +} + +}); + new_g.on("click", function(d) { @@ -429,7 +530,8 @@ $(window).bind('keydown',function(event){ .style("fill-opacity", ".2") .style("stroke", "#666") .style("stroke-width", "1.5px") - .style("fill", function color(d) {var e=(d._id).charAt(0); if (d.expanded=="true") return "red"; else return "none"}); + .style("fill", function color(d) {if (d.expanded=="true" && d.refType=="Objecttype") return "blue"; else if(d.expanded=="true" && d.refType=="Gbobject") return "red"; else return "none"}); + @@ -467,6 +569,35 @@ $(window).bind('keydown',function(event){ } +function check_Relation(metadata,relations) +{ + _.each(metadata,function(d){ + if (d.refType=="Relation") + { + a=d.inverse; + if (d.flag==1) + { + relations= _.reject(relations,function(e) + { + return e.type==a + }); + } + else if (d.flag==0) + { + relations= _.reject(relations,function(e) + { + return e.type==d.screen_name + }); + } + } + + }); + return relations; + + +} + + }); //fgraph({{object.id}}); @@ -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', @@ -107,7 +108,6 @@ setup(name='django-gstudio', 'django-registration>=0.8', 'django-4store>=0.3', 'HTTP4Store>=0.2', - 'html5lib>=0.95', - - + 'html5lib>=0.95', + ]) |