From c27f4ff46eafc54b5729eb5c59edf16ed05599ab Mon Sep 17 00:00:00 2001 From: Anusha Ranganathan Date: Wed, 14 Mar 2012 13:28:23 +0000 Subject: [PATCH] Merged code with dataflow downstream --- LICENCE.txt | 23 + README.txt | 117 +- debian/README | 6 + debian/changelog | 13 + debian/compat | 1 + debian/config | 37 + debian/control | 37 + debian/copyright | 42 + debian/databank.install | 12 + debian/docs | 7 + debian/postinst | 135 + debian/postrm | 8 + debian/preinst | 10 + debian/rules | 13 + debian/templates | 57 + development.ini | 51 +- docs/Databank_VM_Installation.txt | 189 +- docs/Dependencies.pdf | Bin 0 -> 46907 bytes docs/accessLogWithheaderInfo_2011_03_16.csv | Bin 51108 -> 0 bytes docs/accessLogWithheaderInfo_2011_03_16.pdf | Bin 30085 -> 0 bytes docs/apache_config/databank_development_wsgi | 6 +- docs/apache_config/databank_wsgi | 6 +- .../DOI Syntax for datasets in DataBank.docx | Bin 9599 -> 0 bytes docs/assigning_dois/DOISyntax.doc | Bin 0 -> 40448 bytes docs/assigning_dois/ImplementingDOIs.ppt | Bin 86016 -> 152064 bytes .../run1_5Fail_2Error_pyhonTestMessage.txt | 91 - .../run1_5Fail_2Error_wiresharkMessage.pcap | Bin 608039 -> 0 bytes ...un2_testDeleteEmbargo_pyhonTestMessage.txt | 39 - ...n2_testDeleteEmbargo_wiresharkMessage.pcap | Bin 13037 -> 0 bytes ...un3_testChangeEmbargo_pyhonTestMessage.txt | 39 - ...n3_testChangeEmbargo_wiresharkMessage.pcap | Bin 12807 -> 0 bytes .../run4_testFileUpdate_pyhonTestMessage.txt | 37 - .../run4_testFileUpdate_wiresharkMessage.pcap | Bin 25186 -> 0 bytes ...stGetDatasetByVersion_pyhonTestMessage.txt | 69 - ...tGetDatasetByVersion_wiresharkMessage.pcap | Bin 64664 -> 0 bytes ...estMetadataFileUpdate_pyhonTestMessage.txt | 37 - ...stMetadataFileUpdate_wiresharkMessage.pcap | Bin 11560 -> 0 bytes ...un7_testPutUpdateFile_pyhonTestMessage.txt | 43 - ...n7_testPutUpdateFile_wiresharkMessage.pcap | Bin 31172 -> 0 bytes ...8_testPutMetadataFile_pyhonTestMessage.txt | 35 - ..._testPutMetadataFile_wiresharkMessage.pcap | Bin 9595 -> 0 bytes .../run1_all_pass_pyhonTestMessage.txt | 8 - .../run1_all_pass_wiresharkMessage.pcap | Bin 687338 -> 0 bytes ...n2_testDeleteEmbargo_pythonTestMessage.txt | 25 - ...n2_testDeleteEmbargo_wiresharkMessage.pcap | Bin 12742 -> 0 bytes ...n3_testChangeEmbargo_pythonTestMessage.txt | 25 - ...n3_testChangeEmbargo_wiresharkMessage.pcap | Bin 12372 -> 0 bytes .../run4_testFileUpdate_pythonTestMessage.txt | 31 - .../run4_testFileUpdate_wiresharkMessage.pcap | Bin 27984 -> 0 bytes ...tGetDatasetByVersion_pythonTestMessage.txt | 99 - ...tGetDatasetByVersion_wiresharkMessage.pcap | Bin 121229 -> 0 bytes ...stMetadataFileUpdate_pythonTestMessage.txt | 27 - ...stMetadataFileUpdate_wiresharkMessage.pcap | Bin 18157 -> 0 bytes ...n7_testPutUpdateFile_pythonTestMessage.txt | 41 - ...n7_testPutUpdateFile_wiresharkMessage.pcap | Bin 39626 -> 0 bytes ..._testPutMetadataFile_pythonTestMessage.txt | 27 - ..._testPutMetadataFile_wiresharkMessage.pcap | Bin 14711 -> 0 bytes docs/digitalbooksMetadataWrite.py | 50 - docs/index.txt | 19 - .../LogConfigParser.py | 14 - .../getObjects.py | 86 - .../loglines.cfg | 55 - .../solrFields.py | 102 - .../solr_worker.py | 118 - .../supervisor_startup.sh | 3 - .../supervisord.conf | 29 - .../logger_articlelogger.conf | 13 - .../workers_available/logger_auditlogger.conf | 13 - .../workers_available/process_redis.conf | 14 - .../workers_available/process_solr.conf | 14 - docs/solr_config/conf/schema.xml | 114 +- docs/using_databank_api/DatabankDemo.py | 78 + docs/using_databank_api/HTTP_request.py | 24 + docs/using_databank_api/main.py | 25 +- docs/using_databank_api/multipart.py | 78 + docs/using_databank_api/multipartform.py | 90 + docs/using_databank_api/postingToDatabank.py | 89 + docs/using_zipfile_library.py | 123 - message_workers/LogConfigParser.py | 37 + .../broker.py | 29 +- message_workers/loglines.cfg | 58 + .../redisqueue.py | 46 +- message_workers/solrFields.py | 127 + message_workers/solr_worker.py | 129 + .../workers_available/worker_broker.conf | 6 +- .../workers_available/worker_solr.conf | 6 +- mod_wsgi/dispatch.wsgi | 29 +- mod_wsgi/dispatch_development.wsgi | 29 +- passwd-default | 7 +- ...ment-jenkins.ini => production-jenkins.ini | 36 +- production.ini | 41 +- rdfdatabank.egg-info/PKG-INFO | 12 +- rdfdatabank.egg-info/SOURCES.txt | 154 +- rdfdatabank.egg-info/requires.txt | 11 +- rdfdatabank/config/environment.py | 24 + rdfdatabank/config/middleware.py | 23 + rdfdatabank/config/namespaces.py | 23 + rdfdatabank/config/routing.py | 40 +- rdfdatabank/config/users-default.py | 35 +- rdfdatabank/controllers/about.py | 31 + rdfdatabank/controllers/account.py | 23 + rdfdatabank/controllers/admin.py | 37 +- rdfdatabank/controllers/api.py | 23 + rdfdatabank/controllers/datasets.py | 121 +- rdfdatabank/controllers/datasets_log.py | 1237 --------- rdfdatabank/controllers/doi.py | 23 + rdfdatabank/controllers/error.py | 71 +- rdfdatabank/controllers/home.py | 23 + rdfdatabank/controllers/items.py | 49 +- rdfdatabank/controllers/items_log.py | 330 --- rdfdatabank/controllers/keywords.py | 31 + rdfdatabank/controllers/redirect.py | 21 - rdfdatabank/controllers/search.py | 102 +- rdfdatabank/controllers/searching.py | 31 + rdfdatabank/controllers/silos.py | 23 + rdfdatabank/controllers/states.py | 23 + rdfdatabank/controllers/users.py | 25 + rdfdatabank/lib/HTTP_request.py | 23 + rdfdatabank/lib/app_globals.py | 52 +- rdfdatabank/lib/auth.py | 24 + rdfdatabank/lib/base.py | 23 + rdfdatabank/lib/broadcast.py | 23 + rdfdatabank/lib/conneg.py | 25 +- rdfdatabank/lib/doi_helper.py | 23 + rdfdatabank/lib/doi_schema.py | 24 + rdfdatabank/lib/file_unpack.py | 29 +- rdfdatabank/lib/file_unpack_log.py | 253 -- rdfdatabank/lib/helpers.py | 23 + rdfdatabank/lib/htpasswd.py | 36 +- rdfdatabank/lib/ident_md.py | 23 + rdfdatabank/lib/search_term.py | 25 + rdfdatabank/lib/short_pid.py | 2 + rdfdatabank/lib/utils.py | 124 +- rdfdatabank/public/static/js/html5.js | 4 + rdfdatabank/public/static/styles/basic.css | 1218 +++++++++ .../public/static/styles/chimpanzee.css | 52 + rdfdatabank/public/static/styles/ie.css | 41 + .../static/styles/images/blkdiamond.gif | Bin 0 -> 690 bytes .../static/{ => styles/images}/blksquare.gif | Bin .../public/static/{ => styles/images}/csv.png | Bin .../static/styles/images/delete-icon-24.png | Bin 0 -> 1338 bytes .../static/{ => styles/images}/down_arrow.png | Bin .../{ => styles/images}/down_arrow_black.png | Bin .../{ => styles/images}/down_arrow_blue.png | Bin .../static/styles/images/file-add-icon-24.png | Bin 0 -> 1444 bytes .../static/styles/images/file-new-icon-24.png | Bin 0 -> 1058 bytes .../public/static/styles/images/fminus.png | Bin 0 -> 48255 bytes .../public/static/styles/images/fplus.png | Bin 0 -> 48915 bytes .../static/styles/images/go-up-icon-24.png | Bin 0 -> 1127 bytes .../static/styles/images/help-icon-16.png | Bin 0 -> 797 bytes .../static/styles/images/help-icon-24.png | Bin 0 -> 1424 bytes .../styles/images/icons/breadcrumb-arrow.png | Bin 0 -> 165 bytes .../static/styles/images/info-icon-16.png | Bin 0 -> 773 bytes .../static/{ => styles/images}/json.png | Bin .../static/{ => styles/images}/link.png | Bin .../styles/images/page-edit-icon-24.png | Bin 0 -> 1346 bytes .../static/styles/images/state-icon-24.png | Bin 0 -> 1631 bytes .../static/styles/images/unzip-icon-24.png | Bin 0 -> 1409 bytes .../static/styles/images/unzip-icon-32.png | Bin 0 -> 1993 bytes .../static/{ => styles/images}/up_arrow.png | Bin .../{ => styles/images}/up_arrow_black.png | Bin .../{ => styles/images}/up_arrow_blue.png | Bin rdfdatabank/public/static/styles/marmoset.css | 88 + rdfdatabank/public/static/styles/print.css | 39 + rdfdatabank/public/static/styles/reset.css | 153 ++ .../public/static/styles/silverback.css | 46 + .../public/static/styles/squirrelMonkey.css | 127 + rdfdatabank/templates/about.html | 36 + rdfdatabank/templates/admin_siloview.html | 42 +- rdfdatabank/templates/admin_user.html | 75 +- rdfdatabank/templates/admin_users.html | 40 +- rdfdatabank/templates/alter_silo.html | 46 +- rdfdatabank/templates/api.html | 30 +- rdfdatabank/templates/atom_results.html | 4 +- rdfdatabank/templates/base.html | 296 ++- rdfdatabank/templates/create_doi.html | 8 +- rdfdatabank/templates/create_new_item.html | 10 +- rdfdatabank/templates/create_new_silo.html | 33 +- rdfdatabank/templates/datasetview.html | 331 ++- .../templates/datasetview_version.html | 98 +- rdfdatabank/templates/delete_item.html | 10 +- rdfdatabank/templates/doiview.html | 86 +- rdfdatabank/templates/embargo_form.html | 64 +- rdfdatabank/templates/file_upload.html | 9 +- rdfdatabank/templates/files_unpack.html | 38 +- rdfdatabank/templates/files_unpack2.html | 24 +- rdfdatabank/templates/footer.html | 14 +- rdfdatabank/templates/header.html | 12 +- rdfdatabank/templates/home-dev.html | 53 - rdfdatabank/templates/home-prod.html | 13 - rdfdatabank/templates/home.html | 101 +- rdfdatabank/templates/item_file_upload.html | 19 +- rdfdatabank/templates/items_api.html | 320 +-- rdfdatabank/templates/itemview.html | 181 +- rdfdatabank/templates/itemview_version.html | 22 +- rdfdatabank/templates/keywords.html | 7 + rdfdatabank/templates/list_of_datasets.html | 57 +- ...list_of_datasets_without_embargo_info.html | 20 - rdfdatabank/templates/list_of_silos.html | 38 +- rdfdatabank/templates/list_of_zipfiles.html | 42 +- rdfdatabank/templates/login.html | 74 +- rdfdatabank/templates/logout.html | 28 +- rdfdatabank/templates/part_list.html | 74 +- rdfdatabank/templates/part_list_display.html | 49 +- rdfdatabank/templates/raw_search.html | 32 +- rdfdatabank/templates/rdf_manifest.html | 237 ++ rdfdatabank/templates/rdf_manifest_form.html | 21 +- rdfdatabank/templates/readme_section.html | 12 +- rdfdatabank/templates/register_new_user.html | 50 +- rdfdatabank/templates/search.html | 336 +-- rdfdatabank/templates/search_advanced.html | 306 +-- rdfdatabank/templates/search_form.html | 6 +- .../templates/search_response_display.html | 1102 ++++---- rdfdatabank/templates/searching.html | 7 + rdfdatabank/templates/silo_admin.html | 30 +- rdfdatabank/templates/silo_metadata.html | 67 +- rdfdatabank/templates/siloview.html | 30 +- rdfdatabank/templates/update_user.html | 145 +- rdfdatabank/templates/zipfilesubitemview.html | 18 +- rdfdatabank/templates/zipfileview.html | 38 +- .../tests/RDFDatabankConfig-Jenkins.py | 42 +- rdfdatabank/tests/RDFDatabankConfig.py | 33 +- rdfdatabank/tests/TestAdmin.py | 27 +- rdfdatabank/tests/TestSubmission.py | 26 +- rdfdatabank/tests/TestSubmission_load.py | 26 +- rdfdatabank/tests/TestSubmission_submitter.py | 25 +- rdfdatabank/tests/rdflib3/__init__.py | 76 - rdfdatabank/tests/rdflib3/collection.py | 258 -- rdfdatabank/tests/rdflib3/compare.py | 246 -- rdfdatabank/tests/rdflib3/events.py | 90 - rdfdatabank/tests/rdflib3/exceptions.py | 69 - rdfdatabank/tests/rdflib3/graph.py | 1323 ---------- rdfdatabank/tests/rdflib3/namespace.py | 325 --- rdfdatabank/tests/rdflib3/parser.py | 180 -- rdfdatabank/tests/rdflib3/plugin.py | 138 - rdfdatabank/tests/rdflib3/plugins/__init__.py | 7 - rdfdatabank/tests/rdflib3/plugins/memory.py | 556 ---- .../tests/rdflib3/plugins/parsers/__init__.py | 3 - .../rdflib3/plugins/parsers/notation3.py | 2290 ----------------- .../tests/rdflib3/plugins/parsers/nt.py | 27 - .../tests/rdflib3/plugins/parsers/ntriples.py | 251 -- .../rdflib3/plugins/parsers/rdfa/__init__.py | 155 -- .../plugins/parsers/rdfa/embeddedrdf.py | 34 - .../rdflib3/plugins/parsers/rdfa/literal.py | 178 -- .../rdflib3/plugins/parsers/rdfa/options.py | 171 -- .../rdflib3/plugins/parsers/rdfa/parse.py | 199 -- .../rdflib3/plugins/parsers/rdfa/state.py | 426 --- .../parsers/rdfa/transform/__init__.py | 0 .../parsers/rdfa/transform/headabout.py | 27 - .../tests/rdflib3/plugins/parsers/rdfxml.py | 573 ----- .../tests/rdflib3/plugins/parsers/trix.py | 281 -- .../rdflib3/plugins/serializers/__init__.py | 0 .../tests/rdflib3/plugins/serializers/n3.py | 122 - .../tests/rdflib3/plugins/serializers/nt.py | 48 - .../rdflib3/plugins/serializers/rdfxml.py | 271 -- .../tests/rdflib3/plugins/serializers/trix.py | 69 - .../rdflib3/plugins/serializers/turtle.py | 363 --- .../rdflib3/plugins/serializers/xmlwriter.py | 102 - .../tests/rdflib3/plugins/sleepycat.py | 505 ---- rdfdatabank/tests/rdflib3/query.py | 32 - rdfdatabank/tests/rdflib3/serializer.py | 30 - rdfdatabank/tests/rdflib3/store.py | 274 -- rdfdatabank/tests/rdflib3/t.py | 6 - rdfdatabank/tests/rdflib3/term.py | 835 ------ rdfdatabank/tests/rdflib3/util.py | 247 -- rdfdatabank/tests/testdata/rdfdatabank.zip | Bin 376392 -> 733 bytes .../tests/testdata/testrdf2/test-csv.csv | 18 +- .../tests/testdata/testrdf3/directory/1b.rdf | 2 +- .../tests/testlib/SparqlQueryTestCase.py | 27 +- rdfdatabank/tests/testlib/TestUtils.py | 22 + rdfdatabank/tests/userRolesForTesting.txt | 20 +- rdfdatabank/tools/broadcastDatasets.py | 58 + rdfdatabank/tools/indexingItemsinDatabank.py | 112 + rdfdatabank/tools/renamingSymLinks.py | 80 + rdfdatabank/websetup.py | 24 + setup.py | 2 +- test.ini | 20 + who.ini | 21 + 278 files changed, 7872 insertions(+), 16561 deletions(-) create mode 100644 LICENCE.txt create mode 100644 debian/README create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/config create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/databank.install create mode 100644 debian/docs create mode 100644 debian/postinst create mode 100644 debian/postrm create mode 100644 debian/preinst create mode 100644 debian/rules create mode 100644 debian/templates create mode 100644 docs/Dependencies.pdf delete mode 100644 docs/accessLogWithheaderInfo_2011_03_16.csv delete mode 100644 docs/accessLogWithheaderInfo_2011_03_16.pdf delete mode 100755 docs/assigning_dois/DOI Syntax for datasets in DataBank.docx create mode 100644 docs/assigning_dois/DOISyntax.doc delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run1_5Fail_2Error_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run1_5Fail_2Error_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run2_testDeleteEmbargo_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run2_testDeleteEmbargo_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run3_testChangeEmbargo_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run3_testChangeEmbargo_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run4_testFileUpdate_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run4_testFileUpdate_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run5_testGetDatasetByVersion_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run5_testGetDatasetByVersion_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run6_testMetadataFileUpdate_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run6_testMetadataFileUpdate_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run7_testPutUpdateFile_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run7_testPutUpdateFile_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run8_testPutMetadataFile_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run8_testPutMetadataFile_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run1_all_pass_pyhonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run1_all_pass_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run2_testDeleteEmbargo_pythonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run2_testDeleteEmbargo_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run3_testChangeEmbargo_pythonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run3_testChangeEmbargo_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run4_testFileUpdate_pythonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run4_testFileUpdate_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run5_testGetDatasetByVersion_pythonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run5_testGetDatasetByVersion_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run6_testMetadataFileUpdate_pythonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run6_testMetadataFileUpdate_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run7_testPutUpdateFile_pythonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run7_testPutUpdateFile_wiresharkMessage.pcap delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run8_testPutMetadataFile_pythonTestMessage.txt delete mode 100644 docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run8_testPutMetadataFile_wiresharkMessage.pcap delete mode 100644 docs/digitalbooksMetadataWrite.py delete mode 100644 docs/index.txt delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/LogConfigParser.py delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/getObjects.py delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/loglines.cfg delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/solrFields.py delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/solr_worker.py delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/supervisor_startup.sh delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/supervisord.conf delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/workers_available/logger_articlelogger.conf delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/workers_available/logger_auditlogger.conf delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/workers_available/process_redis.conf delete mode 100644 docs/indexingSolrRecordsUsingSupervisord/workers_available/process_solr.conf create mode 100644 docs/using_databank_api/DatabankDemo.py create mode 100644 docs/using_databank_api/multipart.py create mode 100644 docs/using_databank_api/multipartform.py create mode 100644 docs/using_databank_api/postingToDatabank.py delete mode 100644 docs/using_zipfile_library.py create mode 100755 message_workers/LogConfigParser.py rename {docs/indexingSolrRecordsUsingSupervisord => message_workers}/broker.py (64%) mode change 100644 => 100755 create mode 100644 message_workers/loglines.cfg rename {docs/indexingSolrRecordsUsingSupervisord => message_workers}/redisqueue.py (62%) mode change 100644 => 100755 create mode 100644 message_workers/solrFields.py create mode 100755 message_workers/solr_worker.py rename {docs/indexingSolrRecordsUsingSupervisord => message_workers}/workers_available/worker_broker.conf (55%) rename {docs/indexingSolrRecordsUsingSupervisord => message_workers}/workers_available/worker_solr.conf (53%) rename development-jenkins.ini => production-jenkins.ini (67%) create mode 100644 rdfdatabank/config/namespaces.py create mode 100644 rdfdatabank/controllers/about.py delete mode 100644 rdfdatabank/controllers/datasets_log.py delete mode 100644 rdfdatabank/controllers/items_log.py create mode 100644 rdfdatabank/controllers/keywords.py delete mode 100644 rdfdatabank/controllers/redirect.py create mode 100644 rdfdatabank/controllers/searching.py delete mode 100644 rdfdatabank/lib/file_unpack_log.py create mode 100644 rdfdatabank/public/static/js/html5.js create mode 100644 rdfdatabank/public/static/styles/basic.css create mode 100644 rdfdatabank/public/static/styles/chimpanzee.css create mode 100644 rdfdatabank/public/static/styles/ie.css create mode 100644 rdfdatabank/public/static/styles/images/blkdiamond.gif rename rdfdatabank/public/static/{ => styles/images}/blksquare.gif (100%) rename rdfdatabank/public/static/{ => styles/images}/csv.png (100%) create mode 100644 rdfdatabank/public/static/styles/images/delete-icon-24.png rename rdfdatabank/public/static/{ => styles/images}/down_arrow.png (100%) rename rdfdatabank/public/static/{ => styles/images}/down_arrow_black.png (100%) rename rdfdatabank/public/static/{ => styles/images}/down_arrow_blue.png (100%) create mode 100644 rdfdatabank/public/static/styles/images/file-add-icon-24.png create mode 100644 rdfdatabank/public/static/styles/images/file-new-icon-24.png create mode 100644 rdfdatabank/public/static/styles/images/fminus.png create mode 100644 rdfdatabank/public/static/styles/images/fplus.png create mode 100644 rdfdatabank/public/static/styles/images/go-up-icon-24.png create mode 100644 rdfdatabank/public/static/styles/images/help-icon-16.png create mode 100644 rdfdatabank/public/static/styles/images/help-icon-24.png create mode 100644 rdfdatabank/public/static/styles/images/icons/breadcrumb-arrow.png create mode 100644 rdfdatabank/public/static/styles/images/info-icon-16.png rename rdfdatabank/public/static/{ => styles/images}/json.png (100%) rename rdfdatabank/public/static/{ => styles/images}/link.png (100%) create mode 100644 rdfdatabank/public/static/styles/images/page-edit-icon-24.png create mode 100644 rdfdatabank/public/static/styles/images/state-icon-24.png create mode 100644 rdfdatabank/public/static/styles/images/unzip-icon-24.png create mode 100644 rdfdatabank/public/static/styles/images/unzip-icon-32.png rename rdfdatabank/public/static/{ => styles/images}/up_arrow.png (100%) rename rdfdatabank/public/static/{ => styles/images}/up_arrow_black.png (100%) rename rdfdatabank/public/static/{ => styles/images}/up_arrow_blue.png (100%) create mode 100644 rdfdatabank/public/static/styles/marmoset.css create mode 100644 rdfdatabank/public/static/styles/print.css create mode 100644 rdfdatabank/public/static/styles/reset.css create mode 100644 rdfdatabank/public/static/styles/silverback.css create mode 100644 rdfdatabank/public/static/styles/squirrelMonkey.css create mode 100644 rdfdatabank/templates/about.html delete mode 100644 rdfdatabank/templates/home-dev.html delete mode 100644 rdfdatabank/templates/home-prod.html create mode 100644 rdfdatabank/templates/keywords.html delete mode 100644 rdfdatabank/templates/list_of_datasets_without_embargo_info.html create mode 100644 rdfdatabank/templates/rdf_manifest.html create mode 100644 rdfdatabank/templates/searching.html delete mode 100644 rdfdatabank/tests/rdflib3/__init__.py delete mode 100644 rdfdatabank/tests/rdflib3/collection.py delete mode 100644 rdfdatabank/tests/rdflib3/compare.py delete mode 100644 rdfdatabank/tests/rdflib3/events.py delete mode 100644 rdfdatabank/tests/rdflib3/exceptions.py delete mode 100644 rdfdatabank/tests/rdflib3/graph.py delete mode 100644 rdfdatabank/tests/rdflib3/namespace.py delete mode 100644 rdfdatabank/tests/rdflib3/parser.py delete mode 100644 rdfdatabank/tests/rdflib3/plugin.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/__init__.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/memory.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/__init__.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/notation3.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/nt.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/ntriples.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfa/__init__.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfa/embeddedrdf.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfa/literal.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfa/options.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfa/parse.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfa/state.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfa/transform/__init__.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfa/transform/headabout.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/rdfxml.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/parsers/trix.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/serializers/__init__.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/serializers/n3.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/serializers/nt.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/serializers/rdfxml.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/serializers/trix.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/serializers/turtle.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/serializers/xmlwriter.py delete mode 100644 rdfdatabank/tests/rdflib3/plugins/sleepycat.py delete mode 100644 rdfdatabank/tests/rdflib3/query.py delete mode 100644 rdfdatabank/tests/rdflib3/serializer.py delete mode 100644 rdfdatabank/tests/rdflib3/store.py delete mode 100644 rdfdatabank/tests/rdflib3/t.py delete mode 100644 rdfdatabank/tests/rdflib3/term.py delete mode 100644 rdfdatabank/tests/rdflib3/util.py create mode 100644 rdfdatabank/tools/broadcastDatasets.py create mode 100644 rdfdatabank/tools/indexingItemsinDatabank.py create mode 100644 rdfdatabank/tools/renamingSymLinks.py diff --git a/LICENCE.txt b/LICENCE.txt new file mode 100644 index 0000000..54fec5d --- /dev/null +++ b/LICENCE.txt @@ -0,0 +1,23 @@ +The MIT License + +Copyright (c) 2012, University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + diff --git a/README.txt b/README.txt index 96c65d7..3db4301 100644 --- a/README.txt +++ b/README.txt @@ -8,118 +8,11 @@ RDF-enhanced storage API, pairtree-backed. Installation and dependancies ============================= -- [I would advise using virtualenv] +The dependancies are listed in the file docs/Dependancies.pdf +The installation instructions are available at docs/Databank_VM_Installation.txt -Dependancies: +For further infromation visit http://www.dataflow.ox.ac.uk/ +The project wiki is available at http://dataflow-jira.bodleian.ox.ac.uk/jira/ or +https://damssupport.ouls.ox.ac.uk/trac/databank/wiki/ -pylons==0.9.7 -pairtree==0.5.6-T -rdfobject -recordsilo -simplejson -solrpy - -redis (use the redis client that is compatible with your redis server - http://github.com/andymccurdy/redis-py/) - - -- Change the settings in development.ini to suit your uses, specifically: - -redis.host = localhost - -granary.store = silos # Directory to storage directory. Can be absolute: /var/silos -granary.uri_root = http://databank.bodleian.ox.ac.uk/objects/ # URI root - must end with /, # or : - -broadcast.to = redis -broadcast.queue = silochanges # redis 'queue' to push audit messages to (create, delete, update or embargo change) - -solr.host = http://localhost:8983/solr # Unset this to ignore solr while testing - -Setup: -====== - -Create a file 'passwd' in the root directory of the application using 'htpasswd' or similar: - -$ htpasswd -c passwd admin -[enter admin password] - -Add any users you wish to access or work with this application. - -Edit ./rdfdatabank/lib/ident_md.py - this has a variable _DATA which would best be replaced by a DB lookup or similar. For now, adjust it -to suit your users - the important thing is the 'role'. - -Start up the redis-server and confirm that you can access it. - -You should be able to start the application now (as long as the application has access to r+w to the aforementioned 'silos' directory.) - -paster serve development.ini - -Then, go to localhost:5000/admin, and try to log in as the 'admin' account. You should then be able to create and manage silos and assign write-access to them to users. - -WGSI deployment: -================ - -Copy 'development.ini' to a file called 'production.ini' and make sure debug = false and that the 'silos' directory is -owned by the web-server user (www-data for example). Recommendation is to have a separate silo directory for production use. - -Create a folder called 'egg-cache' and make sure that is writable by the web-server user too. - -Create a folder 'mod_wsgi' in the root of the application. - -Create a file within that called 'dispatch.wsgi' and put in the following: - ---------------- -# Add the virtual Python environment site-packages directory to the path - -import pkg_resources -pkg_resources.working_set.add_entry('/opt/rdfdatabank/src') # Path to application root - -# Avoid ``[Errno 13] Permission denied: '/var/www/.python-eggs'`` messages -import os -os.environ['PYTHON_EGG_CACHE'] = '/opt/rdfdatabank/src/egg-cache' # Path to writable directory for egg-cache - -# Load the Pylons application -from paste.deploy import loadapp -application = loadapp('config:/opt/rdfdatabank/src/production.ini') # Path to production.ini file - ---------------- - -In your apache2 configuration, you need an entry like: - - - ServerName foo.com - - # Logfiles - ErrorLog /opt/rdfdatabank/apachelog/error.log - CustomLog /opt/rdfdatabank/apachelog/access.log combined - - # Use only 1 Python sub-interpreter. Multiple sub-interpreters - # play badly with C extensions. - WSGIApplicationGroup %{GLOBAL} - WSGIPassAuthorization On - # Setup mod_wsgi - WSGIScriptAlias / /opt/rdfdatabank/src/mod_wsgi/dispatch.wsgi - - - Order deny,allow - Allow from all - - - - -Note the WSGIScriptAlias points to the dispatch.wsgi file. - ---------------- - -Note about permissions: -src directory and all its files and directories: - Set the owner as admin_user:www-data - Set the permission to 775 on all directories and everything under it - set the owner as www-data:www-data for src/data folder - Set the permission to 644 on all files -apachelog directory and all its files and directories: - Set the owner as admin_user:www-data - Set the persmissions 755 (currently the dir permission is set to 755 and the permission of the files within it is set to 644) -All of other directories: - Set the owner as admin_user:admin_user - Set the permission to 775 on all directories and everything under it diff --git a/debian/README b/debian/README new file mode 100644 index 0000000..433bddc --- /dev/null +++ b/debian/README @@ -0,0 +1,6 @@ +The Debian Package databank +---------------------------- + +Comments regarding the Package + + -- Anusha Ranganathan Fri, 09 Mar 2012 17:08:50 +0000 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..8e38f94 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,13 @@ +databank (0.2) unstable; urgency=low + + * Added message workers + * Databank root set to /var/lib/databank + + -- Anusha Ranganathan Fri, 09 Mar 2012 17:08:50 +0000 + + +databank (0.1) unstable; urgency=low + + * Initial Release. + + -- Anusha Ranganathan Tue, 21 Feb 2012 17:08:50 +0000 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +7 diff --git a/debian/config b/debian/config new file mode 100644 index 0000000..0bdeff2 --- /dev/null +++ b/debian/config @@ -0,0 +1,37 @@ +#!/bin/sh -e + +# Source debconf library. +. /usr/share/debconf/confmodule + +# Admin email? +db_input critical databank/email || true +db_go + +# SMTP server? +db_input high databank/smtpserver || true +db_go + +# Storgae area? +db_input high databank/store || true +db_go + +# Databank URI? +db_input critical databank/uri || true +db_go + +#Configure SOLR +db_input high databank/confsolr || true +db_go + +#Note on configuring SOLR +#db_input high databank/nosolrconf || true +#db_go + +# Password? +#db_input critical databank/password || true +#db_go + +# Note on Password +db_input critical databank/passwdnote || true +db_go + diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..44ee2a6 --- /dev/null +++ b/debian/control @@ -0,0 +1,37 @@ +Source: databank +Section: web +Priority: extra +Maintainer: Anusha Ranganathan +Build-Depends: debhelper (>= 7) +Standards-Version: 3.9.2 +Vcs-Git: git://github.com/dataflow/RDFDatabank.git +Homepage: https://github.com/dataflow/RDFDatabank +Uploaders: Anusha Ranganathan +XS-Python-Version: >= 2.6 + +Package: databank +Architecture: all +Depends: python, + python-pylons, + python-repoze.who, + python-repoze.who-friendlyform, + python-rdflib, + python-dateutil, + python-libxml2, + python-libxslt1, + python-pairtree, + python-recordsilo, + python-solrpy, + python-redis, + unzip, + apache2, + apache2-utils, + libapache2-mod-wsgi, + redis-server, + supervisor, + debconf, + openjdk-6-jre +Recommends: solr-tomcat +Description: RDF-enhanced, pairtree-backed storage API + Databank is a simple, RDF-enhanced storage API which is backed by pairtree, + for the safe storage of and access to data. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..b0264d8 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,42 @@ +This work was packaged for Debian by: + + Anusha Ranganathan on Fri, 09 Mar 2012 17:08:50 +0000 + +It was downloaded from: + + https://github.com/dataflow/RDFDatabank + +Upstream Author(s): + + Anusha Ranganathan + Ben O'Steen + +Copyright: + + Copyright (C) 2012 University of Oxford + +License: + + MIT + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +The Debian packaging is: + + Copyright (C) 2012 University of Oxford + and is licensed under the MIT License. See above. diff --git a/debian/databank.install b/debian/databank.install new file mode 100644 index 0000000..7096838 --- /dev/null +++ b/debian/databank.install @@ -0,0 +1,12 @@ +docs/apache_config/databank_wsgi /etc/default/databank/ +docs/solr_config/conf/schema.xml /etc/default/databank/ +production.ini /etc/default/databank/ +development.ini /etc/default/databank/ +MANIFEST.in /var/lib/databank/ +mod_wsgi /var/lib/databank/ +message_workers/ /var/lib/databank/ +passwd-default /var/lib/databank/ +rdfdatabank/ /var/lib/databank/ +rdfdatabank.egg-info/ /var/lib/databank +test.ini /var/lib/databank/ +who.ini /var/lib/databank/ diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..eb96eff --- /dev/null +++ b/debian/docs @@ -0,0 +1,7 @@ +LICENCE.txt +README.txt +requirements.txt +docs/assigning_dois +docs/Databank_VM_Installation.txt +docs/Dependencies.pdf +docs/using_databank_api diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 0000000..187b6b0 --- /dev/null +++ b/debian/postinst @@ -0,0 +1,135 @@ +#!/bin/sh +# postinst script for databank +# +# see: dh_installdeb(1) + +set -e + +# Source debconf library. +. /usr/share/debconf/confmodule + +# Ask questions +db_get databank/email +local dbemail="$RET" +#echo "Email id is:" $dbemail + +db_get databank/smtpserver +local dbsmtp="$RET" + +db_get databank/store +local dbstore="$RET" + +db_get databank/uri +local dburi="$RET" + +#db_get databank/password +#local dbpasswd="$RET" + +#Modify the ini files +CONFIG_FILE1=/etc/default/databank/production.ini +CONFIG_FILE2=/etc/default/databank/development.ini +#replace email +TARGET_KEY=email_to +echo "Setting email Id: " $dbemail +#Sed syntax: sed s/a/b/ or sed s,a,b, +sed -i "s/\($TARGET_KEY *= *\).*/\1$dbemail/" $CONFIG_FILE1 +sed -i "s/\($TARGET_KEY *= *\).*/\1$dbemail/" $CONFIG_FILE2 +#replace smtp server +echo "Setting SMTP Server: " $dbsmtp +TARGET_KEY=smtp_server +sed -i "s,\($TARGET_KEY *= *\).*,\1$dbsmtp," $CONFIG_FILE1 +sed -i "s,\($TARGET_KEY *= *\).*,\1$dbsmtp," $CONFIG_FILE2 +#replace granary store +echo "Setting Data store: " $dbstore +TARGET_KEY=granary.store +sed -i "s,\($TARGET_KEY *= *\).*,\1$dbstore," $CONFIG_FILE1 +sed -i "s,\($TARGET_KEY *= *\).*,\1$dbstore," $CONFIG_FILE2 +#replace granary uri root +echo "Setting Base URI: " $dburi +TARGET_KEY=granary.uri_root +[ $TARGET_KEY != "*/" ] && TARGET_KEY="$TARGET_KEY""/" +sed -i "s,\($TARGET_KEY *= *\).*,\1$dburi," $CONFIG_FILE1 +sed -i "s,\($TARGET_KEY *= *\).*,\1$dburi," $CONFIG_FILE2 + +#Copy htpasswd file +#htpasswd -b -c /var/lib/databank/passwd admin $dbpasswd +cp /var/lib/databank/passwd-default /var/lib/databank/passwd + +#Link config files +ln -sf /etc/default/databank/production.ini /var/lib/databank/production.ini +ln -sf /etc/default/databank/development.ini /var/lib/databank/development.ini +ln -sf /etc/default/databank/databank_wsgi /etc/apache2/sites-available/databank_wsgi + +#Create dirs and change ownership and permissions +# ownership and permissions for /var/lib/databank +chgrp -R www-data /var/lib/databank/ +chmod -R 770 /var/lib/databank/ +# ownership and permissions for /var/log/databank +mkdir -p /var/log/databank +chgrp -R www-data /var/log/databank/ +chmod -R 770 /var/log/databank/ +# ownership and permissions for /var/cache/databank +mkdir -p /var/cache/databank +chgrp -R www-data /var/cache/databank/ +chmod -R 770 /var/cache/databank/ +# ownership and permissions /etc/default/databank +chgrp -R www-data /etc/default/databank/ +chmod -R 770 /var/cache/databank/ +# ownership and permissions granary.store +mkdir -p $dbstore +chgrp -R www-data $dbstore +chmod -R 770 $dbstore + +#Configure SOLR and message workers in supervisor +db_get databank/confsolr +local dbconf="$RET" +installstatus=`dpkg-query -W -f='${Status}' solr-tomcat` +if [ "$installstatus" = "install ok installed" ] +then + if [ "$dbconf" = "true" ] + then + if [ -f /etc/init.d/tomcat6 ] + then + invoke-rc.d tomcat6 stop + fi + if [ -f /etc/init.d/supervisor ] + then + invoke-rc.d supervisor stop + fi + cp /etc/solr/conf/schema.xml /etc/solr/conf/schema.xml.bak + ln -sf /etc/default/databank/schema.xml /etc/solr/conf/schema.xml + ln -sf /var/lib/databank/message_workers/workers_available/worker_broker.conf /etc/supervisor/conf.d/worker_broker.conf + ln -sf /var/lib/databank/message_workers/workers_available/worker_solr.conf /etc/supervisor/conf.d/worker_solr.conf + if [ -f /etc/init.d/tomcat6 ] + then + invoke-rc.d tomcat6 start + fi + if [ -f /etc/init.d/supervisor ] + then + invoke-rc.d supervisor start + fi + else + echo "***********************************************************" + echo "SOLR has not been configured for Databank." + echo "The instructions for doing so are available at" + echo "/usr/share/doc/databank/ConfiguringSOLR.txt" + echo "***********************************************************" + fi +else + echo "***********************************************************" + echo "SOLR has not been configured for Databank." + echo "The instructions for doing so are available at" + echo "/usr/share/doc/databank/ConfiguringSOLR.txt" + echo "***********************************************************" +fi + +#Enable site in apache +a2dissite default +a2dissite default-ssl +a2ensite databank_wsgi + +#Start Apache +invoke-rc.d apache2 reload +invoke-rc.d apache2 start + +db_stop diff --git a/debian/postrm b/debian/postrm new file mode 100644 index 0000000..7bb6e76 --- /dev/null +++ b/debian/postrm @@ -0,0 +1,8 @@ +#!/bin/bash +set -e + +# Source debconf library. +. /usr/share/debconf/confmodule + +# Remove my changes to the db. +db_purge diff --git a/debian/preinst b/debian/preinst new file mode 100644 index 0000000..a7d0679 --- /dev/null +++ b/debian/preinst @@ -0,0 +1,10 @@ +#!/bin/bash +set -e + +# stop apache server +# stop django server +if [ -f /etc/init.d/apache2 ] +then + invoke-rc.d apache2 stop +fi + diff --git a/debian/rules b/debian/rules new file mode 100644 index 0000000..917d9bf --- /dev/null +++ b/debian/rules @@ -0,0 +1,13 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +%: + dh $@ diff --git a/debian/templates b/debian/templates new file mode 100644 index 0000000..017c4c8 --- /dev/null +++ b/debian/templates @@ -0,0 +1,57 @@ +Template: databank/email +Type: string +Description: Adminstrator Email: + The email id will be used to send error messages from Databank. + +Template: databank/smtpserver +Type: string +Default: localhost +Description: SMTP Server: + This is used for sending emails from Databank + +Template: databank/store +Type: string +Default: /silos +Description: Data storage location: + The location where the data will be stored by Databank. + +Template: databank/uri +Type: string +Description: Base URI: + The base uri (domain name) of Databank. + Example: http://example.com/ + +Template: databank/password +Type: string +Description: Administrator password: + The password for user 'admin' + The user 'admin' is the main administartor for Databank and + has access to all parts of Databank + +Template: databank/confsolr +Type: boolean +Description: Can SOLR be configured for Databank? + The search facility in Databank is powered by SOLR. + . + If you choose to configure SOLR now, the existing schema + at /etc/solr/conf/schema.xml will be replaced with Databank's schema + . + If you choose to configure SOLR at a later time, + the instructions to do so are at /usr/share/doc/databank/ConfiguringSOLR.txt + +Template: databank/nosolrconf +Type: note +Description: Configuring SOLR + SOLR has not been configured for Databank. + If you choose to configure SOLR at a later time, + the instructions to do so are at /usr/share/doc/databank/ConfiguringSOLR.txt + +Template: databank/passwdnote +Type: note +Description: Change your password + Databank has been installed successfully and is available at http://localhost + . + The default credntials for the main user is - username: admin password: test + . + On logging in, Please change the default admin password + diff --git a/development.ini b/development.ini index 6bad250..4507c37 100644 --- a/development.ini +++ b/development.ini @@ -1,3 +1,23 @@ +# Copyright (c) 2012 University of Oxford +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # rdfdatabank - Pylons development environment configuration # @@ -8,7 +28,7 @@ debug = true # Uncomment and replace with the address which should receive any error reports #email_to = you@yourdomain.com smtp_server = localhost -error_email_from = paste@localhost +error_email_from = paste@databank [server:main] use = egg:Paste#http @@ -24,33 +44,34 @@ use = egg:rdfdatabank full_stack = true static_files = true -cache_dir = %(here)s/data -beaker.session.key = localdatabank +cache_dir = /var/cache/databank +beaker.session.key = rdfdatabank beaker.session.secret = somesecret -who.config_file = %(here)s/who.ini +who.config_file = /var/lib/databank/who.ini who.log_level = info -#who.log_file = /var/log/databank/who.log who.log_file = stdout -#who.log_file = %(here)s/logs/who.log +#who.log_file = /var/log/databank/who.log redis.host = localhost -granary.store = %(here)s/silos -granary.uri_root = http://192.168.23.133/ +granary.store = /silos +granary.uri_root = http://databank/ -profile.log_filename = %(here)s/logs/profile.log +profile.log_filename = /var/log/databank/profile.log profile.path = /__profile__ -auth.file = %(here)s/passwd -auth.info = %(here)s/rdfdatabank/config/users.py +auth.file = /var/lib/databank/passwd +auth.info = /var/lib/databank/rdfdatabank/config/users.py -doi.config = %(here)s/rdfdatabank/config/doi_config.py -doi.count = %(here)s/rdfdatabank/config/doi_count +doi.config = /var/lib/databank/rdfdatabank/config/doi_config.py +doi.count = /var/lib/databank/rdfdatabank/config/doi_count broadcast.to = redis broadcast.queue = silochanges +metadata.embargoed = False + solr.host = http://localhost:8080/solr naming_rule = [^0-9a-zA-Z_\-\:] formats_served = text/html,text/xhtml,text/plain,application/json,application/rdf+xml,text/xml,text/rdf+n3,application/x-turtle,text/rdf+ntriples,text/rdf+nt @@ -59,6 +80,8 @@ rights = http://ora.ouls.ox.ac.uk/objects/uuid%3A1d00eebb-8fed-46ad-8e38-45dbdb4 license = CC0 1.0 Universal (CC0 1.0). See http://creativecommons.org/publicdomain/zero/1.0/legalcode #license = Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. See http://creativecommons.org/licenses/by-nc-sa/3.0/ +api.version = 0.2 + # If you'd like to fine-tune the individual locations of the cache data dirs # for the Cache data, or the Session saves, un-comment the desired settings # here: @@ -106,8 +129,6 @@ class = FileHandler level = INFO formatter = generic args = ('/var/log/databank/databank.log', 'w') -#args = ('/opt/RDFDatabank/logs/databank.log', 'w') -#args = ('%(here)s/logs/databank.log', 'w') [formatter_generic] format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s diff --git a/docs/Databank_VM_Installation.txt b/docs/Databank_VM_Installation.txt index ec62751..a4fc900 100644 --- a/docs/Databank_VM_Installation.txt +++ b/docs/Databank_VM_Installation.txt @@ -2,7 +2,7 @@ Databank VM Setup ------------------------------------------------------------------------------------------------------ I. Virtual machine details ------------------------------------------------------------------------------------------------------ -Ubuntu 10.04.1 32 bit i386 +Ubuntu 11.10 server i386 512MB RAM 8GB Harddrive (all of hard disk not allocated at the time of creation) Network: NAT @@ -23,13 +23,9 @@ Install Grub boot loader to master boot record II. Packages to be Installed ------------------------------------------------------------------------------------------------------ sudo apt-get install build-essential - sudo vim /etc/apt/sources.list - add the following repository to the list - deb http://archive.canonical.com/ lucid partner sudo apt-get update sudo apt-get install openssh-server - sudo apt-get install sun-java6-jdk - Accept the licenses + sudo apt-get install openjdk-6-jre sudo apt-get install python-dev sudo apt-get install curl sudo apt-get install links2 @@ -42,16 +38,18 @@ II. Packages to be Installed sudo apt-get install python-setuptools sudo apt-get install python-libxml2 sudo apt-get install python-libxslt1 + sudo apt-get install python-pylons + sudo apt-get install python-rdflib + sudo apt-get install python-dateutil + sudo easy_install pairtree==0.5.6-T - sudo easy_install pylons==0.9.7 sudo easy_install repoze.who==2.0a4 - sudo easy_install rdflib==2.4.2 + sudo easy_install repoze.who_friendlyform sudo easy_install solrpy - sudo easy_install uuid - sudo easy_install python-dateutil==1.5 Installing profilers in python and pylons to obtain run time performance and other stats - Note: This is only needed in development machines. See the note below about running Pylons in debug mode (section B) + Note: This package is OPTIONAL and is only needed in development machines. + See the note below about running Pylons in debug mode (section B) sudo apt-get install python-profiler sudo easy_install repoze.profile @@ -86,43 +84,57 @@ Accept all of the default options Installing Redis (http://redis.io/) sudo apt-get install redis-server The data directory is at /var/lib/redis and the configuration is at /etc/redis - This installed version 21.2.0-1 + This installed version 2:1.2.0-1 + This is actually version 1.2.0-1 of redis whihc is very old. If on Lucid, download the debian package from Oneiric + sudo apt-get remove --purge redis-server + cd ~ + wget http://ubuntu.intergenia.de/ubuntu//pool/universe/r/redis/redis-server_2.2.11-3_amd64.deb + sudo dpkg -i redis-server_2.2.11-3_amd64.deb Installing the python redis client - wget http://launchpadlibrarian.net/53067907/python-redis_2.0.0-1_all.deb - sudo dpkg -i python-redis_2.0.0-1_all.deb + Get the latest version of the python-redis client from oneiric + wget http://de.archive.ubuntu.com/ubuntu/pool/universe/p/python-redis/python-redis_2.4.5-1_all.deb + sudo dpkg -i python-redis_2.4.5-1_all.deb I initially did sudo apt-get install python-redis. This installed verison 0.6.1, which is the latest version available for Lucid amd64 architecture is 0.6.1, so I removed the package using apt-get remove --purge python-redis - I then downloaded the latest debian package from Natty amd64 (https://launchpad.net/ubuntu/natty/amd64/python-redis/2.0.0-1) - using wget and installed it using dpkg - I did have a look at the backports but from what I saw, the necessary package isn't in there (http://packages.ubuntu.com/lucid-backports/python/) - -Pulling Recordsilo and Databank from github + I then downloaded the latest debian package from Oneiric amd64 using wget and installed it using dpkg + I did have a look at the backports but from what I saw, the necessary package isn't in there + +Installing supervisor - to manage the message workers + sudo apt-get install supervisor + +Installing git + sudo apt-get install git-core git-doc + If you want to clone the repository (to be able to commit changes), + setup git following the instructions in http://help.github.com/linux-set-up-git/ + +Pulling Recordsilo from github Recordsilo is available at https://github.com/anusharanganathan/RecordSilo - RDFDatabank is available at https://github.com/anusharanganathan/RDFDatabank Recordsilo and RDFDatabank and kept in sync so at any period of time the latest egg file in Recordsilo/dist (https://github.com/anusharanganathan/RecordSilo/tree/master/dist) is comaptible with the code in the master branch of RDFDatabank - sudo apt-get install git-core git-doc + Clone/Pull Recordsilo and install the latest vesion. Currently the latest version is 0.4.14. + sudo mkdir ~/git-src cd git-src - If you want to clone the repository (to be able to commit changes), - setup git following the instructions in http://help.github.com/linux-set-up-git/ + git clone git://github.com/anusharanganathan/RecordSilo.git + cd RecordSilo/dist + sudo easy_install RecordSilo-0.4.14-py2.x.egg (2.x - depending on whether you are running python 2.6 / python 2.7) - Clone/Pull Recordsilo and install the latest vesion. Currently the latest version is 0.4.14. - - git clone git@github.com:anusharanganathan/RecordSilo.git - sudo easy_install RecordSilo-0.4.14-py2.6.egg - - Clone/Pull RDFDatabank - cd /opt - sudo mkdir RDFDatabank - sudo chown www-data:demoSystemUser RDFDatabank/ - sudo chmod 775 RDFDatabank/ - git clone git@github.com:anusharanganathan/RDFDatabank.git - - /opt/RDFDatabank is the root directory running the databank instance. You can move this to any other place of your choice. +Pulling Recordsilo and Databank from github + RDFDatabank is available at https://github.com/anusharanganathan/RDFDatabank + + Clone/Pull RDFDatabank into its root directory + Previously Databank was installed in /opt/RDFDatabank/ + Since creating a debian package, Databank is installed in /var/lib/databank/ + Installing it in either place is fine. I shall herewith refer to the location of the Databank root directory with $DB_ROOT + where $DB_ROOT = /var/lib/databank/ (or /opt/RDFDatabank/) + + sudo mkdir -p $DB_ROOT + sudo chown www-data:demoSystemUser $DB_ROOT + sudo chmod 775 $DB_ROOT + git clone git://github.com/dataflow/RDFDatabank.git $DB_ROOT ------------------------------------------------------------------------------------------------------ III. Customizing Databank to your environment @@ -157,19 +169,30 @@ In the file production.ini, edit the folllowing: ------------------------------------------------------------------------------------------------------ IV. Create the main admin user to access Databank + +TODO: This section uses htpasswd and a python file to manage user groups and roles. + This would best be replaced by a DB lookup or similar. ------------------------------------------------------------------------------------------------------ -Create a file 'passwd' in the root directory of RDFDatabank using 'htpasswd' and add a user to the passwd file. -OR copy the file passwd-default to passwd +1. Create a file 'passwd' in the root directory of RDFDatabank using 'htpasswd' and add a user to the passwd file. + OR copy the file passwd-default to passwd + + The passwd-default file has users whose username, password and roles are as given in the file rdfdatabank/tests/userRolesForTesting.txt. + These user accounts are just for demonstration and would have to be changed for a production instance. -To create the pssswd file - cd RDFDatabank/ - htpasswd -c passwd admin + To create a new pssswd file with the username 'admin'. + Note: To start off you just need to create this one username and password. This user will be the main databank administrator. + cd RDFDatabank/ + htpasswd -c passwd admin - [enter admin password] + [enter admin password] -Create and add data to the file rdfdatabank/config/users.py. - You would need to create a file called 'users.py' in add data for the main admin user (added earlier into htpasswd) by hand currently. -OR copy the file users-default.py to rdfdatabank/config/users.py +2. Create and add data to the file rdfdatabank/config/users.py. + OR copy the file rdfdatabank/config/users-default.py to rdfdatabank/config/users-.py. + + Currently, you need to create a file called 'users.py' in rdfdatabank/config/ and populate the file with the data for each of the users you had added into the passwd file. + You just need to define the user for the main admin account user ('admin' - added earlier into htpasswd). You can create further users using the Databank web interface. + + Alternatively, you can copy the file rdfdatabank/config/users-default.py to rdfdatabank/config/users.py If creating the users.py file: The data to add should look like this @@ -192,9 +215,7 @@ _USERS = { Examples for owner: 'owner': '*', - 'owner': 'my_first_silo,sandbox,my_second_silo', - - The file has a variable _USERS used by ./rdfdatabank/lib/ident_md.py which would best be replaced by a DB lookup or similar. + 'owner': 'my_first_silo,sandbox,my_second_silo', ------------------------------------------------------------------------------------------------------ V. Integrate Databank with Datacite, for minting DOIs (this section is optional) @@ -236,20 +257,20 @@ class OxDataciteDoi(): VI. Integrate Pylons with Apache ------------------------------------------------------------------------------------------------------ 1. Edit the file dispatch.wsgi - Note: you only need to do this step if the root directory running the databank instance is not /opt/RDFDatabank) + Note: you only need to do this step if the root directory running the databank instance is not /var/lib/databank) In the mod_wsgi/dispatch.wsgi file, edit the location of your databank instance. - Replace the string '/opt/RDFDatabank' with the complete path to the directory where you have installed Databank. + Replace the string '/var/lib/databank' with the complete path to the directory where you have installed Databank ($DB_ROOT). 2. Add a new site in apache sites-available called databank-wsgi - There is a file provided to you in the docs dir called databank_wsgi (/opt/RDFDatabank/docs/apache_config/databank_wsgi). - If the root directory running the databank instance is not /opt/RDFDatabank, edit the location of your databank instance, - replacing the string '/opt/RDFDatabank' with the complete path to the directory where you have installed Databank. + There is a file provided to you in the docs dir called databank_wsgi ($DB_ROOT/docs/apache_config/databank_wsgi). + If the root directory running the databank instance is not /var/lib/databank, edit the location of your databank instance, + replacing the string '/var/lib/databank' with the complete path to the directory where you have installed Databank ($DB_ROOT). The apache log files are configured to be stored in /var/log/apache2/. Agaian you can change this location. Copy the file docs/apache_config/databank_wsgi to /etc/apache/sites-available. - $sudo cp /opt/RDFDatabank/docs/apache_config/databank_wsgi /etc/apache2/sites-available/ + $sudo cp $DB_ROOT/docs/apache_config/databank_wsgi /etc/apache2/sites-available/ 3. Enable mod_wsgi and the site databank_wsgi. If the site default is enabled, disable that site. a2dissite 000-default @@ -261,20 +282,58 @@ VII. Setup SOLR ------------------------------------------------------------------------------------------------------ Copy the solr schema file from docs into your solr conf sudo /etc/init.d/tomcat6 stop - cp /opt/RDFDatabank/docs/solr_config/conf/schema.xml /etc/solr/conf/ + sudo cp $DB_ROOT/docs/solr_config/conf/schema.xml /etc/solr/conf/ sudo /etc/init.d/tomcat6 start ------------------------------------------------------------------------------------------------------ -VIII. Making sure all of the needed folders are available and apache has access to all the needed parts +VIII. Setup Supervisor +------------------------------------------------------------------------------------------------------ +Items are indexed in SOLR from Databank, through redis using message queues +The workers that run on these message queues are managed using supervisor + + The related files are available in $DB_ROOT/message_workers + + Modify the file loglines.cfg - if the solr end point is not http://localhost:8080/solr or databank root is not /var/lib/databank + [worker_solr] + solrurl = http://localhost:8080/solr + dbroot = /var/lib/databank + + Modify the file workers_available/worker_broker.conf - if databank root is not /var/lib/databank + [program:worker_broker] + directory = /var/lib/databank/message_workers/ + command = /var/lib/databank/message_workers/broker.py %(process_num)s + stdout_logfile = /var/log/databank/broker.log + + Modify the file workers_available/worker_solr.conf - if databank root is not /var/lib/databank + [program:worker_solr] + directory = /var/lib/databank/message_workers/ + command = /var/lib/databank/message_workers/solr_worker.py %(process_num)s + stdout_logfile = /var/log/databank/solr_worker.log + + Stop supervisor, copy the following files to /etc/supervisor/conf.d/ and start supervisor + $ sudo /etc/init.d/supervisor stop + $ sudo cp workers_available/worker_broker.conf /etc/supervisor/conf.d/ + $ sudo cp workers_available/worker_solr.conf /etc/supervisor/conf.d + $ sudo /etc/init.d/supervisor start + + The controller for supervisor can be invoked with the command 'supervisorctl' + sudo supervisorctl + + This will list all of the jobs manged by supervisor and their current status. + You can start / stop / restart jobs from withon the controller. + For more info on supervisor, read http://supervisord.org/index.html + +------------------------------------------------------------------------------------------------------ +IX. Making sure all of the needed folders are available and apache has access to all the needed parts ------------------------------------------------------------------------------------------------------ Apache runs as user www-data. Make sure the user www-data is able to read write to the following locations - /opt/RDFDatabank + $DB_ROOT /silos (create if not available) /var/log/databank (create if not available) Change permission, so www-data has access to RDFDatabank - sudo chown -R www-data:demoSystemUser /opt/RDFDatabank/ - sudo chmod -R 775 /opt/RDFDatabank/ + sudo chown -R www-data:demoSystemUser $DB_ROOT + sudo chmod -R 775 $DB_ROOT Create a folder called /silos and change it's owner and permission. This is where the silos are going to be stored sudo mkdir /silos @@ -287,7 +346,7 @@ Create a folder called databank in /var/log/databank and change it's owner and p sudo chmod -R 775 /var/log/databank ------------------------------------------------------------------------------------------------------ -IX. Test your Pylons installation +X. Test your Pylons installation ------------------------------------------------------------------------------------------------------ Restart apache sudo /etc/init.d/apache2 restart @@ -300,15 +359,15 @@ If you have problems with authorization, you can change the who.log_level to deb and restart apache so you can check the logs to see what's happening. The who.log_file is available at /var/log/databank/who.log ------------------------------------------------------------------------------------------------------ -X. Run the test code and make sure all the tests pass +XI. Run the test code and make sure all the tests pass ------------------------------------------------------------------------------------------------------ -The test code is located at /opt/RDFDatabank/rdfdatabank/tests +The test code is located at $DB_ROOT/rdfdatabank/tests There are two test files - TestSubmission.py and TestSubmission_submitter.py TestSubmission.py test all of the different functionality TestSubmission_submitter.py tests the different user roles and permissions -Both of these tests use the configuration file RDFDatabankConfig.py, which you may need to mkodify +Both of these tests use the configuration file RDFDatabankConfig.py, which you may need to modify granary_uri_root="http://databank" This needs to be the same value as granary.uri_root in the production.ini file (or development.ini file if usign that instead) endpointhost="localhost" @@ -322,7 +381,7 @@ Both of these tests use the configuration file RDFDatabankConfig.py, which you m To run the tests Make sure databank is running (see section IX) - cd /opt/RDFDatabank/rdfdatabank/tests + cd $DB_ROOT/rdfdatabank/tests python TestSubmission.py (to run the tests in TestSubmission.py) python TestSubmission_submitter.py (to run the tests in TestSubmission_submitter.py) @@ -334,7 +393,7 @@ If you would like to run Pylons in debug mode from the command line and dump all Open the file development.ini and make the changes as in section III (except may be who.log_file). Note: development.ini is similar to and essentially a copy of production.ini, except in the configuration of logs and debug levels. - To run pylons in debug mode, modify set 'debug' to 'true' in the '[DEFAULT]' section + To run pylons in debug mode, set 'debug' to 'true' in the '[DEFAULT]' section [DEFAULT] debug = true If you run pylons in debug mode, the error stack will be displayed on the browser with the state variables and their values. diff --git a/docs/Dependencies.pdf b/docs/Dependencies.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e8cabba6981a8e553b7c1f756434de53795fbb92 GIT binary patch literal 46907 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μSKO= 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 literal 0 HcmV?d00001 diff --git a/docs/accessLogWithheaderInfo_2011_03_16.csv b/docs/accessLogWithheaderInfo_2011_03_16.csv deleted file mode 100644 index aea9df55f3cf5889d3297ddc31a4df48ea1b6b39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51108 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%0Awesn>KtjPIGHzjs9MTg^B0w4Nf3^TTM40##M54c zxiV`Z388)tQ3@AM2z%WHwCECNG3m&6r)4O+&-Q@yI-)OLDqGp&`h|fLZ3~@65v`Ds zhHn?(GwT=cpmSw|aqgh@5Z3Eu++~zu<53jV3}+#6b6yt_vdyv@(V5Lt8qw@hsdZUq z(f#$2Tkp-HRitQl2D&otVPsgnzp@IejLo6u?^VdO^UV9{DeG>3$j=~L&bZOD>KY9R zSB{Mv6+XYBB(}Z7?C0&O9E_epPWuG%SJ4yhUypZKyd$`Dp2Q(|uas*wOOy20Gfyju z;NtHgS}i3V=cfZhPjOERHSM2lk9W-a=MntqMHe^<{?q$8d`H`F|M?Ld9IbyF!4C&; zKsnftl^yT|X$VZ+&BPUZMzw~sn>qLZ0#h=!1J10LhC^Ty#xCX{8zYQ~AI^kAFbQCo z1mH{pl1vCmCVn6)4Tc5yAuuU>;4%_xdrL-`wza*uy^HlB0Rl`8oLyWct&E)+`4AA8 zqVYilfkZ+8W;0hS7e+k@0)=J-7NZ#XQT&WZqyW~T(HKS)@Pae~s9NwD)&VpmnxFBI zAM`;7IZX6F`Gv_z(r;fYk)>!3@AKNJj%&VR=Cf zK;}cnql6$MK*#X&WBo%qsKsFsuv!2@As`Wy4od#n2k9UUbcf{ypMznrjt-we4g-8( zB>@bF3BfR^8R%mjFE1m=gFyfAK@Cty-XE0+20+P&jKKXkyhkZPiC6+ykfR8g1k4*N z<1jr|2ACAg3}67|VUr#u11VqxtQ;^E$O+0lG6t*)hdKj3sPADS6d#}f>PH;Z9~1=A zkVph01h`m;5y_9i62S+cL!y2Z9@OiQ#wUQp3Pkhq18w=kfdzpa8o=*9wgA}H2lT`? z=7A4N{n`C30eFD5il2OJeS`6zOzjt;pbEbi{xA-<_+j{G|L5Gn@R2nfTE)*kSUEq( z55u59Fbw(zK-UHO{v~r4Q)g>O@HQzv>pAgXVl{n0A4HP;R9L@yaNg_A2=_dmAb3Bofac--U3X{)!5eBRNUSY zxTuL20+Td$lr^`uv~mSa2?7&$F$Is?$M6C`1L_1uco1*^*FXufSP6>e##q>b!%;v2 zcS|fF0Vo6rzijOBBL<~1D}IF2EF6N&KtfQ^zXhj2dQiI~*!pKU#j5eY z1E+w#hid(Ma0=ipSSd$({daKsGgAH>{{IC|!A3l=h(jMN*U#?A8V(tL@ekni7utcP zU}-=Gf5It0_O^|`Q3M`(X!&JcgY zPk{7y$$#D1`+MWj1$&8!8-UvYY7@Z}tj%2XAVdf6lmo*Qc9x4h!V#G5!VgxXu;1VV zaRew8^bcmkh=cQOu-lvf9lPWP`UmoWTU7v!j!uUBr_E4FV_?8>umn^AZ*&1htAm%+ zz!-4xATVpzbTLaG4`*`=2oWzMP%A`0I~@EN1&~NU2k^ekFGzR@gy - ServerName databank.bodleian.ox.ac.uk + #ServerName databank.com # Logfiles ErrorLog /var/log/apache2/databank-error.log @@ -10,9 +10,9 @@ WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On # Setup mod_wsgi - WSGIScriptAlias / /opt/RDFDatabank/mod_wsgi/dispatch_development.wsgi + WSGIScriptAlias / /var/lib/databank/mod_wsgi/dispatch_development.wsgi - + Order deny,allow Allow from all diff --git a/docs/apache_config/databank_wsgi b/docs/apache_config/databank_wsgi index 89bc9f0..071d498 100644 --- a/docs/apache_config/databank_wsgi +++ b/docs/apache_config/databank_wsgi @@ -1,5 +1,5 @@ - ServerName databank.bodleian.ox.ac.uk + #ServerName databank.com # Logfiles ErrorLog /var/log/apache2/databank-error.log @@ -10,9 +10,9 @@ WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On # Setup mod_wsgi - WSGIScriptAlias / /opt/RDFDatabank/mod_wsgi/dispatch.wsgi + WSGIScriptAlias / /var/lib/databank/mod_wsgi/dispatch.wsgi - + Order deny,allow Allow from all diff --git a/docs/assigning_dois/DOI Syntax for datasets in DataBank.docx b/docs/assigning_dois/DOI Syntax for datasets in DataBank.docx deleted file mode 100755 index 25db4a35a6f6ad0d1345e3cb879cf8d8d9fe61e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9599 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 DB+|u;dD`}aP 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 z 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 diff --git a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run2_testDeleteEmbargo_pyhonTestMessage.txt b/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run2_testDeleteEmbargo_pyhonTestMessage.txt deleted file mode 100644 index 4295489..0000000 --- a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run2_testDeleteEmbargo_pyhonTestMessage.txt +++ /dev/null @@ -1,39 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testDeleteEmbargo -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -Delete embargo information - POST embargo_change to /silo_name/datasets/dataset_name ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 404 Not Found -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 204 Updated -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -ERROR - -====================================================================== -ERROR: Delete embargo information - POST embargo_change to /silo_name/datasets/dataset_name ----------------------------------------------------------------------- -Traceback (most recent call last): - File "TestSubmission.py", line 1394, in testDeleteEmbargo - expect_status=200, expect_reason="OK", expect_type="application/json") - File "../TestLib/SparqlQueryTestCase.py", line 182, in doHTTP_GET - if (expect_type.lower() == "application/json"): responsedata = simplejson.loads(responsedata) - File "/usr/lib/pymodules/python2.6/simplejson/__init__.py", line 307, in loads - return _default_decoder.decode(s) - File "/usr/lib/pymodules/python2.6/simplejson/decoder.py", line 338, in decode - raise ValueError(errmsg("Extra data", s, end, len(s))) -ValueError: Extra data: line 1 column 4 - line 11 column 1372 (char 4 - 1664) - ----------------------------------------------------------------------- -Ran 1 test in 19.271s - -FAILED (errors=1) diff --git a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run2_testDeleteEmbargo_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run2_testDeleteEmbargo_wiresharkMessage.pcap deleted file mode 100644 index 4402859f3e50d9362382fa4799ca5c53c678d812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13037 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 Bd3XQ- diff --git a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run3_testChangeEmbargo_pyhonTestMessage.txt b/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run3_testChangeEmbargo_pyhonTestMessage.txt deleted file mode 100644 index 04b281c..0000000 --- a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run3_testChangeEmbargo_pyhonTestMessage.txt +++ /dev/null @@ -1,39 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testChangeEmbargo -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -Modify embargo information - POST embargo_change, embargo, embargo_until to /silo_name/datasets/dataset_name ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 204 Updated -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -ERROR - -====================================================================== -ERROR: Modify embargo information - POST embargo_change, embargo, embargo_until to /silo_name/datasets/dataset_name ----------------------------------------------------------------------- -Traceback (most recent call last): - File "TestSubmission.py", line 1457, in testChangeEmbargo - expect_status=200, expect_reason="OK", expect_type="application/json") - File "../TestLib/SparqlQueryTestCase.py", line 182, in doHTTP_GET - if (expect_type.lower() == "application/json"): responsedata = simplejson.loads(responsedata) - File "/usr/lib/pymodules/python2.6/simplejson/__init__.py", line 307, in loads - return _default_decoder.decode(s) - File "/usr/lib/pymodules/python2.6/simplejson/decoder.py", line 338, in decode - raise ValueError(errmsg("Extra data", s, end, len(s))) -ValueError: Extra data: line 1 column 4 - line 11 column 1391 (char 4 - 1683) - ----------------------------------------------------------------------- -Ran 1 test in 24.111s - -FAILED (errors=1) diff --git a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run3_testChangeEmbargo_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run3_testChangeEmbargo_wiresharkMessage.pcap deleted file mode 100644 index ca89a28fc24029d3e0a9020454c6a74becfff5fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12807 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 diff --git a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run4_testFileUpdate_pyhonTestMessage.txt b/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run4_testFileUpdate_pyhonTestMessage.txt deleted file mode 100644 index 8911a45..0000000 --- a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run4_testFileUpdate_pyhonTestMessage.txt +++ /dev/null @@ -1,37 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testFileUpdate -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -Update file in dataset - POST file to /silo_name/datasets/dataset_name (x 2) ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 204 No Content -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -FAIL - -====================================================================== -FAIL: Update file in dataset - POST file to /silo_name/datasets/dataset_name (x 2) ----------------------------------------------------------------------- -Traceback (most recent call last): - File "TestSubmission.py", line 592, in testFileUpdate - self.assertEqual(zipdata, zipfile, "Difference between local and remote zipfile!") -AssertionError: Difference between local and remote zipfile! - ----------------------------------------------------------------------- -Ran 1 test in 22.510s - -FAILED (failures=1) diff --git a/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run4_testFileUpdate_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test1-204_ppdated_returns_content-5_fail_2_error_in_test_run/run4_testFileUpdate_wiresharkMessage.pcap deleted file mode 100644 index 2196a96adea2cb2191a0d6e5c57fc2fdbb20abd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25186 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 S?v9aG)O1jkmBKiAJtA3R3JPC?Dw6skNe6d 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 z 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 JUGC|0{|9$MooWC8 diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run2_testDeleteEmbargo_pythonTestMessage.txt b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run2_testDeleteEmbargo_pythonTestMessage.txt deleted file mode 100644 index 3c7429f..0000000 --- a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run2_testDeleteEmbargo_pythonTestMessage.txt +++ /dev/null @@ -1,25 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testDeleteEmbargo -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -Delete embargo information - POST embargo_change to /silo_name/datasets/dataset_name ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 404 Not Found -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 204 Updated -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -ok - ----------------------------------------------------------------------- -Ran 1 test in 0.369s - -OK diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run2_testDeleteEmbargo_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run2_testDeleteEmbargo_wiresharkMessage.pcap deleted file mode 100644 index ff1f1d80c022659f4d4e13d930ced621360724d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12742 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 diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run3_testChangeEmbargo_pythonTestMessage.txt b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run3_testChangeEmbargo_pythonTestMessage.txt deleted file mode 100644 index 8bfb78b..0000000 --- a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run3_testChangeEmbargo_pythonTestMessage.txt +++ /dev/null @@ -1,25 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testChangeEmbargo -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -Modify embargo information - POST embargo_change, embargo, embargo_until to /silo_name/datasets/dataset_name ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 204 Updated -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -ok - ----------------------------------------------------------------------- -Ran 1 test in 0.431s - -OK diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run3_testChangeEmbargo_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run3_testChangeEmbargo_wiresharkMessage.pcap deleted file mode 100644 index 88ae69e53d17e6bf2b03682a5cdc7d19a8f474ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12372 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 diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run4_testFileUpdate_pythonTestMessage.txt b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run4_testFileUpdate_pythonTestMessage.txt deleted file mode 100644 index 44cacca..0000000 --- a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run4_testFileUpdate_pythonTestMessage.txt +++ /dev/null @@ -1,31 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testFileUpdate -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -Update file in dataset - POST file to /silo_name/datasets/dataset_name (x 2) ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 204 No Content -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -ok - ----------------------------------------------------------------------- -Ran 1 test in 0.481s - -OK diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run4_testFileUpdate_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run4_testFileUpdate_wiresharkMessage.pcap deleted file mode 100644 index dbe215191a4263b94eef3140d5cca20c7c3ca89a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27984 zcmeHQ34B!5)qj}~mMju9U=ksYLkMUx`($5)l86L?LsmA0*$6{2GjW!XkdH;MxO^_4 zRzyWXph$%(h`1zx3Mz{&V1=S2tq3SoR1``-Ln+@m_s;URJfaO1e@);fnK$qK-?`_U zd$xP#<>MWjR?3(jOyKL%C58!u7bk5COBVNyVv6B+9E`E@GZp@z0;lYcF{U&<9Vuw*5@*KPfUI#TG;{ z832MqK;y9a?-Ck6=FvD9(3Tlv2kg)Ml+JV=pzH8a8Z=_0sBioVwl3B zu|?%Ya<#|gw3=NFYOBd>^4Po{b-B&sE%TWjc8|yIa>{QnFE^^SDs4>U?JkcuM~>&2 zP0kvX%WYD*8dN5W%2yK;Il^MG)p?agPK(QGcUI@f?N*!9Yxg$7TR!g$m)kzu;rLuR^Z@^D=bYGg(&L#MN#70&(vSfFo9{ybsCNQjxjNjg(j~pM}C{zo+j63 z$xBRbct@+1YxOzlnK^ocd{jw!Ok|nOU2k*e$Vb$fEHi9sol2+D>g2;J%s!{rcXLdn z(QT@Bm~!M!m(qe~#6*t7AIgy~r`PSO<-7rhfP>1hHfObWMh@I4CbH7xZUk^Hs{zA* zYI$QFkm$8Fc-3{aCc86NZkb_ngHZE*-s#FLxZV!;23d9_#F)sYp{|;tIYYf}pKa(I zlt*&Cq`K}TiuMst(YDNMAGh2Xn;_SprSfQNltg)tpd1iI=?5s^Q;6rpZJ6W#b< zu2jb@2iE6Y6uzk$#xOV|-BR9+UI)HB zNBHs`MOpN$l)+l^45F;~GKg}NF}5!MU>2@pe;m$b?I3;)9RH`j0RRC4!*$(Q!H7I zD9>LKMFE2~6YQ?>jBOnYowk8=X|vaGz%Dib|AJBwYVEZ|p2V#o z55WPUJQubu-{nTTn7DvS;S`{31p(mTOM!WL$#X=OcXOq%%S~hnQrNqkVS+P-Upks> zfS-kSPo2wSr)HnUH>b&A%U9T~3Y;9*-NZy*{su}Vbrol&S#lj=$-O)kN0$76EJ?UP zS@Q53QA`>rB@ThBNRq`Nikj_k0*w8^2(H34n&m3=8m+vA)wcqkXB2&icWb7G^MS;yP#4EjNp>zi8}p*r%pdaTlzGj5o|w5 zCGd1}6r%?2`u+-&SO$awY?72^svig10z6J?mk z6=URPP=?u{4BrlbToP%KIass^Q6MUW1aPh>3Pgv_zVF{uAU&?z$jfK8G}S_=>@x#3X9`pF22FV>=!XM2#!vL`$W)gUBrF zS+o3n;CRniKu^Y~@#QU{sPPma1(%>;rsqE;G`8?)Oa`g4tIXW1N~50~*zr|5dN25a zS3$7K^k$I4kCuK>xEfyhVBvs=XOJyQi>F=%Bmbe?Yj((E3!9#otywv-=-sR>>ctCB zZ#rd6TeJJ``W-_fUhP|-^!!(o58hR=r{X$`&HDb9Y0C;9kIxvLrwmiqEM5_9iCgsY z$_=`zZ0m^uf12=i+UaRIGnc#D`fhak|~~NxNOuD2#~rww|Wp*85D@n zfwmC``X<-Pu5KAP-dl>f)vC2rAkRG=%@lwzaPVz)nCARnhy#5^6a~V1nX8iy^uNS^ zZUk-yWg_&SH;IKu-qN<=Yj)xydHau4Ch^Zm`p>@-|2d2+lQlbuWI-l*>%0A@xYzCW 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 diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run5_testGetDatasetByVersion_pythonTestMessage.txt b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run5_testGetDatasetByVersion_pythonTestMessage.txt deleted file mode 100644 index c9c0879..0000000 --- a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run5_testGetDatasetByVersion_pythonTestMessage.txt +++ /dev/null @@ -1,99 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testGetDatasetByVersion -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -Upload files to a dataset - POST file to /silo_name/datasets/dataset_name. Access each of the versions and the files in that version ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/version0 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir2.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 404 Not Found -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir2.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 204 No Content -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 404 Not Found -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir2.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/version0 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission/version0 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/version1 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip/version1 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission/version1 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/version2 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip/version2 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir2.zip/version2 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission/version2 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/version3 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir2.zip/version3 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip/version3 -DEBUG:SparqlQueryTestCase:Status: 404 Not Found -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission/version3 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/version4 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir2.zip/version4 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip/version4 -DEBUG:SparqlQueryTestCase:Status: 404 Not Found -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission/version4 -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/version5 -DEBUG:SparqlQueryTestCase:Status: 404 Not Found -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir2.zip/version5 -DEBUG:SparqlQueryTestCase:Status: 404 Not Found -ok - ----------------------------------------------------------------------- -Ran 1 test in 1.915s - -OK diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run5_testGetDatasetByVersion_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run5_testGetDatasetByVersion_wiresharkMessage.pcap deleted file mode 100644 index f9dabb02db47b6f0d74e49c4335f2fcb1d52ae0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121229 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 diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run6_testMetadataFileUpdate_pythonTestMessage.txt b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run6_testMetadataFileUpdate_pythonTestMessage.txt deleted file mode 100644 index 44d3546..0000000 --- a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run6_testMetadataFileUpdate_pythonTestMessage.txt +++ /dev/null @@ -1,27 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testMetadataFileUpdate -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -POST manifest to dataset - POST manifest.rdf to /silo_name/datasets/dataset_name ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 204 No Content -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 204 No Content -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -ok - ----------------------------------------------------------------------- -Ran 1 test in 0.490s - -OK diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run6_testMetadataFileUpdate_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run6_testMetadataFileUpdate_wiresharkMessage.pcap deleted file mode 100644 index 3e18a68ecfa9529a1159e01e07acec19d3e31419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18157 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 diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run7_testPutUpdateFile_pythonTestMessage.txt b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run7_testPutUpdateFile_pythonTestMessage.txt deleted file mode 100644 index 3cbc0d9..0000000 --- a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run7_testPutUpdateFile_pythonTestMessage.txt +++ /dev/null @@ -1,41 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testPutUpdateFile -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -PUT file contents to existing filename - PUT file contents to /silo_name/datasets/dataset_name/file_name ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:PUT http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testrdf3.zip -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testrdf3.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:PUT http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 204 No Content -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testrdf3.zip -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/testdir.zip/version1 -DEBUG:SparqlQueryTestCase:Status: 200 OK -ok - ----------------------------------------------------------------------- -Ran 1 test in 0.819s - -OK diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run7_testPutUpdateFile_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run7_testPutUpdateFile_wiresharkMessage.pcap deleted file mode 100644 index 3bc3d31bb8955ef7130c09aeba9cf1d3c0e5ca9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39626 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 diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run8_testPutMetadataFile_pythonTestMessage.txt b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run8_testPutMetadataFile_pythonTestMessage.txt deleted file mode 100644 index 7636f96..0000000 --- a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run8_testPutMetadataFile_pythonTestMessage.txt +++ /dev/null @@ -1,27 +0,0 @@ -databankadmin@databank:/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank$ python TestSubmission.py testPutMetadataFile -/opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/plugin.py:94: UserWarning: Module rdflib was already imported from /opt/RDFDatabank/rdfdatabank/tests/RDFDatabank/rdflib/__init__.pyc, but /usr/local/lib/python2.6/dist-packages/rdflib-2.4.2-py2.6-linux-i686.egg is being added to sys.path - from pkg_resources import iter_entry_points -Add metadata to manifest - PUT metadata to /silo_name/datasets/dataset_name/manifest.rdf ... DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointhost databank.ora.ox.ac.uk: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpath /sandbox/: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointuser admin: -DEBUG:SparqlQueryTestCase:setRequestEndPoint: endpointpass test: -DEBUG:SparqlQueryTestCase:DELETE http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:POST http://databank.ora.ox.ac.uk/sandbox/datasets/ -DEBUG:SparqlQueryTestCase:Status: 201 Created -DEBUG:SparqlQueryTestCase:PUT http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/manifest.rdf -DEBUG:SparqlQueryTestCase:Status: 204 No Content -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:PUT http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission/manifest.rdf -DEBUG:SparqlQueryTestCase:Status: 204 No Content -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/datasets/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -DEBUG:SparqlQueryTestCase:GET http://databank.ora.ox.ac.uk/sandbox/states/TestSubmission -DEBUG:SparqlQueryTestCase:Status: 200 OK -ok - ----------------------------------------------------------------------- -Ran 1 test in 0.538s - -OK diff --git a/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run8_testPutMetadataFile_wiresharkMessage.pcap b/docs/databank_test_run_for_204_response/test2-204_updated_returns_no_content-all_pass_in_test_run/run8_testPutMetadataFile_wiresharkMessage.pcap deleted file mode 100644 index f69a215f4caf2f131815f1b03f0fa95489ec01ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14711 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 0 and docs: - out_f = codecs.open(fname, 'a', 'utf-8') - for row in docs: - row_val = [] - for name in fieldnames: - if name in row and row[name] and isinstance(row[name], basestring): - row_val.append(row[name]) - elif name in row and row[name] and isinstance(row[name], list): - row_val.append(";".join(row[name])) - else: - row_val.append("") - if row_val: - out_f.write("%s\n" %delimiter.join(row_val) - out_f.close() - else: - print 'The search resulted in no documents' -else: - print 'The search resulted in no matches' - diff --git a/docs/index.txt b/docs/index.txt deleted file mode 100644 index b3a9628..0000000 --- a/docs/index.txt +++ /dev/null @@ -1,19 +0,0 @@ -rdfdatabank -+++++++++++ - -This is the main index page of your documentation. It should be written in -`reStructuredText format `_. - -You can generate your documentation in HTML format by running this command:: - - setup.py pudge - -For this to work you will need to download and install `buildutils`_, -`pudge`_, and `pygments`_. The ``pudge`` command is disabled by -default; to ativate it in your project, run:: - - setup.py addcommand -p buildutils.pudge_command - -.. _buildutils: http://pypi.python.org/pypi/buildutils -.. _pudge: http://pudge.lesscode.org/ -.. _pygments: http://pygments.org/ diff --git a/docs/indexingSolrRecordsUsingSupervisord/LogConfigParser.py b/docs/indexingSolrRecordsUsingSupervisord/LogConfigParser.py deleted file mode 100644 index ef9aec1..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/LogConfigParser.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python - -import ConfigParser, os - -class Config(ConfigParser.ConfigParser): - DEFAULT_CONFIG_FILE = "loglines.cfg" - def __init__(self, config_file=DEFAULT_CONFIG_FILE): - ConfigParser.ConfigParser.__init__(self) - if os.path.exists(config_file) and os.path.isfile(config_file): - self.read(config_file) - self.validate() - - def validate(self): - pass diff --git a/docs/indexingSolrRecordsUsingSupervisord/getObjects.py b/docs/indexingSolrRecordsUsingSupervisord/getObjects.py deleted file mode 100644 index 9836564..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/getObjects.py +++ /dev/null @@ -1,86 +0,0 @@ -import os -from rdfdatabank.lib.broadcast import BroadcastToRedis -from pylons import config - -def get_objs_in_dir(items_list, dirname, fnames): - for fname in fnames: - a = os.path.join(dirname,fname) - if fname == 'obj': - item = a.split('pairtree_root')[1].strip('/').split('obj')[0].replace('/', '') - silo = a.split('pairtree_root')[0].strip('/').split('/')[-1] - if not (silo, item) in items_list: - items_list.append((silo, item)) - return - -def broadcast_links(src_dir): - links_list = [] - os.path.walk(src_dir,get_objs_in_dir,links_list) - b = BroadcastToRedis(config['redis.host'], config['broadcast.queue']) - - for silo, item in links_list: - b.creation(silo, item) - return - -src_dirs = [ -'/silos/admiral/pairtree_root', -'/silos/digitaltest/pairtree_root', -'/silos/eidcsr/pairtree_root', -'/silos/general/pairtree_root', -'/silos/ww1archives/pairtree_root', -'/silos/digitalbooks/pairtree_root/30', -'/silos/digitalbooks/pairtree_root/og/-4/00', -'/silos/digitalbooks/pairtree_root/og/-4/01', -'/silos/digitalbooks/pairtree_root/og/-3/00', -'/silos/digitalbooks/pairtree_root/og/-3/01', -'/silos/digitalbooks/pairtree_root/og/-3/02', -'/silos/digitalbooks/pairtree_root/og/-3/03', -'/silos/digitalbooks/pairtree_root/og/-3/04', -'/silos/digitalbooks/pairtree_root/og/-3/05', -'/silos/digitalbooks/pairtree_root/og/-3/06', -'/silos/digitalbooks/pairtree_root/og/-3/15', -'/silos/digitalbooks/pairtree_root/og/-3/16', -'/silos/digitalbooks/pairtree_root/og/-3/18', -'/silos/digitalbooks/pairtree_root/og/-3/20', -'/silos/digitalbooks/pairtree_root/og/-3/61', -'/silos/digitalbooks/pairtree_root/og/-3/90', -'/silos/digitalbooks/pairtree_root/og/-3/93', -'/silos/digitalbooks/pairtree_root/og/-5/00', -'/silos/digitalbooks/pairtree_root/og/-5/01', -'/silos/digitalbooks/pairtree_root/og/-5/02', -'/silos/digitalbooks/pairtree_root/og/-5/03', -'/silos/digitalbooks/pairtree_root/og/-5/04', -'/silos/digitalbooks/pairtree_root/og/-5/09', -'/silos/digitalbooks/pairtree_root/og/-5/31', -'/silos/digitalbooks/pairtree_root/og/-5/32', -'/silos/digitalbooks/pairtree_root/og/-5/33', -'/silos/digitalbooks/pairtree_root/og/-5/50', -'/silos/digitalbooks/pairtree_root/og/-5/55', -'/silos/digitalbooks/pairtree_root/og/-5/56', -'/silos/digitalbooks/pairtree_root/og/-5/90', -'/silos/digitalbooks/pairtree_root/og/-5/91', -'/silos/digitalbooks/pairtree_root/og/-5/96', -'/silos/digitalbooks/pairtree_root/og/-5/97', -'/silos/digitalbooks/pairtree_root/og/-6/00', -'/silos/digitalbooks/pairtree_root/og/-6/50', -'/silos/digitalbooks/pairtree_root/og/-6/81', -'/silos/digitalbooks/pairtree_root/og/-6/90', -'/silos/digitalbooks/pairtree_root/og/-N/08', -'/silos/digitalbooks/pairtree_root/og/-N/10', -'/silos/digitalbooks/pairtree_root/og/-N/11', -'/silos/digitalbooks/pairtree_root/og/-N/12', -'/silos/digitalbooks/pairtree_root/og/-N/13', -'/silos/digitalbooks/pairtree_root/og/-N/14', -'/silos/digitalbooks/pairtree_root/og/-N/15', -'/silos/digitalbooks/pairtree_root/og/-N/16', -'/silos/digitalbooks/pairtree_root/og/-N/17', -'/silos/digitalbooks/pairtree_root/og/-N/32', -'/silos/digitalbooks/pairtree_root/og/-N/50' -] - -for src_dir in src_dirs: - print "starting", src_dir - links_list = [] - os.path.walk(src_dir,get_objs_in_dir,links_list) - b = BroadcastToRedis(config['redis.host'], config['broadcast.queue']) - for silo, item in links_list: - b.creation(silo, item) \ No newline at end of file diff --git a/docs/indexingSolrRecordsUsingSupervisord/loglines.cfg b/docs/indexingSolrRecordsUsingSupervisord/loglines.cfg deleted file mode 100644 index 7c2812a..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/loglines.cfg +++ /dev/null @@ -1,55 +0,0 @@ -# CONFIGURE THE FOLLOWING: -[supervisor] -port = 127.0.0.1:9001 -username = guest -password = guest - -# Configure the following to let supervisor control the redis instance -# or comment it out otherwise. -[process_redis] -# add the correct path to the redis instance here -command = redis-1.2.6/redis-server - -# Configure the following to let supervisor control the redis instance -# or comment it out otherwise. -[process_solr] -# add the correct path to the redis instance here -command = /opt/solr/start_solr.sh - -[worker_solr] -listento = solrindex -command = ./solr_worker.py -# Time in seconds to sleep if there is nothing on the queue -solrurl = http://localhost:8983/solr -idletime = 1 -stdout_logfile = workerlogs/solr_worker.log -numprocs = 2 - -[worker_broker] -listento = silochanges -command = ./broker.py -fanout = auditlog, solrindex -fanout_status_queue = broker_temp -# Time in seconds to sleep if there is nothing on the queue -idletime = 1 -stdout_logfile = workerlogs/broker.log -numprocs = 2 - -[logger_auditlogger] -listento = auditlog -command = ./logfromqueue.py -logfile = logs/audit.log -stdout_logfile = workerlogs/auditlogger.log - -# DEFAULT VALUES FOLLOW -############################## -[redis] -host = localhost -port = 6379 -db = 0 - -[redis_test] -host = localhost -port = 6379 -db = 1 - diff --git a/docs/indexingSolrRecordsUsingSupervisord/solrFields.py b/docs/indexingSolrRecordsUsingSupervisord/solrFields.py deleted file mode 100644 index 555a3bc..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/solrFields.py +++ /dev/null @@ -1,102 +0,0 @@ -solr_fields_mapping = { - "silo":"silo", - "id":"id", - "uuid":"uuid", - "http://www.w3.org/1999/02/22-rdf-syntax-ns#type":"type", - "http://vocab.ox.ac.uk/dataset/schema#isEmbargoed":"embargoStatus", - "http://purl.org/spar/pso/Status":"embargoStatus", - "http://vocab.ox.ac.uk/dataset/schema#embargoedUntil":"embargoedUntilDate", - "http://purl.org/spar/fabio/hasEmbargoDate":"embargoedUntilDate", - "http://vocab.ox.ac.uk/dataset/schema#currentVersion":"currentVersion", - "http://purl.org/ontology/bibo/doi":"doi", - "http://www.openarchives.org/ore/terms/aggregates":"aggregatedResource" - "http://purl.org/spar/fabio/publicationDate":"publicationDate", - "http://dublincore.org/documents/dcmi-terms/abstract":"abstract", - "http://dublincore.org/documents/dcmi-terms/accessRights":"accessRights", - "http://dublincore.org/documents/dcmi-terms/accrualMethod":"accrualMethod", - "http://dublincore.org/documents/dcmi-terms/accrualPeriodicity":"accrualPeriodicity", - "http://dublincore.org/documents/dcmi-terms/accrualPolicy":"accrualPolicy", - "http://dublincore.org/documents/dcmi-terms/alternative":"alternative", - "http://dublincore.org/documents/dcmi-terms/audience":"audience", - "http://dublincore.org/documents/dcmi-terms/available":"available", - "http://dublincore.org/documents/dcmi-terms/bibliographicCitation":"bibliographicCitation", - "http://dublincore.org/documents/dcmi-terms/conformsTo":"conformsTo", - "http://dublincore.org/documents/dcmi-terms/contributor":"contributor", - "http://dublincore.org/documents/dcmi-terms/coverage":"coverage", - "http://dublincore.org/documents/dcmi-terms/created":"created", - "http://dublincore.org/documents/dcmi-terms/creator":"creator", - "http://dublincore.org/documents/dcmi-terms/date":"date", - "http://dublincore.org/documents/dcmi-terms/dateAccepted":"dateAccepted", - "http://dublincore.org/documents/dcmi-terms/dateCopyrighted":"dateCopyrighted", - "http://dublincore.org/documents/dcmi-terms/dateSubmitted":"dateSubmitted", - "http://dublincore.org/documents/dcmi-terms/description":"description", - "http://dublincore.org/documents/dcmi-terms/educationLevel":"educationLevel", - "http://dublincore.org/documents/dcmi-terms/extent":"extent", - "http://dublincore.org/documents/dcmi-terms/format":"format", - "http://dublincore.org/documents/dcmi-terms/hasFormat":"hasFormat", - "http://dublincore.org/documents/dcmi-terms/hasPart":"hasPart", - "http://dublincore.org/documents/dcmi-terms/hasVersion":"hasVersion", - "http://dublincore.org/documents/dcmi-terms/identifier":"identifier", - "http://dublincore.org/documents/dcmi-terms/instructionalMethod":"instructionalMethod", - "http://dublincore.org/documents/dcmi-terms/isFormatOf":"isFormatOf", - "http://dublincore.org/documents/dcmi-terms/isPartOf":"isPartOf", - "http://dublincore.org/documents/dcmi-terms/isReferencedBy":"isReferencedBy", - "http://dublincore.org/documents/dcmi-terms/isReplacedBy":"isReplacedBy", - "http://dublincore.org/documents/dcmi-terms/isRequiredBy":"isRequiredBy", - "http://dublincore.org/documents/dcmi-terms/issued":"issued", - "http://dublincore.org/documents/dcmi-terms/isVersionOf":"isVersionOf", - "http://dublincore.org/documents/dcmi-terms/language":"language", - "http://dublincore.org/documents/dcmi-terms/license":"license", - "http://dublincore.org/documents/dcmi-terms/mediator":"mediator", - "http://dublincore.org/documents/dcmi-terms/medium":"medium", - "http://dublincore.org/documents/dcmi-terms/modified":"modified", - "http://dublincore.org/documents/dcmi-terms/provenance":"provenance", - "http://dublincore.org/documents/dcmi-terms/publisher":"publisher", - "http://dublincore.org/documents/dcmi-terms/references":"references", - "http://dublincore.org/documents/dcmi-terms/relation":"relation", - "http://dublincore.org/documents/dcmi-terms/replaces":"replaces", - "http://dublincore.org/documents/dcmi-terms/requires":"requires", - "http://dublincore.org/documents/dcmi-terms/rights":"rights", - "http://dublincore.org/documents/dcmi-terms/rightsHolder":"rightsHolder", - "http://dublincore.org/documents/dcmi-terms/source":"source", - "http://dublincore.org/documents/dcmi-terms/spatial":"spatial", - "http://dublincore.org/documents/dcmi-terms/subject":"subject", - "http://dublincore.org/documents/dcmi-terms/tableOfContents":"tableOfContents", - "http://dublincore.org/documents/dcmi-terms/temporal":"temporal", - "http://dublincore.org/documents/dcmi-terms/title":"title", - "http://dublincore.org/documents/dcmi-terms/type":"type", - "http://dublincore.org/documents/dcmi-terms/valid":"valid", - "http://purl.org/dc/elements/1.1/contributor":"contributor", - "http://purl.org/dc/elements/1.1/coverage":"coverage", - "http://purl.org/dc/elements/1.1/creator":"creator", - "http://purl.org/dc/elements/1.1/date":"date", - "http://purl.org/dc/elements/1.1/description":"description", - "http://purl.org/dc/elements/1.1/format":"format", - "http://purl.org/dc/elements/1.1/identifier":"identifier", - "http://purl.org/dc/elements/1.1/language":"language", - "http://purl.org/dc/elements/1.1/publisher":"publisher", - "http://purl.org/dc/elements/1.1/relation":"relation", - "http://purl.org/dc/elements/1.1/rights":"rights", - "http://purl.org/dc/elements/1.1/source":"source", - "http://purl.org/dc/elements/1.1/subject":"subject", - "http://purl.org/dc/elements/1.1/title":"title", - "http://purl.org/dc/elements/1.1/type":"type" -} - -facets = [ - 'f_creator', - 'f_mediator', - 'f_embargoedUntilDate', - 'f_license', - 'f_rights', - 'f_type', - 'f_publisher', - 'f_isPartOf', - 'f_hasVersion', - 'f_publicationDate', - 'f_contributor', - 'f_language', - 'f_rightsHolder', - 'f_source', - 'f_subject' -] \ No newline at end of file diff --git a/docs/indexingSolrRecordsUsingSupervisord/solr_worker.py b/docs/indexingSolrRecordsUsingSupervisord/solr_worker.py deleted file mode 100644 index 32bebab..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/solr_worker.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python - -from redisqueue import RedisQueue -from LogConfigParser import Config -from solrFields import solr_fields_mapping - -import sys -from time import sleep -from rdflib import URIRef -import simplejson - -from recordsilo import Granary -from solr import SolrConnection - -DB_ROOT = "/opt/RDFDatabank" - -class NoSuchSilo(Exception): - pass - -def gather_document(silo_name, item): - graph = item.get_graph() - document = {'uuid':item.metadata['uuid'], 'id':item.item_id, 'silo':silo_name} - for (_,p,o) in graph.triples((URIRef(item.uri), None, None)): - #print p,o - #if p.startswith("http://purl.org/dc/terms/"): - if p in solr_fields_mapping: - #field = p[len("http://purl.org/dc/terms/"):].encode("utf-8") - field = solr_fields_mapping[p] - if not document.has_key(field): - document[field] = [] - #print "Adding %s to %s" % (o, field) - document[field].append(unicode(o).encode("utf-8")) - else: - if not document.has_key('text'): - document['text'] = [] - #print "Adding %s to %s - (from %s)" % (o, "text", p) - document['text'].append(unicode(o).encode("utf-8")) - #print document - return document - -if __name__ == "__main__": - c = Config() - redis_section = "redis" - worker_section = "worker_solr" - worker_number = sys.argv[1] - if len(sys.argv) == 3: - if "redis_%s" % sys.argv[2] in c.sections(): - redis_section = "redis_%s" % sys.argv[2] - - rq = RedisQueue(c.get(worker_section, "listento"), "solr_%s" % worker_number, - db=c.get(redis_section, "db"), - host=c.get(redis_section, "host"), - port=c.get(redis_section, "port") - ) - rdfdb_config = Config("%s/production.ini" % DB_ROOT) - granary_root = rdfdb_config.get("app:main", "granary.store", 0, {'here':DB_ROOT}) - - g = Granary(granary_root) - - solr = SolrConnection(c.get(worker_section, "solrurl")) - - idletime = 2 - - while(True): - sleep(idletime) - line = rq.pop() - if not line: - continue - msg = simplejson.loads(line) - # solr switch - silo_name = msg['silo'] - if silo_name not in g.silos: - raise NoSuchSilo - s = g.get_rdf_silo(silo_name) - if msg['type'] == "c" or msg['type'] == "u" or msg['type'] == "embargo": - # Creation - itemid = msg.get('id') - print "Got creation message on id:%s in silo:%s" % (itemid, silo_name) - if itemid and s.exists(itemid): - item = s.get_item(itemid) - solr_doc = gather_document(silo_name, item) - try: - solr.add(_commit=True, **solr_doc) - except: - f = open('/opt/logs/solr_error.log', 'a') - f.write("Error adding record (creating) id:%s in silo:%s" % (itemid, silo_name)) - f.close() - rq.task_complete() - elif msg['type'] == "d": - # Deletion - itemid = msg.get('id') - if itemid and s.exists(itemid): - solr.delete(itemid) - solr.commit() - rq.task_complete() - """ - elif msg['type'] == "embargo": - itemid = msg.get('id') - if itemid and s.exists(itemid): - if msg['embargoed'] in ['false', 'False', 0, False]: - # Embargo removed: update solr - item = s.get_item(itemid) - solr_doc = gather_document(silo_name, item) - try: - solr.add(_commit=True, **solr_doc) - except: - f = open('/opt/logs/solr_error.log', 'a') - f.write("Error adding record (embargo change) id:%s in silo:%s" % (itemid, silo_name)) - f.close() - else: - solr.delete(itemid) - solr.commit() - rq.task_complete() - except NoSuchSilo: - print "ERROR: Silo doesn't exist %s" % silo_name - print line - rq.task_complete() - """ diff --git a/docs/indexingSolrRecordsUsingSupervisord/supervisor_startup.sh b/docs/indexingSolrRecordsUsingSupervisord/supervisor_startup.sh deleted file mode 100644 index 667f8fb..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/supervisor_startup.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -su databankadmin --command "exec /usr/local/bin/supervisord -c /opt/workers/supervisord.conf" - diff --git a/docs/indexingSolrRecordsUsingSupervisord/supervisord.conf b/docs/indexingSolrRecordsUsingSupervisord/supervisord.conf deleted file mode 100644 index 098e111..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/supervisord.conf +++ /dev/null @@ -1,29 +0,0 @@ -[unix_http_server] -username = guest -password = guest -file = /tmp/supervisor.sock - -[supervisord] -minfds = 1024 -minprocs = 200 -loglevel = info -logfile = /tmp/supervisord.log -logfile_maxbytes = 50MB -nodaemon = false -pidfile = /tmp/supervisord.pid -logfile_backups = 10 - -[supervisorctl] -serverurl = unix:///tmp/supervisor.sock - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[include] -files = workers_enabled/*.conf - -[inet_http_server] -username = guest -password = guest -port = 127.0.0.1:9001 - diff --git a/docs/indexingSolrRecordsUsingSupervisord/workers_available/logger_articlelogger.conf b/docs/indexingSolrRecordsUsingSupervisord/workers_available/logger_articlelogger.conf deleted file mode 100644 index 30b3481..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/workers_available/logger_articlelogger.conf +++ /dev/null @@ -1,13 +0,0 @@ -[program:logger_articlelogger] -autorestart = true -numprocs = 1 -startretries = 3 -redirect_stderr = True -stopwaitsecs = 10 -process_name = logger_articlelogger_%(process_num)s -priority = 999 -command = ./logfromqueue.py %(process_num)s logger_articlelogger -autostart = true -startsecs = 10 -stdout_logfile = workerlogs/articlelogger.log - diff --git a/docs/indexingSolrRecordsUsingSupervisord/workers_available/logger_auditlogger.conf b/docs/indexingSolrRecordsUsingSupervisord/workers_available/logger_auditlogger.conf deleted file mode 100644 index 65c219d..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/workers_available/logger_auditlogger.conf +++ /dev/null @@ -1,13 +0,0 @@ -[program:logger_auditlogger] -autorestart = true -numprocs = 1 -startretries = 3 -redirect_stderr = True -stopwaitsecs = 10 -process_name = logger_auditlogger_%(process_num)s -priority = 666 -directory = /opt/workers/ -command = /opt/workers/logfromqueue.py %(process_num)s logger_auditlogger -autostart = true -startsecs = 10 -stdout_logfile = /opt/workers/workerlogs/auditlogger.log diff --git a/docs/indexingSolrRecordsUsingSupervisord/workers_available/process_redis.conf b/docs/indexingSolrRecordsUsingSupervisord/workers_available/process_redis.conf deleted file mode 100644 index b024366..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/workers_available/process_redis.conf +++ /dev/null @@ -1,14 +0,0 @@ -[program:process_redis] -autorestart = true -numprocs = 1 -startretries = 3 -redirect_stderr = True -stopwaitsecs = 10 -process_name = process_redis_%(process_num)s -priority = 555 -directory = /opt/workers/ -command = /opt/workers/redis-1.2.6/redis-server -autostart = true -startsecs = 10 -stdout_logfile = /opt/workers/workerlogs/process_redis.log - diff --git a/docs/indexingSolrRecordsUsingSupervisord/workers_available/process_solr.conf b/docs/indexingSolrRecordsUsingSupervisord/workers_available/process_solr.conf deleted file mode 100644 index c866f22..0000000 --- a/docs/indexingSolrRecordsUsingSupervisord/workers_available/process_solr.conf +++ /dev/null @@ -1,14 +0,0 @@ -[program:process_solr] -autorestart = true -numprocs = 1 -startretries = 3 -redirect_stderr = True -stopwaitsecs = 10 -process_name = process_solr_%(process_num)s -priority = 999 -directory = /opt/solr/ -command = /opt/solr/start_solr.sh -autostart = true -startsecs = 10 -stdout_logfile = /opt/workers/workerlogs/process_solr.log - diff --git a/docs/solr_config/conf/schema.xml b/docs/solr_config/conf/schema.xml index 410d98d..97e0e99 100644 --- a/docs/solr_config/conf/schema.xml +++ b/docs/solr_config/conf/schema.xml @@ -262,64 +262,64 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/using_databank_api/DatabankDemo.py b/docs/using_databank_api/DatabankDemo.py new file mode 100644 index 0000000..4045c17 --- /dev/null +++ b/docs/using_databank_api/DatabankDemo.py @@ -0,0 +1,78 @@ +#-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +#Databank API demo + +import urllib2 +import base64 +import urllib +from multipartform import MultiPartForm + +#=============================================================================== +#Using urllib2 to create a package in Databank +url = "http://databank-vm1.oerc.ox.ac.uk/test/datasets" +req = urllib2.Request(url) +USER = "admin" +PASS = "test" +identifier = "TestSubmission" +auth = 'Basic ' + base64.urlsafe_b64encode("%s:%s" % (USER, PASS)) +req.add_header('Authorization', auth) +req.add_header('Accept', 'application/JSON') +req.add_data(urllib.urlencode({'id': identifier})) + +# To verify the method is POST +req.get_method() + +ans = urllib2.urlopen(req) + +ans.read() +ans.msg +ans.code + +#=============================================================================== +#Using urllib2 to post a file in Databank +#Add a file +form = MultiPartForm() +filename = "solrconfig.xml" +filepath = "./solrconfig.xml" +form.add_file('file', filename, fileHandle=open(filepath)) + +# Build the request +url2 = "http://databank-vm1.oerc.ox.ac.uk/test/datasets/TestSubmission" +req2 = urllib2.Request(url2) +auth = 'Basic ' + base64.urlsafe_b64encode("admin:test") +req2.add_header('Authorization', auth) +req2.add_header('Accept', 'application/JSON') +body = str(form) +req2.add_header('Content-type', form.get_content_type()) +req2.add_header('Content-length', len(body)) +req2.add_data(body) + +print +print 'OUTGOING DATA:' +print req2.get_data() +ans2 = urllib2.urlopen(req2) +print +print 'SERVER RESPONSE:' +ans2.read() \ No newline at end of file diff --git a/docs/using_databank_api/HTTP_request.py b/docs/using_databank_api/HTTP_request.py index 796a1f9..bd76624 100644 --- a/docs/using_databank_api/HTTP_request.py +++ b/docs/using_databank_api/HTTP_request.py @@ -1,3 +1,27 @@ +#-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging import mimetypes import httplib diff --git a/docs/using_databank_api/main.py b/docs/using_databank_api/main.py index 6872808..d9f7748 100644 --- a/docs/using_databank_api/main.py +++ b/docs/using_databank_api/main.py @@ -1,3 +1,26 @@ +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + # Using the databank API """ @@ -6,7 +29,7 @@ The full functionality of RDFDatabank is detailed in the API documentation at http://databank.ora.ox.ac.uk/api -https://github.com/anusharanganathan/RDFDatabank/tree/master/rdfdatabank/public/static/api_files +https://github.com/dataflow/RDFDatabank/tree/master/rdfdatabank/public/static/api_files """ import json as simplejson diff --git a/docs/using_databank_api/multipart.py b/docs/using_databank_api/multipart.py new file mode 100644 index 0000000..14aa3e7 --- /dev/null +++ b/docs/using_databank_api/multipart.py @@ -0,0 +1,78 @@ +# --------------------------------------------------------------------- +# +# Copyright (c) 2012 University of Oxford +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# --------------------------------------------------------------------- + +import mimetools +import mimetypes + +class MultiPartFormData(object): + def __init__(self, fields=None, files=None): + self._boundary = mimetools.choose_boundary() + self._fields = fields or () + self._files = files or () + for file in self._files: + file['mimetype'] = file.get('mimetype') or mimetypes.guess_type(file['filename'])[0] or 'application/octet-stream' + self._body = self._body_iterator() + + @property + def content_type(self): + return 'multipart/form-data; boundary=%s' % self._boundary + + @property + def content_length(self): + field_padding = '--\r\nContent-Disposition: form-data; name=""\r\n\r\n\r\n' + file_padding = '--\r\nContent-Disposition: form-data; name=""; filename=""\r\nContent-Type: \r\n\r\n' + + field_length = sum(sum(map(len, [self._boundary, field_padding, k, v])) for k,v in self._fields) + file_length = sum(f['size'] + sum(map(len, [self._boundary, file_padding, f['name'], f['filename'], f['mimetype']])) for f in self._files) + + return field_length + file_length + len('----\r\n') + len(self._boundary) + + def _body_iterator(self): + for (key, value) in self._fields: + yield '--%s\r\n' % self._boundary + yield 'Content-Disposition: form-data; name="%s"\r\n' % key + yield '\r\n' + if value: + yield value + yield '\r\n' + for file in self._files: + yield '--%s\r\n' % self._boundary + yield 'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (file['name'], file['filename']) + yield 'Content-Type: %s\r\n' % file['mimetype'] + yield '\r\n' + + stream = file['stream'] + while True: + data = stream.read(4096) + if not data: + break + yield data + yield '--%s--\r\n' % self._boundary + + def read(self, blocksize): + try: + return self._body.next() + except StopIteration: + return '' diff --git a/docs/using_databank_api/multipartform.py b/docs/using_databank_api/multipartform.py new file mode 100644 index 0000000..0bfd916 --- /dev/null +++ b/docs/using_databank_api/multipartform.py @@ -0,0 +1,90 @@ +#-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import itertools +import mimetools +import mimetypes + +class MultiPartForm(object): + """Accumulate the data to be used when posting a form.""" + + def __init__(self): + self.form_fields = [] + self.files = [] + self.boundary = mimetools.choose_boundary() + return + + def get_content_type(self): + return 'multipart/form-data; boundary=%s' % self.boundary + + def add_field(self, name, value): + """Add a simple field to the form data.""" + self.form_fields.append((name, value)) + return + + def add_file(self, fieldname, filename, fileHandle, mimetype=None): + """Add a file to be uploaded.""" + body = fileHandle.read() + if mimetype is None: + mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' + self.files.append((fieldname, filename, mimetype, body)) + return + + def __str__(self): + """Return a string representing the form data, including attached files.""" + # Build a list of lists, each containing "lines" of the + # request. Each part is separated by a boundary string. + # Once the list is built, return a string where each + # line is separated by '\r\n'. + parts = [] + part_boundary = '--' + self.boundary + + # Add the form fields + parts.extend( + [ part_boundary, + 'Content-Disposition: form-data; name="%s"' % name, + '', + value, + ] + for name, value in self.form_fields + ) + + # Add the files to upload + parts.extend( + [ part_boundary, + 'Content-Disposition: file; name="%s"; filename="%s"' % \ + (field_name, filename), + 'Content-Type: %s' % content_type, + '', + body, + ] + for field_name, filename, content_type, body in self.files + ) + + # Flatten the list and add closing boundary marker, + # then return CR+LF separated data + flattened = list(itertools.chain(*parts)) + flattened.append('--' + self.boundary + '--') + flattened.append('') + return '\r\n'.join(flattened) \ No newline at end of file diff --git a/docs/using_databank_api/postingToDatabank.py b/docs/using_databank_api/postingToDatabank.py new file mode 100644 index 0000000..89326b3 --- /dev/null +++ b/docs/using_databank_api/postingToDatabank.py @@ -0,0 +1,89 @@ +#-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import urllib2 +import base64 +import urllib +from multipart import MultiPartFormData +import os + +#=============================================================================== +#Using urllib2 to create a package in Databank +url = "http://databank-vm1.oerc.ox.ac.uk/test/datasets" +identifier = "TestSubmission" +req = urllib2.Request(url) +USER = "admin" +PASS = "test" +auth = 'Basic ' + base64.urlsafe_b64encode("%s:%s" % (USER, PASS)) +req.add_header('Authorization', auth) +req.add_header('Accept', 'application/JSON') +req.add_data(urllib.urlencode({'id': identifier})) + +# To verify the method is POST +req.get_method() + +ans = urllib2.urlopen(req) + +ans.read() +ans.msg +ans.code + +#=============================================================================== +#Using urllib2 to post a file +#Add a file + +filename = "solrconfig.xml" +filepath = "./solrconfig.xml" +f = open(filepath, 'rb') +stat_info = os.stat(filepath) + +file1_info = { + 'name':'file', + 'filename':filename, + 'mimetype':'application/xml', + 'stream': f, + 'size':int(stat_info.st_size)} + +data = MultiPartFormData(files=[file1_info]) + +# Build the request +url2 = "http://databank-vm1.oerc.ox.ac.uk/test/datasets/TestSubmission" +req2 = urllib2.Request(url2) +auth = 'Basic ' + base64.urlsafe_b64encode("admin:test") +req2.add_header('Authorization', auth) +req2.add_header('Accept', 'application/JSON') +req2.add_header('Content-type', data.content_type) +req2.add_header('Content-length', data.content_length) + +body = ''.join(list(data._body)) +req2.add_data(str(body)) + +#print +#print 'OUTGOING DATA:' +#print req2.get_data() +ans2 = urllib2.urlopen(req2) +#print +print 'SERVER RESPONSE:' +ans2.read() +#=============================================================================== \ No newline at end of file diff --git a/docs/using_zipfile_library.py b/docs/using_zipfile_library.py deleted file mode 100644 index 9b31e8c..0000000 --- a/docs/using_zipfile_library.py +++ /dev/null @@ -1,123 +0,0 @@ -from zipfile import ZipFile, BadZipfile as BZ -#================================================ -def read_zipfile(filepath): - try: - tmpfile = ZipFile(filepath, "r") - except BZ: - raise BadZipfile - zipfile_contents = {} - for info in tmpfile.infolist(): - zipfile_contents[info.filename] = (info.file_size, info.date_time) - tmpfile.close() - return zipfile_contents -#================================================ -def read_file_in_zipfile(filepath, filename): - try: - tmpfile = ZipFile(filepath, "r") - except BZ: - raise BadZipfile - try: - fileinfo = tmpfile.getinfo(filename) - except KeyError: - return False - if fileinfo.file_size == 0: - return 0 - file_contents = None - file_contents = tmpfile.read(filename) - tmpfile.close() - return file_contents -#================================================ -def get_file_in_zipfile(filepath, filename, targetdir): - try: - tmpfile = ZipFile(filepath, "r") - except BZ: - raise BadZipfile - try: - fileinfo = tmpfile.getinfo(filename) - except KeyError: - return False - if fileinfo.file_size == 0: - return 0 - targetfile = tmpfile.extract(filename, targetdir) - tmpfile.close() - return targetfile -#================================================ -path = 'silos/sandbox/pairtree_root/da/ta/se/t1/obj/__26/' -fp1 = path + 'test3.zip' -fp2 = path + 'read_test.zip' -fp3 = path + 'databank_logo.png' - -zc1 = read_zipfile(fp1) -zc2 = read_zipfile(fp2) -zc3 = read_zipfile(fp3) - -zc1_files = zc1.keys() -zc2_files = zc2.keys() - -ans11 = read_file_in_zipfile(fp1, zc1_files[1]) #expected: 0 -ans12 = read_file_in_zipfile(fp1, 'test') #expected: False -ans13 = read_file_in_zipfile(fp1, zc1_files[0]) #expected: file conts - -ans21 = read_file_in_zipfile(fp2, zc2_files[0]) #expected: file conts -ans22 = read_file_in_zipfile(fp2, zc2_files[1]) #expected: 0 -ans23 = read_file_in_zipfile(fp2, zc2_files[4]) #expected: binary output - -ans14 = get_file_in_zipfile(fp1, zc1_files[1], '/tmp') #expected: 0 -ans15 = get_file_in_zipfile(fp1, 'test', '/tmp') #expected: False -ans16 = get_file_in_zipfile(fp1, zc1_files[0], '/tmp') #expected: '/tmp/admiral-dataset.txt' - -ans24 = get_file_in_zipfile(fp2, zc2_files[0], '/tmp') #expected: '/tmp/read_test/Dir/TestScanFiles32.txt' -ans25 = get_file_in_zipfile(fp2, zc2_files[1], '/tmp') #expected: 0 -ans26 = get_file_in_zipfile(fp2, zc2_files[4], '/tmp') #expected: '/tmp/read_test/databank_logo.png' -#================================================ -#Expected Answers -""" ->>> zc1 -{'admiral-dataset.txt': (43, (2010, 11, 29, 16, 30, 52)), 'TestScanFilesSubDir/': (0, (2010, 11, 29, 17, 34, 42)), 'TestScanFilesSubDir/TestScanFiles31.txt': (9, (2010, 10, 4, 15, 39, 54)), 'TestScanFilesSubDir/TestScanFiles32.txt': (9, (2010, 10, 4, 15, 39, 54)), 'TestScanFilesSubDir/manifest.rdf': (511, (2010, 11, 29, 17, 42, 10))} - ->>> zc2 -{'read_test/Dir/TestScanFiles32.txt': (9, (2010, 10, 4, 15, 39, 54)), 'read_test/Dir/': (0, (2011, 1, 5, 13, 43, 30)), 'read_test/admiral-dataset.txt': (43, (2010, 11, 29, 16, 30, 52)), 'read_test/Dir/manifest.rdf': (511, (2010, 11, 29, 17, 42, 10)), 'read_test/databank_logo.png': (20220, (2010, 12, 6, 15, 11, 40)), 'read_test/': (0, (2011, 1, 5, 13, 44, 40)), 'read_test/Dir/TestScanFiles31.txt': (9, (2010, 10, 4, 15, 39, 54))} - ->>> zc1_files -['admiral-dataset.txt', 'TestScanFilesSubDir/', 'TestScanFilesSubDir/TestScanFiles31.txt', 'TestScanFilesSubDir/TestScanFiles32.txt', 'TestScanFilesSubDir/manifest.rdf'] - ->>> zc2_files -['read_test/Dir/TestScanFiles32.txt', 'read_test/Dir/', 'read_test/admiral-dataset.txt', 'read_test/Dir/manifest.rdf', 'read_test/databank_logo.png', 'read_test/', 'read_test/Dir/TestScanFiles31.txt'] - ->>> ans11 -0 - ->>> ans12 -False - ->>> ans13 -'This directory contains an ADMIRAL dataset\n' - ->>> ans21 -'Test file' - ->>> ans22 -0 - ->>> ans23 -'\x89PNG\..... - ->>> ans14 -0 - ->>> ans15 -False - ->>> ans16 -'/tmp/admiral-dataset.txt' - ->>> ans24 -'/tmp/read_test/Dir/TestScanFiles32.txt' - ->>> ans25 -0 - ->>> ans26 -'/tmp/read_test/databank_logo.png' -""" -#================================================ diff --git a/message_workers/LogConfigParser.py b/message_workers/LogConfigParser.py new file mode 100755 index 0000000..92b8531 --- /dev/null +++ b/message_workers/LogConfigParser.py @@ -0,0 +1,37 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import ConfigParser, os + +class Config(ConfigParser.ConfigParser): + DEFAULT_CONFIG_FILE = "loglines.cfg" + def __init__(self, config_file=DEFAULT_CONFIG_FILE): + ConfigParser.ConfigParser.__init__(self) + if os.path.exists(config_file) and os.path.isfile(config_file): + self.read(config_file) + self.validate() + + def validate(self): + pass diff --git a/docs/indexingSolrRecordsUsingSupervisord/broker.py b/message_workers/broker.py old mode 100644 new mode 100755 similarity index 64% rename from docs/indexingSolrRecordsUsingSupervisord/broker.py rename to message_workers/broker.py index 20a5f6c..6746857 --- a/docs/indexingSolrRecordsUsingSupervisord/broker.py +++ b/message_workers/broker.py @@ -1,4 +1,27 @@ -#!/usr/bin/env python +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" from redisqueue import RedisQueue @@ -31,13 +54,13 @@ port=c.get(redis_section, "port") ) fanout_queues = [x.strip() for x in c.get(worker_section, "fanout").split(",") if x] - + if c.has_option(worker_section, "idletime"): try: idletime = float(c.get(worker_section, "idletime")) except ValueError: idletime = 10 - + while(True): line = rq.pop() if line: diff --git a/message_workers/loglines.cfg b/message_workers/loglines.cfg new file mode 100644 index 0000000..5399fbf --- /dev/null +++ b/message_workers/loglines.cfg @@ -0,0 +1,58 @@ +#Copyright (c) 2012 University of Oxford +# +#Permission is hereby granted, free of charge, to any person obtaining +#a copy of this software and associated documentation files (the +#"Software"), to deal in the Software without restriction, including +#without limitation the rights to use, copy, modify, merge, publish, +#distribute, sublicense, and/or sell copies of the Software, and to +#permit persons to whom the Software is furnished to do so, subject to +#the following conditions: +# +#The above copyright notice and this permission notice shall be +#included in all copies or substantial portions of the Software. +# +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +#EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +#IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +#CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +#TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +#SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# Configuring workers: +[worker_solr] +listento = solrindex +command = ./solr_worker.py +solrurl = http://localhost:8080/solr +dbroot = /var/lib/databank +idletime = 1 +stdout_logfile = workerlogs/solr_worker.log +numprocs = 2 + +[worker_broker] +listento = silochanges +command = ./broker.py +#fanout = auditlog, solrindex +fanout = solrindex +fanout_status_queue = broker_temp +idletime = 1 +stdout_logfile = workerlogs/broker.log +numprocs = 2 + +[logger_auditlogger] +listento = auditlog +command = ./logfromqueue.py +logfile = logs/audit.log +stdout_logfile = workerlogs/auditlogger.log + +# DEFAULT VALUES FOLLOW +############################## +[redis] +host = localhost +port = 6379 +db = 0 + +[redis_test] +host = localhost +port = 6379 +db = 1 diff --git a/docs/indexingSolrRecordsUsingSupervisord/redisqueue.py b/message_workers/redisqueue.py old mode 100644 new mode 100755 similarity index 62% rename from docs/indexingSolrRecordsUsingSupervisord/redisqueue.py rename to message_workers/redisqueue.py index d3e422b..79d38a6 --- a/docs/indexingSolrRecordsUsingSupervisord/redisqueue.py +++ b/message_workers/redisqueue.py @@ -1,6 +1,31 @@ -#!/usr/bin/env python +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" from redis import Redis +from redis.exceptions import ConnectionError +from time import sleep WORKERPREFIX = "temp" HOST = "localhost" @@ -45,6 +70,13 @@ def _initclient(self): logger.debug("Debug messages detailing worker queue activity") self._r = Redis(host=self.host, db=self.db, port=self.port) + def check_connection(self): + #sleep(1) + try: + self._r.info() + except ConnectionError: + self._initclient() + def __len__(self): if self.inprogress(): return self._r.llen(self.queuename) + 1 @@ -52,9 +84,12 @@ def __len__(self): return self._r.llen(self.queuename) def __getitem__(self, index): + #self.check_connection() return self._r.lrange(self.queuename, index, index) def inprogress(self): + #sleep(1) + #self.check_connection() ip = self._r.lrange(self.workeritem, 0, 0) if ip: return ip.pop() @@ -62,15 +97,21 @@ def inprogress(self): return None def task_complete(self): + #sleep(1) + #self.check_connection() logger.debug("Task completed by worker %s" % self.workername) return self._r.rpop(self.workeritem) def task_failed(self): + #sleep(1) + #self.check_connection() logger.error("Task FAILED by worker %s" % self.workername) logger.debug(self.inprogress()) return self._r.rpoplpush(self.workeritem, self.queuename) def push(self, item, to_queue=None): + #sleep(1) + #self.check_connection() if to_queue: logger.debug("{%s} put onto queue %s by worker %s" % (item, to_queue,self.workername)) return self._r.lpush(to_queue, item) @@ -79,6 +120,9 @@ def push(self, item, to_queue=None): return self._r.lpush(self.queuename, item) def pop(self): + #sleep(1) + #self.check_connection() + logger.debug("In pop - Queuename: %s, workeritem:%s"%(self.queuename, self.workeritem)) if self._r.llen(self.workeritem) == 0: self._r.rpoplpush(self.queuename, self.workeritem) logger.debug("{%s} pulled from queue %s by worker %s" % (self.inprogress(), self.queuename,self.workername)) diff --git a/message_workers/solrFields.py b/message_workers/solrFields.py new file mode 100644 index 0000000..45dffe8 --- /dev/null +++ b/message_workers/solrFields.py @@ -0,0 +1,127 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +solr_fields_mapping = { + "silo":"silo", + "id":"id", + "uuid":"uuid", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#type":"type", + "http://vocab.ox.ac.uk/dataset/schema#isEmbargoed":"embargoStatus", + "http://purl.org/spar/pso/Status":"embargoStatus", + "http://vocab.ox.ac.uk/dataset/schema#embargoedUntil":"embargoedUntilDate", + "http://purl.org/spar/fabio/hasEmbargoDate":"embargoedUntilDate", + "http://vocab.ox.ac.uk/dataset/schema#currentVersion":"currentVersion", + "http://purl.org/ontology/bibo/doi":"doi", + "http://www.openarchives.org/ore/terms/aggregates":"aggregatedResource", + "http://purl.org/spar/fabio/publicationDate":"publicationDate", + "http://purl.org/dc/terms/abstract":"abstract", + "http://purl.org/dc/terms/accessRights":"accessRights", + "http://purl.org/dc/terms/accrualMethod":"accrualMethod", + "http://purl.org/dc/terms/accrualPeriodicity":"accrualPeriodicity", + "http://purl.org/dc/terms/accrualPolicy":"accrualPolicy", + "http://purl.org/dc/terms/alternative":"alternative", + "http://purl.org/dc/terms/audience":"audience", + "http://purl.org/dc/terms/available":"available", + "http://purl.org/dc/terms/bibliographicCitation":"bibliographicCitation", + "http://purl.org/dc/terms/conformsTo":"conformsTo", + "http://purl.org/dc/terms/contributor":"contributor", + "http://purl.org/dc/terms/coverage":"coverage", + "http://purl.org/dc/terms/created":"created", + "http://purl.org/dc/terms/creator":"creator", + "http://purl.org/dc/terms/date":"date", + "http://purl.org/dc/terms/dateAccepted":"dateAccepted", + "http://purl.org/dc/terms/dateCopyrighted":"dateCopyrighted", + "http://purl.org/dc/terms/dateSubmitted":"dateSubmitted", + "http://purl.org/dc/terms/description":"description", + "http://purl.org/dc/terms/educationLevel":"educationLevel", + "http://purl.org/dc/terms/extent":"extent", + "http://purl.org/dc/terms/format":"format", + "http://purl.org/dc/terms/hasFormat":"hasFormat", + "http://purl.org/dc/terms/hasPart":"hasPart", + "http://purl.org/dc/terms/hasVersion":"hasVersion", + "http://purl.org/dc/terms/identifier":"identifier", + "http://purl.org/dc/terms/instructionalMethod":"instructionalMethod", + "http://purl.org/dc/terms/isFormatOf":"isFormatOf", + "http://purl.org/dc/terms/isPartOf":"isPartOf", + "http://purl.org/dc/terms/isReferencedBy":"isReferencedBy", + "http://purl.org/dc/terms/isReplacedBy":"isReplacedBy", + "http://purl.org/dc/terms/isRequiredBy":"isRequiredBy", + "http://purl.org/dc/terms/issued":"issued", + "http://purl.org/dc/terms/isVersionOf":"isVersionOf", + "http://purl.org/dc/terms/language":"language", + "http://purl.org/dc/terms/license":"license", + "http://purl.org/dc/terms/mediator":"mediator", + "http://purl.org/dc/terms/medium":"medium", + "http://purl.org/dc/terms/modified":"modified", + "http://purl.org/dc/terms/provenance":"provenance", + "http://purl.org/dc/terms/publisher":"publisher", + "http://purl.org/dc/terms/references":"references", + "http://purl.org/dc/terms/relation":"relation", + "http://purl.org/dc/terms/replaces":"replaces", + "http://purl.org/dc/terms/requires":"requires", + "http://purl.org/dc/terms/rights":"rights", + "http://purl.org/dc/terms/rightsHolder":"rightsHolder", + "http://purl.org/dc/terms/source":"source", + "http://purl.org/dc/terms/spatial":"spatial", + "http://purl.org/dc/terms/subject":"subject", + "http://purl.org/dc/terms/tableOfContents":"tableOfContents", + "http://purl.org/dc/terms/temporal":"temporal", + "http://purl.org/dc/terms/title":"title", + "http://purl.org/dc/terms/type":"type", + "http://purl.org/dc/terms/valid":"valid", + "http://purl.org/dc/elements/1.1/contributor":"contributor", + "http://purl.org/dc/elements/1.1/coverage":"coverage", + "http://purl.org/dc/elements/1.1/creator":"creator", + "http://purl.org/dc/elements/1.1/date":"date", + "http://purl.org/dc/elements/1.1/description":"description", + "http://purl.org/dc/elements/1.1/format":"format", + "http://purl.org/dc/elements/1.1/identifier":"identifier", + "http://purl.org/dc/elements/1.1/language":"language", + "http://purl.org/dc/elements/1.1/publisher":"publisher", + "http://purl.org/dc/elements/1.1/relation":"relation", + "http://purl.org/dc/elements/1.1/rights":"rights", + "http://purl.org/dc/elements/1.1/source":"source", + "http://purl.org/dc/elements/1.1/subject":"subject", + "http://purl.org/dc/elements/1.1/title":"title", + "http://purl.org/dc/elements/1.1/type":"type" +} + +facets = [ + 'f_creator', + 'f_mediator', + 'f_embargoedUntilDate', + 'f_license', + 'f_rights', + 'f_type', + 'f_publisher', + 'f_isPartOf', + 'f_hasVersion', + 'f_publicationDate', + 'f_contributor', + 'f_language', + 'f_rightsHolder', + 'f_source', + 'f_subject' +] diff --git a/message_workers/solr_worker.py b/message_workers/solr_worker.py new file mode 100755 index 0000000..055056f --- /dev/null +++ b/message_workers/solr_worker.py @@ -0,0 +1,129 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +from redisqueue import RedisQueue +from LogConfigParser import Config +from solrFields import solr_fields_mapping + +import sys +from time import sleep +from rdflib import URIRef +import simplejson +from collections import defaultdict + +from recordsilo import Granary +from solr import SolrConnection + +import logging + +logger = logging.getLogger("redisqueue") +logger.setLevel(logging.INFO) +ch = logging.StreamHandler() +formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") +ch.setFormatter(formatter) +logger.addHandler(ch) + +class NoSuchSilo(Exception): + pass + +def gather_document(silo_name, item): + graph = item.get_graph() + document = defaultdict(list) + document['uuid'].append(item.metadata['uuid']) + document['id'].append(item.item_id) + document['silo'].append(silo_name) + for (_,p,o) in graph.triples((URIRef(item.uri), None, None)): + if str(p) in solr_fields_mapping: + field = solr_fields_mapping[str(p)] + if field == "embargoedUntilDate": + ans = u"%sZ"%unicode(o).split('.')[0] + document[field].append(unicode(ans).encode("utf-8")) + else: + document[field].append(unicode(o).encode("utf-8")) + else: + document['text'].append(unicode(o).encode("utf-8")) + document = dict(document) + return document + +if __name__ == "__main__": + c = Config() + redis_section = "redis" + worker_section = "worker_solr" + worker_number = sys.argv[1] + if len(sys.argv) == 3: + if "redis_%s" % sys.argv[2] in c.sections(): + redis_section = "redis_%s" % sys.argv[2] + + rq = RedisQueue(c.get(worker_section, "listento"), "solr_%s" % worker_number, + db=c.get(redis_section, "db"), + host=c.get(redis_section, "host"), + port=c.get(redis_section, "port") + ) + DB_ROOT = c.get(worker_section, "dbroot") + rdfdb_config = Config("%s/production.ini" % DB_ROOT) + granary_root = rdfdb_config.get("app:main", "granary.store", 0, {'here':DB_ROOT}) + + g = Granary(granary_root) + + solr = SolrConnection(c.get(worker_section, "solrurl")) + + idletime = 2 + + while(True): + sleep(idletime) + line = rq.pop() + if not line: + continue + msg = simplejson.loads(line) + # solr switch + silo_name = msg['silo'] + if silo_name not in g.silos: + raise NoSuchSilo + s = g.get_rdf_silo(silo_name) + if msg['type'] == "c" or msg['type'] == "u" or msg['type'] == "embargo": + # Creation, update or embargo change + itemid = msg.get('id') + logger.info("Got creation message on id:%s in silo:%s" % (itemid, silo_name)) + if itemid and s.exists(itemid): + item = s.get_item(itemid) + solr_doc = gather_document(silo_name, item) + try: + solr.add(_commit=True, **solr_doc) + except Exception, e : + logger.error("Error adding document to solr id:%s in silo:%s\n" % (itemid, silo_name)) + #f = open('/var/log/databank/solr_error.log', 'a') + #f.write("Error adding record (creating) id:%s in silo:%s\n" % (itemid, silo_name)) + try: + logger.error("%s\n\n" %str(e)) + except: + pass + rq.task_complete() + elif msg['type'] == "d": + # Deletion + itemid = msg.get('id') + if itemid and s.exists(itemid): + solr.delete(itemid) + solr.commit() + rq.task_complete() diff --git a/docs/indexingSolrRecordsUsingSupervisord/workers_available/worker_broker.conf b/message_workers/workers_available/worker_broker.conf similarity index 55% rename from docs/indexingSolrRecordsUsingSupervisord/workers_available/worker_broker.conf rename to message_workers/workers_available/worker_broker.conf index d7f8b2b..0323f9a 100644 --- a/docs/indexingSolrRecordsUsingSupervisord/workers_available/worker_broker.conf +++ b/message_workers/workers_available/worker_broker.conf @@ -6,9 +6,9 @@ redirect_stderr = True stopwaitsecs = 10 process_name = worker_broker_%(process_num)s priority = 777 -directory = /opt/workers/ -command = /opt/workers/broker.py %(process_num)s +directory = /var/lib/databank/message_workers/ +command = /var/lib/databank/message_workers/broker.py %(process_num)s autostart = true startsecs = 10 -stdout_logfile = /opt/workers/workerlogs/broker.log +stdout_logfile = /var/log/databank/broker.log diff --git a/docs/indexingSolrRecordsUsingSupervisord/workers_available/worker_solr.conf b/message_workers/workers_available/worker_solr.conf similarity index 53% rename from docs/indexingSolrRecordsUsingSupervisord/workers_available/worker_solr.conf rename to message_workers/workers_available/worker_solr.conf index a659549..5cb1790 100644 --- a/docs/indexingSolrRecordsUsingSupervisord/workers_available/worker_solr.conf +++ b/message_workers/workers_available/worker_solr.conf @@ -6,9 +6,9 @@ redirect_stderr = True stopwaitsecs = 10 process_name = worker_solr_%(process_num)s priority = 888 -directory = /opt/workers/ -command = /opt/workers/solr_worker.py %(process_num)s +directory = /var/lib/databank/message_workers/ +command = /var/lib/databank/message_workers/solr_worker.py %(process_num)s autostart = true startsecs = 10 -stdout_logfile = /opt/workers/workerlogs/solr_worker.log +stdout_logfile = /var/log/databank/solr_worker.log diff --git a/mod_wsgi/dispatch.wsgi b/mod_wsgi/dispatch.wsgi index 72c4052..67ce816 100644 --- a/mod_wsgi/dispatch.wsgi +++ b/mod_wsgi/dispatch.wsgi @@ -1,16 +1,39 @@ +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + # Add the virtual Python environment site-packages directory to the path #import site #site.addsitedir('/home/simplesite/env/lib/python2.5/site-packages') #site.addsitedir('/usr/local/lib/python2.6/dist-packages') import pkg_resources -pkg_resources.working_set.add_entry('/opt/RDFDatabank') +pkg_resources.working_set.add_entry('/var/lib/databank') # Avoid ``[Errno 13] Permission denied: '/var/www/.python-eggs'`` messages import os -os.environ['PYTHON_EGG_CACHE'] = '/opt/RDFDatabank/egg-cache' +os.environ['PYTHON_EGG_CACHE'] = '/var/cache/databank/egg-cache' # Load the Pylons application from paste.deploy import loadapp -application = loadapp('config:/opt/RDFDatabank/production.ini') +application = loadapp('config:/var/lib/databank/production.ini') diff --git a/mod_wsgi/dispatch_development.wsgi b/mod_wsgi/dispatch_development.wsgi index 0528d21..3b8b054 100644 --- a/mod_wsgi/dispatch_development.wsgi +++ b/mod_wsgi/dispatch_development.wsgi @@ -1,16 +1,39 @@ +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + # Add the virtual Python environment site-packages directory to the path #import site #site.addsitedir('/home/simplesite/env/lib/python2.5/site-packages') #site.addsitedir('/usr/local/lib/python2.6/dist-packages') import pkg_resources -pkg_resources.working_set.add_entry('/opt/RDFDatabank') +pkg_resources.working_set.add_entry('/var/lib/databank') # Avoid ``[Errno 13] Permission denied: '/var/www/.python-eggs'`` messages import os -os.environ['PYTHON_EGG_CACHE'] = '/opt/RDFDatabank/egg-cache' +os.environ['PYTHON_EGG_CACHE'] = '/var/cache/databank/egg-cache' # Load the Pylons application from paste.deploy import loadapp -application = loadapp('config:/opt/RDFDatabank/development.ini') +application = loadapp('config:/var/lib/databank/development.ini') diff --git a/passwd-default b/passwd-default index 6af3641..c4930a9 100644 --- a/passwd-default +++ b/passwd-default @@ -1,10 +1,9 @@ admin:uaXjyn4Uw3qXo -sandbox_user:0kcQdq23ysbq. -anusha:pMfrTZVXm5Ix. admin2:IFWZaH87O7ZDg admin3:b6TA/1MC7CD96 +sandbox_user:0kcQdq23ysbq. +sandbox_user2:Zg8jCIxXK8/Sc +sandbox_user3:qhc7aFzy.y5vU sandbox_manager:ej4TeOgLu4GQ6 sandbox_manager2:blUNnoUzOfRNM sandbox_manager3:i/VlXSPqIgnwQ -sandbox_user2:Zg8jCIxXK8/Sc -sandbox_user3:qhc7aFzy.y5vU diff --git a/development-jenkins.ini b/production-jenkins.ini similarity index 67% rename from development-jenkins.ini rename to production-jenkins.ini index dd0421b..66c8267 100644 --- a/development-jenkins.ini +++ b/production-jenkins.ini @@ -1,3 +1,23 @@ +# Copyright (c) 2012 University of Oxford +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # rdfdatabank - Pylons development environment configuration # @@ -32,13 +52,14 @@ who.config_file = %(here)s/who.ini who.log_level = info who.log_file = /var/log/databank/who.log #who.log_file = %(here)s/logs/who.log -#who.log_file = stdout redis.host = localhost granary.store = %(here)s/silos granary.uri_root = http://dataflow-jenkins.bodleian.ox.ac.uk/ -#granary.uri_root = http://163.1.127.173/ + +#profile.log_filename = %(here)s/logs/profile.log +#profile.path = /__profile__ auth.file = %(here)s/passwd auth.info = %(here)s/rdfdatabank/config/users.py @@ -49,14 +70,18 @@ doi.count = %(here)s/rdfdatabank/config/doi_count broadcast.to = redis broadcast.queue = silochanges -solr.host = http://localhost:8983/solr +metadata.embargoed = False + +solr.host = http://localhost:8080/solr naming_rule = [^0-9a-zA-Z_\-\:] formats_served = text/html,text/xhtml,text/plain,application/json,application/rdf+xml,text/xml,text/rdf+n3,application/x-turtle,text/rdf+ntriples,text/rdf+nt publisher = Bodleian Libraries, University of Oxford rights = http://ora.ouls.ox.ac.uk/objects/uuid%3A1d00eebb-8fed-46ad-8e38-45dbdb4b224c -license = +license = CC0 1.0 Universal (CC0 1.0). See http://creativecommons.org/publicdomain/zero/1.0/legalcode #license = Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. See http://creativecommons.org/licenses/by-nc-sa/3.0/ +api.version = 0.2 + # If you'd like to fine-tune the individual locations of the cache data dirs # for the Cache data, or the Session saves, un-comment the desired settings # here: @@ -68,7 +93,6 @@ license = # execute malicious code after an exception is raised. #set debug = false - # Logging configuration [loggers] keys = root, routes, rdfdatabank @@ -90,7 +114,7 @@ qualname = routes.middleware # "level = DEBUG" logs the route matched and routing variables. [logger_rdfdatabank] -level = DEBUG +level = INFO handlers = logfile qualname = rdfdatabank diff --git a/production.ini b/production.ini index a7c0da6..03f892f 100644 --- a/production.ini +++ b/production.ini @@ -1,3 +1,23 @@ +# Copyright (c) 2012 University of Oxford +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # rdfdatabank - Pylons development environment configuration # @@ -6,7 +26,7 @@ [DEFAULT] debug = false # Uncomment and replace with the address which should receive any error reports -email_to = anusha.ranganathan@bodleian.ox.ac.uk +email_to = you@yourdomain.com smtp_server = localhost error_email_from = paste@databank @@ -24,25 +44,24 @@ use = egg:rdfdatabank full_stack = true static_files = true -cache_dir = %(here)s/data +cache_dir = /var/cache/databank beaker.session.key = rdfdatabank beaker.session.secret = somesecret -who.config_file = %(here)s/who.ini +who.config_file = /var/lib/databank/who.ini who.log_level = info who.log_file = /var/log/databank/who.log -#who.log_file = %(here)s/logs/who.log redis.host = localhost granary.store = /silos -granary.uri_root = http://databank.ora.ox.ac.uk/ +granary.uri_root = http://databank/ -auth.file = %(here)s/passwd -auth.info = %(here)s/rdfdatabank/config/users.py +auth.file = /var/lib/databank/passwd +auth.info = /var/lib/databank/rdfdatabank/config/users.py -doi.config = %(here)s/rdfdatabank/config/doi_config.py -doi.count = %(here)s/rdfdatabank/config/doi_count +doi.config = /var/lib/databank/rdfdatabank/config/doi_config.py +doi.count = /var/lib/databank/rdfdatabank/config/doi_count broadcast.to = redis broadcast.queue = silochanges @@ -57,6 +76,8 @@ rights = http://ora.ouls.ox.ac.uk/objects/uuid%3A1d00eebb-8fed-46ad-8e38-45dbdb4 license = CC0 1.0 Universal (CC0 1.0). See http://creativecommons.org/publicdomain/zero/1.0/legalcode #license = Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. See http://creativecommons.org/licenses/by-nc-sa/3.0/ +api.version = 0.2 + # If you'd like to fine-tune the individual locations of the cache data dirs # for the Cache data, or the Session saves, un-comment the desired settings # here: @@ -68,7 +89,6 @@ license = CC0 1.0 Universal (CC0 1.0). See http://creativecommons.org/publicdoma # execute malicious code after an exception is raised. #set debug = false - # Logging configuration [loggers] keys = root, routes, rdfdatabank @@ -105,7 +125,6 @@ class = FileHandler level = INFO formatter = generic args = ('/var/log/databank/databank.log', 'w') -#args = ('%(here)s/logs/databank.log', 'w') [formatter_generic] format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s diff --git a/rdfdatabank.egg-info/PKG-INFO b/rdfdatabank.egg-info/PKG-INFO index b1eff68..eaa2bed 100644 --- a/rdfdatabank.egg-info/PKG-INFO +++ b/rdfdatabank.egg-info/PKG-INFO @@ -1,10 +1,10 @@ Metadata-Version: 1.0 Name: rdfdatabank -Version: 0.1dev -Summary: UNKNOWN -Home-page: UNKNOWN -Author: UNKNOWN -Author-email: UNKNOWN -License: UNKNOWN +Version: 0.2 +Summary: RDF-enhanced, pairtree-backed storage API +Home-page: https://github.com/dataflow/RDFDatabank +Author: Anusha Ranganathan, Ben O'Steen +Author-email: anusha.ranganathan@ieee.org, bosteen@gmail.com +License: MIT License Description: UNKNOWN Platform: UNKNOWN diff --git a/rdfdatabank.egg-info/SOURCES.txt b/rdfdatabank.egg-info/SOURCES.txt index 41a75aa..48c1f04 100644 --- a/rdfdatabank.egg-info/SOURCES.txt +++ b/rdfdatabank.egg-info/SOURCES.txt @@ -16,18 +16,160 @@ rdfdatabank/config/__init__.py rdfdatabank/config/deployment.ini_tmpl rdfdatabank/config/environment.py rdfdatabank/config/middleware.py +rdfdatabank/config/namespaces.py rdfdatabank/config/routing.py +rdfdatabank/config/users-default.py rdfdatabank/controllers/__init__.py +rdfdatabank/controllers/about.py +rdfdatabank/controllers/account.py +rdfdatabank/controllers/admin.py +rdfdatabank/controllers/api.py +rdfdatabank/controllers/datasets.py +rdfdatabank/controllers/doi.py rdfdatabank/controllers/error.py +rdfdatabank/controllers/home.py +rdfdatabank/controllers/items.py +rdfdatabank/controllers/keywords.py +rdfdatabank/controllers/search.py +rdfdatabank/controllers/searching.py +rdfdatabank/controllers/silos.py +rdfdatabank/controllers/states.py +rdfdatabank/controllers/users.py +rdfdatabank/lib/HTTP_request.py rdfdatabank/lib/__init__.py rdfdatabank/lib/app_globals.py +rdfdatabank/lib/auth.py rdfdatabank/lib/base.py +rdfdatabank/lib/broadcast.py +rdfdatabank/lib/conneg.py +rdfdatabank/lib/doi_helper.py +rdfdatabank/lib/doi_schema.py +rdfdatabank/lib/file_unpack.py rdfdatabank/lib/helpers.py +rdfdatabank/lib/htpasswd.py +rdfdatabank/lib/ident_md.py +rdfdatabank/lib/search_term.py +rdfdatabank/lib/short_pid.py +rdfdatabank/lib/utils.py rdfdatabank/model/__init__.py -rdfdatabank/public/bg.png -rdfdatabank/public/favicon.ico -rdfdatabank/public/index.html -rdfdatabank/public/pylons-logo.gif +rdfdatabank/public/static/databank_logo.png +rdfdatabank/public/static/databank_logo_generic.png +rdfdatabank/public/static/jquery.js +rdfdatabank/public/static/style.css +rdfdatabank/public/static/js/html5.js +rdfdatabank/public/static/json_data/DatasetStateInfo-dataset1-version0.txt +rdfdatabank/public/static/json_data/DatasetStateInfo-dataset1-version1.txt +rdfdatabank/public/static/json_data/DatasetStateInfo-dataset2.txt +rdfdatabank/public/static/json_data/SiloStateInfo.txt +rdfdatabank/public/static/json_data/adminInformation.txt +rdfdatabank/public/static/json_data/adminInformationForSilo.txt +rdfdatabank/public/static/json_data/datasetInformation-version0.txt +rdfdatabank/public/static/json_data/datasetInformation-version1.txt +rdfdatabank/public/static/json_data/datasetInformation.txt +rdfdatabank/public/static/json_data/datasetSubdirInformation-version1.txt +rdfdatabank/public/static/json_data/datasetSubdirInformation-version3.txt +rdfdatabank/public/static/json_data/datasetSubdirInformation.txt +rdfdatabank/public/static/json_data/datasetsInSiloInformation.txt +rdfdatabank/public/static/json_data/itemInformationForDataset-old.txt +rdfdatabank/public/static/json_data/itemInformationForDataset.txt +rdfdatabank/public/static/json_data/itemInformationForZipFileinDataset.txt +rdfdatabank/public/static/json_data/siloInformation.txt +rdfdatabank/public/static/json_data/silos.txt +rdfdatabank/public/static/styles/basic.css +rdfdatabank/public/static/styles/chimpanzee.css +rdfdatabank/public/static/styles/ie.css +rdfdatabank/public/static/styles/marmoset.css +rdfdatabank/public/static/styles/print.css +rdfdatabank/public/static/styles/reset.css +rdfdatabank/public/static/styles/silverback.css +rdfdatabank/public/static/styles/squirrelMonkey.css +rdfdatabank/public/static/styles/images/blkdiamond.gif +rdfdatabank/public/static/styles/images/blksquare.gif +rdfdatabank/public/static/styles/images/csv.png +rdfdatabank/public/static/styles/images/delete-icon-24.png +rdfdatabank/public/static/styles/images/down_arrow.png +rdfdatabank/public/static/styles/images/down_arrow_black.png +rdfdatabank/public/static/styles/images/down_arrow_blue.png +rdfdatabank/public/static/styles/images/file-add-icon-24.png +rdfdatabank/public/static/styles/images/file-new-icon-24.png +rdfdatabank/public/static/styles/images/fminus.png +rdfdatabank/public/static/styles/images/fplus.png +rdfdatabank/public/static/styles/images/go-up-icon-24.png +rdfdatabank/public/static/styles/images/help-icon-16.png +rdfdatabank/public/static/styles/images/help-icon-24.png +rdfdatabank/public/static/styles/images/info-icon-16.png +rdfdatabank/public/static/styles/images/json.png +rdfdatabank/public/static/styles/images/link.png +rdfdatabank/public/static/styles/images/page-edit-icon-24.png +rdfdatabank/public/static/styles/images/state-icon-24.png +rdfdatabank/public/static/styles/images/unzip-icon-24.png +rdfdatabank/public/static/styles/images/unzip-icon-32.png +rdfdatabank/public/static/styles/images/up_arrow.png +rdfdatabank/public/static/styles/images/up_arrow_black.png +rdfdatabank/public/static/styles/images/up_arrow_blue.png +rdfdatabank/public/static/styles/images/icons/breadcrumb-arrow.png +rdfdatabank/templates/about.html +rdfdatabank/templates/admin_api.html +rdfdatabank/templates/admin_siloview.html +rdfdatabank/templates/admin_user.html +rdfdatabank/templates/admin_users.html +rdfdatabank/templates/alter_silo.html +rdfdatabank/templates/api.html +rdfdatabank/templates/atom_results.html +rdfdatabank/templates/base.html +rdfdatabank/templates/create_doi.html +rdfdatabank/templates/create_new_item.html +rdfdatabank/templates/create_new_silo.html +rdfdatabank/templates/datasets_api.html +rdfdatabank/templates/datasetview.html +rdfdatabank/templates/datasetview_version.html +rdfdatabank/templates/delete_item.html +rdfdatabank/templates/doiview.html +rdfdatabank/templates/embargo_form.html +rdfdatabank/templates/file_upload.html +rdfdatabank/templates/files_unpack.html +rdfdatabank/templates/files_unpack2.html +rdfdatabank/templates/footer.html +rdfdatabank/templates/header.html +rdfdatabank/templates/home.html +rdfdatabank/templates/item_file_upload.html +rdfdatabank/templates/items_api.html +rdfdatabank/templates/itemview.html +rdfdatabank/templates/itemview_version.html +rdfdatabank/templates/keywords.html +rdfdatabank/templates/list_of_datasets.html +rdfdatabank/templates/list_of_silos.html +rdfdatabank/templates/list_of_zipfiles.html +rdfdatabank/templates/login.html +rdfdatabank/templates/logout.html +rdfdatabank/templates/part_list.html +rdfdatabank/templates/part_list_display.html +rdfdatabank/templates/raw_search.html +rdfdatabank/templates/rdf_manifest.html +rdfdatabank/templates/rdf_manifest_form.html +rdfdatabank/templates/readme_section.html +rdfdatabank/templates/register_new_user.html +rdfdatabank/templates/search.html +rdfdatabank/templates/search_advanced.html +rdfdatabank/templates/search_form.html +rdfdatabank/templates/search_response_display.html +rdfdatabank/templates/searching.html +rdfdatabank/templates/silo_admin.html +rdfdatabank/templates/silo_metadata.html +rdfdatabank/templates/silos_api.html +rdfdatabank/templates/siloview.html +rdfdatabank/templates/states_api.html +rdfdatabank/templates/update_user.html +rdfdatabank/templates/zipfilesubitemview.html +rdfdatabank/templates/zipfileview.html +rdfdatabank/tests/RDFDatabankConfig-Jenkins.py +rdfdatabank/tests/RDFDatabankConfig.py +rdfdatabank/tests/TestAdmin.py +rdfdatabank/tests/TestSubmission.py +rdfdatabank/tests/TestSubmission_load.py +rdfdatabank/tests/TestSubmission_submitter.py rdfdatabank/tests/__init__.py -rdfdatabank/tests/test_models.py -rdfdatabank/tests/functional/__init__.py \ No newline at end of file +rdfdatabank/tests/pylons_init.py +rdfdatabank/tests/testlib/SparqlQueryTestCase.py +rdfdatabank/tests/testlib/TestUtils.py +rdfdatabank/tests/testlib/__init__.py \ No newline at end of file diff --git a/rdfdatabank.egg-info/requires.txt b/rdfdatabank.egg-info/requires.txt index a6822b7..7e42a3a 100644 --- a/rdfdatabank.egg-info/requires.txt +++ b/rdfdatabank.egg-info/requires.txt @@ -1 +1,10 @@ -Pylons>=0.9.7 \ No newline at end of file +Pylons>=0.9.7 +pairtree>=0.5.6-T +recordsilo +redis +repoze.who>=2.0a4 +repoze.who_friendlyform +solrpy +lxml +rdflib==2.4.2 +python-dateutil>=1.4.1 diff --git a/rdfdatabank/config/environment.py b/rdfdatabank/config/environment.py index f7c75cc..d2d1528 100644 --- a/rdfdatabank/config/environment.py +++ b/rdfdatabank/config/environment.py @@ -1,5 +1,29 @@ #-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + """Pylons environment configuration""" + import os from mako.lookup import TemplateLookup diff --git a/rdfdatabank/config/middleware.py b/rdfdatabank/config/middleware.py index d65d79e..ae99e76 100644 --- a/rdfdatabank/config/middleware.py +++ b/rdfdatabank/config/middleware.py @@ -1,4 +1,27 @@ #-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + """Pylons middleware initialization""" #from paste import httpexceptions diff --git a/rdfdatabank/config/namespaces.py b/rdfdatabank/config/namespaces.py new file mode 100644 index 0000000..cbfd32f --- /dev/null +++ b/rdfdatabank/config/namespaces.py @@ -0,0 +1,23 @@ +from rdflib import Namespace + +NAMESPACES = {} +NAMESPACES['rdf'] = Namespace(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#') +NAMESPACES['rdfs'] = Namespace(u'http://www.w3.org/2000/01/rdf-schema#') +NAMESPACES['dc'] = Namespace(u'http://purl.org/dc/elements/1.1/') +NAMESPACES['dcterms'] = Namespace(u'http://purl.org/dc/terms/') +NAMESPACES['foaf'] = Namespace(u'http://xmlns.com/foaf/0.1/') +NAMESPACES['oxds'] = Namespace(u'http://vocab.ox.ac.uk/dataset/schema#') +NAMESPACES['ore'] = Namespace(u'http://www.openarchives.org/ore/terms/') +NAMESPACES['bibo'] = Namespace(u'http://purl.org/ontology/bibo/') + +PREFIXES = {} +PREFIXES['http://www.w3.org/1999/02/22-rdf-syntax-ns#'] = 'rdf' +PREFIXES['http://www.w3.org/2000/01/rdf-schema#'] = 'rdfs' +PREFIXES['http://purl.org/dc/elements/1.1/'] = 'dc' +PREFIXES['http://purl.org/dc/terms/'] = 'dcterms' +PREFIXES['http://xmlns.com/foaf/0.1/'] = 'foaf' +PREFIXES['http://vocab.ox.ac.uk/dataset/schema#'] = 'oxds' +PREFIXES['http://www.openarchives.org/ore/terms/'] = 'ore' +PREFIXES['http://purl.org/ontology/bibo/'] = 'bibo' + + diff --git a/rdfdatabank/config/routing.py b/rdfdatabank/config/routing.py index dbf940d..55ab02a 100644 --- a/rdfdatabank/config/routing.py +++ b/rdfdatabank/config/routing.py @@ -1,4 +1,27 @@ #-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + """Routes configuration The more specific and detailed routes should be defined first so they @@ -21,14 +44,10 @@ def make_map(): # CUSTOM ROUTES HERE - #map.redirect("/", "/silos") map.redirect('/*(url)/', '/{url}', _redirect_code='301 Moved Permanently') - #Special controller to redirect datasets from databank.ouls to databank.ora - map.connect('/objects/{id}', controller='redirect', action='index') - - map.connect("/login", controller='account', action='login') + #Special controller to redirect datasets from databank.ouls to databank.ora map.connect('/objects/{id}', controller='redirect', action='index') map.connect("/login", controller='account', action='login') map.connect("/logout", controller='account', action='logout') map.connect("/welcome", controller='account', action='welcome') @@ -36,15 +55,18 @@ def make_map(): map.connect('/api', controller='api', action='index') map.connect('/api/{api_name}', controller='api', action='apiview') + map.connect('/keywords', controller='keywords', action='index') + map.connect('/about', controller='about', action='index') + map.connect('/searching', controller='searching', action='index') + map.connect('/admin', controller='admin', action='index') + map.connect('/silos', controller='silos', action='index') + map.connect('/{silo}', controller='silos', action='siloview') + map.connect('/{silo_name}/admin', controller='admin', action='archive') map.connect('/{silo_name}/register', controller='admin', action='register') - map.connect('/{silo_name}/users', controller='users', action='index') map.connect('/{silo_name}/users/{username}', controller='users', action='userview') - - map.connect('/silos', controller='silos', action='index') - map.connect('/{silo}', controller='silos', action='siloview') map.connect('/{silo}/datasets', controller='datasets', action='siloview') map.connect('/{silo}/datasets/{id}', controller='datasets', action='datasetview') diff --git a/rdfdatabank/config/users-default.py b/rdfdatabank/config/users-default.py index ce85c7c..2c25dac 100644 --- a/rdfdatabank/config/users-default.py +++ b/rdfdatabank/config/users-default.py @@ -1,2 +1,35 @@ #-*- coding: utf-8 -*- -_USERS = {'admin': {'owner': '*', 'first_name': 'Databank', 'last_name': 'Admin', 'role': 'admin'}, 'sandbox_user': {'owner': ['sandbox'], 'role': 'user', 'name': 'Sandbox user', 'description': 'User for silo Sandbox'}} +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +_USERS = { +'admin': {'owner': '*', 'first_name': 'Databank', 'last_name': 'Admin', 'role': 'admin', 'description': 'Admin for all silos'}, +'admin2': {'owner': ['sandbox'], 'first_name': 'Databank', 'last_name': 'Admin-2', 'role': 'admin', 'description': 'Admin for silo Sandbox'}, +'admin3': {'owner': ['sandbox2'], 'first_name': 'Databank', 'last_name': 'Admin-3', 'role': 'admin', 'description': 'Admin for silo Sandbox2'}, +'sandbox_user': {'owner': ['sandbox'], 'role': 'user', 'name': 'Sandbox user', 'description': 'User for silo Sandbox'}, +'sandbox_user2': {'owner': ['sandbox'], 'role': 'user', 'name': 'Sandbox user-2', 'description': 'User for silo Sandbox'}, +'sandbox_user3': {'owner': ['sandbox2'], 'role': 'user', 'name': 'Sandbox user-3', 'description': 'User for silo Sandbox2'}, +'sandbox_manager': {'owner': ['sandbox'], 'role': 'manager', 'name': 'Sandbox manager', 'description': 'Manager for silo Sandbox'}, +'sandbox_manager2': {'owner': ['sandbox'], 'role': 'manager', 'name': 'Sandbox manager-2', 'description': 'Manager for silo Sandbox'}, +'sandbox_manager3': {'owner': ['sandbox2'], 'role': 'manager', 'name': 'Sandbox manager-3', 'description': 'Manager for silo Sandbox2'} +} diff --git a/rdfdatabank/controllers/about.py b/rdfdatabank/controllers/about.py new file mode 100644 index 0000000..b40290f --- /dev/null +++ b/rdfdatabank/controllers/about.py @@ -0,0 +1,31 @@ +#-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import logging + +from rdfdatabank.lib.base import BaseController, render + +class AboutController(BaseController): + def index(self): + return render('/about.html') diff --git a/rdfdatabank/controllers/account.py b/rdfdatabank/controllers/account.py index 230efa4..063d4f2 100644 --- a/rdfdatabank/controllers/account.py +++ b/rdfdatabank/controllers/account.py @@ -1,4 +1,27 @@ #-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + from pylons import url from pylons import request, response, session, tmpl_context as c, url, app_globals as ag from rdfdatabank.lib.base import BaseController, render diff --git a/rdfdatabank/controllers/admin.py b/rdfdatabank/controllers/admin.py index 50f6d57..0f97a15 100644 --- a/rdfdatabank/controllers/admin.py +++ b/rdfdatabank/controllers/admin.py @@ -1,4 +1,27 @@ #-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging import simplejson from pylons import request, response, session, config, tmpl_context as c, url @@ -138,12 +161,12 @@ def archive(self, silo_name): #c.granary_list = ag.granary.silos c.silo_name = silo_name # Admin only - if not ident.get('role') == "admin": + if not ident.get('role') in ["admin", "manager"]: abort(403, "Do not have admin credentials") if ident.get('role') == "admin": c.roles = ["admin", "manager", "user"] else: - c.roles = ["admin", "manager"] + c.roles = ["manager", "user"] granary_list = ag.granary.silos silos = ag.authz(granary_list, ident) if not silo_name in silos: @@ -317,11 +340,17 @@ def archive(self, silo_name): # and then remove the silo todelete_silo = ag.granary.get_rdf_silo(silo_name) for item in todelete_silo.list_items(): - ag.b.deletion(silo_name, item, ident=ident['repoze.who.userid']) + try: + ag.b.deletion(silo_name, item, ident=ident['repoze.who.userid']) + except: + pass ag.granary.delete_silo(silo_name) + try: + ag.b.silo_deletion(silo_name, ident=ident['repoze.who.userid']) + except: + pass - ag.b.silo_deletion(silo_name, ident=ident['repoze.who.userid']) try: del ag.granary.state[silo_name] except: diff --git a/rdfdatabank/controllers/api.py b/rdfdatabank/controllers/api.py index 204d605..ab8a779 100644 --- a/rdfdatabank/controllers/api.py +++ b/rdfdatabank/controllers/api.py @@ -1,4 +1,27 @@ #-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging from pylons import request, response, session, tmpl_context as c, url diff --git a/rdfdatabank/controllers/datasets.py b/rdfdatabank/controllers/datasets.py index 1b96b05..bbbff7d 100644 --- a/rdfdatabank/controllers/datasets.py +++ b/rdfdatabank/controllers/datasets.py @@ -1,4 +1,27 @@ #-*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging import re, os, shutil, codecs import simplejson @@ -12,7 +35,8 @@ from pylons.decorators import rest from paste.fileapp import FileApp from rdfdatabank.lib.base import BaseController, render -from rdfdatabank.lib.utils import create_new, is_embargoed, get_readme_text, test_rdf, munge_manifest, serialisable_stat, allowable_id2, get_embargo_values, get_rdf_template +from rdfdatabank.lib.utils import create_new, get_readme_text, serialisable_stat, allowable_id2, natural_sort +from rdfdatabank.lib.utils import is_embargoed, test_rdf, munge_manifest, get_embargo_values, get_rdf_template, extract_metadata from rdfdatabank.lib.file_unpack import get_zipfiles_in_dataset from rdfdatabank.lib.conneg import MimeType as MT, parse as conneg_parse @@ -27,9 +51,6 @@ def siloview(self, silo): abort(404) c.silo_name = silo granary_list = ag.granary.silos - #f = open('/tmp/ds.log', 'a') - #f.write(str(granary_list)) - #f.close() ident = request.environ.get('repoze.who.identity') c.ident = ident @@ -118,7 +139,10 @@ def siloview(self, silo): item = create_new(c_silo, id, ident['repoze.who.userid'], **params) # Broadcast change as message - ag.b.creation(silo, id, ident=ident['repoze.who.userid']) + try: + ag.b.creation(silo, id, ident=ident['repoze.who.userid']) + except: + pass # conneg return accept_list = None @@ -244,6 +268,10 @@ def datasetview(self, silo, id): c.embargos[id] = is_embargoed(c_silo, id) c.parts = item.list_parts(detailed=True) c.manifest_pretty = item.rdf_to_string(format="pretty-xml") + c.metadata = None + c.metadata = extract_metadata(item) + c.versions = item.manifest['versions'] + c.versions = natural_sort(c.versions) #c.manifest = item.rdf_to_string() c.manifest = get_rdf_template(item.uri, id) c.zipfiles = get_zipfiles_in_dataset(item) @@ -329,7 +357,10 @@ def datasetview(self, silo, id): item = create_new(c_silo, id, ident['repoze.who.userid'], **params) # Broadcast change as message - ag.b.creation(silo, id, ident=ident['repoze.who.userid']) + try: + ag.b.creation(silo, id, ident=ident['repoze.who.userid']) + except: + pass # conneg return accept_list = None @@ -379,24 +410,35 @@ def datasetview(self, silo, id): e, e_d = get_embargo_values(embargoed=params['embargoed'], embargo_days_from_now=params['embargo_days_from_now']) else: e, e_d = get_embargo_values(embargoed=params['embargoed']) - item.metadata['embargoed_until'] = '' item.del_triple(item.uri, u"oxds:isEmbargoed") item.del_triple(item.uri, u"oxds:embargoedUntil") - ag.r.set("%s:%s:embargoed_until" % (c_silo.state['storage_dir'], id), ' ') + try: + ag.r.set("%s:%s:embargoed_until" % (c_silo.state['storage_dir'], id), ' ') + except: + pass if e: item.metadata['embargoed'] = True item.add_triple(item.uri, u"oxds:isEmbargoed", 'True') - ag.r.set("%s:%s:embargoed" % (c_silo.state['storage_dir'], id), True) + try: + ag.r.set("%s:%s:embargoed" % (c_silo.state['storage_dir'], id), True) + except: + pass if e_d: item.metadata['embargoed_until'] = e_d item.add_triple(item.uri, u"oxds:embargoedUntil", e_d) - ag.r.set("%s:%s:embargoed_until" % (c_silo.state['storage_dir'], id), e_d) + try: + ag.r.set("%s:%s:embargoed_until" % (c_silo.state['storage_dir'], id), e_d) + except: + pass else: item.metadata['embargoed'] = False item.add_triple(item.uri, u"oxds:isEmbargoed", 'False') - ag.r.set("%s:%s:embargoed" % (c_silo.state['storage_dir'], id), False) + try: + ag.r.set("%s:%s:embargoed" % (c_silo.state['storage_dir'], id), False) + except: + pass item.del_triple(item.uri, u"dcterms:modified") item.add_triple(item.uri, u"dcterms:modified", datetime.now()) @@ -496,13 +538,19 @@ def datasetview(self, silo, id): item.sync() if code == 201: - ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) + try: + ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) + except: + pass response.status = "201 Created" response.status_int = 201 response.headers["Content-Location"] = url(controller="datasets", action="itemview", id=id, silo=silo, path=filename) response_message = "201 Created. Added file %s to item %s" % (filename, id) else: - ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) + try: + ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) + except: + pass response.status = "204 Updated" response.status_int = 204 response_message = None @@ -589,13 +637,19 @@ def datasetview(self, silo, id): item.sync() if code == 201: - ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) + try: + ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) + except: + pass response.status = "201 Created" response.status_int = 201 response.headers["Content-Location"] = url(controller="datasets", action="datasetview", id=id, silo=silo) response_message = "201 Created. Added file %s to item %s" % (filename, id) else: - ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) + try: + ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) + except: + pass response.status = "204 Updated" response.status_int = 204 response_message = None @@ -642,7 +696,10 @@ def datasetview(self, silo, id): c_silo.del_item(id) # Broadcast deletion - ag.b.deletion(silo, id, ident=ident['repoze.who.userid']) + try: + ag.b.deletion(silo, id, ident=ident['repoze.who.userid']) + except: + pass response.content_type = "text/plain" response.status_int = 200 @@ -853,6 +910,8 @@ def itemview(self, silo, id, path): return fileserve_app(request.environ, self.start_response) elif item.isdir(path): #c.parts = item.list_parts(detailed=True) + c.versions = item.manifest['versions'] + c.versions = natural_sort(c.versions) c.parts = item.list_parts(path, detailed=True) c.readme_text = None if "README" in c.parts.keys(): @@ -940,13 +999,19 @@ def itemview(self, silo, id, path): item.sync() if code == 201: - ag.b.creation(silo, id, path, ident=ident['repoze.who.userid']) + try: + ag.b.creation(silo, id, path, ident=ident['repoze.who.userid']) + except: + pass response.status = "201 Created" response.status_int = 201 response.headers["Content-Location"] = url(controller="datasets", action="itemview", id=id, silo=silo, path=path) response_message = "201 Created" else: - ag.b.change(silo, id, path, ident=ident['repoze.who.userid']) + try: + ag.b.change(silo, id, path, ident=ident['repoze.who.userid']) + except: + pass response.status = "204 Updated" response.status_int = 204 response_message = None @@ -1036,13 +1101,19 @@ def itemview(self, silo, id, path): item.sync() if code == 201: - ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) + try: + ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) + except: + pass response.status = "201 Created" response.status_int = 201 response.headers["Content-Location"] = url(controller="datasets", action="itemview", id=id, silo=silo, path=path) response_message = "201 Created" else: - ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) + try: + ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) + except: + pass response.status = "204 Updated" response.status_int = 204 response_message = None @@ -1089,7 +1160,10 @@ def itemview(self, silo, id, path): item.del_triple(item.uri, u"oxds:currentVersion") item.add_triple(item.uri, u"oxds:currentVersion", item.currentversion) item.sync() - ag.b.deletion(silo, id, path, ident=ident['repoze.who.userid']) + try: + ag.b.deletion(silo, id, path, ident=ident['repoze.who.userid']) + except: + pass response.content_type = "text/plain" response.status_int = 200 response.status = "200 OK" @@ -1102,7 +1176,10 @@ def itemview(self, silo, id, path): item.del_triple(item.uri, u"dcterms:modified") item.add_triple(item.uri, u"dcterms:modified", datetime.now()) item.sync() - ag.b.deletion(silo, id, path, ident=ident['repoze.who.userid']) + try: + ag.b.deletion(silo, id, path, ident=ident['repoze.who.userid']) + except: + pass response.content_type = "text/plain" response.status_int = 200 response.status = "200 OK" diff --git a/rdfdatabank/controllers/datasets_log.py b/rdfdatabank/controllers/datasets_log.py deleted file mode 100644 index e116dde..0000000 --- a/rdfdatabank/controllers/datasets_log.py +++ /dev/null @@ -1,1237 +0,0 @@ -#-*- coding: utf-8 -*- -import logging -import re, os, shutil -import simplejson -from datetime import datetime, timedelta -import time - -from pylons import request, response, session, tmpl_context as c, url, app_globals as ag -from pylons.controllers.util import abort, redirect_to -from pylons.decorators import rest -from paste.fileapp import FileApp -from rdfdatabank.lib.base import BaseController, render -from rdfdatabank.lib.utils import create_new, is_embargoed, get_readme_text, test_rdf, munge_manifest, manifest_type, serialisable_stat, allowable_id2 -from rdfdatabank.lib.file_unpack import get_zipfiles_in_dataset -from rdfdatabank.lib.conneg import MimeType as MT, parse as conneg_parse - -JAILBREAK = re.compile("[\/]*\.\.[\/]*") - -log = logging.getLogger(__name__) - -class DatasetsController(BaseController): - @rest.restrict('GET', 'POST') - def siloview(self, silo): - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - ident = request.environ.get('repoze.who.identity') - c.ident = ident - granary_list = ag.granary.silos - silos = ag.authz(granary_list, ident) - if silo not in silos: - abort(403, "Forbidden") - - c.silo_name = silo - c_silo = ag.granary.get_rdf_silo(silo) - - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - hr = "-"*80 + '\n' - f.write(hr) - f.write("%s :: datasets - siloview : silo=%s\n"%(str(datetime.now()), silo)) - - http_method = request.environ['REQUEST_METHOD'] - - f.write("Http method = %s\n"%http_method) - f.close() - - if http_method == "GET": - c.embargos = {} - for item in c_silo.list_items(): - c.embargos[item] = is_embargoed(c_silo, item) - #c.items = c_silo.list_items() - c.items = c.embargos.keys() - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - return render('/siloview.html') - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = 'application/json; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - return simplejson.dumps(c.embargos) - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops nothing satisfies - return text/html - return render('/siloview.html') - elif http_method == "POST": - params = request.POST - if params.has_key("id"): - if c_silo.exists(params['id']): - response.content_type = "text/plain" - response.status_int = 409 - response.status = "409 Conflict: Dataset Already Exists" - return "Dataset Already Exists" - else: - # Supported params: - # id, title, embargoed, embargoed_until, embargo_days_from_now - id = params['id'] - if not allowable_id2(id): - response.content_type = "text/plain" - response.status_int = 403 - response.status = "403 Forbidden" - return "Dataset name can contain only the following characters - %s and has to be more than 1 character"%ag.naming_rule - del params['id'] - item = create_new(c_silo, id, ident['repoze.who.userid'], **params) - - # Broadcast change as message - ag.b.creation(silo, id, ident=ident['repoze.who.userid']) - - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - redirect_to(controller="datasets", action="datasetview", silo=silo, id=id) - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = "text/plain" - response.status_int = 201 - response.status = "201 Created" - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", silo=silo, id=id) - return "201 Created" - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - # Whoops - nothing satisfies - return text/plain - response.content_type = "text/plain" - response.status_int = 201 - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", silo=silo, id=id) - response.status = "201 Created" - return "201 Created" - - @rest.restrict('GET', 'POST', 'DELETE') - def datasetview(self, silo, id): - # Check to see if embargo is on: - c.silo_name = silo - c.id = id - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - hr = "-"*80 + '\n' - f.write(hr) - f.write("%s :: datasets - datasetview : silo=%s, id=%s\n"%(str(datetime.now()), silo, id)) - - http_method = request.environ['REQUEST_METHOD'] - f.write("Http method = %s\n"%http_method) - - # -- Step 1 ----------------------------- - tic1 = time.mktime(time.gmtime()) - c_silo = ag.granary.get_rdf_silo(silo) - toc = time.mktime(time.gmtime()) - f.write("1. Get rdf silo: %d\n"%(toc-tic1)) - f.close() - - c.editor = False - c.version = None - - # -- Step 2 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - tic = time.mktime(time.gmtime()) - if not (http_method == "GET"): - #identity management of item - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - ident = request.environ.get('repoze.who.identity') - c.ident = ident - granary_list = ag.granary.silos - silos = ag.authz(granary_list, ident) - if silo not in silos: - abort(403, "Forbidden") - c.editor = silo in silos - elif http_method == "GET": - if not c_silo.exists(id): - abort(404) - item = c_silo.get_item(id) - embargoed = False - if item.metadata.get('embargoed') not in ["false", 0, False]: - embargoed = True - granary_list = ag.granary.silos - if embargoed: - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - ident = request.environ.get('repoze.who.identity') - silos = ag.authz(granary_list, ident) - if silo not in silos: - abort(403, "Forbidden") - c.editor = silo in silos - ident = request.environ.get('repoze.who.identity') - c.ident = ident - if ident: - silos = ag.authz(granary_list, ident) - c.editor = silo in silos - toc = time.mktime(time.gmtime()) - f.write("2. Authentication: %d\n"%(toc-tic)) - f.close() - - # Method determination - if http_method == "GET": - # -- Step 3 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - tic = time.mktime(time.gmtime()) - c.embargos = {} - c.embargos[id] = is_embargoed(c_silo, id) - toc = time.mktime(time.gmtime()) - f.write("3. Embargo information: %d\n"%(toc-tic)) - f.close() - - # -- Step 4 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - tic = time.mktime(time.gmtime()) - c.parts = item.list_parts(detailed=True) - toc = time.mktime(time.gmtime()) - f.write("4. Detailed file stats: %d\n"%(toc-tic)) - f.close() - - # -- Step 5 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - tic = time.mktime(time.gmtime()) - c.manifest_pretty = item.rdf_to_string(format="pretty-xml") - toc = time.mktime(time.gmtime()) - f.write("5. Pretty manifest: %d\n"%(toc-tic)) - f.close() - - # -- Step 6 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - tic = time.mktime(time.gmtime()) - c.manifest = item.rdf_to_string() - toc = time.mktime(time.gmtime()) - f.write("6. Manifest: %d\n"%(toc-tic)) - f.close() - - # -- Step 7 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - tic = time.mktime(time.gmtime()) - c.zipfiles = get_zipfiles_in_dataset(item) - toc = time.mktime(time.gmtime()) - f.write("7. List of zipfiles: %d\n"%(toc-tic)) - f.close() - - # -- Step 8 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - tic = time.mktime(time.gmtime()) - c.readme_text = None - #if item.isfile("README"): - if "README" in c.parts.keys(): - c.readme_text = get_readme_text(item) - #if item.manifest: - # state = item.manifest.state - toc = time.mktime(time.gmtime()) - f.write("8. Readme Text: %d\n"%(toc-tic)) - f.close() - - # View options - options = request.GET - if "view" in options: - c.view = options['view'] - elif c.editor: - c.view = 'editor' - else: - c.view = 'user' - - # conneg: - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - # ------------------------------- - while(mimetype): - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Trying MIME type %s\n"%mimetype) - f.close() - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/html, text/xhtml\n") - f.close() - return render('/datasetview.html') - elif str(mimetype).lower() in ["text/plain", "application/json"]: - # -- Step 9 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - tic = time.mktime(time.gmtime()) - response.content_type = 'application/json; charset="UTF-8"' - returndata = {} - returndata['embargos'] = c.embargos - returndata['view'] = c.view - returndata['editor'] = c.editor - returndata['parts'] = {} - for part in c.parts: - returndata['parts'][part] = serialisable_stat(c.parts[part]) - returndata['readme_text'] = c.readme_text - returndata['manifest_pretty'] = c.manifest_pretty - returndata['manifest'] = c.manifest - returndata['zipfiles'] = c.zipfiles - #items['state'] = state - toc = time.mktime(time.gmtime()) - f.write("9. Accumulate JSON data: %d\n"%(toc-tic)) - #f.write("Data returned : \n %s\n\n"%str(returndata)) - f.write("--END-- Data returned for application/json, text/plain\n") - f.close() - response.status_int = 200 - response.status = "200 OK" - return simplejson.dumps(returndata) - elif str(mimetype).lower() in ["application/rdf+xml", "text/xml"]: - # -- Step 9 ----------------------------- - response.status_int = 200 - response.status = "200 OK" - response.content_type = 'application/rdf+xml; charset="UTF-8"' - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Data returned for application/rdf+xml, text/xml\n") - #f.write(c.manifest_pretty + '\n') - f.close() - return c.manifest_pretty - elif str(mimetype).lower() == "text/rdf+n3": - response.content_type = 'text/rdf+n3; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/rdf+n3\n") - f.close() - return item.rdf_to_string(format="n3") - elif str(mimetype).lower() == "application/x-turtle": - response.content_type = 'application/x-turtle; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for application/x-turtle\n") - f.close() - return item.rdf_to_string(format="turtle") - elif str(mimetype).lower() in ["text/rdf+ntriples", "text/rdf+nt"]: - response.content_type = 'text/rdf+ntriples; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/rdf+ntriples, text/rdf+nt\n") - f.close() - return item.rdf_to_string(format="nt") - # Whoops - nothing satisfies - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing staisfies - default to text/html - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for Default (text/html)\n") - f.close() - return render('/datasetview.html') - elif http_method == "POST" and c.editor: - params = request.POST - if not c_silo.exists(id): - if not allowable_id2(id): - response.content_type = "text/plain" - response.status_int = 403 - response.status = "403 Forbidden" - return "Dataset name can contain only the following characters - %s and has to be more than 1 character"%ag.naming_rule - if 'id' in params.keys(): - del params['id'] - item = create_new(c_silo, id, ident['repoze.who.userid'], **params) - - # Broadcast change as message - ag.b.creation(silo, id, ident=ident['repoze.who.userid']) - - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Trying MIME type %s\n"%mimetype) - f.close() - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/html, text/xhtml\n") - f.close() - redirect_to(controller="datasets", action="datasetview", silo=silo, id=id) - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = "text/plain" - response.status_int = 201 - response.status = "201 Created" - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", silo=silo, id=id) - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/plain, application/json\n") - f.close() - return "201 Created" - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - # Whoops - nothing satisfies - return text/plain - response.content_type = "text/plain" - response.status_int = 201 - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", silo=silo, id=id) - response.status = "201 Created" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for default (text/plain)\n") - f.close() - return "201 Created" - elif params.has_key('embargo_change'): - item = c_silo.get_item(id) - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - if params.has_key('embargoed'): - if params.has_key('embargoed_until') and params['embargoed_until']: - embargoed_until_date = params['embargoed_until'] - elif params.has_key('embargo_days_from_now') and params['embargo_days_from_now']: - embargoed_until_date = (datetime.now() + timedelta(days=params['embargo_days_from_now'])).isoformat() - else: - embargoed_until_date = (datetime.now() + timedelta(days=365*70)).isoformat() - item.metadata['embargoed'] = True - item.metadata['embargoed_until'] = embargoed_until_date - item.del_triple(item.uri, u"oxds:isEmbargoed") - item.del_triple(item.uri, u"oxds:embargoedUntil") - item.add_triple(item.uri, u"oxds:isEmbargoed", 'True') - item.add_triple(item.uri, u"oxds:embargoedUntil", embargoed_until_date) - else: - #if is_embargoed(c_silo, id)[0] == True: - item.metadata['embargoed'] = False - item.metadata['embargoed_until'] = '' - item.del_triple(item.uri, u"oxds:isEmbargoed") - item.del_triple(item.uri, u"oxds:embargoedUntil") - item.add_triple(item.uri, u"oxds:isEmbargoed", 'False') - item.del_triple(item.uri, u"dcterms:modified") - item.add_triple(item.uri, u"dcterms:modified", datetime.now()) - item.del_triple(item.uri, u"oxds:currentVersion") - item.add_triple(item.uri, u"oxds:currentVersion", item.currentversion) - item.sync() - item.sync() - e, e_d = is_embargoed(c_silo, id, refresh=True) - - # Broadcast change as message - ag.b.embargo_change(silo, id, item.metadata['embargoed'], item.metadata['embargoed_until'], ident=ident['repoze.who.userid']) - - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Trying MIME type %s\n"%mimetype) - f.close() - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/html, text/xhtml\n") - f.close() - redirect_to(controller="datasets", action="datasetview", id=id, silo=silo) - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = "text/plain" - response.status_int = 204 - response.status = "204 Updated" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/plain, application/json\n") - f.close() - return - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing satisfies - return text / plain - response.content_type = "text/plain" - response.status_int = 204 - response.status = "204 Updated" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for default (text/plain)\n") - f.close() - return - elif params.has_key('file'): - # File upload by a not-too-savvy method - Service-orientated fallback: - # Assume file upload to 'filename' - params = request.POST - item = c_silo.get_item(id) - filename = params.get('filename') - if not filename: - filename = params['file'].filename - upload = params.get('file') - if JAILBREAK.search(filename) != None: - abort(400, "'..' cannot be used in the path or as a filename") - target_path = filename - - if item.isfile(target_path): - code = 204 - elif item.isdir(target_path): - response.content_type = "text/plain" - response.status_int = 403 - response.status = "403 Forbidden" - return "Cannot POST a file on to an existing directory" - else: - code = 201 - - if filename == "manifest.rdf": - #Copy the uploaded file to a tmp area - mani_file = os.path.join('/tmp', filename.lstrip(os.sep)) - mani_file_obj = open(mani_file, 'w') - shutil.copyfileobj(upload.file, mani_file_obj) - upload.file.close() - mani_file_obj.close() - #test rdf file - mani_file_obj = open(mani_file, 'r') - manifest_str = mani_file_obj.read() - mani_file_obj.close() - if not test_rdf(manifest_str): - response.status_int = 400 - return "Bad manifest file" - #munge rdf - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - a = item.get_rdf_manifest() - b = a.to_string() - mtype = manifest_type(b) - if not mtype: - mtype = 'http://vocab.ox.ac.uk/dataset/schema#Grouping' - munge_manifest(manifest_str, item, manifest_type=mtype) - else: - if code == 204: - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf', filename]) - else: - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - item.put_stream(target_path, upload.file) - upload.file.close() - item.del_triple(item.uri, u"dcterms:modified") - item.add_triple(item.uri, u"dcterms:modified", datetime.now()) - item.del_triple(item.uri, u"oxds:currentVersion") - item.add_triple(item.uri, u"oxds:currentVersion", item.currentversion) - item.sync() - - if code == 201: - ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) - response.status = "201 Created" - response.status_int = 201 - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", id=id, silo=silo) - response_message = "201 Created. Added file %s to item %s" % (filename, id) - else: - ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) - response.status = "204 Updated" - response.status_int = 204 - response_message = None - - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Trying MIME type %s\n"%mimetype) - f.close() - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/html, text/xhtml\n") - f.close() - redirect_to(controller="datasets", action="datasetview", id=id, silo=silo) - elif str(mimetype).lower() in ["text/plain"]: - response.content_type = "text/plain" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/plain, application/json\n") - f.close() - return response_message - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing satisfies - return text / plain - response.content_type = "text/plain" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for default (text/plain)\n") - f.close() - return response_message - elif params.has_key('text'): - # Text upload convenience service - params = request.POST - item = c_silo.get_item(id) - filename = params.get('filename') - if not filename: - abort(406, "Must supply a filename") - - if JAILBREAK.search(filename) != None: - abort(400, "'..' cannot be used in the path or as a filename") - target_path = filename - - if item.isfile(target_path): - code = 204 - elif item.isdir(target_path): - response.content_type = "text/plain" - response.status_int = 403 - response.status = "403 forbidden" - return "Cannot POST a file on to an existing directory" - else: - code = 201 - - if filename == "manifest.rdf": - # valid to make sure it's valid RDF - # Otherwise this dataset will not be accessible - text = params['text'] - if not test_rdf(text): - abort(406, "Not able to parse RDF/XML") - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - a = item.get_rdf_manifest() - b = a.to_string() - mtype = manifest_type(b) - if not mtype: - mtype = 'http://vocab.ox.ac.uk/dataset/schema#Grouping' - munge_manifest(text, item, manifest_type=mtype) - else: - if code == 204: - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf', filename]) - else: - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - item.put_stream(target_path, params['text'].encode("utf-8")) - item.del_triple(item.uri, u"dcterms:modified") - item.add_triple(item.uri, u"dcterms:modified", datetime.now()) - item.del_triple(item.uri, u"oxds:currentVersion") - item.add_triple(item.uri, u"oxds:currentVersion", item.currentversion) - item.sync() - - if code == 201: - ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) - response.status = "201 Created" - response.status_int = 201 - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", id=id, silo=silo) - response_message = "201 Created. Added file %s to item %s" % (filename, id) - else: - ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) - response.status = "204 Updated" - response.status_int = 204 - response_message = None - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Trying MIME type %s\n"%mimetype) - f.close() - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/html, text/xhtml\n") - f.close() - redirect_to(controller="datasets", action="datasetview", id=id, silo=silo) - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = "text/plain" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for text/plain, application/json\n") - f.close() - return response_message - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing satisfies - return text / plain - response.content_type = "text/plain" - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("--END-- Data returned for default (text/plain)\n") - f.close() - return response_message - else: - response.content_type = "text/plain" - response.status_int = 403 - response.status = "403 Forbidden" - return "403 Forbidden" - elif http_method == "DELETE" and c.editor: - if c_silo.exists(id): - c_silo.del_item(id) - - # Broadcast deletion - ag.b.deletion(silo, id, ident=ident['repoze.who.userid']) - - response.content_type = "text/plain" - response.status_int = 200 - response.status = "200 OK" - return "{'ok':'true'}" # required for the JQuery magic delete to succede. - else: - abort(404) - - @rest.restrict('GET') - def datasetview_vnum(self, silo, id, vnum): - c.silo_name = silo - c.id = id - c_silo = ag.granary.get_rdf_silo(silo) - - if not c_silo.exists(id): - abort(404) - - item = c_silo.get_item(id) - vnum = str(vnum) - if not vnum in item.manifest['versions']: - abort(404) - #Set the item's version cursor - item.set_version_cursor(vnum) - c.version = vnum - - embargoed = False - c.editor = False - if item.metadata.get('embargoed') not in ["false", 0, False]: - embargoed = True - if embargoed: - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorized") - ident = request.environ.get('repoze.who.identity') - c.ident = ident - granary_list = ag.granary.silos - silos = ag.authz(granary_list, ident) - c.editor = silo in silos - elif request.environ.get('repoze.who.identity'): - ident = request.environ.get('repoze.who.identity') - c.ident = ident - granary_list = ag.granary.silos - silos = ag.authz(granary_list, ident) - c.editor = silo in silos - - # Check to see if embargo is on: - c.embargos = {} - c.embargos[id] = is_embargoed(c_silo, id) - c.readme_text = None - c.parts = item.list_parts(detailed=True) - c.manifest_pretty = item.rdf_to_string(format="pretty-xml") - if "README" in c.parts.keys(): - c.readme_text = get_readme_text(item) - - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - mimetype = accept_list.pop(0) - - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - return render('/datasetview_version.html') - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = 'application/json; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - returndata = {} - returndata['embargos'] = c.embargos - returndata['view'] = c.view - returndata['editor'] = c.editor - returndata['parts'] = {} - for part in c.parts: - returndata['parts'][part] = serialisable_stat(c.parts[part]) - returndata['readme_text'] = c.readme_text - returndata['manifest_pretty'] = c.manifest_pretty - return simplejson.dumps(items) - elif str(mimetype).lower() in ["application/rdf+xml", "text/xml"]: - response.content_type = 'application/rdf+xml; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - return c.manifest_pretty - elif str(mimetype).lower() == "text/rdf+n3": - response.content_type = 'text/rdf+n3; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - return item.rdf_to_string(format="n3") - elif str(mimetype).lower() == "application/x-turtle": - response.content_type = 'application/x-turtle; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - return item.rdf_to_string(format="turtle") - elif str(mimetype).lower() in ["text/rdf+ntriples", "text/rdf+nt"]: - response.content_type = 'text/rdf+ntriples; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - return item.rdf_to_string(format="nt") - # Whoops - nothing satisfies - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing staisfies - default to text/html - return render('/datasetview_version.html') - - @rest.restrict('GET', 'POST', 'PUT', 'DELETE') - def itemview(self, silo, id, path): - # Check to see if embargo is on: - c.silo_name = silo - c.id = id - c.version = None - c.path = path - c_silo = ag.granary.get_rdf_silo(silo) - - if not c_silo.exists(id): - # dataset doesn't exist yet... - # DECISION FOR POST / PUT : Auto-instantiate dataset and then put file there? - # or error out with perhaps a 404? - # Going with error out... - abort(404) - - embargoed = False - item = c_silo.get_item(id) - if item.metadata.get('embargoed') not in ["false", 0, False]: - embargoed = True - - http_method = request.environ['REQUEST_METHOD'] - - editor = False - granary_list = ag.granary.silos - if not (http_method == "GET"): - #identity management if item - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - ident = request.environ.get('repoze.who.identity') - c.ident = ident - silos = ag.authz(granary_list, ident) - if silo not in silos: - abort(403, "Forbidden") - editor = silo in silos - elif embargoed: - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - ident = request.environ.get('repoze.who.identity') - c.ident = ident - silos = ag.authz(granary_list, ident) - if silo not in silos: - abort(403, "Forbidden") - editor = silo in silos - ident = request.environ.get('repoze.who.identity') - c.ident = ident - if ident: - silos = ag.authz(granary_list, ident) - editor = silo in silos - - if http_method == "GET": - if item.isfile(path): - fileserve_app = FileApp(item.to_dirpath(path)) - return fileserve_app(request.environ, self.start_response) - elif item.isdir(path): - #c.parts = item.list_parts(detailed=True) - c.parts = item.list_parts(path, detailed=True) - c.readme_text = None - if "README" in c.parts.keys(): - c.readme_text = get_readme_text(item, "%s/README" % path) - - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - return render("/itemview.html") - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = 'application/json; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - returndata = {} - returndata['parts'] = {} - for part in c.parts: - returndata['parts'][part] = serialisable_stat(c.parts[part]) - returndata['readme_text'] = c.readme_text - return simplejson.dumps(returndata) - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing satisfies - return text/html - return render("/itemview.html") - else: - abort(404) - elif http_method == "PUT" and editor: - # Pylons loads the request body into request.body... - # This is not going to work for large files... ah well - # POST will handle large files as they are pushed to disc, - # but this won't - content = request.body - item = c_silo.get_item(id) - - if JAILBREAK.search(path) != None: - abort(400, "'..' cannot be used in the path") - - if item.isfile(path): - code = 204 - elif item.isdir(path): - response.content_type = "text/plain" - response.status_int = 403 - response.status = "403 Forbidden" - return "Cannot PUT a file on to an existing directory" - else: - code = 201 - - #Check if path is manifest.rdf - If, yes Munge - if "manifest.rdf" in path: - #test content is valid rdf - if not test_rdf(content): - response.status_int = 400 - return "Bad manifest file" - #munge rdf - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - a = item.get_rdf_manifest() - b = a.to_string() - mtype = manifest_type(b) - if not mtype: - mtype = 'http://vocab.ox.ac.uk/dataset/schema#Grouping' - munge_manifest(content, item, manifest_type=mtype) - else: - if code == 204: - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf', path]) - else: - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - item.put_stream(path, content) - item.del_triple(item.uri, u"dcterms:modified") - item.add_triple(item.uri, u"dcterms:modified", datetime.now()) - item.del_triple(item.uri, u"oxds:currentVersion") - item.add_triple(item.uri, u"oxds:currentVersion", item.currentversion) - item.sync() - - if code == 201: - ag.b.creation(silo, id, path, ident=ident['repoze.who.userid']) - response.status = "201 Created" - response.status_int = 201 - response.headers["Content-Location"] = url(controller="datasets", action="itemview", id=id, silo=silo, path=path) - response_message = "201 Created" - else: - ag.b.change(silo, id, path, ident=ident['repoze.who.userid']) - response.status = "204 Updated" - response.status_int = 204 - response_message = None - - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - redirect_to(controller="datasets", action="itemview", id=id, silo=silo, path=path) - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = "text/plain" - return response_message - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing satisfies - return text / plain - response.content_type = "text/plain" - return response_message - elif http_method == "POST" and editor: - # POST... differences from PUT: - # path = filepath that this acts on, should be dir, or non-existant - # if path is a file, this will revert to PUT's functionality and - # overwrite the file, if there is a multipart file uploaded - # Expected params: filename, file (uploaded file) - params = request.POST - item = c_silo.get_item(id) - filename = params.get('filename') - upload = params.get('file') - if JAILBREAK.search(filename) != None: - abort(400, "'..' cannot be used in the path or as a filename") - target_path = path - if item.isdir(path) and filename: - target_path = os.path.join(path, filename) - - if item.isfile(target_path): - code = 204 - elif item.isdir(target_path): - response.content_type = "text/plain" - response.status_int = 403 - response.status = "403 Forbidden" - return "Cannot POST a file on to an existing directory" - else: - code = 201 - - if filename == "manifest.rdf": - #Copy the uploaded file to a tmp area - mani_file = os.path.join('/tmp', filename.lstrip(os.sep)) - mani_file_obj = open(mani_file, 'w') - shutil.copyfileobj(upload.file, mani_file_obj) - upload.file.close() - mani_file_obj.close() - #test rdf file - mani_file_obj = open(mani_file, 'r') - manifest_str = mani_file_obj.read() - mani_file_obj.close() - if not test_rdf(manifest_str): - response.status_int = 400 - return "Bad manifest file" - #munge rdf - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - a = item.get_rdf_manifest() - b = a.to_string() - mtype = manifest_type(b) - if not mtype: - mtype = 'http://vocab.ox.ac.uk/dataset/schema#Grouping' - munge_manifest(manifest_str, item, manifest_type=mtype) - else: - if code == 204: - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf', filename]) - else: - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - item.put_stream(target_path, upload.file) - upload.file.close() - item.del_triple(item.uri, u"dcterms:modified") - item.add_triple(item.uri, u"dcterms:modified", datetime.now()) - item.del_triple(item.uri, u"oxds:currentVersion") - item.add_triple(item.uri, u"oxds:currentVersion", item.currentversion) - item.sync() - - if code == 201: - ag.b.creation(silo, id, target_path, ident=ident['repoze.who.userid']) - response.status = "201 Created" - response.status_int = 201 - response.headers["Content-Location"] = url(controller="datasets", action="itemview", id=id, silo=silo, path=path) - response_message = "201 Created" - else: - ag.b.change(silo, id, target_path, ident=ident['repoze.who.userid']) - response.status = "204 Updated" - response.status_int = 204 - response_message = None - - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_dataset.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - redirect_to(controller="datasets", action="itemview", id=id, silo=silo, path=path) - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = "text/plain" - return response_message - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing satisfies - return text / plain - response.content_type = "text/plain" - return response_message - elif http_method == "DELETE" and editor: - item = c_silo.get_item(id) - if item.isfile(path): - if 'manifest.rdf' in path: - response.content_type = "text/plain" - response.status_int = 403 - response.status = "403 Forbidden" - return "Forbidden - Cannot delete the manifest" - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - item.del_stream(path) - item.del_triple(item.uri, u"dcterms:modified") - item.add_triple(item.uri, u"dcterms:modified", datetime.now()) - item.del_triple(item.uri, u"oxds:currentVersion") - item.add_triple(item.uri, u"oxds:currentVersion", item.currentversion) - item.sync() - ag.b.deletion(silo, id, path, ident=ident['repoze.who.userid']) - response.content_type = "text/plain" - response.status_int = 200 - response.status = "200 OK" - return "{'ok':'true'}" # required for the JQuery magic delete to succede. - elif item.isdir(path): - parts = item.list_parts(path) - for part in parts: - if item.isdir(os.path.join(path, part)): - # TODO implement proper recursive delete, with RDF aggregation - # updating - abort(400, "Directory is not empty of directories") - item.increment_version_delta(clone_previous_version=True, copy_filenames=['manifest.rdf']) - item.del_triple(item.uri, u"oxds:currentVersion") - item.add_triple(item.uri, u"oxds:currentVersion", item.currentversion) - for part in parts: - item.del_stream(os.path.join(path, part)) - ag.b.deletion(silo, id, os.path.join(path, part), ident=ident['repoze.who.userid']) - item.del_stream(path) - item.del_triple(item.uri, u"dcterms:modified") - item.add_triple(item.uri, u"dcterms:modified", datetime.now()) - item.sync() - ag.b.deletion(silo, id, path, ident=ident['repoze.who.userid']) - response.content_type = "text/plain" - response.status_int = 200 - response.status = "200 OK" - return "{'ok':'true'}" # required for the JQuery magic delete to succede. - else: - abort(404) - - @rest.restrict('GET') - def itemview_vnum(self, silo, id, path, vnum): - # Check to see if embargo is on: - c.silo_name = silo - c.id = id - c.version = vnum - c.path = path - c_silo = ag.granary.get_rdf_silo(silo) - - if not c_silo.exists(id): - # dataset doesn't exist - abort(404) - - item = c_silo.get_item(id) - vnum = str(vnum) - if not vnum in item.manifest['versions']: - abort(404) - item.set_version_cursor(vnum) - - embargoed = False - if item.metadata.get('embargoed') not in ["false", 0, False]: - embargoed = True - - if embargoed: - #identity management if item - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - ident = request.environ.get('repoze.who.identity') - c.ident = ident - granary_list = ag.granary.silos - silos = ag.authz(granary_list, ident) - if silo not in silos: - abort(403, "Forbidden") - - if item.isfile(path): - fileserve_app = FileApp(item.to_dirpath(path)) - return fileserve_app(request.environ, self.start_response) - elif item.isdir(path): - c.parts = item.list_parts(path, detailed=True) - c.readme_text = None - if "README" in c.parts.keys(): - c.readme_text = get_readme_text(item, "%s/README" % path) - - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - return render("/itemview_version.html") - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = 'application/json; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - returndata = {} - returndata['parts'] = {} - for part in c.parts: - returndata['parts'][part] = serialisable_stat(c.parts[part]) - returndata['readme_text'] = c.readme_text - return simplejson.dumps(returndata) - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops - nothing satisfies - return text/html - return render("/itemview_version.html") - else: - abort(404) diff --git a/rdfdatabank/controllers/doi.py b/rdfdatabank/controllers/doi.py index 52fcede..115a724 100644 --- a/rdfdatabank/controllers/doi.py +++ b/rdfdatabank/controllers/doi.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + from pylons import request, response, session, tmpl_context as c, url, app_globals as ag from pylons.controllers.util import abort from pylons.decorators import rest diff --git a/rdfdatabank/controllers/error.py b/rdfdatabank/controllers/error.py index d43e909..82188c3 100644 --- a/rdfdatabank/controllers/error.py +++ b/rdfdatabank/controllers/error.py @@ -1,13 +1,37 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import cgi from paste.urlparser import PkgResourcesParser -from pylons import request +from pylons import request, response, tmpl_context as c from pylons.controllers.util import forward from pylons.middleware import error_document_template from webhelpers.html.builder import literal -from rdfdatabank.lib.base import BaseController +from rdfdatabank.lib.base import BaseController, render +from rdfdatabank.lib.conneg import MimeType as MT, parse as conneg_parse class ErrorController(BaseController): @@ -25,11 +49,44 @@ def document(self): """Render the error document""" resp = request.environ.get('pylons.original_response') content = literal(resp.body) or cgi.escape(request.GET.get('message', '')) - page = error_document_template % \ - dict(prefix=request.environ.get('SCRIPT_NAME', ''), - code=cgi.escape(request.GET.get('code', str(resp.status_int))), - message=content) - return page + code = cgi.escape(request.GET.get('code', str(resp.status_int))) + if 'HTTP_ACCEPT' in request.environ: + try: + accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) + except: + accept_list= [MT("text", "plain")] + if not accept_list: + accept_list= [MT("text", "plain")] + mimetype = accept_list.pop(0) + while(mimetype): + if str(mimetype).lower() in ["text/html", "text/xhtml"]: + #page = error_document_template % \ + #dict(prefix=request.environ.get('SCRIPT_NAME', ''), + # code=code, + # message=content) + #return page + c.code = code + #c.message = content + c.message = cgi.escape(request.GET.get('message', '')) + c.status = resp.status + c.status = c.status.replace(c.code, '').strip() + if not c.message: + c.message = content.replace(resp.status, '').strip() + return render('/error.html') + elif str(mimetype).lower() in ["text/plain", "application/json"]: + response.content_type = 'text/plain; charset="UTF-8"' + response.status_int = resp.status_int + response.status = resp.status + return content + try: + mimetype = accept_list.pop(0) + except IndexError: + mimetype = None + #Whoops nothing satisfies - return text/plain + response.content_type = 'text/plain; charset="UTF-8"' + response.status_int = resp.status_int + response.status = resp.status + return content def img(self, id): """Serve Pylons' stock images""" diff --git a/rdfdatabank/controllers/home.py b/rdfdatabank/controllers/home.py index c356bad..be6e28c 100644 --- a/rdfdatabank/controllers/home.py +++ b/rdfdatabank/controllers/home.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging from rdfdatabank.lib.base import BaseController, render diff --git a/rdfdatabank/controllers/items.py b/rdfdatabank/controllers/items.py index fb49d3c..a3bddbf 100644 --- a/rdfdatabank/controllers/items.py +++ b/rdfdatabank/controllers/items.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging import os, time from datetime import datetime, timedelta @@ -8,7 +31,7 @@ from pylons.decorators import rest from rdfdatabank.lib.base import BaseController, render -from rdfdatabank.lib.utils import create_new +from rdfdatabank.lib.utils import create_new, allowable_id2 from rdfdatabank.lib.file_unpack import check_file_mimetype, BadZipfile, get_zipfiles_in_dataset, unpack_zip_item, read_zipfile from rdfdatabank.lib.conneg import MimeType as MT, parse as conneg_parse @@ -111,12 +134,18 @@ def datasetview(self, silo, id): if params.has_key("id") and params['id']: target_dataset_name = params['id'] else: - (head, fn) = os.path.split(params['filename']) - (fn, ext) = os.path.splitext(fn) - target_dataset_name = "%s-%s"%(id,fn) + #(head, fn) = os.path.split(params['filename']) + #(fn, ext) = os.path.splitext(fn) + #target_dataset_name = "%s-%s"%(id,fn) + target_dataset_name = id #step 1: Create / initialize target dataset if not rdfsilo.exists(target_dataset_name): + if not allowable_id2(target_dataset_name): + response.content_type = "text/plain" + response.status_int = 400 + response.status = "400 Bad request. Dataset name not valid" + return "Dataset name can contain only the following characters - %s and has to be more than 1 character"%ag.naming_rule target_dataset = create_new(rdfsilo, target_dataset_name, ident['repoze.who.userid']) response.status_int = 201 response.status = "201 Created" @@ -255,12 +284,18 @@ def itemview(self, silo, id, path): if params.has_key("id") and params['id']: target_dataset_name = params['id'] else: - (head, fn) = os.path.split(path) - (fn, ext) = os.path.splitext(fn) - target_dataset_name = "%s-%s"%(id,fn) + #(head, fn) = os.path.split(path) + #(fn, ext) = os.path.splitext(fn) + #target_dataset_name = "%s-%s"%(id,fn) + target_dataset_name = id #step 1: Create / initialize target dataset if not rdfsilo.exists(target_dataset_name): + if not allowable_id2(target_dataset_name): + response.content_type = "text/plain" + response.status_int = 400 + response.status = "400 Bad request. Dataset name not valid" + return "Dataset name can contain only the following characters - %s and has to be more than 1 character"%ag.naming_rule target_dataset = create_new(rdfsilo, target_dataset_name, ident['repoze.who.userid']) response.status_int = 201 response.status = "201 Created" diff --git a/rdfdatabank/controllers/items_log.py b/rdfdatabank/controllers/items_log.py deleted file mode 100644 index 45131c9..0000000 --- a/rdfdatabank/controllers/items_log.py +++ /dev/null @@ -1,330 +0,0 @@ -# -*- coding: utf-8 -*- -import logging -import os, time -from datetime import datetime, timedelta -import simplejson -from pylons import request, response, session, tmpl_context as c, url, app_globals as ag -from pylons.controllers.util import abort, redirect_to -from pylons.decorators import rest - -from rdfdatabank.lib.base import BaseController, render -from rdfdatabank.lib.utils import create_new -from rdfdatabank.lib.file_unpack import check_file_mimetype, BadZipfile, get_zipfiles_in_dataset, unpack_zip_item, read_zipfile -from rdfdatabank.lib.conneg import MimeType as MT, parse as conneg_parse - -log = logging.getLogger(__name__) - -class ItemsController(BaseController): - def siloview(self, silo): - abort(403, "Forbidden") - - @rest.restrict('GET', 'POST') - def datasetview(self, silo, id): - #tmpl_context variables needed: c.silo_name, c.zipfiles, c.ident, c.id, c.path - c.silo_name = silo - c.id = id - - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - - ident = request.environ.get('repoze.who.identity') - c.ident = ident - granary_list = ag.granary.silos - silos = ag.authz(granary_list, ident) - if silo not in silos: - abort(403, "Forbidden") - - rdfsilo = ag.granary.get_rdf_silo(silo) - if not rdfsilo.exists(id): - abort (403, "Forbidden") - - dataset = rdfsilo.get_item(id) - - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - hr = "-"*80 + '\n' - f.write(hr) - f.write("%s :: items - datasetview : silo=%s, id=%s\n"%(str(datetime.now()), silo, id)) - - http_method = request.environ['REQUEST_METHOD'] - - f.write("Http method = %s\n"%http_method) - f.close() - - if http_method == "GET": - c.zipfiles = get_zipfiles_in_dataset(dataset) - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - return render("/list_of_zipfiles.html") - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = 'application/json; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - return simplejson.dumps(dict(c.zipfiles)) - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - #Whoops nothing satisfies - return text/html - return render("/list_of_zipfiles.html") - elif http_method == "POST": - logstr = [] - logstr.append("="*80) - logstr.append("Items - datasetview of %s, %s"%(silo, id)) - params = request.POST - if not (params.has_key("filename") and params['filename']): - abort(400, "You must supply a filename to unpack") - - logstr.append("POSTED filename %s"%params['filename']) - item_real_filepath = dataset.to_dirpath() - target_filepath = "%s/%s"%(item_real_filepath, params['filename']) - if not os.path.isfile(target_filepath): - abort(404, "File to unpack not found") - if not check_file_mimetype(target_filepath, 'application/zip'): - abort(415, "File is not of type application/zip") - - if params.has_key("id") and params['id']: - target_dataset_name = params['id'] - else: - (head, fn) = os.path.split(params['filename']) - (fn, ext) = os.path.splitext(fn) - target_dataset_name = "%s-%s"%(id,fn) - - #step 1: Create / initialize target dataset - tic = time.mktime(time.gmtime()) - if not rdfsilo.exists(target_dataset_name): - target_dataset = create_new(rdfsilo, target_dataset_name, ident['repoze.who.userid']) - else: - target_dataset = rdfsilo.get_item(target_dataset_name) - toc = time.mktime(time.gmtime()) - logstr.append("1. Time to create / initialize target dataset: %d"%(toc-tic)) - - #step 2: Unpack zip item - logstr.append("Start unpacking zip item : %s"%(time.strftime("%d %b %Y %H:%M:%S", time.gmtime()))) - logstr.append("") - logstr = '\n'.join(logstr) - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write(logstr) - f.close() - try: - unpack_zip_item(target_dataset, dataset, params['filename'], rdfsilo, ident['repoze.who.userid']) - except BadZipfile: - abort(400, "Couldn't unpack zipfile") - logstr = [] - logstr.append("End unpacking zip item : %s"%(time.strftime("%d %b %Y %H:%M:%S", time.gmtime()))) - logstr.append("="*80) - logstr.append("") - logstr.append("") - logstr.append("") - logstr = '\n'.join(logstr) - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write(logstr) - f.close() - - target_dataset.sync() - target_dataset.sync() - target_dataset.sync() - - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - redirect_to(controller="datasets", action="datasetview", silo=silo, id=target_dataset_name) - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = "text/plain" - response.status_int = 201 - response.status = "201 Created" - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", silo=silo, id=target_dataset_name) - return "201 Created" - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - # Whoops - nothing satisfies - return text/plain - response.content_type = "text/plain" - response.status_int = 201 - response.status = "201 Created" - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", silo=silo, id=target_dataset_name) - return "201 Created" - - @rest.restrict('GET', 'POST') - def itemview(self, silo, id, path): - #tmpl_context variables needed: c.silo_name, c.zipfile_contents c.ident, c.id, c.path - c.silo_name = silo - c.id = id - c.path = path - - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - - if not path: - abort(400, "You must supply a filename to unpack") - - ident = request.environ.get('repoze.who.identity') - c.ident = ident - granary_list = ag.granary.silos - silos = ag.authz(granary_list, ident) - if silo not in silos: - abort(403, "Forbidden") - - rdfsilo = ag.granary.get_rdf_silo(silo) - if not rdfsilo.exists(id): - abort (403, "Forbidden") - - dataset = rdfsilo.get_item(id) - item_real_filepath = dataset.to_dirpath() - target_filepath = "%s/%s"%(item_real_filepath, path) - #c.parts = dataset.list_parts(detailed=False) - if not dataset.isfile(path): - abort(404, "File not found") - if not os.path.isfile(target_filepath): - abort(404, "File not found") - if not check_file_mimetype(target_filepath, 'application/zip'): - abort(415, "File is not of type application/zip") - - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - hr = "-"*80 + '\n' - f.write(hr) - f.write("%s :: datasets - datasetview : silo=%s, id=%s\n"%(str(datetime.now()), silo, id)) - - http_method = request.environ['REQUEST_METHOD'] - - f.write("Http method = %s\n"%http_method) - f.close() - - if http_method == "GET": - try: - c.zipfile_contents = read_zipfile(target_filepath) - except BadZipfile: - abort(400, "Could not read zipfile") - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - return render("/zipfileview.html") - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = 'application/json; charset="UTF-8"' - response.status_int = 200 - response.status = "200 OK" - return simplejson.dumps(c.zipfile_contents) - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - # Whoops - nothing satisfies - return text/html - return render("/zipfileview.html") - elif http_method == "POST": - params = request.POST - #if not (params.has_key("filename") and params['filename']): - # abort(400, "You must supply a filename to unpack") - - if params.has_key("id") and params['id']: - target_dataset_name = params['id'] - else: - (head, fn) = os.path.split(path) - (fn, ext) = os.path.splitext(fn) - target_dataset_name = "%s-%s"%(id,fn) - #target_dataset_name, current_dataset, post_filepath, silo, ident - try: - unpack_zip_item(target_dataset_name, dataset, path, rdfsilo, ident['repoze.who.userid']) - except BadZipfile: - abort(400, "Couldn't unpack zipfile") - target_dataset.sync() - target_dataset.sync() - target_dataset.sync() - - # conneg return - accept_list = None - if 'HTTP_ACCEPT' in request.environ: - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write("Received accept list: %s\n"%str(request.environ['HTTP_ACCEPT'])) - f.close() - try: - accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) - except: - accept_list= [MT("text", "html")] - if not accept_list: - accept_list= [MT("text", "html")] - f = open('/opt/rdfdatabank/src/logs/runtimes_item.log', 'a') - f.write("Parsed accept list: %s\n"%str(accept_list)) - f.close() - mimetype = accept_list.pop(0) - while(mimetype): - if str(mimetype).lower() in ["text/html", "text/xhtml"]: - redirect_to(controller="datasets", action="datasetview", silo=silo, id=target_dataset_name) - elif str(mimetype).lower() in ["text/plain", "application/json"]: - response.content_type = "text/plain" - response.status_int = 201 - response.status = "201 Created" - response.headers['Content-Location'] = url(controller="datasets", action="datasetview", silo=silo, id=target_dataset_name) - return "201 Created" - try: - mimetype = accept_list.pop(0) - except IndexError: - mimetype = None - # Whoops - nothing satisfies - return text/plain - response.content_type = "text/plain" - response.status_int = 201 - response.status = "201 Created" - response.headers["Content-Location"] = url(controller="datasets", action="datasetview", silo=silo, id=target_dataset_name) - return "201 Created" - - @rest.restrict('GET') - def subitemview(self, silo, id, path, subpath): - #tmpl_context variables needed: c.silo_name, c.zipfile_contents c.ident, c.id, c.path - c.silo_name = silo - c.id = id - c.path = path - c.subpath = subpath - - if not request.environ.get('repoze.who.identity'): - abort(401, "Not Authorised") - - if not (path or subpath): - abort(400, "You must supply a filename to unpack") - - return render("/zipfilesubitemview.html") - diff --git a/rdfdatabank/controllers/keywords.py b/rdfdatabank/controllers/keywords.py new file mode 100644 index 0000000..b3f25af --- /dev/null +++ b/rdfdatabank/controllers/keywords.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import logging + +from rdfdatabank.lib.base import BaseController, render + +class KeywordsController(BaseController): + def index(self): + return render('/keywords.html') diff --git a/rdfdatabank/controllers/redirect.py b/rdfdatabank/controllers/redirect.py deleted file mode 100644 index 444e142..0000000 --- a/rdfdatabank/controllers/redirect.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -import logging -from pylons import url - -from pylons.controllers.util import redirect -from rdfdatabank.lib.base import BaseController - -class RedirectController(BaseController): - def index(self, id): - if id.lower().endswith(('.html', '.rdf', '.json')): - id = id.rsplit('.', 1)[0] - lid = id.lower() - if lid == 'dataset%3a1' or lid == 'dataset:1': - redirect(url(controller="datasets", action="datasetview", silo="general", id='Tick1AudioCorpus')) - elif lid == 'dataset%3A2.html' or lid == 'dataset:2': - redirect(url(controller="datasets", action="datasetview", silo="general", id='RobertDarnton')) - if lid == 'dataset%3A3' or lid == 'dataset:3': - redirect(url(controller="datasets", action="datasetview", silo="general", id='MostynBrown')) - else: - redirect(url(controller="datasets", action="datasetview", silo="general", id=id)) - diff --git a/rdfdatabank/controllers/search.py b/rdfdatabank/controllers/search.py index 83eae72..455b9ee 100644 --- a/rdfdatabank/controllers/search.py +++ b/rdfdatabank/controllers/search.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging from urllib import urlencode, unquote, quote import json @@ -100,8 +123,10 @@ def raw(self): params['start'] = '0' if not 'rows' in params or not params['rows']: params['rows'] = '100' - - result = ag.solr.raw_query(**params) + try: + result = ag.solr.raw_query(**params) + except: + result = {} mimetype = accept_list.pop(0) while(mimetype): @@ -142,7 +167,7 @@ def detailed(self, query=None, additional_fields=[]): if request.params.get("type", None): c.typ = request.params.get("type") - if not c.q or c.q == '*': + if not c.q or c.q == '*' or c.q == "": c.q = "*:*" # Search controls @@ -152,8 +177,34 @@ def detailed(self, query=None, additional_fields=[]): sort = request.params.get('sort', None) format = request.params.get('format', None) if not format: - format = 'html' - + accept_list = None + if 'HTTP_ACCEPT' in request.environ: + try: + accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) + except: + accept_list= [MT("text", "html")] + if not accept_list: + accept_list= [MT("text", "html")] + mimetype = accept_list.pop(0) + while(mimetype): + if str(mimetype).lower() in ["text/html", "text/xhtml"]: + format = 'html' + break + elif str(mimetype).lower() in ["text/plain", "application/json"]: + format = 'json' + break + elif str(mimetype).lower() in ["text/xml"]: + format = 'xml' + break + elif str(mimetype).lower() in ["text/csv"]: + format = 'csv' + break + try: + mimetype = accept_list.pop(0) + except IndexError: + mimetype = None + # Whoops - nothing satisfies - return text/plain + format = 'json' c.sort = 'score desc' # Lock down the sort parameter. @@ -277,17 +328,40 @@ def detailed(self, query=None, additional_fields=[]): solr_params['facet.field'] = [] for facet in c.fields_to_facet: solr_params['facet.field'].append(facet) - - solr_response = ag.solr.raw_query(**solr_params) - + + solr_response = None + try: + solr_response = ag.solr.raw_query(**solr_params) + except: + pass + c.add_facet = u"%ssearch/detailed?q=%s&" % (ag.root, c.q.encode('utf-8')) c.add_facet = c.add_facet + urlencode(c.search) + filter_url if not solr_response: - # FAIL - do something here: - c.message = 'Sorry, either that search "%s" resulted in no matches, or the search service is not functional.' % c.q - h.redirect_to(controller='/search', action='index') + # conneg return + response.status_int = 200 + response.status = "200 OK" + if format == "html": + c.numFound = 0 + c.message = 'Sorry, either that search "%s" resulted in no matches, or the search service is not functional.' % c.q + return render('/search.html') + elif format == 'xml': + response.headers['Content-Type'] = 'application/xml' + response.charset = 'utf8' + c.atom = {} + return render('/atom_results.html') + elif format == 'json': + response.headers['Content-Type'] = 'application/json' + response.charset = 'utf8' + return {} + else: + response.headers['Content-Type'] = 'application/text' + response.charset = 'utf8' + return solr_response + response.status_int = 200 + response.status = "200 OK" if format == 'xml': response.headers['Content-Type'] = 'application/xml' response.charset = 'utf8' @@ -403,8 +477,10 @@ def advanced(self): solr_params['facet.field'] = [] for facet in c.fields_to_facet: solr_params['facet.field'].append(facet) - - solr_response = ag.solr.raw_query(**solr_params) + try: + solr_response = ag.solr.raw_query(**solr_params) + except: + solr_response = None c.add_facet = u"%ssearch/detailed?q=%s&" % (ag.root, c.q.encode('utf-8')) c.add_facet = c.add_facet + urlencode(c.search) + filter_url diff --git a/rdfdatabank/controllers/searching.py b/rdfdatabank/controllers/searching.py new file mode 100644 index 0000000..d215996 --- /dev/null +++ b/rdfdatabank/controllers/searching.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import logging + +from rdfdatabank.lib.base import BaseController, render + +class SearchingController(BaseController): + def index(self): + return render('/searching.html') diff --git a/rdfdatabank/controllers/silos.py b/rdfdatabank/controllers/silos.py index 42100e7..5c2dbed 100644 --- a/rdfdatabank/controllers/silos.py +++ b/rdfdatabank/controllers/silos.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging from datetime import datetime, timedelta import re diff --git a/rdfdatabank/controllers/states.py b/rdfdatabank/controllers/states.py index 16e619a..9ec810c 100644 --- a/rdfdatabank/controllers/states.py +++ b/rdfdatabank/controllers/states.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging import simplejson diff --git a/rdfdatabank/controllers/users.py b/rdfdatabank/controllers/users.py index dd399b0..a8ea59e 100644 --- a/rdfdatabank/controllers/users.py +++ b/rdfdatabank/controllers/users.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging import simplejson import codecs @@ -85,6 +108,7 @@ def index(self, silo_name): if params['username'] in ag.users: abort(403, "User exists") code = 201 + ag.users[params['username']] = {'role':'', 'first_name':'', 'last_name':'', 'name':'', 'owner':''} owner_of_silos = [] if 'owner' in params and params['owner'] and (('first_name' in params and 'last_name' in params) or 'name' in params) and \ 'username' in params and params['username'] and 'password' in params and params['password']: @@ -230,6 +254,7 @@ def userview(self, silo_name, username): code = 204 else: code = 201 + ag.users[params['username']] = {'role':'', 'first_name':'', 'last_name':'', 'name':'', 'owner':''} owner_of_silos = [] if code == 201: if 'owner' in params and params['owner'] and 'password' in params and params['password'] and \ diff --git a/rdfdatabank/lib/HTTP_request.py b/rdfdatabank/lib/HTTP_request.py index 9ba235d..ad2a63c 100644 --- a/rdfdatabank/lib/HTTP_request.py +++ b/rdfdatabank/lib/HTTP_request.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import logging import mimetypes import httplib diff --git a/rdfdatabank/lib/app_globals.py b/rdfdatabank/lib/app_globals.py index 61575a8..ce3425a 100644 --- a/rdfdatabank/lib/app_globals.py +++ b/rdfdatabank/lib/app_globals.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + """The application's Globals object""" from pylons import config @@ -11,6 +34,7 @@ from rdfdatabank.lib.broadcast import BroadcastToRedis from rdfdatabank.config.users import _USERS +from rdfdatabank.config.namespaces import NAMESPACES, PREFIXES class Globals(object): @@ -28,6 +52,8 @@ def __init__(self): self.authz = authz self.users = _USERS + self.NAMESPACES = NAMESPACES + self.PREFIXES = PREFIXES if config.has_key("granary.uri_root"): self.root = config['granary.uri_root'] @@ -37,17 +63,28 @@ def __init__(self): if config.has_key("redis.host"): self.redishost = config['redis.host'] - self.r = Redis(self.redishost) + try: + self.r = Redis(self.redishost) + except: + self.r = None + if self.r and config.has_key("broadcast.to") and config['broadcast.to'] == "redis" and config.has_key("broadcast.queue"): + self.b = BroadcastToRedis(config['redis.host'], config['broadcast.queue']) + else: + self.r = None + self.redishost = None + self.b = None if config.has_key("solr.host"): from solr import SolrConnection self.solrhost = config['solr.host'] - self.solr = SolrConnection(self.solrhost) + try: + self.solr = SolrConnection(self.solrhost) + except: + self.solr = None + else: + self.solrhost = None + self.solr = None - if config.has_key("broadcast.to"): - if config['broadcast.to'] == "redis": - self.b = BroadcastToRedis(config['redis.host'], config['broadcast.queue']) - if config.has_key("naming_rule"): self.naming_rule = config['naming_rule'] @@ -90,3 +127,6 @@ def __init__(self): if config.has_key("license"): self.license = config['license'] + if config.has_key("api.version"): + self.api_version = config['api.version'] + diff --git a/rdfdatabank/lib/auth.py b/rdfdatabank/lib/auth.py index 05051f2..1a1acde 100644 --- a/rdfdatabank/lib/auth.py +++ b/rdfdatabank/lib/auth.py @@ -1,3 +1,27 @@ +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + from webob import Request import zope.interface from repoze.who.classifiers import default_request_classifier diff --git a/rdfdatabank/lib/base.py b/rdfdatabank/lib/base.py index 792d640..351464a 100644 --- a/rdfdatabank/lib/base.py +++ b/rdfdatabank/lib/base.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + """The base Controller API Provides the BaseController class for subclassing. diff --git a/rdfdatabank/lib/broadcast.py b/rdfdatabank/lib/broadcast.py index 73ab39b..3025e21 100644 --- a/rdfdatabank/lib/broadcast.py +++ b/rdfdatabank/lib/broadcast.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + from redis import Redis from redis.exceptions import ConnectionError diff --git a/rdfdatabank/lib/conneg.py b/rdfdatabank/lib/conneg.py index d822606..8cc0bad 100644 --- a/rdfdatabank/lib/conneg.py +++ b/rdfdatabank/lib/conneg.py @@ -1,5 +1,28 @@ -# -*- coding: utf-8 -*- #!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + from pylons import app_globals as ag from datetime import datetime def skipws(next): diff --git a/rdfdatabank/lib/doi_helper.py b/rdfdatabank/lib/doi_helper.py index 86e4eef..5cd5ef9 100644 --- a/rdfdatabank/lib/doi_helper.py +++ b/rdfdatabank/lib/doi_helper.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + from rdfdatabank.lib.doi_schema import DataciteDoiSchema from pylons import app_globals as ag import os, codecs, uuid diff --git a/rdfdatabank/lib/doi_schema.py b/rdfdatabank/lib/doi_schema.py index 623f5cb..1619ad1 100755 --- a/rdfdatabank/lib/doi_schema.py +++ b/rdfdatabank/lib/doi_schema.py @@ -1,4 +1,28 @@ +#!/usr/bin/python # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + class DataciteDoiSchema(): def __init__(self): """ diff --git a/rdfdatabank/lib/file_unpack.py b/rdfdatabank/lib/file_unpack.py index 268dce3..0ac4dca 100644 --- a/rdfdatabank/lib/file_unpack.py +++ b/rdfdatabank/lib/file_unpack.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + import subprocess from threading import Thread from datetime import datetime, timedelta @@ -47,7 +70,8 @@ def get_zipfiles_in_dataset(dataset): real_filepath = os.readlink(real_filepath) if check_file_mimetype(real_filepath, 'application/zip'): (fn, ext) = os.path.splitext(filepath) - zipfiles[filepath]="%s-%s"%(dataset.item_id, fn) + #zipfiles[filepath]="%s-%s"%(dataset.item_id, fn) + zipfiles[filepath]=dataset.item_id return zipfiles def store_zipfile(silo, target_item_uri, POSTED_file, ident): @@ -139,7 +163,6 @@ def unpack_zip_item(target_dataset, current_dataset, zip_item, silo, ident): filepath = current_dataset.to_dirpath(zip_item) if os.path.islink(filepath): filepath = os.readlink(filepath) - emb = target_dataset.metadata.get('embargoed') emb_until = target_dataset.metadata.get('embargoed_until') @@ -150,7 +173,7 @@ def unpack_zip_item(target_dataset, current_dataset, zip_item, silo, ident): file_uri = current_dataset.uri if not file_uri.endswith('/'): file_uri += '/' - file_uri = "%s%s"%(file_uri,zip_item) + file_uri = "%s%s?version=%s"%(file_uri,zip_item,current_dataset.currentversion) items_list = [] os.path.walk(unpacked_dir,get_items_in_dir,items_list) diff --git a/rdfdatabank/lib/file_unpack_log.py b/rdfdatabank/lib/file_unpack_log.py deleted file mode 100644 index dd11bbd..0000000 --- a/rdfdatabank/lib/file_unpack_log.py +++ /dev/null @@ -1,253 +0,0 @@ -# -*- coding: utf-8 -*- -import subprocess - -from datetime import datetime, timedelta -import time -import os - -from redis import Redis - -from uuid import uuid4 - -from rdfdatabank.lib.utils import create_new, munge_manifest, test_rdf - -#import checkm -from zipfile import ZipFile, BadZipfile as BZ - -zipfile_root = "zipfile:" - -class BadZipfile(Exception): - """Cannot open zipfile using commandline tool 'unzip' to target directory""" - -def check_file_mimetype(real_filepath, mimetype): - if os.path.islink(real_filepath): - real_filepath = os.readlink(real_filepath) - p = subprocess.Popen("file -ib %s" %(real_filepath), shell=True, stdout=subprocess.PIPE) - output_file = p.stdout - output_str = output_file.read() - if mimetype in output_str: - return True - else: - return False - -def get_zipfiles_in_dataset(dataset): - derivative = dataset.list_rdf_objects("*", "ore:aggregates") - #print "derivative ", derivative - #print "derivative values", derivative.values()[0] - zipfiles = {} - if derivative and derivative.values() and derivative.values()[0]: - for file_uri in derivative.values()[0]: - filepath = file_uri[len(dataset.uri)+1:] - real_filepath = dataset.to_dirpath(filepath) - if os.path.islink(real_filepath): - real_filepath = os.readlink(real_filepath) - #print "file_uri : ", file_uri - #print "filepath : ", filepath - #print "real_filepath : ", real_filepath - if check_file_mimetype(real_filepath, 'application/zip'): - (fn, ext) = os.path.splitext(filepath) - zipfiles[filepath]="%s-%s"%(dataset.item_id, fn) - return zipfiles - -def store_zipfile(silo, target_item_uri, POSTED_file, ident): - zipfile_id = get_next_zipfile_id(silo.state['storage_dir']) - while(silo.exists("%s%s" % (zipfile_root, zipfile_id))): - zipfile_id = get_next_zipfile_id(silo.state['storage_dir']) - - #zip_item = silo.get_item("%s%s" % (zipfile_root, zipfile_id)) - zip_item = create_new(silo, "%s%s" % (zipfile_root, zipfile_id), ident) - zip_item.add_triple("%s/%s" % (zip_item.uri, POSTED_file.filename.lstrip(os.sep)), "dcterms:hasVersion", target_item_uri) - zip_item.put_stream(POSTED_file.filename, POSTED_file.file) - try: - POSTED_file.file.close() - except: - pass - zip_item.sync() - return zip_item - -def read_zipfile(filepath): - try: - tmpfile = ZipFile(filepath, "r") - except BZ: - raise BadZipfile - - # list filenames - #list_of_files = tmpfile.namelist() - - # file information - zipfile_contents = {} - for info in tmpfile.infolist(): - zipfile_contents[info.filename] = (info.file_size, info.date_time) - tmpfile.close() - return zipfile_contents - -def read_file_in_zipfile(filepath, filename): - try: - tmpfile = ZipFile(filepath, "r") - except BZ: - raise BadZipfile - - try: - fileinfo = tmpfile.getinfo(filename) - except KeyError: - return False - if fileinfo.file_size == 0: - return 0 - - # read file - file_contents = None - file_contents = tmpfile.read(filename) - tmpfile.close() - return file_contents - -def get_file_in_zipfile(filepath, filename, targetdir): - try: - tmpfile = ZipFile(filepath, "r") - except BZ: - raise BadZipfile - - try: - fileinfo = tmpfile.getinfo(filename) - except KeyError: - return False - if fileinfo.file_size == 0: - return 0 - - # extract file - targetfile = tmpfile.extract(filename, targetdir) - tmpfile.close() - return targetfile - -def unzip_file(filepath, target_directory=None): - #f = open("/tmp/python_out.log", "a") - #f.write("\n--------------- In unzip file -------------------\n") - #f.write("filepath : %s\n"%str(filepath)) - #f.write('-'*40+'\n') - #f.close() - # TODO add the checkm stuff back in - if not target_directory: - target_directory = "/tmp/%s" % (uuid4().hex) - p = subprocess.Popen("unzip -qq -d %s %s" % (target_directory, filepath), shell=True, stdout=subprocess.PIPE) - p.wait() - if p.returncode != 0: - raise BadZipfile - else: - return target_directory - -def get_items_in_dir(items_list, dirname, fnames): - for fname in fnames: - items_list.append(os.path.join(dirname,fname)) - return - -def unpack_zip_item(target_dataset, current_dataset, zip_item, silo, ident): - f = open('/opt/rdfdatabank/src/logs/runtimes_items.log', 'a') - hr = "-"*80 + '\n' - f.write(hr) - f.write("file_unpack - unpack_zip_item\n") - f.write("Unpacking %s in %s TO %s\n"%(zip_item, current_dataset.uri, target_dataset.uri)) - filepath = current_dataset.to_dirpath(zip_item) - if os.path.islink(filepath): - filepath = os.readlink(filepath) - - # -- Step 1 ----------------------------- - tic1 = time.mktime(time.gmtime()) - unpacked_dir = unzip_file(filepath) - toc = time.mktime(time.gmtime()) - f.write("1. Time to unpack: %d\n"%(toc-tic1)) - f.close() - - # -- Step 2 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_items.log', 'a') - tic = time.mktime(time.gmtime()) - file_uri = current_dataset.uri - if not file_uri.endswith('/'): - file_uri += '/' - file_uri = "%s%s"%(file_uri,zip_item) - - items_list = [] - os.path.walk(unpacked_dir,get_items_in_dir,items_list) - toc = time.mktime(time.gmtime()) - f.write("2. Time to walk: %d\n"%(toc-tic)) - f.close() - - # -- Step 3 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_items.log', 'a') - tic = time.mktime(time.gmtime()) - manifest_str = None - #Read manifest - for i in items_list: - if 'manifest.rdf' in i and os.path.isfile(i): - F = open(i, 'r') - manifest_str = F.read() - F.close() - items_list.remove(i) - os.remove(i) - break - toc = time.mktime(time.gmtime()) - f.write("3. Time to read manifest: %d\n"%(toc-tic)) - f.close() - - # -- Step 4 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_items.log', 'a') - tic = time.mktime(time.gmtime()) - #Copy unpacked dir as new version - target_dataset.move_directory_as_new_version(unpacked_dir) - toc = time.mktime(time.gmtime()) - f.write("4. Time to move unpacked file: %d\n"%(toc-tic)) - f.close() - - # -- Step 5 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_items.log', 'a') - tic = time.mktime(time.gmtime()) - #Add type and isVersionOf metadata - target_dataset.add_namespace('oxds', "http://vocab.ox.ac.uk/dataset/schema#") - target_dataset.add_triple(target_dataset.uri, u"rdf:type", "oxds:Grouping") - target_dataset.add_triple(target_dataset.uri, "dcterms:isVersionOf", file_uri) - #TODO: Adding the following metadata again as moving directory deletes all this information. Need to find a better way - embargoed_until_date = (datetime.now() + timedelta(days=365*70)).isoformat() - target_dataset.add_triple(target_dataset.uri, u"oxds:isEmbargoed", 'True') - target_dataset.add_triple(target_dataset.uri, u"oxds:embargoedUntil", embargoed_until_date) - target_dataset.add_triple(target_dataset.uri, u"dcterms:identifier", target_dataset.item_id) - target_dataset.add_triple(target_dataset.uri, u"dcterms:creator", ident) - target_dataset.add_triple(target_dataset.uri, u"dcterms:created", datetime.now()) - target_dataset.add_triple(target_dataset.uri, u"oxds:currentVersion", target_dataset.currentversion) - #Adding ore aggregates - unp_dir = unpacked_dir - if not unp_dir.endswith('/'): - unp_dir += '/' - target_uri_base = target_dataset.uri - if not target_uri_base.endswith('/'): - target_uri_base += '/' - for i in items_list: - i = i.replace(unp_dir, '') - target_dataset.add_triple(target_dataset.uri, "ore:aggregates", "%s%s"%(target_uri_base,i)) - target_dataset.add_triple(target_dataset.uri, u"dcterms:modified", datetime.now()) - target_dataset.sync() - toc = time.mktime(time.gmtime()) - f.write("5. Time to add metadata: %d\n"%(toc-tic)) - f.close() - - # -- Step 6 ----------------------------- - f = open('/opt/rdfdatabank/src/logs/runtimes_items.log', 'a') - tic = time.mktime(time.gmtime()) - #Munge rdf - #TODO: If manifest is not well formed rdf - inform user. Currently just ignored. - if manifest_str and test_rdf(manifest_str): - munge_manifest(manifest_str, target_dataset, manifest_type='http://vocab.ox.ac.uk/dataset/schema#Grouping') - toc = time.mktime(time.gmtime()) - f.write("6. Time to munge rdf: %d\n"%(toc-tic)) - - # -- Step 7 ----------------------------- - tic = time.mktime(time.gmtime()) - target_dataset.sync() - target_dataset.sync() - target_dataset.sync() - current_dataset.add_triple("%s/%s" % (current_dataset.uri, zip_item.lstrip(os.sep)), "dcterms:hasVersion", target_dataset.uri) - current_dataset.sync() - toc = time.mktime(time.gmtime()) - f.write("7. Time to Sync and unpadte parent manifest: %d\n"%(toc-tic)) - - f.write(hr) - f.write("Total Time: %d\n\n"%(toc-tic1)) - f.close() - return True diff --git a/rdfdatabank/lib/helpers.py b/rdfdatabank/lib/helpers.py index e18f53b..aff6947 100644 --- a/rdfdatabank/lib/helpers.py +++ b/rdfdatabank/lib/helpers.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + """Helper functions Consists of functions to typically be used within templates, but also diff --git a/rdfdatabank/lib/htpasswd.py b/rdfdatabank/lib/htpasswd.py index 1a46527..e4da240 100644 --- a/rdfdatabank/lib/htpasswd.py +++ b/rdfdatabank/lib/htpasswd.py @@ -1,8 +1,38 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -"""Replacement for htpasswd""" -#Downloaded from: http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py -# Original author: Eli Carter +"""Replacement for htpasswd +Downloaded from: http://trac.edgewall.org/browser/trunk/contrib/htpasswd.py +Original author: Eli Carter + +Copyright (C) 2003-2012 Edgewall Software +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 os import sys diff --git a/rdfdatabank/lib/ident_md.py b/rdfdatabank/lib/ident_md.py index 22a4324..d7fc87a 100644 --- a/rdfdatabank/lib/ident_md.py +++ b/rdfdatabank/lib/ident_md.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + from rdfdatabank.config.users import _USERS as _DATA class IdentMDProvider(object): diff --git a/rdfdatabank/lib/search_term.py b/rdfdatabank/lib/search_term.py index 85fbae0..9ae3737 100644 --- a/rdfdatabank/lib/search_term.py +++ b/rdfdatabank/lib/search_term.py @@ -1,3 +1,28 @@ +# -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + + class term_list(): def get_all_search_fields(self): return [ diff --git a/rdfdatabank/lib/short_pid.py b/rdfdatabank/lib/short_pid.py index d0872da..d46e946 100644 --- a/rdfdatabank/lib/short_pid.py +++ b/rdfdatabank/lib/short_pid.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- +""" #Downloaded from http://code.activestate.com/recipes/576918/ #Created by Michael Fogleman #Short URL Generator +""" #DEFAULT_ALPHABET = 'JedR8LNFY2j6MrhkBSADUyfP5amuH9xQCX4VqbgpsGtnW7vc3TwKE' #DEFAULT_BLOCK_SIZE = 22 diff --git a/rdfdatabank/lib/utils.py b/rdfdatabank/lib/utils.py index f483979..565a5f1 100644 --- a/rdfdatabank/lib/utils.py +++ b/rdfdatabank/lib/utils.py @@ -1,4 +1,27 @@ # -*- coding: utf-8 -*- +""" +Copyright (c) 2012 University of Oxford + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, --INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + from datetime import datetime, timedelta from dateutil.relativedelta import * from dateutil.parser import parse @@ -13,9 +36,9 @@ from rdflib import StringInputSource from rdflib import Namespace, RDF, RDFS, URIRef, Literal, BNode - from uuid import uuid4 import re +from collections import defaultdict ID_PATTERN = re.compile(r"^[0-9A-z\-\:]+$") @@ -82,8 +105,11 @@ def is_embargoed(silo, id, refresh=False): # TODO evaluate ag.r.expire settings for these keys - popularity resets ttl or increases it? e = None e_d = None - e = ag.r.get("%s:%s:embargoed" % (silo.state['storage_dir'], id)) - e_d = ag.r.get("%s:%s:embargoed_until" % (silo.state['storage_dir'], id)) + try: + e = ag.r.get("%s:%s:embargoed" % (silo.state['storage_dir'], id)) + e_d = ag.r.get("%s:%s:embargoed_until" % (silo.state['storage_dir'], id)) + except: + pass if refresh or (not e or not e_d): if silo.exists(id): @@ -94,11 +120,20 @@ def is_embargoed(silo, id, refresh=False): e = True else: e = False - ag.r.set("%s:%s:embargoed" % (silo.state['storage_dir'], id), e) - ag.r.set("%s:%s:embargoed_until" % (silo.state['storage_dir'], id), e_d) + try: + ag.r.set("%s:%s:embargoed" % (silo.state['storage_dir'], id), e) + ag.r.set("%s:%s:embargoed_until" % (silo.state['storage_dir'], id), e_d) + except: + pass return (e, e_d) def get_embargo_values(embargoed=None, embargoed_until=None, embargo_days_from_now=None): + if isinstance(embargoed, basestring): + embargoed = embargoed.strip() + if isinstance(embargoed_until, basestring): + embargoed_until = embargoed_until.strip() + if isinstance(embargo_days_from_now, basestring): + embargo_days_from_now = embargo_days_from_now.strip() e_status=None e_date=None if embargoed == None: @@ -137,20 +172,32 @@ def create_new(silo, id, creator, title=None, embargoed=None, embargoed_until=No item.metadata['embargoed_until'] = '' item.del_triple(item.uri, u"oxds:isEmbargoed") item.del_triple(item.uri, u"oxds:embargoedUntil") - ag.r.set("%s:%s:embargoed_until" % (silo.state['storage_dir'], id), ' ') + try: + ag.r.set("%s:%s:embargoed_until" % (silo.state['storage_dir'], id), ' ') + except: + pass e, e_d = get_embargo_values(embargoed=embargoed, embargoed_until=embargoed_until, embargo_days_from_now=embargo_days_from_now) if e: item.metadata['embargoed'] = True item.add_triple(item.uri, u"oxds:isEmbargoed", 'True') - ag.r.set("%s:%s:embargoed" % (silo.state['storage_dir'], id), True) + try: + ag.r.set("%s:%s:embargoed" % (silo.state['storage_dir'], id), True) + except: + pass if e_d: item.metadata['embargoed_until'] = e_d - item.add_triple(item.uri, u"oxds:embargoedUntil", e_d) - ag.r.set("%s:%s:embargoed_until" % (silo.state['storage_dir'], id), e_d) + item.add_triple(item.uri, u"oxds:embargoedUntil", e_d) + try: + ag.r.set("%s:%s:embargoed_until" % (silo.state['storage_dir'], id), e_d) + except: + pass else: item.metadata['embargoed'] = False item.add_triple(item.uri, u"oxds:isEmbargoed", 'False') - ag.r.set("%s:%s:embargoed" % (silo.state['storage_dir'], id), False) + try: + ag.r.set("%s:%s:embargoed" % (silo.state['storage_dir'], id), False) + except: + pass item.add_triple(item.uri, u"dcterms:identifier", id) item.add_triple(item.uri, u"dcterms:mediator", creator) @@ -329,4 +376,61 @@ def serialisable_stat(stat): pass return stat_values +def natural_sort(l): + convert = lambda text: int(text) if text.isdigit() else text.lower() + alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] + return sorted(l, key = alphanum_key) + +def extract_metadata(item): + g = item.get_graph() + m = defaultdict(list) + #for s,p,o in g.triples((URIRef(item.uri), ag.NAMESPACES[dc]['identifier'], None)): + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dc']['title']): + m['title'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dc']['identifier']): + m['identifier'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dc']['description']): + m['description'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dc']['creator']): + m['creator'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dc']['subject']): + m['subject'].append(o) + + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['abstract']): + m['abstract'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['created']): + m['created'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['description']): + m['description'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['hasVersion']): + m['hasVersion'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['identifier']): + m['identifier'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['isVersionOf']): + m['isVersionOf'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['license']): + m['license'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['mediator']): + m['mediator'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['modified']): + m['modified'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['publisher']): + m['publisher'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['rights']): + m['rights'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['subject']): + m['subject'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['dcterms']['title']): + m['title'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['oxds']['isEmbargoed']): + m['isEmbargoed'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['oxds']['embargoedUntil']): + m['embargoedUntil'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['oxds']['currentVersion']): + m['currentVersion'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['bibo']['doi']): + m['doi'].append(o) + for o in g.objects(URIRef(item.uri), ag.NAMESPACES['ore']['aggregates']): + m['aggregates'].append(o) + return dict(m) diff --git a/rdfdatabank/public/static/js/html5.js b/rdfdatabank/public/static/js/html5.js new file mode 100644 index 0000000..6692336 --- /dev/null +++ b/rdfdatabank/public/static/js/html5.js @@ -0,0 +1,4 @@ +// iepp v2.1pre @jon_neal & @aFarkas github.com/aFarkas/iepp +// html5shiv @rem remysharp.com/html5-enabling-script +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++bX z_05|%w{G3~`0?YnZ{L3X`t|3}pQA^QE?>UCvGd(^1-Me?!uV1&fw=XU(?&#=9N=lNE zkzrlq$j~zP}8ymZ8*RF*N7n+!utXsFv&dzSyv}s~uVt@bs{rU6fr%#{${rmU-|9=KL z0>z&!VB2&+Bq&Z8*#9>~H#Ij!wY9Z$wnPaqM6g9L2t;*tGw}HZ>6u3IF-(~n#m^p~ zV51t$#LdpXpd~yaQph@HtEvu0TaBAkIszIPrqv3j zge;ie=+)E6`jB(Rf`=!aG9~kB5*9MXPb-oL>+o=RtRybvGb_hKA*t0`cOx6i28D+# zol25DH8&IvHtmSrKPQl5!J%eOdG(@@j|&b-ZHwEVROT?D$ytO?Q=mj*`x=1_+&lpa n8yXl~^-|Zd#7b^;aA0I(UUHZT{~jN&wz65ay1m^Bc|2=2o;x@7f8w{gyF>GumPuc^5*C`q8r$0Jr|ER8`^Jqs z3xL5`tX_{sZ)Z}e8V#E?MG>}XDvhnJ=8Bq{==!r~mxbKfw=XnXDoJtf@vxF@Gs84l zw469T{yrqN-9D*{h+U0=g3Yu?nf zyLVx^s_RU+q5#;~FJS<1A%5(gn|psD$zO-V{n#9*_yfWLu|Z%8)(X}|ge%h8I{(9dg@D2KcKy-xbk0CmQ%~^9Gmw>@P(Jt@O-+%# zSFb*JWx(am&QO-~%mhl&=kZ7nobbpT2r5G-2Sp@)75XF;3`RQ!2d7>N7~Z`*lw~aQ zS1J|uqt0Qg1SsY3NB}Rh${_--fM$$t*<#iLvg7>usTTr%-L*@K|LKU+kK6$)+9<0? zI3T;+2e?%XWi9Tm*Kl|3x^Q7?2_Ug^rxYJgCc^>0pQ^@o0G!rNh!huMyVc}08r?-^ zKCi^!2|>CpUYuG0T-dRrHm4}*--n08I_?%m-Ar+YET=yBSNIn!9zv{_yScz$G+eni zu+Ae~8vv;b2G{OMB<@SVPi<|i#E)(w*f_oN54IIto z-djlWF??WN?*RoD8Es;v67B~3(h192wnN=<-0$zhCD^0-eDb|ySqxYDV~R3)alc^M_~7{P1*i^j*qH zVCBlxr}yu7RFvt@0|U{VVI0OkkX89xx87pKqOLbL7eziFfOV7+FSdD|@KH2qHZfax zDREuT71C+dE)+AEuI-RL%02X?XtRUqWLVgHUxsALC wK>e4;r{{9*@t}>EDJ<(bz8gI~JqGRn2Yp7rH%QQd?EnA(07*qoM6N<$f=U31O8@`> literal 0 HcmV?d00001 diff --git a/rdfdatabank/public/static/down_arrow.png b/rdfdatabank/public/static/styles/images/down_arrow.png similarity index 100% rename from rdfdatabank/public/static/down_arrow.png rename to rdfdatabank/public/static/styles/images/down_arrow.png diff --git a/rdfdatabank/public/static/down_arrow_black.png b/rdfdatabank/public/static/styles/images/down_arrow_black.png similarity index 100% rename from rdfdatabank/public/static/down_arrow_black.png rename to rdfdatabank/public/static/styles/images/down_arrow_black.png diff --git a/rdfdatabank/public/static/down_arrow_blue.png b/rdfdatabank/public/static/styles/images/down_arrow_blue.png similarity index 100% rename from rdfdatabank/public/static/down_arrow_blue.png rename to rdfdatabank/public/static/styles/images/down_arrow_blue.png diff --git a/rdfdatabank/public/static/styles/images/file-add-icon-24.png b/rdfdatabank/public/static/styles/images/file-add-icon-24.png new file mode 100644 index 0000000000000000000000000000000000000000..1f77aee9975082cd4358954e9227ec156429a4ca GIT binary patch literal 1444 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

EMbV`0Q7tF%{1OUH2EpgweK$u!nkiPM;n~5B1 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 literal 0 HcmV?d00001 diff --git a/rdfdatabank/public/static/styles/images/fplus.png b/rdfdatabank/public/static/styles/images/fplus.png new file mode 100644 index 0000000000000000000000000000000000000000..8201a634fa3db95c763d216467089d9d49942713 GIT binary patch literal 48915 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

S4{b_h? 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 sybkj9xMxB^^CjS*8s`Sr+y)}< zP4|z76-VEv<3^4>^55G45BF_sYw+|*yAt<=NlKjpQVTqlRxNAW%9yH;siyoSYvv9c zi=G`D1}7X>7*swzf56w?)TvTQSB~jivV`4jTr3EAX@=Fmgoe~O0x@^|e?d4c8}Xl9 zNkU%u8}3kbRa*Q;f!>Sbi$HGiEhIY(XvgN`XxDmx%nz2?kxJ~43YfCK`Pg@1hy+-P zDHu6W08DH8Kz3x58gS>qsxpm(95QBFUF4{XCq)}wI~=N8(T5E1ZjrL~ z3CMvceSfwIVw1$&M}sq{wm?8`pWogmzE9rPq?WrpOq=xCIOD1HsBP)NH&u!!!bN|z z$Gny`YKj}iJH}f=G$$eH=M_@QLL@8Q`S#bls*u@l>{;A#()+#upr-7UpUjyb^GVBX zxy-{L#RjS+tGYf&dnJ8z$@N>*y8q??JxQz8jSy2@%1nIC<~t^(Ou~|J=3d!*j5kLY zG0G?HiIO0kl9Z=yB;E$wTq2ueKowziG;&<5tS;L{vi}o~(G6{M-Z}1T zyW@2UZ&K~_gc0 zPp%+9>mqZlBXD)(1?p;Tt)}o2=-d{C#rl%WC?I+%4>>Ep1^-$aVSrvVs>+lf>Mj-P z%F5x(@t*k@|E%2O!kOS)!o}PU$JpQyRQz$xY*4*+Y80GX>Ve7|MqFiKxhr3(sSybE zdGs>A{VK{Zd;1q0uAhB@_29llwjZ0pfEC=ZRIj`@CQT4u#FxZMkAxE<~!%*!#IqtY=Hmn3u+ ziKE}m);C|%GsHC3iJHt(NQ~&>ValhZxqW<5v8y7bx*7-n~`nLK1BSsSg zkhrpvbJAF-vA)V7A@@q&tQk>xT))OwoNn-n_n#ju6p2LQ4h|e&MXrU{vSn$ZY4Iv=szBh;XtdBP@A3dZ5#9j}S;uE9 zC@6$15_l3i7gh4b`*eFp&Zb<^kGGrTc#lfe{Xx}v>pYkO{4ml}7#4Zu`QwX`!&^KI zlY+JM);v*V$HzjNVuU>MMz4!{Vk|dv>@+is%%L@)>@ignwlgcI;d6e|p9OF7OqexV z-*nu(jMv9#RbZW|gxFu~y1zhp#+&#m+u=?L^7JX0wgu zhRc7My8=XxeRbV~UAu%H)qJ=-ILt+~2T3v|&|fR$U;*G{gkk2>5!o_0ZPND&Op?&4 z^JP6q2Pm|=^)j)30cm@#KNpS(2pl|>o3=qCwG>2*(26G4sw2iw2-!=$O@F^s`jnpYFm;S$v%kn zPP(w2%R#jmL?UJ8+O_zcjlhTp$wn4MY$bgGPmwRP+K-Dx3yO}joLq}=kax@twtx=D z=a)up%V2?B&hqn$yMVVshgnt@_{K-bN7R82yhrPY{}}#UIDfd%h^JG^o5ZHz)om2i zgK>a<`~%=6F4<=@ul+&dl^A}=m@ec~J1Q?LkmxGlO$kD&QP%=;He5ZaK!>aYc;@>j z4F^>=oB-F4+CzSA7OvQ1M{!M zkUU8l;XudJN6y^N!=Qyhe359ux!_=k=^Ssc`pqZTACo4HRhPA@U{LG=x;w|MCv!jJ z!%TSd540rgY*La5f`qC0UkEQMuEl9F(*e#w8O_LgO?!uSMfnay=YKNfzqry|TbAbk z_m(2N%^sbV_-R2lG4CeA{`$X#P;un{UIY;k+z6q$4Ttde_oMVl+-XSMsTtj=|9Pls z3nOd%`3V2zE-XwXR~LPt?KJ*6^~uZs*Tp{R&I0Rz>%yc*>V1)&ExJfobEqc^*fZxR z7;?yjJL1^^x5PtX{vnG1=pjDXW+~tp3SVl#qDGOhPHbltiVcb^Ln>Cz`l9nx zXA4-Nj{h|^6!M=F3jV*fD@DM)>+&Xp#b>rR@G|~4yygF#cksV%H}KAjP)2avS5(qz z$jAU!Uvl`o&13+j+t4|YyZo8lw)^tSUW1LALwh>?i>?Uc_4`UIhb&L7OnmM@{^M9NH@$dQE zKorc^bjUMznX1808{79dMdJy>gPS{Nit!WL2eAq9@$m`#*+6}C-Z2QYcRhojiFxO_ zr(hTey<05^Zxwv=7Zxl5B3P_T5g34~y^k*HC2}+GzwJn{78%le{*iS(>>f2?!#(B+ z(35W8m9&MLi0;#|AWzJxiYq}z?uruMth-o4hm$V-{dK>5#SNZ4;gb)|ReS*CUD|KU zZ}@*$CJ7I>#2-dN;3>j zDd^r2=5i`~-jwvxnGbh-;F9cnyrj;U8fn4g zsKUx_o5Ds`pnFntWk|?pQ(nO$ajWoH3H~`$Q-4?YXJ<+f>n(5HZ&&bAX*aX0X{?+O zGnEja4b#}9(Xz zS)rzEv;^ikt6T^{B-tM}Ny*py%wgaSot0T-edxyA(fL71X}Y)eIx;XR5iLIWR8aY+ z&d?V!CPx{jyN9?5Nqb(s}udmwayl&aF3Jzb=VoD)*#RQo?+3=)8 z05fucd;yWYCvN$=gz^Mfpx^z6wDDy4MeJR6bGcVuJ%x>L?Q(P82fgH%+iuDTUROJ( z)c<5Y;ri56@53aPFh&B)WK3()IVQKk_!~f7YT{~75UK`Z#0X1BZiH2^OT1D$%~Cf# ziM;LW!GSiXoOuyVFxLQlZh2NPsZnpS>hrK^zN|P#{xn|6jTk7s*DOLdg2M4>CZS4qt&QW^ z&1GNp6(z#0NMrn-qI8NYXcvT+=i9!ydzI*lfwJzT1tpM;eTSU{!6 zBj5qb>JZR3eR=u;7hCFW$A}mEm*qCH_vA{kR}3GfF$(7f30k7T-%^$?N8PZ`$z4VsjJUr~Hy%j4zKimK)L-s0EeQHuXt>0q6I?wCUUh^* z#LG{+*YO(bEZ)CjPxlX^vy#Yc*Gm}4kD$;GhfEn!v8L}BAIK=kfwdK16-l2HVTsB& zpG>=((-RgF1j}ngGLSpon!t$-3^TQCRbB7Zws>{wr^y396Y}4c901>`Uu(r4?!!DO z`V^A4zKdNoz*mA^4pzGk1;dND7^Oe>EV(fqS~d_dZ-xMH*d zuF<9?MhowRCKGR=k9N1)gvZV9ES~uRlg}%CAnt2A@4k~MaNZiA2#<(gS60osn_bMC z@wtV|e_korYX_i=-X}9Tbmr+Xdg-$5)GnIEw~Jjj6K%ZYI9laRc3PHd zobz&Gy3Nw9_)bu{J+uhUbSuN=G%_wB+~D;ZB5WYsS;6}2%dkD16Ap34twZr4%DV5n zx>)nmgs3*oGG4%L8|2AtLQi&7%lbca8HcuHiE(JPEuCe=}EU>Y{weW!5jh-EOF zlxn9aPM!BJ%S<4xNWY79>D7YVKt+!Wy{`(?1CBku@s7~;jzTidCMri` zMqB?B+BsD)GG|cf*O+pTbdR?-b@kHfb3OTH%UjbEZ!PFFYW2&-zQNInZ{#4?#z1?FQU#nsIAW*S;i z0s8aw-vSMEwk8*}x?blqZBVry>keCs`j zK#nyR?Zz|thNpd9!?q@=a-9~b;q#5}EhX|x*9L>^S(`==Zi~$qDuhOeay-y$p+>pm zp^_x@ki?|dQU&piKQ>$9GymI{)%zLuZqp-RRm6Ef|TMmhasl0>+d&xi{ZA31$P{AT2LTk=DJlZaMFZVAXps1_PXWPM_S@n5LoRgX@s8TGERic6yRn z5iV5;oOx)ZycPWRpsqLu@en^gGnd32ngWl{j^qg@TX(%%dn9ANTVApxQKDw=6ASY~~P(5ItT49>7uls(v)?5_c>+}7uW*NBoPp3k7QJ9dk)Ip@8Y<- zyUsv*Ucc7dtNJ`X?9QXiI(GoI)Am=ALmE;cWeHO z>h2MIzQQ!TIsxcQ*oJqE2|}QsE2AW7x9jnD6Y9J2+%KcBxUnDSUK?{!yx z{mp{YmEjC0=oI?&RshlFW>_3WRUgu1YAeJcW;;DxuaY3foto{yn@f@>;x@~*p{z1d zVX6~HfZBl{H1SSd*!MW?T;#|Z8Gn$TE&1Dvxo?+_pHsMVby^S~N7IE0pQ!3&H2=P* zL97IISVilT$$$11U>ADxS6}IcbXrmAl-=y1(b38JQ{#Sb&ZKeoh^bt^u3 zlv0gMp8mS>ek{E;r#v6v7Cu@&=i^jd;UrHMPMyR?Kh$J$xC{0#pkM9~_aeqd{+yyA zgF35*hXsK6Fuz&h+RQZ_aSEkcosMAnI1dl<=Ly8uhx;X%`$BeDsvOlW4_aJTh+Y)a zPZ#Ai({Gh#cBb@!g=NvHb`OiTOqPg!3<`|6nWLib1*+LpJBz?q3F8CFh*o?%NQkxY zv$DyolBHZvQeZegl-1%@?}TsxSy&>-W#uyV{D_MNwdmciDDJ7UdtYU?#yRhlT}p!~ ze9Ol66y7}GMV>k?r}yd|9+6nB7@h=Az8+l0@3I!QGCa@M4601xd{4<3%=n?ek;Xu0 z6aS4nE99l&qaMdIBf`)yt@zw`(2EyeZ|P`ebQj-7juskj-61c^gY+S>E3$ub>_%zf zS|J~J%y+6*A1QzG+2xtEJp*5`7j-rx%o@*?cWwu#DtT)l4GMpJqq#FqL@;Z2fc$#= zP@DajtW-`inp`)oQD*RH*c9n3;eF(DnYaR$6-)eEFF%Mm_GR5G@r`$3+eKI5uTV)@ zw|@K(bJN6)Yk&XIP#j)b7I-d5;6+yXxRChV#Vh9_fNuRD!P?=p`s1jIMBTZ3^|0#Q zx(DCbD%fTzBl$y%nI|iC2k+J9T?jYZ<9wn=Zaj=sSvL6=_=Wb{r^R%a$lT%IF&>x_ zg0AhJ=lL2;6s%Gn+Y2*yG!GL(hx}TOlvofl!=e<6G&Ws=zsd=rD+R(ja(4L#+u>K) z+%Z3gkH;j6_M)G5_o|PI%*{1A2Ok$&e5!OgnrfeZjTI(W2_TFEA88p!iDB~w4Z|-Z zv}G-BZ{jTILyWDe+Y>_xKM+3L^&wW*xb6LT14be8<=jyRs)>E`8NeU20P_f!KVD9Z zG7gqdQKmMMSZXCmR$F5%H9Ho|bPjy}$Xpt~(OLmre)ZgC@BTcU_^WBp2;a}k7UaKQ z6d>(OsXiwl;sY)}w>A{5VWsdH>nwT)>E>Ah`HUy$Eg}ufe#M(1j0BkaS5ll-9Z$m` z9dwnAR%(IP=UL1vYs9QA?XIlI7)9TH;aGi7y{fHd+8j&z(Xeq20I8V2vS?p&U{DAC zws>7hQ*`i%f?uFJ&xg+1rOD493IVr66DM%`X;05eMxDCLFP|em|A2hj>4K!^Vp_ys~Fr<_F_LQCq0khng)p1~JI~zLW3teLaJh zgSv$8QG>9^;o8=yB)LcD38vJbCLP}eM8k)^<*SD8??My1{9?@vynJ#9r!3yRI$HT) z#zQ#FHux@EPc<{?0DsIO@+D`r=ysuf;yN<_(EpAw@-;!S)}ujx$}xRnJ*rU<^%19m z;&cty^QsR8($qxUqC%C^`1RmIvwF;dPUw`ItRJ z1U%l_1I&E*;jsOJuHMLr6qw3DSlE6NW1Lk$)b(yrLDu^!pZABOD={yp(Z=A|>l~L# zD}#1FM0%iUm#49h$d7Vq@mLzm@`vTZntMza-ArF-8fLR47ZpGRZ`=ySqvM(u{`_!y zC|3L$^LRdgU+cI%#yELD5|&?Px*_g-S$IWB-qNX0Aph7q_%da{4f6GwU&6=B+1Qrj zt*k9h2W`H(YsJ=gkCN}=8X=V-pVp^L(pSpqnNkY>Og&)(h=0lW=6uI%-#f;fBl>Bg zVj^-SQik%mz0^{8)7QdQFYiM}u`XHEz3~*?A0kRZ9&w$wI0E( zhYrhJpEz%su!+jFJb6dT^P$4}ui}~lcfdW+{W}p*E$Z^By7DC=#)IgFU+og_k|(>Q zg5EO^NUS_2+KD$N6j`$jr3$#sO-*sECh!Z{I+=t9RHKY7h|b8AWB?+h-$`WWN9~0) znLuxqxi3h_F+RF3wCoQcx71#reQp~fzqm8-W4{_cx~d;2?`SWX-NmTAQ`O~btbgr> zG4p|srH$(f;Tr_|FBean?;#RUvmG!0IMoW5vgKF)P#r8-Mzi?uLXzEx)*)+XZX zbsc*t^iZe&i9*8S&x!5AoMEV=i-9MRhSWoIUsDu+PQ(la?hO|EB*oWq{qEM689Y zgnib(wbRL^&}5p_#(7VfKw}Ktz82_HXtRDB>ZscbeKX|b&XZ)QL3}b+Z=Xa(-nx=5 zMcu-$=v7^RIoLbWa^`t*vXGC z6!^O#g07CVkFhUgqk<$eO$F&$>R-&M95E{870_&R#yWui?m6KxRk4tQ!k2U96AWjh zo9C;2?%`44*yBESZ(!-CAV%D7HV&e0;!})7bcS0=_Jr>pJVaphiMlYgSVuV8655RVP&tn6FJ}g5O|Mz8|GS) ztv&LAL)wFhhVcmj-SKS8ed2clZT9Dm_Gj$(*a0eOPa5x{EizBN`jU{H($+jFQVe=4 zk>-mHIYm%kQ`+x@zD`Vg5ZU^8>x>zfENB$MbzHM-H^KUvT;t)-)d-#!sH(`S8=71& zFGo4F;aeC>9)jzzHp&Ml5A#x)j!(pSC1^E-E-yw+#zdlD49^Sg}9p^Y`# zEA9-(o=~QQ503!uE8v-OtZmb75yH46>VOzbyM-!{{#B-P9PRzzdtR%9fyF9W^||e% zD&<60@7s?Tgoh)2*u+_Td;H|K!_Up6O^6y-@KzgW=)`ug$fB^sW9Xkpb4lj~2h#i2 zPBPq?CP3h@a5gNSL*V0MpwW`gdP%mxxSMcV&^qXtqkZX zx5uZf(4{y=a>C}q&qbVe63_gKrP)s^BjApK8p)M%M#-g@q({rj4Ek#cy0A_v?YFmR zt|J3A?Jo)}rIplVl>&^!Tsb2+-GcuC^gLmP4BLq;qzrM2^-HlIreVvPW@ACQ9iSesHt7 z0H4C6b}wVZIiy`Ze`+uKXWhNfyd^NXZBZ-QGgK+K(b*qjOCx?U!sL_v=o-%~CE!;vAn9nyg z`?uQa6d&QtpEidt2XI2=`(FL<1iu%{0vd7H1jr@my;MJ=Qc3$TN+$D+_J@y3sYHfH9e zW@qFhxy##uejnDfT$|(cr-4p-zM7H=hkG{z9T&$ESbX50Ww*pRedL+x5{U+!b{>S^ zIXb6=h^4Vcti)SLeqXwjIiZdmSq<;)wP^A7EQjQ{D>q9$>rU9U4^{VzXRkKF-B9N& zP86;kauoQQ-L6a8WjDpZIFnT+*z~$AjHk||pK z{?gLtKU{elL9r_n>)pHJpS4nA@p8|H!r^CTA8-Fe-yju5ll1~%ZmS*mR^r*`*V}T@ zxeH4+*$Kk@-yW6CQz-ozneS+WT}EyfUdC%Skrp`r$aBu`9#~80^@z)FzX>C$q*eUL z!L*6S-Xmp40_Qe3!+YJhpZrlv9_dtkG!-ZeVtgAx^V7uW*L;twO$Gn2FWkT5G`L$j zk?&z1SdsC~#a;Sv&YZEE{b}$z^Wh3Lok>g58Zh;pGV6qWUr?rBZKKAyB89|~Nq~b9 zyHkX(K3z9C4a-LGXMcApM$h$%!@5WB%j(!e{5ii1=rXO4&8GamY%F~F-8ci8>^wI@ zb064-BRMS{^@p5>O0sYRy+h1I5aH8f3^&luTe$ebj2NNy_e+?XwR?@F~k^F7A7;9EDwq zW4~9uX!6@lLIcUt&4e`4mPdzPkZ*VskGoU7%QRbzSLfTws5d499=|Q3@^)_74y+FyEHB;J+d5}ABip1teBaavuwGtb z6!EW1-|^O7k{GC$dS`4d)q7>(7Wvy(|A0ZY14h9`3XhMj5Mi+OpfkuJ?$&fbpTZ`d zP^TYI2ez@?C#=a~W0RGg3sL)a zsd+3WIpLUdKXcSuj@0e4-g-E3XE%mVr4;xe=Lcyvd4jq0OU zO8V>Xt;-n>CskrfbyjBoF{k!u8QRel{L6&Zqf}S+8s$SdC9}l%95aa|>yurq+Rt@& z_H{_%P^5mW>1Mr%oMY+nicYV>Dn9G=)1ZUT;}aQhPr^6e15P&G7pWg}l!BF-4*ni7 zfX4pdM7FTZ!d*&%>_eK@X~SQc?@zbfR63p{IRj5vGibe(_W<3cq57_8V0VrNpId5u zY%-`T+N0y!m94*pS-tu@Ux?zk&r;)Xk z=YjT9eqkC}>IN>gx5i@QZD?+(d_?)(o{6mv`@JWj-d*<#$(mB0pdUGBEh=d?I$vg; z_d11nNZzbfji|)-S)1@)3M=ta5y3L0t{!nR3M|g!5%F#uG`ZpyT zHXVVBt!w-z6U4G))>Ma!EXoBi-TYXuvC3~Mm?63`;~@hztI)d6_9YX+s*%jf7p^~9 z(2l4D8NbKm`xV8L;ncEGeFm`mM~UgpjO1aJR@=Feli3$Fr_1zM43<&V$yvRp32KHJ5mQ{>Xa~_O8x}N#=mubEA#2nM10U zRJ^O})kTg%2;SjOSYBB2#QE2ka>)la zr&c|5I;u>4M-lk}>(4H0zKFAs##sTre_}7d?=Yp8r`zUB*4JkNG%Y6|>g7*z^K*E< z<8ggM5tOpun`S2PbbmKJ6>T4pdgveCebs+HYf4ui_#38BA3 zf%d8Pk*A}Nf7)I3KBSTNCH;Ei(R@SCX2pDo0HCJ#@S_bW-n2Tb_JPZGj8x|+fS3Dk zP>k~t|IT;s@1{tTp7TXlFZ`WCK1AsKM`iZ5i!eb^^TU;9Kr~lIp0Cn|LCl{Hwcfst zgN6OWTtRCXsEN>&qa(HO|Iha?}wi##3C8 ztuCEX9%uy(8=Wf$-{^zCE3!r3EB07?R!>l&E@6+e#z_f}KGw4~^WJKg3x{@$EuTi) zSe}S9(6eIl+;(@7uwZ1FhzMdujWcD<#5g?6jsA!G{fFjR%btlh_8q@z&(mjIEQNP! z6vJ6xwAr5bPBkkX8H}W|Fd0sJRjqPpzA2%Bu65in zjfMJNj#9$NFWa>clSkN*iEY)LeWp`V7sf_P1V*?jq<>wgOo?*kEbLyU=8iM+Ghq$2 zf(3rX$mF|w)Z=Gc7Lb@@=du**)chbbrk@MmIsvGxTfFC3HYRJM4ChnuN; z!hg?XBp{%#hX@;^%4hO|b}48?^}8|B&wufpwgYt4?`PYtVCbBYqQV z@*zCah^I(_9gJ73@Y*td9`pW0Oa12p$Ss33ZYW~w1AHr|zuJk-?1!oJXDhU*#QCNn zC6HWO!j`|~%URn90e3Fr51Pn3AeD)^)8|(XaxaiBw`$>qoL7FBtcf}bjR0|22bJmX zd$pFoAl;3-%zyN~^17X4eRM`tEJsh@e~b3poy2U0P-uT7rSK$RfZo?r^=pj+&qvE{ zb|I~dx*6l2xtI}sodaa!lc1eG;WE0U7d2vvwjJ!@JyQk{t^u2+vx{?9dN|nmcBZNG zLY@jqMD)J6Eh7(xTzhVNZb8R^xHHkjc*1X@l&<*itbEDyd;WbIOu8v@+aTefoFo{K zg-#4nJW5SEYKp&9zAFQ?7D;*hZbA16pQazuVKh}9?)i1+RTD0B#_ng#Ao=Z(H3w6J z0PZNJwj7cHb$SqIl}}1m@S;L7z$nCxy~-2v4FJMB)~zZbp_;uO{q=qQmWw)EnTg|>+Z(Im z!~!Ve!oGwGlLD(5Dyh4zq)H8n_SI{?+p*^guV2!U6a9RXWq9!L>MWwY^;TTIZ^dJw z=XI-dNjI))$FWL>{(IBgfx2~Rw_2A8h#UAa0+#|SU~Q|j<77HCkHW+CwPQYYIv=uY<)H)X_Bw;2btU>tI^bztYsPd(n&*p%Zd zAjE)J6I&|2ZaF>DsXp2?=E=392v3~ebiL4~d2y2BIsD-Jhel2er*NPZMfYIW$gQp;p_5%3Uo<}6v48VX^cpAk1Uc}` zs;liUsf#1BF5MCdP0lzen?QDQ2EO1^rk2Zov_VW|>J&!8s`Zl!}gXO#-GUQvkbS(v0 z((2C3hiQJIsm0d<0M9#_9v{>n`}-Kyg}Hr@HK3v*Dudm`{rbZ57&%6j3e30|QO#-h z@PGu)K9WP1yGuvHi#9e1?SIm&LtInccN!|H9uYhO*Xmhl+#E#dT7NK@B3RkiMw&A7 zf7(0KpeC<1j-yyWqPS2{L@|U>FS2B13ke7WkkY7yU{DZ^NeF>#B*BD55kwIyix`Bs zYXJouuz-jXupk4<7OjAavMQ_Px;Ijm+!v*2ojbkre(22o@V?21lQaM4dCvKreXV`PPqU8!%W6?tx@ZZGhW`OZG_Cwf`S5_$KfaQ%dsr)D}`Hi$9Iy<@OM&NZ%C z=A>WJ{RX{?-zJ$8E!izw54GIcy^Ngp?Sbs(tZ!7IE=_bht*Y&-b)WBWg5fGzyMNcM zHJE(;UNj#=^${6(vouF-yL1Ky7p@c8hp#q{dQG7O$b3!(NNP2j&AooibogK+%}IGm z4V~;*XeKk|ZL)~kl3v>()9;&K?Y)@QS6tmiaX)IQT{EY8tp0^_Nlx@|kWcJoQfCga zbe>O6L{QZ2LV8j9rIIG?oV6r9#k{0-Y&+ZsUxUW)Dpz*PQb*Tr%o*^@GxqGMSQ)Tn zJieDM)VbZ98+U{N+??Tp$-`UwOs0}>dpiy;KRX(7@oI}>(Zm~$0Ql#f(lzP+t=kP9 z#f3jOC+PpIQmxWE`!-VkG7N1|R}x`cvnrq|L(1KpldpR9Un`P^}POFMmJ1Cp^jkz$)-;7;`5_3Ij3OYQH9qgkxIclYcwAK9^J z+5G{Lsk7w6kjnp5Qry5$mWgMk$JHE;sa?t;ztin8ZoFQ@;Fl!_@zxu-;cE)3hZ1E! z1K(~Q_-HMQaMrdyk%})GqPf0MwBKxMTI6o#x$*#OU8H{jsb3wD=u5r%TwZ^KWPUUY zgMN7bno-i$Ylmqp>Xn`?DJ8|>$(4fz$~);wm}aw~NVeKJwx%p&Lq7{)o)hY3xZ?lp^L`pd$Z&M^0C;C;Z zcqKc2gXsL6e1 z6m}uhJxf1kJSkk6m(u#}ym;@emP%NUay{@yosx$2KHd96nzY*Q#<0HDX(ai{M3-i5 zO>Z3W3@p3ts$jCJVSqSzBu&SpB}n>*t6^iRYFSr@x3u8WgAK0&(%!Uq$*Wqox$ZEe zZNv%=-826~pVeFZn660%9 zlG*PPICOkl;OXv2V*TY;o}sF$rs4YcZ5M0E|K6~o@2I#nzARynCMmXR;(%UMi$(F{ zCRe@Mn}OHQU71kaZo6_&_4tKti@K7>>fFvHs&74q!<5&j zsNgk{`nWZ@K|<3Q+YDEnyt;A0QtaI)<5N|0ymn>Xc@yzy%%I|ZIeMfy`|kL4ojXdE zI=0_p=U4-^>P<#b%>Vz;V82?s^Q4hnVxFtg(7>3oDgI)A^7nW;pKDEH@OLwICJVm6-#pUz9$ z&5sZh5s2wRv)9bNxPsY2Jkbn0fFe>#6ClynDCBHrAdmns!Mh2WG%;UD;qy68pLXuS z7BVG#VVDT+=4%5-15v;OXODwZ**pecA|fEaj{Cfj&ncNCnwaSXfI?eMKT#C4Egpx% zqp{n+i2o$|DxAz`u!AH2dpH&~6aIy0CY*qrX7dHBj|VZm&9CPF7efYp7NHsUpa_5xL+*lbfg%7(47m%! z1&RPDG2|`?7bpUt#E`onT%ZVm5<~8SaDgHKN({LR!Uc)|C^6(N2p1>sUpa_5x|E;@pKlgnwc|fy=1nBB`W=1>#^n_%2kz6SMI+l@Ust4So z)O{yb=IHL`Za!k5Ye8PoXuz>W1#V$WC68?O96D2NW)zZ9+Iisj*!E20C3E08Vy&p2 zhIHdsl(uCWhy$%p!YXLqC3dZsb^%YD@s^A~BK&zGFn9B>tA-8|h3TTIO*>zn-IG2OS~<-Unj I=(;QZKLl93k^lez literal 0 HcmV?d00001 diff --git a/rdfdatabank/public/static/styles/images/go-up-icon-24.png b/rdfdatabank/public/static/styles/images/go-up-icon-24.png new file mode 100644 index 0000000000000000000000000000000000000000..ad51a4d7f6b33d90306c7ef822cc9ad846b75e1f GIT binary patch literal 1127 zcmV-t1ep7YP)_1R9oHD>uw2ty*%Y=SqY59%L(M$X#-sTHCA_edhZ=oD+&-rW25YU2_BJW5=4eQ zKPkUTF?G?oLz~0X0=Vbj`Fh2Q@+~g6(_BIVHCu8yHgmvO2b>&0R6+1VzkDFjxntvh z0v!1(Yy1WN_piAw57872G{az;rV&NPU_!8ANY`|%X)01x6?9F*W0N`rFDjdUJG!&& z9|5+jD|~K`=fuLBmZY;B2P~Ux1Of&CQOGQi5jk-V8gZUTD3DMT0#V`oxF%hawBle_ z!`Z(91Yaq|TOHkn#Y-w|b|>Zq3*va50C>!>EFxJD0F^vtB4-jgR@DSTSOb>ASdK=K z6p6v+-!j8<`7f&60L6-BauKLCmn#|b5l6jg>;M8XkCBmfa87UPl)RTn!pF7sXnEZyErM<&Gf z!M;;jsuCwNy5WX&YVPvd2eX|{FK`?SbP_=7uR&Z%fEd02Uv=&a(!4WB3of87X<&C{ zfWKrx=f|zBc#3AF@~k;8@l?10|6_u~-a;!ei)@w!KZ4&Kye-Fz=R@yB@A@^trRZ zZnJ_Q2&T|tavUTn3Zqg8j=cRw^F-gl6ahK6w$wh_(3q1p7dahvu-k2>2t+A@!lHzS zqm$@pdt1}^@qMWSY94E7%ywiV2XSt-Sj>we8j}&Zrtz>GM%{-#Xd3xqPila?+wX5) zSiSyPo5lcdijFb2s4Dr35-P+k3``81Ywm8nFEzmGJ^S;|_Z;64==+)6c0_1IBZy{! tVhl~NknZ#93sx`h=-jq4kP=`v>~{&9*C@!WUb6rI002ovPDHLkV1jL)2N3`O literal 0 HcmV?d00001 diff --git a/rdfdatabank/public/static/styles/images/help-icon-16.png b/rdfdatabank/public/static/styles/images/help-icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa51794962e6d8380b5681faf938b30b399b53f GIT binary patch literal 797 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 D*j8Pk literal 0 HcmV?d00001 diff --git a/rdfdatabank/public/static/json.png b/rdfdatabank/public/static/styles/images/json.png similarity index 100% rename from rdfdatabank/public/static/json.png rename to rdfdatabank/public/static/styles/images/json.png diff --git a/rdfdatabank/public/static/link.png b/rdfdatabank/public/static/styles/images/link.png similarity index 100% rename from rdfdatabank/public/static/link.png rename to rdfdatabank/public/static/styles/images/link.png diff --git a/rdfdatabank/public/static/styles/images/page-edit-icon-24.png b/rdfdatabank/public/static/styles/images/page-edit-icon-24.png new file mode 100644 index 0000000000000000000000000000000000000000..8c8fca7e1ae0e75bf339970b920f0a67e83de4d2 GIT binary patch literal 1346 zcmV-I1-<%-P);uwaDi9kmO8#~=fw{EQ6t=Dtf)1Jro^yXSN!Uvz^+|T>}J-7FL z5&lPOUAJOcwmw# z#pymDgn0f!5@3AX)hz{700#-diAOx5sBYw035yVH-vFZ93Lku>fnIw6X7YB}p9y5@ z#Pdl2m&+{#f`N$F+$0e|{8`mzSD-M8=B=O+@6soY9GV`9ph$K)yr7+?U7n>-w%-H`WcS@nhB@R3E=m+;Ar(ItbDBiR_=6s*kz-O?6+_t@utkR9w2k1NUJZqXg)o2q`~^(! zLA=uv0KeaFi2zuU6I~R$S7aB2tjA#3lR?#cuc|#yWd=7k@9=^@V>wy5?Wl^+nKOs< zdi^{_QG}-fq9}x;fQ0wzoB$;VL2DC8L4?iwTcJy^gCSpplRHO&&nbs{{#~HczW^mA zC6Nfy)6?fNfaNKGD2kSFIGh{-0tKwc**OH;>#xDBJ66h@F5}71hDl#&z-!K3kXJB^ zj7B3C7Z*cXS{m^@KLtRNEQ$(HCt9q?0o!-Pg9{HdUWY$gdm%%sQ1dn?md(wf->us) zGuNnkPNk)#n3a{K>P!ug7$B@DkrlZYQan&nhuy2C| z7tC*x;9jbB43(FcqfV~}ug62IL6D^e{}sw1skKyo9X%)LjqQcVZI~ZGC<8@L?w|U9uR= z=KHpT2M@kwGPQT6?sUn3V9-J=MW%aqNyGD4QBj##?4o-Os>LL>D5AyELqiS+N|L{; z?(pGvJ31b8!z7jp5GY#YXaK<{H4w6$Hk-PHK?I#!2%n8GFkit6j@zl^_& z3#Xcz!eA&2gF}w-bHAKv@VMO$c!s5_aPa&_vE!NcFKUaZErtmC!2kdN07*qoM6N<$ Ef>N1#IsgCw literal 0 HcmV?d00001 diff --git a/rdfdatabank/public/static/styles/images/state-icon-24.png b/rdfdatabank/public/static/styles/images/state-icon-24.png new file mode 100644 index 0000000000000000000000000000000000000000..07838e3df6d344211b4b938ac3204304f5b50493 GIT binary patch literal 1631 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 bGTMIuWBx8(ifGXe00000NkvXXu0mjfO2fW4 literal 0 HcmV?d00001 diff --git a/rdfdatabank/public/static/up_arrow.png b/rdfdatabank/public/static/styles/images/up_arrow.png similarity index 100% rename from rdfdatabank/public/static/up_arrow.png rename to rdfdatabank/public/static/styles/images/up_arrow.png diff --git a/rdfdatabank/public/static/up_arrow_black.png b/rdfdatabank/public/static/styles/images/up_arrow_black.png similarity index 100% rename from rdfdatabank/public/static/up_arrow_black.png rename to rdfdatabank/public/static/styles/images/up_arrow_black.png diff --git a/rdfdatabank/public/static/up_arrow_blue.png b/rdfdatabank/public/static/styles/images/up_arrow_blue.png similarity index 100% rename from rdfdatabank/public/static/up_arrow_blue.png rename to rdfdatabank/public/static/styles/images/up_arrow_blue.png diff --git a/rdfdatabank/public/static/styles/marmoset.css b/rdfdatabank/public/static/styles/marmoset.css new file mode 100644 index 0000000..15d641a --- /dev/null +++ b/rdfdatabank/public/static/styles/marmoset.css @@ -0,0 +1,88 @@ + + + +/* +### this is styles/marmoset.css ### + + + +This stylesheet is part of a set of stylesheets intended to provide progressive enhancement of css styles based on device capabilities. + +Here is an outline of each stylesheet: + +### basic.css ### This stylesheet establishes some basic style rules that work on all devices. + +### smartphone.css ### styles for more advanced handheld devices. + +### full.css ### styles for 'full screen' devices (desktops, laptops, etc.). + +### ie.css ### IE specific styles (ie.css also imports full.css) + +### mainnav.css ### styles for the main nav in full mode (mainnav.css is imported by full.css) + +### homepage.css ### styles for the homepage in full mode (homepage.css is imported by full.css) + +### print.css ### styles for printing + +All stylesheets files are in the /styles directory. + + + + +*/ +/* for tesing media queries */ + + + + + +header.pageHeader +{ +margin-bottom: 0px; + +} + + + + + +ul.mqtest li +{ +color: #eee; +} +ul.mqtest li.marmoset +{ +color: #333; +} + +header.pageHeader +{ +margin-top: 0px; +} + + +/* give some padding to content containers */ +.main, +footer.site +{ +padding: 3px; +} + + +.main +{ +background-color: #fff; +padding-top: 10px; +padding-bottom: 10px; +margin-bottom: 0px; +} + + +footer.site +{ + +margin-top: 0px; +} + + + diff --git a/rdfdatabank/public/static/styles/print.css b/rdfdatabank/public/static/styles/print.css new file mode 100644 index 0000000..c6e92bc --- /dev/null +++ b/rdfdatabank/public/static/styles/print.css @@ -0,0 +1,39 @@ + + + +/* +### this is styles/print.css ### + + + +This stylesheet is part of a set of stylesheets intended to provide progressive enhancement of css styles based on device capabilities. + +Here is an outline of each stylesheet: + +### basic.css ### This stylesheet establishes some basic style rules that work on all devices. + +### smartphone.css ### styles for more advanced handheld devices. + +### full.css ### styles for 'full screen' devices (desktops, laptops, etc.). + +### ie.css ### IE specific styles (ie.css also imports full.css) + +### mainnav.css ### styles for the main nav in full mode (mainnav.css is imported by full.css) + +### homepage.css ### styles for the homepage in full mode (homepage.css is imported by full.css) + +### print.css ### styles for printing + +All stylesheets files are in the /styles directory. + + + + +*/ +/* for tesing media queries */ + +ul.mqtest li.print +{ +color: #333; +} + diff --git a/rdfdatabank/public/static/styles/reset.css b/rdfdatabank/public/static/styles/reset.css new file mode 100644 index 0000000..4ea402f --- /dev/null +++ b/rdfdatabank/public/static/styles/reset.css @@ -0,0 +1,153 @@ + + + +/* +### this is styles/reset.css ### + + + +This stylesheet is part of a set of stylesheets intended to provide progressive enhancement of css styles based on device capabilities. + +Here is an outline of each stylesheet: + +### basic.css ### This stylesheet establishes some basic style rules that work on all devices. + +### smartphone.css ### styles for more advanced handheld devices. + +### full.css ### styles for 'full screen' devices (desktops, laptops, etc.). + +### ie.css ### IE specific styles (ie.css also imports full.css) + +### mainnav.css ### styles for the main nav in full mode (mainnav.css is imported by full.css) + +### homepage.css ### styles for the homepage in full mode (homepage.css is imported by full.css) + +### print.css ### styles for printing + +All stylesheets files are in the /styles directory. + + + + +*/ + + +/* for tesing media queries */ + + + + + +/* +html5doctor.com Reset Stylesheet +v1.6.1 +Last Updated: 2010-09-17 +Author: Richard Clark - http://richclarkdesign.com +Twitter: @rich_clark +*/ + +html, body, div, span, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +abbr, address, cite, code, +del, dfn, em, img, ins, kbd, q, samp, +small, strong, sub, sup, var, +b, i, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, figcaption, figure, +footer, header, hgroup, menu, nav, section, summary, +time, mark, audio, video { + margin:0px; + padding:0; + border:0; + outline:0; + font-size:100%; + vertical-align:baseline; + background:transparent; + +} + + +body { + line-height:1; + +} + +article,aside,details,figcaption,figure, +footer,header,hgroup,menu,nav,section { + display:block; +} + +nav ul { + list-style:none; +} + +blockquote, q { + quotes:none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content:''; + content:none; +} + +a { + margin:0; + padding:0; + font-size:100%; + vertical-align:baseline; + background:transparent; +} + +/* change colours to suit your needs */ +ins { + background-color:#ff9; + color:#000; + text-decoration:none; +} + +/* change colours to suit your needs */ +mark { + background-color:#ff9; + color:#000; + font-style:italic; + font-weight:bold; +} + +del { + text-decoration: line-through; +} + +abbr[title], dfn[title] { + border-bottom:1px dotted; + cursor:help; +} + +table { + border-collapse:collapse; + border-spacing:0; +} + +/* change border colour to suit your needs */ +hr { + display:block; + height:1px; + border:0; + border-top:1px solid #cccccc; + margin:1em 0; + padding:0; +} + +input, select { + vertical-align:middle; +} + + + +ul.mqtest li.reset +{ +color: #333; +} + diff --git a/rdfdatabank/public/static/styles/silverback.css b/rdfdatabank/public/static/styles/silverback.css new file mode 100644 index 0000000..621b4b9 --- /dev/null +++ b/rdfdatabank/public/static/styles/silverback.css @@ -0,0 +1,46 @@ + + + +/* +### this is styles/silverback.css ### + + + +This stylesheet is part of a set of stylesheets intended to provide progressive enhancement of css styles based on device capabilities. + +Here is an outline of each stylesheet: + +### basic.css ### This stylesheet establishes some basic style rules that work on all devices. + +### smartphone.css ### styles for more advanced handheld devices. + +### full.css ### styles for 'full screen' devices (desktops, laptops, etc.). + +### ie.css ### IE specific styles (ie.css also imports full.css) + +### mainnav.css ### styles for the main nav in full mode (mainnav.css is imported by full.css) + +### homepage.css ### styles for the homepage in full mode (homepage.css is imported by full.css) + +### print.css ### styles for printing + +All stylesheets files are in the /styles directory. + + + + +*/ +/* for tesing media queries */ +ul.mqtest li.silverback +{ +color: #333; +} + + +#page { + + width: 1500px; + +} + + diff --git a/rdfdatabank/public/static/styles/squirrelMonkey.css b/rdfdatabank/public/static/styles/squirrelMonkey.css new file mode 100644 index 0000000..bea282b --- /dev/null +++ b/rdfdatabank/public/static/styles/squirrelMonkey.css @@ -0,0 +1,127 @@ + +/* +### this is styles/squirrelMonkey.css ### + +*/ + + + +#page { + + margin: 0px auto; + +} + +#search { + +padding: 0px; +position: absolute; +right: 6px; +text-align: right; +top: -3px; +} + +#search div +{ +display: inline; +padding: 0px; +margin: 0px; +} + +#search label +{ + +position: absolute; +top: -9000px; +} + + +/* drop shadow on main page blocks */ +header.pageHeader, +.main, +footer.site { + + + -webkit-box-shadow: #b9c8d5 0.5em 0.5em 0.5em; /* Chrome Safari */ + -moz-box-shadow: #b9c8d5 0.5em 0.5em 0.5em; /* Firefox F3.5+ */ + box-shadow: #b9c8d5 0.5em 0.5em 0.5em; /* Opera 10.5, IE 9.0 */ + + +} + + + + + +.content .wrapper { + background-color: #fff; + +} + +.content footer { + + clear: both; +} + +.content a +{ +text-decoration: underline; +} + + +.main +{ + border: 1px solid #dfe2e4; + margin: 10px 0px; + padding: 10px; +} + +.content footer section +{ + + + float: right; + width: 49%; +} + +footer.site +{ +margin: 20px 0px; + +clear: both; + + +} + + + +footer.site +{ +padding: 10px; +} + + + +footer li +{ +display: inline; +} + + + + +footer .copyright +{ +text-align: center; +padding: 10px; +} + +.contentMeta +{ + float: left; + width: 300px; +} + + + + diff --git a/rdfdatabank/templates/about.html b/rdfdatabank/templates/about.html new file mode 100644 index 0000000..48945e3 --- /dev/null +++ b/rdfdatabank/templates/about.html @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + About DataBank + + +

info on project goes here goes here...

+ +

Background

+ + +

Documentation

+ + +
\ No newline at end of file diff --git a/rdfdatabank/templates/admin_siloview.html b/rdfdatabank/templates/admin_siloview.html index f53191c..ce4a9ec 100644 --- a/rdfdatabank/templates/admin_siloview.html +++ b/rdfdatabank/templates/admin_siloview.html @@ -1,20 +1,22 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - Admin Interface - ${c.silo_name} - -

Admin Interface - ${c.silo_name}

-% if c.silo_name: -

Admin ${c.silo_name}

-% if c.message: -

${c.message}

-% endif -
-

Delete this silo - NO UNDO!

-
-% endif -<%include file="/silo_metadata.html"/> -
-<%include file="/alter_silo.html"/> -
- +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + Admin Interface - ${c.silo_name} + +

Admin Interface - ${c.silo_name}

+% if c.silo_name: +

Admin ${c.silo_name}

+% if c.message: +

${c.message}

+% endif +
+

Delete this silo - NO UNDO!

+
+% endif +

Silo metadata

+<%include file="/silo_metadata.html"/> +
+

Update silo metadata

+<%include file="/alter_silo.html"/> +
+ diff --git a/rdfdatabank/templates/admin_user.html b/rdfdatabank/templates/admin_user.html index 182e637..7e3c178 100644 --- a/rdfdatabank/templates/admin_user.html +++ b/rdfdatabank/templates/admin_user.html @@ -1,37 +1,38 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - User Info - ${c.silo_name} - -

Silo ${c.silo_name}

-

User info for ${c.username}

-% if c.message: -

${c.message}

-% endif -%if c.user: - -% endif -
-<%include file="/update_user.html"/> +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + User Info - ${c.silo_name} + +

Silo ${c.silo_name}

+

User info for ${c.username}

+% if c.message: +

${c.message}

+% endif +%if c.user: + +% endif +
+

Update user information

+<%include file="/update_user.html"/> diff --git a/rdfdatabank/templates/admin_users.html b/rdfdatabank/templates/admin_users.html index 7db49d8..fff3cc7 100644 --- a/rdfdatabank/templates/admin_users.html +++ b/rdfdatabank/templates/admin_users.html @@ -1,20 +1,20 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - Users - ${c.silo_name} - -

Users - ${c.silo_name}

-

Users in ${c.silo_name}

-% if c.message: -

${c.message}

-% endif -
-% if c.users: -
    - % for o in c.users: -
  • ${o}
  • - % endfor -
-% endif -
-<%include file="/register_new_user.html"/> +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + Users - ${c.silo_name} + +

Users of ${c.silo_name}

+% if c.message: +

${c.message}

+% endif +
+% if c.users: +
    + % for o in c.users: +
  • ${o}
  • + % endfor +
+% endif +
+

Create new user

+<%include file="/register_new_user.html"/> diff --git a/rdfdatabank/templates/alter_silo.html b/rdfdatabank/templates/alter_silo.html index f83250d..8d06f3a 100644 --- a/rdfdatabank/templates/alter_silo.html +++ b/rdfdatabank/templates/alter_silo.html @@ -1,23 +1,23 @@ -# -*- coding: utf-8 -*- -

Alter Silo

-

-

-
    -
  • ${c.silo_name}
  • -% if c.kw: -
  • -
  • -
  • -
  • -
  • -% else: -
  • -
  • -
  • -
  • -
  • -% endif -
  • -
-
-

+# -*- coding: utf-8 -*- +

+

+
    +
  • ${c.silo_name}

  • +% if c.kw: +
  • +
  • +
  • +
  • +
    List all of the users who can access this silo. Separate usernames with a comma
  • +
  • +% else: +
  • +
  • +
  • +
  • +
  • +% endif +
  • +
+
+

diff --git a/rdfdatabank/templates/api.html b/rdfdatabank/templates/api.html index a740db5..b8da929 100644 --- a/rdfdatabank/templates/api.html +++ b/rdfdatabank/templates/api.html @@ -1,15 +1,15 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - Databank API - -

Databank API

-

- -<%include file="${c.api_file}"/> +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + Databank API + +

Databank API

+

+ +<%include file="${c.api_file}"/> diff --git a/rdfdatabank/templates/atom_results.html b/rdfdatabank/templates/atom_results.html index 2a8a0a5..ebedd08 100644 --- a/rdfdatabank/templates/atom_results.html +++ b/rdfdatabank/templates/atom_results.html @@ -1,2 +1,2 @@ - -${c.atom} + +${c.atom} diff --git a/rdfdatabank/templates/base.html b/rdfdatabank/templates/base.html index 88c7d63..4f344e2 100644 --- a/rdfdatabank/templates/base.html +++ b/rdfdatabank/templates/base.html @@ -1,99 +1,197 @@ -# -*- coding: utf-8 -*- - - - - - ${ h.stylesheet_link( '/static/style.css' ) } - ${ h.javascript_link( '/static/jquery.js' ) } - ${self.head_tags()} - - - -
- -
- <% - user_logged_in = request.environ.get("repoze.who.identity") - if user_logged_in: - c.user_logged_in_name = user_logged_in['repoze.who.userid'] - current_url = request.environ.get('PATH_INFO') - %> - -
- % if c.id: - % if c.path: -

Subdirectory ${c.id}/${c.path}

-

Root directory: ${c.id}

- % else: -

Root directory of ${c.id}

- % endif - % endif - ${self.body()} -
- -
- - +# -*- coding: utf-8 -*- + + + + + + + + + + + + + + + ${ h.javascript_link( '/static/jquery.js' ) } + ${self.head_tags()} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ +
+ + + + + + + ${self.body()} +
+
+
+ + +
+
+ <%include file="/footer.html"/> +
+
+ + diff --git a/rdfdatabank/templates/create_doi.html b/rdfdatabank/templates/create_doi.html index aa972d8..f98db20 100644 --- a/rdfdatabank/templates/create_doi.html +++ b/rdfdatabank/templates/create_doi.html @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- -
- -
+# -*- coding: utf-8 -*- +
+ +
diff --git a/rdfdatabank/templates/create_new_item.html b/rdfdatabank/templates/create_new_item.html index b020d30..c8cd06a 100644 --- a/rdfdatabank/templates/create_new_item.html +++ b/rdfdatabank/templates/create_new_item.html @@ -1,5 +1,5 @@ -# -*- coding: utf-8 -*- -
- - -
+# -*- coding: utf-8 -*- +
+ + +
diff --git a/rdfdatabank/templates/create_new_silo.html b/rdfdatabank/templates/create_new_silo.html index 0e481db..5bc61a8 100644 --- a/rdfdatabank/templates/create_new_silo.html +++ b/rdfdatabank/templates/create_new_silo.html @@ -1,15 +1,18 @@ -# -*- coding: utf-8 -*- -

Create new Silo

-

-

-
    -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
-
-

+# -*- coding: utf-8 -*- +
+

Create new Silo

+ +
+
    +
  • +
    The machine readable name of the silo, used by the system and in the urls.

    For example the name siloa will appear in the url as http://databank/siloa/...
    +
  • +
  • +
  • +
  • +
    List all of the users who can access this silo. Separate multiple usernames with a comma
    +
  • +
  • +
+
+
diff --git a/rdfdatabank/templates/datasetview.html b/rdfdatabank/templates/datasetview.html index 3e40b18..f75559d 100644 --- a/rdfdatabank/templates/datasetview.html +++ b/rdfdatabank/templates/datasetview.html @@ -1,114 +1,217 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - - Dataset ${c.id} - - -<% -c.current = c.id -%> - -

Dataset ${c.id}

- - -% if c.embargos: -

Embargo Information

-% if c.embargos[c.current][0] not in ['False', 'false', 0, False]: -

Embargoed: True

-

Embargoed until: ${c.embargos[c.current][1]}

-% else: -

Embargoed: False

-% endif -% endif - - -% if c.editor: -
- % if c.view == 'editor': - Editor view - % else: - User view - % endif - % if c.version: -
Change view : - Editor | - User

- % else: -
Change view : - Editor | - User

- % endif -
-% endif - -
-% if c.version: -

Information for version ${c.version} of the dataset

-% endif - - - -% if c.show_files: - % if c.editor: - <%include file="/part_list.html"/> - % else: - <%include file="/part_list_display.html"/> - % endif -% endif - - -% if c.readme_text: -<%include file="/readme_section.html"/> -% endif - - -
-
Item's RDF Manifest (Accept: most RDF mimetypes):
-
${c.manifest_pretty}
-
- -
- - - -% if c.editor: -
-

View state information

- % if c.view == 'editor': -
- -
Change Embargo
-
- <%include file="/embargo_form.html"/> -

Embargo state: True - only those logged in and with edit rights can see item. False - Anyone can GET the item and it's files.

-

Embargo date: Aim is for ISO8601 dates to provide embargo trigger events. Currently unused, unvalidated and unparsed.

-
- -
Add metadata to the RDF Manifest:
-
<%include file="/rdf_manifest_form.html"/>
-
- - <%include file="/file_upload.html"/> - - % if c.zipfiles: -

List of item unpack endpoints:

-
    - % for zf in c.zipfiles: - <% - c.zipfile = zf - c.newid = c.zipfiles[zf] - %> -
  • <%include file="/files_unpack.html"/>
  • - % endfor -
- % endif - % endif -
-% endif - +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + + Dataset ${c.id} + + + + +<% +c.current = c.id +%> +

Dataset ${c.id}

+% if c.version: +

Version ${c.version}

+% elif c.versions: +

Version ${c.versions[-1]}

+% endif + +% if c.editor: + +% endif + + +
+% if c.version and c.versions and c.version == c.versions[-1]: +

You are currently viewing the latest version (${c.version}) of the data package

+% elif c.version: +

You are currently viewing version ${c.version} of the data package

+% elif c.versions: +

You are currently viewing the latest version (${c.versions[-1]}) of the data package

+% else: +

You are currently viewing the latest version of th data package

+% endif + +% if c.versions: +

View other versions: + % for i in range(1, len(c.versions)-1): + % if c.version and c.versions[i] == c.version: + ${c.versions[i]} | + % else: + ${c.versions[i]} | + % endif + % endfor + % if c.version: + % if c.version == c.versions[-1]: + ${c.versions[-1]} + % else: + ${c.versions[-1]} + % endif + % else: + ${c.versions[-1]} + % endif +

+% endif +
+ +
+ + +% if c.embargos: +

Access Information

+
+% if c.embargos and c.current in c.embargos and c.embargos[c.current]: + <% c.emb = c.embargos[c.current] %> + % if c.emb[0] == True or c.emb[0] == 1 or (isinstance(c.emb[0], basestring) and c.emb[0].strip().lower() in ['true', '1']): + % if (isinstance(c.emb[1], basestring) and c.emb[1].strip()): + Data package is embargoed until ${c.emb[1]}. Only the metadata is openly accessible. + % else: + Data package is embargoed indefinitely. Only the metadata is openly accessible. + % endif + % else: + Data package is openly accessible + % endif +% else: + Data package is openly accessible +% endif +% endif +
+ +
+ +% if c.show_files: +

Data package contents

+
+ % if c.editor: + <%include file="/part_list.html"/> + % else: + <%include file="/part_list_display.html"/> + % endif +
+% endif + + +% if c.readme_text: +

README text

+
+<%include file="/readme_section.html"/> +
+% endif + + +

Metadata

+
+ +<%include file="/rdf_manifest.html"/> +
+ +
+ + +% if c.editor: +
+ % if c.view == 'editor': +
+ + + + + + + + + + % if c.zipfiles: + + % endif + % endif +
+% endif + +
diff --git a/rdfdatabank/templates/datasetview_version.html b/rdfdatabank/templates/datasetview_version.html index 6e18250..f7b645c 100644 --- a/rdfdatabank/templates/datasetview_version.html +++ b/rdfdatabank/templates/datasetview_version.html @@ -1,49 +1,49 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - - Dataset ${c.id} - - -<% -c.current = c.id -%> - -

Dataset ${c.id}

- -
- - - -% if c.editor or c.embargos[c.current][0] in ['False', 'false', 0, False]: -<%include file="/part_list_display.html"/> -% endif - - -% if c.readme_text: -<%include file="/readme_section.html"/> -% endif - - -
-% if c.embargos: -
Embargo Information
-% if c.embargos[c.current][0] not in ['False', 'false', 0, False]: -
Embargoed: True
-
Embargoed until: ${c.embargos[c.current][1]}
-% else: -
Embargoed: False
-% endif -% endif -
- - -
Item's RDF Manifest (Accept: most RDF mimetypes):
-
${c.manifest_pretty}
- -
+# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + + Dataset ${c.id} + + +<% +c.current = c.id +%> + +

Dataset ${c.id}

+ +
+ + + +% if c.editor or c.embargos[c.current][0] in ['False', 'false', 0, False]: +<%include file="/part_list_display.html"/> +% endif + + +% if c.readme_text: +<%include file="/readme_section.html"/> +% endif + + +
+% if c.embargos: +
Embargo Information
+% if c.embargos[c.current][0] not in ['False', 'false', 0, False]: +
Embargoed: True
+
Embargoed until: ${c.embargos[c.current][1]}
+% else: +
Embargoed: False
+% endif +% endif +
+ + +
Item's RDF Manifest (Accept: most RDF mimetypes):
+
${c.manifest_pretty}
+ +
diff --git a/rdfdatabank/templates/delete_item.html b/rdfdatabank/templates/delete_item.html index b020d30..c8cd06a 100644 --- a/rdfdatabank/templates/delete_item.html +++ b/rdfdatabank/templates/delete_item.html @@ -1,5 +1,5 @@ -# -*- coding: utf-8 -*- -
- - -
+# -*- coding: utf-8 -*- +
+ + +
diff --git a/rdfdatabank/templates/doiview.html b/rdfdatabank/templates/doiview.html index 89447d6..ea96f5a 100644 --- a/rdfdatabank/templates/doiview.html +++ b/rdfdatabank/templates/doiview.html @@ -1,43 +1,43 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - DOI view - -

DOI Information for ${c.silo_name}/${c.id}/version${c.version}

-% if c.heading: -

${c.heading}

-%endif -
-% if c.message: -

${c.message}

-% endif -% if c.resp_status: -

Response code from Datacite: ${c.resp_status}

-% endif -% if c.resp_reason: -

Response message from Datacite: ${c.resp_reason}

-% endif -
- -% if c.dois: -

DOIs available for this dataset

-
    - % for v, d in c.dois.iteritems(): -
  • Verison ${v}: ${d}
  • - % endfor -
-% endif - -% if c.version_doi: -

DOI: ${c.version_doi}

-% endif - -% if c.editor: - <%include file="/create_doi.html"/> -% endif - -%if c.metadata: -

Metadata associated with the DOI

-
${c.metadata}
-% endif - +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + DOI view + +

DOI Information for ${c.silo_name}/${c.id}/version${c.version}

+% if c.heading: +

${c.heading}

+%endif +
+% if c.message: +

${c.message}

+% endif +% if c.resp_status: +

Response code from Datacite: ${c.resp_status}

+% endif +% if c.resp_reason: +

Response message from Datacite: ${c.resp_reason}

+% endif +
+ +% if c.dois: +

DOIs available for this dataset

+
    + % for v, d in c.dois.iteritems(): +
  • Verison ${v}: ${d}
  • + % endfor +
+% endif + +% if c.version_doi: +

DOI: ${c.version_doi}

+% endif + +% if c.editor: + <%include file="/create_doi.html"/> +% endif + +%if c.metadata: +

Metadata associated with the DOI

+
${c.metadata}
+% endif + diff --git a/rdfdatabank/templates/embargo_form.html b/rdfdatabank/templates/embargo_form.html index e32d2b2..7b4c55b 100644 --- a/rdfdatabank/templates/embargo_form.html +++ b/rdfdatabank/templates/embargo_form.html @@ -1,27 +1,37 @@ -# -*- coding: utf-8 -*- -
- -% if c.embargos and c.current in c.embargos and c.embargos[c.current]: - % if c.embargos[c.current][0] == True or (isinstance(c.embargos[c.current][0], basestring) and c.embargos[c.current][0].lower() in ['true', '1', 1]): - - - % else: - - - % endif -
- - % if c.embargos[c.current][1]: - - % else: - - % endif -% else: - - -
- - -% endif - -
+# -*- coding: utf-8 -*- +
+% if c.embargos and c.current in c.embargos and c.embargos[c.current]: + % if c.embargos[c.current][0] == True or (isinstance(c.embargos[c.current][0], basestring) and c.embargos[c.current][0].lower() in ['true', '1', 1]): + + Embargoed + Open access +

+ % else: + + Embargoed + Open access +

+ % endif + % if c.embargos[c.current][1]: + + +

+ % else: + + +

+ % endif +% else: + + Embargoed + Open access +

+ +

+

+% endif +
Embargoed: only authorized users of the silo can access the data package
+Open access: all users can access the data package.
+
Embargo date: Date until which a data package should be emargoed. By default, this is set to 70 years from now
+ +
diff --git a/rdfdatabank/templates/file_upload.html b/rdfdatabank/templates/file_upload.html index 89f25d4..3c5324a 100644 --- a/rdfdatabank/templates/file_upload.html +++ b/rdfdatabank/templates/file_upload.html @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -

Add File to ${c.id}

-

+ - +

+ + +

-

diff --git a/rdfdatabank/templates/files_unpack.html b/rdfdatabank/templates/files_unpack.html index 7e57eb5..9430ea5 100644 --- a/rdfdatabank/templates/files_unpack.html +++ b/rdfdatabank/templates/files_unpack.html @@ -1,18 +1,20 @@ -# -*- coding: utf-8 -*- -% if c.zipfile: -
- -% if len(c.zipfile) > 50: -<% c.disp = "...%s"%c.zipfile[-50:] %> -${c.disp} -% else: -${c.zipfile} -% endif -% if c.newid: -   -% else: -   -%endif - -
-%endif +# -*- coding: utf-8 -*- +% if c.zipfile: +
+ +<% +c.disp = c.zipfile.strip().strip('/').split('/')[-1] +if len(c.disp) > 50: + c.disp = "...%s"%c.disp[-50:] +%> + +% if c.newid: + +% else: + +%endif + +
${c.disp}Id (optional) :Id (optional) : +
+
+%endif diff --git a/rdfdatabank/templates/files_unpack2.html b/rdfdatabank/templates/files_unpack2.html index a3798d5..799de04 100644 --- a/rdfdatabank/templates/files_unpack2.html +++ b/rdfdatabank/templates/files_unpack2.html @@ -1,12 +1,12 @@ -# -*- coding: utf-8 -*- -% if c.zipfile: -
- -% if c.newid: -   -% else: -   -%endif - -
-%endif +# -*- coding: utf-8 -*- +% if c.zipfile: +
+ +% if c.newid: +   +% else: +   +%endif + +
+%endif diff --git a/rdfdatabank/templates/footer.html b/rdfdatabank/templates/footer.html index d3c2e9f..70b9c3c 100644 --- a/rdfdatabank/templates/footer.html +++ b/rdfdatabank/templates/footer.html @@ -1,3 +1,11 @@ -# -*- coding: utf-8 -*- -

Copyright resides with the noted authors/creators of the works held here, unless otherwise noted.

-

Databank API documentation

+# -*- coding: utf-8 -*- +
+ +
+ diff --git a/rdfdatabank/templates/header.html b/rdfdatabank/templates/header.html index 1915c80..0ae526e 100644 --- a/rdfdatabank/templates/header.html +++ b/rdfdatabank/templates/header.html @@ -1,5 +1,11 @@ # -*- coding: utf-8 -*- -
- +<% +from pylons import app_globals as ag +%> +

DataBank + %if ag.api_version: + ${ag.api_version} + % endif +

<%include file="/search_form.html"/> -
+ diff --git a/rdfdatabank/templates/home-dev.html b/rdfdatabank/templates/home-dev.html deleted file mode 100644 index 9d9b580..0000000 --- a/rdfdatabank/templates/home-dev.html +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - Databank - -

Databank

-

The purpose of DataBank is to provide a pilot version of a robust and efficient system for the safe storage of and open access to (where appropriate) research data. Content could be described as data produced as a result of academic research.. Items might comprise files such as spreadsheets, databases, audio files and images (still and moving). Numerical or other data might be raw data or the data may have been manipulated or processed in some way.

- -

DataBank is not intended to store large-scale data sets such as grid data or other vast data sets. Neither is it intended to replace national, subject or other established data collections. It is envisaged that the future role of DataBank will be to provide a secure and accessible store of small to medium-sized files which have no other option for similar safe storage.

- -

Please note DataBank is a pilot system and still under development.

- -

Users should adhere to the terms and conditions stated for each item.

- -

Browse Data packages

- -
- -

How to use Databank

- -

The admin credentials used in this demo instance of Databank are
username: admin
Password: test

- -

Databank documentation

- - -

Using the Databank API

-

Data can be submitted into Databank by using the Databank API. The API provides a restful web interface to all of Databank's features. -

- - -

Running your own instance of Databank

-

Databank is written in Python. The Databank code is licensed under MIT and can be checked out from https://github.com/dataflow/RDFDatabank -

-

For instructions on installing Databank, follow this document

- - Get in touch with the developers of Databank - -

diff --git a/rdfdatabank/templates/home-prod.html b/rdfdatabank/templates/home-prod.html deleted file mode 100644 index 0c3a0cf..0000000 --- a/rdfdatabank/templates/home-prod.html +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - Databank - -

Databank

-

Oxford DataBank is a small collection of non-bibliographic works created by Oxford researchers. The purpose of DataBank is to provide a pilot version of a robust and efficient system for the safe storage of and open access to (where appropriate) Oxford research data. Content could be described as .data produced as a result of academic research.. Items might comprise files such as spreadsheets, databases, audio files and images (still and moving). Numerical or other data might be raw data or the data may have been manipulated or processed in some way.

- -

DataBank is not intended to store large-scale data sets such as grid data or other vast data sets. Neither is it intended to replace national, subject or other established data collections. It is envisaged that the future role of DataBank will be to provide a secure and accessible store of small to medium-sized files which have no other option for similar safe storage. The role of DataBank will be clarified as Oxford University works towards a solution for the storage of and access to its research data. Please note DataBank is a pilot system and still under development.

- -

Users should adhere to the terms and conditions stated for each item.

- - diff --git a/rdfdatabank/templates/home.html b/rdfdatabank/templates/home.html index 9d9b580..976a170 100644 --- a/rdfdatabank/templates/home.html +++ b/rdfdatabank/templates/home.html @@ -1,53 +1,48 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - Databank - -

Databank

-

The purpose of DataBank is to provide a pilot version of a robust and efficient system for the safe storage of and open access to (where appropriate) research data. Content could be described as data produced as a result of academic research.. Items might comprise files such as spreadsheets, databases, audio files and images (still and moving). Numerical or other data might be raw data or the data may have been manipulated or processed in some way.

- -

DataBank is not intended to store large-scale data sets such as grid data or other vast data sets. Neither is it intended to replace national, subject or other established data collections. It is envisaged that the future role of DataBank will be to provide a secure and accessible store of small to medium-sized files which have no other option for similar safe storage.

- -

Please note DataBank is a pilot system and still under development.

- -

Users should adhere to the terms and conditions stated for each item.

- -

Browse Data packages

- -
- -

How to use Databank

- -

The admin credentials used in this demo instance of Databank are
username: admin
Password: test

- -

Databank documentation

- - -

Using the Databank API

-

Data can be submitted into Databank by using the Databank API. The API provides a restful web interface to all of Databank's features. -

- - -

Running your own instance of Databank

-

Databank is written in Python. The Databank code is licensed under MIT and can be checked out from https://github.com/dataflow/RDFDatabank -

-

For instructions on installing Databank, follow this document

- - Get in touch with the developers of Databank - -

+# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + Databank + +

Welcome to DataBank

+
+

Store, archive, publish and access your data from the web using Databank.

+
+
+

DataBank has a simple restful api and uses a rdf-enhanced pair tree store which can be used by other data services to archive data in Databank, as is used by DataStage

+

DataBank is a pilot system, still under devlopment.

+

We are a part of the Dataflow project

+
+ + + + +

How to use Databank

+ +

The admin credentials used in this demo instance of Databank are
username: admin
Password: test

+ + + + +

Using the Databank API

+ +

Data can be submitted into Databank by using the Databank API. The API provides a restful web interface to all of Databank's features. +

+ + + +

Running your own instance of Databank

+

Databank is written in Python. The Databank code is licensed under MIT and can be checked out from https://github.com/dataflow/RDFDatabank +

+ +

For instructions on installing Databank, follow this document

+ + Get in touch with the developers of Databank + diff --git a/rdfdatabank/templates/item_file_upload.html b/rdfdatabank/templates/item_file_upload.html index 6570d54..748f059 100644 --- a/rdfdatabank/templates/item_file_upload.html +++ b/rdfdatabank/templates/item_file_upload.html @@ -1,9 +1,10 @@ -# -*- coding: utf-8 -*- -

Add File to ${c.id}/${c.path}

-

-

- - - -
-

+# -*- coding: utf-8 -*- +
+ + +

+ + +

+ +
diff --git a/rdfdatabank/templates/items_api.html b/rdfdatabank/templates/items_api.html index 79691ec..7505239 100644 --- a/rdfdatabank/templates/items_api.html +++ b/rdfdatabank/templates/items_api.html @@ -1,160 +1,160 @@ -# -*- coding: utf-8 -*- -
-

Items

-

Sections

-
    - -
  1. /{silo name}/items/{id}
  2. -
  3. /{silo name}/items/{id}/{path}
  4. -
  5. /{silo name}/items/{id}/{path}/{subpath}
  6. -
- - - -
-
-
/{silo name}/items/{id}
- -
-
-

API call to obtain a list of unpack end-points and unpack a zip file into a new / existing dataset

-

Controller: items     action: datasetview

-
-

GET

-
Returns
-
-
401 if not a valid user
-
403 if not authorized
-
404 if dataset id does not exist
-
Accept: text/html
-
Returns an HTML page with list of zipfiles in {id} with form to unpack the zip file
-
Accept: text/plain, application/json
-
200 OK
-
Returns a JSON-encoded list of zipfiles in dataset
-
The file - itemInformationForDataset.txt - contains an example of the data returned (data_returned) -
-
Accept: */*, default
-
Returns text/html - an HTML page with list of zipfiles in {id} with form to unpack the zip file
-
-
-
-

POST Unpack file. Create new dataset/update existing dataset with contents of upacked file

-
Parameters
-
- - - -
filename{name of file to be unpacked, including the path}
Id{(Optional)}. if Id is not supplied, the default dataset id for the new dataset will be {dataset_id}-{file_name}
-
-
Returns
-
-
401 if not a valid user
-
403 if not authorized
-
404 if file to unpack (as given by filename) was not found
-
415 if file is not of type application/zip
-
400 if there was an error reading the zipfile (BadZipFile)
-
Accept:text/html
-
302 to splash page for newly created dataset / updated dataset
-
Accept: text/plain, application/json
-
201/204 on creation/update of dataset
-
Accept: */*, default
-
Returns text/plain - 201/204 on creation/update of dataset
-
-
-
-

PUT, DELETE NOOP

-
- - -
-
-
/{silo name}/items/{id}/{path}
- -
-
-

API call to read the contents of a zip-file (without having to unpack) and unpack a zip file into a new / existing dataset

-

Controller: items     action: itemview

-
-

GET

-
Returns
-
-
401 if not a valid user
-
403 if not authorized
-
404 if path does not exist, or if path does not point to a file
-
415 if file is not of type application/zip
-
400 if there was an error reading the zipfile (BadZipFile)
-
Accept: text/html
-
Returns a HTML page listing the contents of the zipfile
-
Accept: text/plain, application/json
-
200 OK
-
Returns a JSON-encoded hash dict listing the contents of the ziipfile (files / directories in archive), along with the size of the uncompressed member and and the date of last modification of the member as a tuple of 6 values (Year, Month, Day of month, Hours, Minutes, Seconds).
-
The file - itemInformationForZipFileinDataset.txt - contains an example of the data returned (data_returned) -
-
Accept: */*, default
-
Returns text/html - an HTML page listing the contents of the zipfile
-
-
-
-

POST Unpack file. Create new dataset/update existing dataset with contents of upacked file

-
Parameters
-
- - - -
filename{name of file to be unpacked, including the path}
Id{(Optional)}. if Id is not supplied, the default dataset id for the new dataset will be {dataset_id}-{file_name}
-
-
Returns
-
-
401 if not a valid user
-
403 if not authorized
-
404 if path does not exist, or if path does not point to a file
-
415 if file is not of type application/zip
-
400 if there was an error reading the zipfile (BadZipFile)
-
Accept:text/html
-
302 to splash page for newly created dataset / updated dataset
-
Accept: text/plain, application/json
-
201/204 on creation/update of dataset
-
Accept: */*, default
-
Returns text/plain - 201/204 on creation/update of dataset
-
-
-
-

PUT, DELETE NOOP

-
- - -
-
-
/{silo name}/items/{id}/{path}/{subpath}
- -
-
-

API call to retreive a file from the zip file

-

Controller: items     action: subitemview

-
-
TODO:
-
This is yet to be implemented
-
- -
+# -*- coding: utf-8 -*- +
+

Items

+

Sections

+
    + +
  1. /{silo name}/items/{id}
  2. +
  3. /{silo name}/items/{id}/{path}
  4. +
  5. /{silo name}/items/{id}/{path}/{subpath}
  6. +
+ + + +
+
+
/{silo name}/items/{id}
+ +
+
+

API call to obtain a list of unpack end-points, read the contents of a zip-file (without unpacking) and unpack a zip file into a new / existing dataset

+

Controller: items     action: datasetview

+
+

GET

+
Returns
+
+
401 if not a valid user
+
403 if not authorized
+
404 if dataset id does not exist
+
Accept: text/html
+
Returns an HTML page with list of zipfiles in {id} with form to unpack the zip file
+
Accept: text/plain, application/json
+
200 OK
+
Returns a JSON-encoded list of zipfiles in dataset
+
The file + itemInformationForDataset.txt + contains an example of the data returned (data_returned) +
+
Accept: */*, default
+
Returns text/html - an HTML page with list of zipfiles in {id} with form to unpack the zip file
+
+
+
+

POST Unpack file. Create new dataset/update existing dataset with contents of upacked file

+
Parameters
+
+ + + +
filename{name of file to be unpacked, including the path}
Id{(Optional)}. if Id is not supplied, the default dataset id for the new dataset will be {dataset_id}-{file_name}
+
+
Returns
+
+
401 if not a valid user
+
403 if not authorized
+
404 if file to unpack (as given by filename) was not found
+
415 if file is not of type application/zip
+
400 if there was an error reading the zipfile (BadZipFile)
+
Accept:text/html
+
302 to splash page for newly created dataset / updated dataset
+
Accept: text/plain, application/json
+
201/204 on creation/update of dataset
+
Accept: */*, default
+
Returns text/plain - 201/204 on creation/update of dataset
+
+
+
+

PUT, DELETE NOOP

+
+ + +
+
+
/{silo name}/items/{id}/{path}
+ +
+
+

API call to read the contents of a zip-file (without having to unpack) and unpack a zip file into a new / existing dataset

+

Controller: items     action: itemview

+
+

GET

+
Returns
+
+
401 if not a valid user
+
403 if not authorized
+
404 if path does not exist, or if path does not point to a file
+
415 if file is not of type application/zip
+
400 if there was an error reading the zipfile (BadZipFile)
+
Accept: text/html
+
Returns a HTML page listing the contents of the zipfile
+
Accept: text/plain, application/json
+
200 OK
+
Returns a JSON-encoded hash dict listing the contents of the ziipfile (files / directories in archive), along with the size of the uncompressed member and and the date of last modification of the member as a tuple of 6 values (Year, Month, Day of month, Hours, Minutes, Seconds).
+
The file + itemInformationForZipFileinDataset.txt + contains an example of the data returned (data_returned) +
+
Accept: */*, default
+
Returns text/html - an HTML page listing the contents of the zipfile
+
+
+
+

POST Unpack file. Create new dataset/update existing dataset with contents of upacked file

+
Parameters
+
+ + + +
filename{name of file to be unpacked, including the path}
Id{(Optional)}. if Id is not supplied, the default dataset id for the new dataset will be {dataset_id}-{file_name}
+
+
Returns
+
+
401 if not a valid user
+
403 if not authorized
+
404 if path does not exist, or if path does not point to a file
+
415 if file is not of type application/zip
+
400 if there was an error reading the zipfile (BadZipFile)
+
Accept:text/html
+
302 to splash page for newly created dataset / updated dataset
+
Accept: text/plain, application/json
+
201/204 on creation/update of dataset
+
Accept: */*, default
+
Returns text/plain - 201/204 on creation/update of dataset
+
+
+
+

PUT, DELETE NOOP

+
+ + +
+
+
/{silo name}/items/{id}/{path}/{subpath}
+ +
+
+

API call to retreive a file from the zip file

+

Controller: items     action: subitemview

+
+
TODO:
+
This is yet to be implemented
+
+ +
diff --git a/rdfdatabank/templates/itemview.html b/rdfdatabank/templates/itemview.html index 81ed617..0353e64 100644 --- a/rdfdatabank/templates/itemview.html +++ b/rdfdatabank/templates/itemview.html @@ -1,58 +1,123 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - Item View - - -

Dataset ${c.id}

- - -% if c.editor: -
- % if c.view == 'editor': - Editor view - % else: - User view - % endif - % if c.version: -
Change view : - Editor | - User

- % else: -
Change view : - Editor | - User

- % endif -
-% endif - -
- -% if c.readme_text: -<%include file="/readme_section.html"/> -% endif - - -% if c.parts: - % if c.show_files: - % if c.editor: - <%include file="/part_list.html"/> - % else: - <%include file="/part_list_display.html"/> - % endif - % else: -

You do not have permission to view these files

- % endif -% else: -

There are no files or folders in this path

-% endif -
- - -% if c.editor and c.view == 'editor': -
- - <%include file="/item_file_upload.html"/> -
-% endif - +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + Item View + + + + +

Dataset ${c.id}

+% if c.version: +

Version ${c.version}

+% elif c.versions: +

Version ${c.versions[-1]}

+% endif + + +% if c.editor: +
+

Editorial functions

+ +

+ Upload file

+
+% endif + + +
+% if c.version and c.versions and c.version == c.versions[-1]: +

You are currently viewing the latest version (${c.versions[-1]}) of the data package

+% elif c.version: +

You are currently viewing version ${c.version} of the data package

+% elif c.versions: +

You are currently viewing the latest version (${c.versions[-1]}) of the data package

+% else: +

You are currently viewing the latest version of th data package

+% endif + +% if c.versions: +

View other versions: + % for i in range(1, len(c.versions)-1): + % if c.version and c.versions[i] == c.version: + ${c.versions[i]} | + % else: + ${c.versions[i]} | + % endif + % endfor + % if c.version: + % if c.version == c.versions[-1]: + ${c.versions[-1]} + % else: + ${c.versions[-1]} + % endif + % else: + ${c.versions[-1]} + % endif +

+% endif +
+ +
+ +% if c.parts: +

Data package contents within ${c.path}

+
+ % if c.show_files: + % if c.editor: + <%include file="/part_list.html"/> + % else: + <%include file="/part_list_display.html"/> + % endif + % else: +

You do not have permission to view these files

+ % endif +
+% else: +

There are no files or folders in this path

+% endif +
+ + +% if c.readme_text: +

README text

+
+<%include file="/readme_section.html"/> +
+% endif + + +% if c.editor and c.view == 'editor': + + +% endif + diff --git a/rdfdatabank/templates/itemview_version.html b/rdfdatabank/templates/itemview_version.html index f2f45a7..379f229 100644 --- a/rdfdatabank/templates/itemview_version.html +++ b/rdfdatabank/templates/itemview_version.html @@ -1,11 +1,11 @@ -# -*- coding: utf-8 -*- -<%inherit file="/base.html" /> -<%def name="head_tags()"> - Item View - -% if c.readme_text: -<%include file="/readme_section.html"/> -% endif -% if c.item: -<%include file="/part_list_display.html"/> -% endif +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + Item View + +% if c.readme_text: +<%include file="/readme_section.html"/> +% endif +% if c.item: +<%include file="/part_list_display.html"/> +% endif diff --git a/rdfdatabank/templates/keywords.html b/rdfdatabank/templates/keywords.html new file mode 100644 index 0000000..f13a756 --- /dev/null +++ b/rdfdatabank/templates/keywords.html @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +<%inherit file="/base.html" /> +<%def name="head_tags()"> + Keywords + + +

List of keywords in the site goes here...

diff --git a/rdfdatabank/templates/list_of_datasets.html b/rdfdatabank/templates/list_of_datasets.html index e28b1b1..6c17a94 100644 --- a/rdfdatabank/templates/list_of_datasets.html +++ b/rdfdatabank/templates/list_of_datasets.html @@ -1,22 +1,35 @@ -# -*- coding: utf-8 -*- -% if c.silo_name: -

Datasets:

-
    -<% -n = len(c.items) -%> -

    Number of Datasets: ${n}

    -% for item in sorted(c.items): -
  • - ${item} -
    • Delete dataset
    • -<% -c.current = item -%> -
    • <%include file="/embargo_form.html"/>
    • -
    -
  • -% endfor -
-% endif - +# -*- coding: utf-8 -*- +% if c.silo_name: +

Datasets:

+