{ "info": { "author": "Mirek \u0160imek", "author_email": "miroslav.simek@vscht.cz", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "========================\nInvenio Records Draft\n========================\n\n.. image:: https://img.shields.io/github/license/oarepo/invenio-records-draft.svg\n :target: https://github.com/oarepo/invenio-records-draft/blob/master/LICENSE\n\n.. image:: https://img.shields.io/travis/oarepo/invenio-records-draft.svg\n :target: https://travis-ci.org/oarepo/invenio-records-draft\n\n.. image:: https://img.shields.io/coveralls/oarepo/invenio-records-draft.svg\n :target: https://coveralls.io/r/oarepo/invenio-records-draft\n\n.. image:: https://img.shields.io/pypi/v/oarepo-invenio-records-draft.svg\n :target: https://pypi.org/pypi/oarepo-invenio-records-draft\n\n\n\n**Beta version, use at your own risk!!!**\n\nThis library helps to solve the situation where records in Invenio go through draft stage before they\nare published.\n\nExample:\n\n.. code:: python\n\n # marshmallow and schema: property 'title' is required\n\n > draft_url = 'https://localhost:5000/api/drafts/records/'\n > published_url = 'https://localhost:5000/api/records/'\n\n > created_draft_url = post(draft_url,\n json={\n '$schema': current_jsonschemas.path_to_url('draft/records/record-v1.0.0.json')\n })[...]\n\n 302, created_draft_url = 'https://localhost:5000/drafts/records/1'\n\n > resp = get(created_draft_url)\n\n > publish_link = resp.json['links']['publish']\n\n > resp.json['metadata']\n\n {\n \"$schema\": \"https://localhost:5000/schemas/draft/records/record-v1.0.0.json\",\n \"id\": \"1\",\n 'invenio_draft_validation': {\n 'errors': {\n 'marshmallow': [\n {'field': 'title',\n 'message': 'Missing data for required field.'\n }\n ]\n },\n 'valid': False\n }\n }\n\n > put(created_draft_url, json={\n \"$schema\": \"https://localhost:5000/schemas/draft/records/record-v1.0.0.json\",\n 'title': 'def'})\n\n {\n \"$schema\": \"https://localhost:5000/schemas/draft/records/record-v1.0.0.json\",\n \"id\": \"1\",\n 'invenio_draft_validation': {\n 'valid': True\n }\n }\n\n > post(publish_link)\n\n 302, headers['Location'] == 'https://localhost:5000/records/1'\n\n\nLibrary principles:\n===================\n\n1. Draft records should follow the same json schema as published records with the exception\n that all/most properties are not required even though they are marked as such\n\n2. Draft records should follow the same marshmallow schema as published records with\n some exceptions:\n\n a. all/most properties are not required even though they are marked as such\n b. for properties that have validators attached these validations will be ignored,\n unless they are explicitly marked with ``draft_allowed``.\n\n3. If wished, draft records may be configured not follow the schema at all. In this case,\n the record is not indexed in elasticsearch at all.\n\n4. \"Draft\" records live at a different endpoint and different ES index than published ones.\n The recommended URL is ``/api/records`` for the published records and\n ``/api/drafts/records`` for drafts\n\n5. Draft and published records share the same value of pid but have two different pid types \u2713\n\n6. Published records can not be directly created/updated/patched. Draft records can be\n created/updated/patched.\n\n7. Invenio record contains ``Link`` header and ``links`` section in the JSON payload.\n Links of a published record contain (apart from ``self``):\n\n a. ``draft`` - a url that links to the \"draft\" version of the record. This url is present\n only if the draft version of the record exists and the caller has the rights\n to edit the draft\n b. ``edit`` - URL to a handler that creates a draft version of the record and then\n returns HTTP 302 redirect to the draft version. This url is present only if the\n draft version does not exist\n c. ``unpublish`` - URL to a handler that creates a draft version of the record\n if it does not exist, deletes the published version and then returns HTTP 302 to the draft.\n\n\n8. On a draft record the ``links`` contain (apart from ``self``):\n\n a. ``published`` - a url that links to the \"published\" version of the record. This url is present\n only if the published version of the record exists\n\n b. ``publish`` - a POST to this url publishes the record. The JSONSchema and marshmallow\n schema of the published record must pass. After the publishing the draft record is\n deleted. HTTP 302 is returned pointing to the published record.\n\n9. The serialized representation of a draft record contains a section named ``invenio_draft_validation``.\n This section contains the result of marshmallow and JSONSchema validation against original\n schemas.\n\n10. Deletion of a published record does not delete the draft record.\n\n11. Deletion of a draft record does not delete the published record.\n\n\nUsage\n======================\n\n.. code:: bash\n\n pip install oarepo-invenio-records-draft\n\nJSON Schema\n------------\n\nCreate json schema for the published record, no modifications are required for the\ndraft version.\n\nIn the configuration (invenio.cfg or your module's config) register the schema:\n\n\n.. code:: python\n\n INVENIO_RECORD_DRAFT_SCHEMAS = [\n 'records/record-v1.0.0.json',\n ]\n\n # or\n\n INVENIO_RECORD_DRAFT_SCHEMAS = [\n {\n 'published_schema': 'records/record-v1.0.0.json',\n # ... other options (not yet used)\n }\n ]\n\nRun in terminal\n\n.. code:: bash\n\n invenio draft make-schemas\n\nThis command will create a draft schema in ``INVENIO_RECORD_DRAFT_SCHEMAS_DIR``, default value\nis ``var/instance/draft_schemas/`` and will print out the created schema path:\n\n.. code:: bash\n\n ...var/instance/draft_schemas/draft/records/record-v1.0.0.json\n\nTo check that the schemas are working, run\n\n.. code:: bash\n\n invenio run \n\n curl https://localhost:5000/schemas/records/record-v1.0.0.json\n curl https://localhost:5000/schemas/draft/records/record-v1.0.0.json\n\nNote the extra prefix \"/draft/\".\n\nElasticsearch Mapping\n----------------------\n\nTo create elasticsearch schemas and aliases for the draft records, run:\n\n.. code:: bash\n\n invenio draft make-mappings\n invenio index init --force\n\nThe first command creates\n\n.. code:: bash\n\n ...var/instance/draft_mappings/draft-records-record-v1.0.0.json\n\nwhich is a patched version of the \"published\" records mapping with an extra section\nfor validation errors\n\n.. code:: json\n\n {\n \"invenio_draft_validation\": {\n \"type\": \"object\",\n \"properties\": {\n \"valid\": {\n \"type\": \"boolean\"\n },\n \"errors\": {\n \"type\": \"object\",\n \"properties\": {\n \"marshmallow\": {\n \"type\": \"object\",\n \"properties\": {\n \"field\": {\n \"type\": \"keyword\"\n },\n \"message\": {\n \"type\": \"text\",\n \"fields\": {\n \"keyword\": {\n \"type\": \"keyword\"\n }\n }\n }\n }\n },\n \"jsonschema\": {\n \"type\": \"object\",\n \"properties\": {\n \"field\": {\n \"type\": \"keyword\"\n },\n \"message\": {\n \"type\": \"text\",\n \"fields\": {\n \"keyword\": {\n \"type\": \"keyword\"\n }\n }\n }\n }\n },\n \"other\": {\n \"type\": \"text\"\n }\n }\n }\n }\n }\n }\n\nThe second deploys the schema to elasticsearch as ``draft-records-record-v1.0.0``\nand creates alias ``draft-records``.\n\nTo check that the command worked GET http://localhost:9200/draft-records-record-v1.0.0\n\nMarhsmallow Schema\n----------------------\n\nInherit your marshmallow schema (and all nested schemas) from ``DraftEnabledSchema``.\nIf you use mixins that inherit from Schema (such as StrictKeysMixin) put them\nafter ``DraftEnabledSchema``.\n\n\n.. code:: python\n\n from invenio_records_draft.marshmallow import \\\n DraftEnabledSchema, always, published_only, draft_allowed\n\n class MetadataSchemaV1(DraftEnabledSchema, StrictKeysMixin):\n title = String(required=always, validate=[draft_allowed(Length(max=50))])\n abstract = String(required=published_only)\n # ...\n\n class RecordSchemaV1(DraftEnabledSchema, StrictKeysMixin):\n \"\"\"Record schema.\"\"\"\n\n metadata = fields.Nested(MetadataSchemaV1)\n # ...\n\nUse ``required=always`` for properties that are required even in draft, ``required=published_only`` or\n``required=True`` for props that are required only in published records.\n\nValidators (validate=[xxx]) will be removed when validating draft records.\nTo enforce them for draft records wrap them with ``draft_allowed``.\n\nPersistent identifiers\n----------------------\n\nThis library supposes that draft and published records have the same value of their\npersistent identifier and different ``pid_type`` s. This way the library is able to distinguish\nthem apart and at the same time keep link between them. If you create your own minters & loaders\nfor draft records, you have to honour this.\n\nRecord class\n------------\n\nTo allow for schema validation on draft endpoint, create your own record classes:\n\n.. code:: python\n\n class PublishedRecord(DraftEnabledRecordMixin, Record):\n def validate(self, **kwargs):\n self['$schema'] = current_jsonschemas.path_to_url('records/record-v1.0.0.json')\n return super().validate(**kwargs)\n\n\n class DraftRecord(DraftEnabledRecordMixin, Record):\n\n draft_validator = MarshmallowValidator(\n 'sample.records.marshmallow:MetadataSchemaV1', # marshmallow of the published version\n 'records/record-v1.0.0.json' # json schema of the published version\n )\n\n def validate(self, **kwargs):\n self['$schema'] = current_jsonschemas.path_to_url('draft/records/record-v1.0.0.json')\n return super().validate(**kwargs)\n\nWhen a draft record is validated, the ``draft_validator`` gets called and fills in property\n``invenio_draft_validation`` that is stored both to invenio database and to elasticsearch:\n\n.. code:: javascript\n\n {\n 'id': 1,\n '$schema': '...',\n // ... other properties\n 'invenio_draft_validation': {\n 'valid': false,\n 'errors': {\n 'marshmallow': [\n {\n 'field': 'title',\n 'message': 'Missing data for required field.'\n }\n ]\n }\n }\n }\n\nEndpoints, loaders and serializers\n-----------------------------------\n\nFor common cases, use ``DRAFT_ENABLED_RECORDS_REST_ENDPOINTS`` that sets all the required\nendpoint properties including marshmallow-assisted validation. See the sources of ``ext.py``\nif you need small modifications. If you want to have more control on the created endpoints,\nyou can set up your own endpoints as usual, look at the following sections.\n\n.. code:: python\n\n DRAFT_ENABLED_RECORDS_REST_ENDPOINTS = {\n 'records': {\n 'json_schemas': [\n 'records/record-v1.0.0.json'\n ],\n 'draft_pid_type': 'drecid',\n 'draft_allow_patch': True,\n\n 'record_marshmallow': RecordSchemaV1,\n 'metadata_marshmallow': MetadataSchemaV1,\n\n 'draft_record_class': DraftRecord,\n 'published_record_class': PublishedRecord,\n\n 'publish_permission_factory': allow_authenticated,\n 'unpublish_permission_factory': allow_authenticated,\n 'edit_permission_factory': allow_authenticated,\n }\n }\n\n\nThis configuration takes all the options that can be passed to\n``RECORDS_REST_ENDPOINTS``. If an option is prefixed with ``draft_``, it will\nbe used only on the draft record endpoint. If it is prefixed with ``published_``,\nit will be used only on published record endpoint. Unprefixed keys\nwill be used for both endpoints.\n\n``draft_allow_patch`` will add an endpoint for JSON PATCH operation on draft.\n\nThe initial permissions are allow_all for drafts, allow_all for read on published,\nallow_none for modifications on published, allow_all on delete operation. There are\ntwo ways to modify these:\n\n\n * Use high-level options. ``read-permission-factory`` handles read operation\n (but not list that is always allow_all), ``modify_permission_factory``\n handles create/update/delete\n\n\n.. code:: python\n\n RECORDS_REST_ENDPOINTS =\n draft_enabled_endpoint(\n # ... other options\n draft_read_permission_factory=check_elasticsearch,\n draft_modify_permission_factory=allow_role('editors'),\n published_read_permission_factory=allow_all\n )\n\n\nAlternatively:\n\n * Use normal ``_imp`` options to set up permissions, but prefix them with ``draft_`` or ``published_``\n\nLoaders\n------------------\n\nWhen registering schema to loader/serializer, wrap the schema that will be used on draft endpoint\nwith ``DraftSchemaWrapper``:\n\n.. code:: python\n\n from invenio_records_draft.marshmallow import DraftSchemaWrapper\n\n # JSON loader using Marshmallow for data validation\n json_v1 = marshmallow_loader(DraftSchemaWrapper(MetadataSchemaV1))\n\nDo not provide loader for published endpoint as create/update/patch will never be called on production\nendpoint.\n\nSerializers\n-----------------\n\nIn serialization, you will need two serializers:\n\n.. code:: python\n\n from invenio_records_draft.marshmallow import DraftSchemaWrapper\n\n json_v1 = JSONSerializer(RecordSchemaV1, replace_refs=True)\n draft_json_v1 = JSONSerializer(DraftSchemaWrapper(RecordSchemaV1), replace_refs=True)\n\n json_v1_response = record_responsify(json_v1, 'application/json')\n json_v1_search = search_responsify(json_v1, 'application/json')\n\n draft_json_v1_response = record_responsify(draft_json_v1, 'application/json')\n draft_json_v1_search = search_responsify(draft_json_v1, 'application/json')\n\n\nREST Endpoints\n-----------------\n\n.. code:: python\n\n RECORDS_REST_ENDPOINTS = {\n 'published_records': {\n 'create_permission_factory_imp': '',\n 'default_endpoint_prefix': True,\n 'delete_permission_factory_imp': '',\n 'item_route': '/records/',\n 'list_permission_factory_imp': '',\n 'list_route': '/records/',\n 'pid_type': 'recid',\n 'pid_fetcher': 'recid',\n 'pid_minter': 'recid',\n 'read_permission_factory_imp': '',\n 'record_class': \"\",\n 'record_serializers': {\n 'application/json': '.view>'\n },\n 'search_index': 'records-record-v1.0.0',\n 'search_serializers': {\n 'application/json': '.view>'\n },\n 'default_media_type': 'application/json',\n 'links_factory_imp':\n '',\n 'update_permission_factory_imp': '',\n },\n 'draft_records': {\n 'create_permission_factory_imp': '',\n 'default_endpoint_prefix': True,\n 'delete_permission_factory_imp': '',\n 'item_route': 'drafts/records/',\n 'list_permission_factory_imp': '',\n 'list_route': 'drafts/records/',\n 'pid_type': 'drecid',\n 'pid_fetcher': 'drecid',\n 'pid_minter': 'drecid',\n 'read_permission_factory_imp': '',\n 'record_class': \"\",\n 'record_loaders': {\n 'application/json': '.json_loader>',\n 'application/json-patch+json': ''\n },\n 'record_serializers': {\n 'application/json': '.view>'\n },\n 'search_index': 'draft-records-record-v1.0.0',\n 'search_serializers': {\n 'application/json': '.view>'\n },\n 'default_media_type': 'application/json',\n 'update_permission_factory_imp': '',\n 'links_factory_imp':\n '',\n }\n }\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/oarepo/invenio-records-draft", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "oarepo-invenio-records-draft", "package_url": "https://pypi.org/project/oarepo-invenio-records-draft/", "platform": "any", "project_url": "https://pypi.org/project/oarepo-invenio-records-draft/", "project_urls": { "Homepage": "https://github.com/oarepo/invenio-records-draft" }, "release_url": "https://pypi.org/project/oarepo-invenio-records-draft/1.2.2/", "requires_dist": [ "wrapt (>=1.11.2)", "invenio[auth,base,elasticsearch6,metadata,postgresql] (==3.1.1) ; extra == 'deploy'", "invenio[auth,base,elasticsearch6,metadata,tests] (==3.1.1) ; extra == 'devel'", "invenio[postgresql] (==3.1.1) ; extra == 'postgresql'", "invenio[sqlite] (==3.1.1) ; extra == 'sqlite'", "invenio[auth,base,elasticsearch6,metadata,tests] (==3.1.1) ; extra == 'tests'" ], "requires_python": "", "summary": "Handling Draft and Production invenio records in one package", "version": "1.2.2" }, "last_serial": 5932378, "releases": { "1.1.0": [ { "comment_text": "", "digests": { "md5": "d93bf5e0b30b8747ed665d83b121db77", "sha256": "a87797c41b4128fa563640e29ca6006755fecef2c8adef94d8cc293d634870dc" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d93bf5e0b30b8747ed665d83b121db77", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17873, "upload_time": "2019-08-14T10:39:12", "url": "https://files.pythonhosted.org/packages/a8/ab/0b0b8e3f96086c69156049dde53e9a604691b9664da2742ef679cd4dbc96/oarepo_invenio_records_draft-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec6efb9e526aaf1a25e916033ba28b3f", "sha256": "e3703e31255ebe8bda6ddb2212b3b211073e89126821a1bf8dbcadc1179290dc" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.1.0.tar.gz", "has_sig": false, "md5_digest": "ec6efb9e526aaf1a25e916033ba28b3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17752, "upload_time": "2019-08-14T10:39:15", "url": "https://files.pythonhosted.org/packages/a5/00/5856b27626d098d723871b95ec6ff3652ced14349e6d82230678bb02e753/oarepo-invenio-records-draft-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "f6eee426d27b14a4eac5d360e4e659ff", "sha256": "4255622e7cfe2449c23ae2cf1c8c14713b7bf430e4e2caff5bbd9259f737ab47" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f6eee426d27b14a4eac5d360e4e659ff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17764, "upload_time": "2019-08-15T10:30:22", "url": "https://files.pythonhosted.org/packages/1f/d2/7c69c60c35450e20de5c17180afe41d760a77a6e7241eec3b78d8b3cefa3/oarepo_invenio_records_draft-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a0821eca0218e07dd143c25873d138e7", "sha256": "184f4d48d0ea2ad4db19988b4a1bda15a109895fa7677575b8f9474eaf8d980a" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.1.1.tar.gz", "has_sig": false, "md5_digest": "a0821eca0218e07dd143c25873d138e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17710, "upload_time": "2019-08-15T10:30:24", "url": "https://files.pythonhosted.org/packages/ae/8c/183e8a11c8cb088afe91ed0d4295a7d835b3ca466b2ebb89ec8ec1833d9b/oarepo-invenio-records-draft-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "0b5c605df8f137973db2d638ffbac3cf", "sha256": "e7ababa32d331f7903fb5fb0653102158b3aeff4c463d6c58a01dcc4df69b220" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0b5c605df8f137973db2d638ffbac3cf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22071, "upload_time": "2019-08-15T10:35:02", "url": "https://files.pythonhosted.org/packages/08/a3/95d6d6fa130b1ebde004e0c435ee047fe0cfa61e8b616378c212d0e6264d/oarepo_invenio_records_draft-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff8467cd16a6e6d387a63038cb9dbfa2", "sha256": "0e1aae12130a2d68a05d830ef36d577167a254710aedac0db0743858642268e0" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.1.2.tar.gz", "has_sig": false, "md5_digest": "ff8467cd16a6e6d387a63038cb9dbfa2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23238, "upload_time": "2019-08-15T10:35:04", "url": "https://files.pythonhosted.org/packages/36/88/88585acaf74973daaffe812cf1c0500a4a1f119325f6fee6852596a22142/oarepo-invenio-records-draft-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "ccefe3152cb1d8ff02dc1fa77b082ea2", "sha256": "f71173eff0fddf38a3c7a3747f9945b76a084f654401a787b6b73919848da67c" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ccefe3152cb1d8ff02dc1fa77b082ea2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22067, "upload_time": "2019-08-15T10:36:04", "url": "https://files.pythonhosted.org/packages/8a/2b/904d5dda1652877f268a6055781f1f2de9109612643c35b8cb5bc9225936/oarepo_invenio_records_draft-1.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4bc5f6d6b86dbd5580dae59ff1526c51", "sha256": "eeec3791b5ef609e032a8376c76384a62e803b865f40a71489db0c6a6781ec2f" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.1.3.tar.gz", "has_sig": false, "md5_digest": "4bc5f6d6b86dbd5580dae59ff1526c51", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23232, "upload_time": "2019-08-15T10:36:07", "url": "https://files.pythonhosted.org/packages/f3/88/3950b93527df747733aeb9eec15d861e6af906e6c92df41726a02dca4ef8/oarepo-invenio-records-draft-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "9dc47e3666b357f46493e4750677f1d0", "sha256": "07633a83d92606bf80315fd6ecac910979335fae509ed7fc9bcb39e1dd64473c" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "9dc47e3666b357f46493e4750677f1d0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22071, "upload_time": "2019-08-15T10:36:43", "url": "https://files.pythonhosted.org/packages/44/0f/db72aa4d72ff42e3c4e55451daf9fb844387c62ec7e2d8354e1c2cf5573c/oarepo_invenio_records_draft-1.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56424ce3d7d9e0d1e1d65dc32333d54a", "sha256": "720b858ee07111c3ff7c70835f7620b2ed9b1e166d8452d5f1dcb006f059e0cd" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.1.4.tar.gz", "has_sig": false, "md5_digest": "56424ce3d7d9e0d1e1d65dc32333d54a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23226, "upload_time": "2019-08-15T10:36:46", "url": "https://files.pythonhosted.org/packages/f2/c8/4fad196f7a41dfd2e5934fc3c8b4a138022d4b13760beecd4dd980b73da8/oarepo-invenio-records-draft-1.1.4.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "3cdc4cda82cfee6ad6d74b38065253f4", "sha256": "4769dc79b40ef24c1256ab03d4af7276761c63cfce5a952d35c430947ec03910" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "3cdc4cda82cfee6ad6d74b38065253f4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22068, "upload_time": "2019-08-15T10:38:51", "url": "https://files.pythonhosted.org/packages/ce/bf/b95e59e7d161d06c82328159b49eae7337c9e0e8a494b79c5ed494244b46/oarepo_invenio_records_draft-1.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "62d0ef0f9f8664c8dac31debdb8ca2d9", "sha256": "a260e528b6face203316d356ec5fa06c38faac426b377a9f3c61ff553822c457" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.1.5.tar.gz", "has_sig": false, "md5_digest": "62d0ef0f9f8664c8dac31debdb8ca2d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23244, "upload_time": "2019-08-15T10:38:53", "url": "https://files.pythonhosted.org/packages/87/34/341d371755a921d857ddbe5e442ad3ae22a79ed39d8e58f12b688aa33ba0/oarepo-invenio-records-draft-1.1.5.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "45fdc67696ccea8b61dd7b56ee5227f1", "sha256": "ac8fbb2fb69dddc29a8dfcfcea09b4702cfb5af8becf84d3dac1b763149df74e" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "45fdc67696ccea8b61dd7b56ee5227f1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22060, "upload_time": "2019-08-15T10:41:52", "url": "https://files.pythonhosted.org/packages/0e/6a/97610342403a9ac3c75e3d35f22dd19ef66db48c0d1ae7992ab4347711bd/oarepo_invenio_records_draft-1.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f963eb5027a5173649aace4f6d02b200", "sha256": "d022923c88ab0868c648bc9e6bc7e3a57f40514d24305a439e91e96c76271b41" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.1.6.tar.gz", "has_sig": false, "md5_digest": "f963eb5027a5173649aace4f6d02b200", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23202, "upload_time": "2019-08-15T10:41:54", "url": "https://files.pythonhosted.org/packages/37/83/752607b09a404fede58d5db443992fc63b6aec20bf37fa9219f4972cd32d/oarepo-invenio-records-draft-1.1.6.tar.gz" } ], "1.1.7": [ { "comment_text": "", "digests": { "md5": "10d87a759d46bbfd49df9a163fab1d82", "sha256": "38c00ac368a26ac53bd3a4db029c3a6fb6caf94029d0aa4e50efd53b413d7253" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "10d87a759d46bbfd49df9a163fab1d82", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22171, "upload_time": "2019-08-15T10:45:26", "url": "https://files.pythonhosted.org/packages/6c/01/3ad9637e89e611c7c5aa398943873b6d6609ba1b99167a9ac916635f234a/oarepo_invenio_records_draft-1.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d47a46a8843a458fe41f1943c3cba113", "sha256": "743bf47b1b31839d366b451c687fe8a5a6c8f4d05db05478eb145a25cc42b523" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.1.7.tar.gz", "has_sig": false, "md5_digest": "d47a46a8843a458fe41f1943c3cba113", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23458, "upload_time": "2019-08-15T10:45:29", "url": "https://files.pythonhosted.org/packages/e3/31/506c384f59104d9641424ade0de81022773ebf261c57e185f117a6f3b2aa/oarepo-invenio-records-draft-1.1.7.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "1712225a40c38d7cf36ab24312e08720", "sha256": "3bada49ae78fa046a7edc145e6911541e1fcb774e950713519e808d9ad673190" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1712225a40c38d7cf36ab24312e08720", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22190, "upload_time": "2019-08-15T10:58:51", "url": "https://files.pythonhosted.org/packages/94/4d/c70f6ace5beaf34d0814b9d921054b6fa20ed52b8b35fd6d74629bc16a99/oarepo_invenio_records_draft-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f0f8a850a1dd866db5c346eba0ef0a0d", "sha256": "0bb4a34276d90bcc00e0a1f62e573f466776e3abb92704dda92e4a447e22f531" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.2.0.tar.gz", "has_sig": false, "md5_digest": "f0f8a850a1dd866db5c346eba0ef0a0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23469, "upload_time": "2019-08-15T10:58:53", "url": "https://files.pythonhosted.org/packages/9a/90/a3c4d269731af1227bd609dcf5810b253ed58f7b1d71379a9ba64f58c721/oarepo-invenio-records-draft-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "a2d4423e59c339a05ca15846db87ef31", "sha256": "7271eca736c7c6ac8930822341ac045177f70095fd3555c42636dbe12e205229" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a2d4423e59c339a05ca15846db87ef31", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22193, "upload_time": "2019-09-04T16:48:39", "url": "https://files.pythonhosted.org/packages/71/62/9eebbd9dcc786e573220c34b6da8957a46ff33b2a249b59e5a8b1f27931c/oarepo_invenio_records_draft-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "67e65a3f83306a6d69b64e8b7aac9015", "sha256": "aa74f7754877d7521d799b59dbece68b67a9313fc8915a8238889ce4eabf08ef" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.2.1.tar.gz", "has_sig": false, "md5_digest": "67e65a3f83306a6d69b64e8b7aac9015", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23506, "upload_time": "2019-09-04T16:48:41", "url": "https://files.pythonhosted.org/packages/9b/00/ccc727121938d5aed4109a54d58d530a4835fb9077318b6d71b4f2bf3261/oarepo-invenio-records-draft-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "af39ca1569153db10e05a23d659c61c1", "sha256": "c3faa27264e58e0e648328bbd03619bb06675c9626275dfb80577587079aac52" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "af39ca1569153db10e05a23d659c61c1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22233, "upload_time": "2019-10-05T16:03:16", "url": "https://files.pythonhosted.org/packages/75/8e/0d75286f503272932b8e9c83d2ae109f92bdd067ee5a9172802454022cb7/oarepo_invenio_records_draft-1.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d93f8598b50f5eed81f615740bc0efda", "sha256": "be9bd761ad72ac39c90a79e7fe31b6ce3b124c525c16b80a0d4fd528f9a164bf" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.2.2.tar.gz", "has_sig": false, "md5_digest": "d93f8598b50f5eed81f615740bc0efda", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23540, "upload_time": "2019-10-05T16:03:18", "url": "https://files.pythonhosted.org/packages/32/d9/7324fde4a4ceaa8e389e98238bb771b1c289ac1eedf140bca4c3801f291c/oarepo-invenio-records-draft-1.2.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "af39ca1569153db10e05a23d659c61c1", "sha256": "c3faa27264e58e0e648328bbd03619bb06675c9626275dfb80577587079aac52" }, "downloads": -1, "filename": "oarepo_invenio_records_draft-1.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "af39ca1569153db10e05a23d659c61c1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22233, "upload_time": "2019-10-05T16:03:16", "url": "https://files.pythonhosted.org/packages/75/8e/0d75286f503272932b8e9c83d2ae109f92bdd067ee5a9172802454022cb7/oarepo_invenio_records_draft-1.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d93f8598b50f5eed81f615740bc0efda", "sha256": "be9bd761ad72ac39c90a79e7fe31b6ce3b124c525c16b80a0d4fd528f9a164bf" }, "downloads": -1, "filename": "oarepo-invenio-records-draft-1.2.2.tar.gz", "has_sig": false, "md5_digest": "d93f8598b50f5eed81f615740bc0efda", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23540, "upload_time": "2019-10-05T16:03:18", "url": "https://files.pythonhosted.org/packages/32/d9/7324fde4a4ceaa8e389e98238bb771b1c289ac1eedf140bca4c3801f291c/oarepo-invenio-records-draft-1.2.2.tar.gz" } ] }