diff --git a/oarepo_model_builder_drafts/invenio/__init__.py b/oarepo_model_builder_drafts/invenio/__init__.py index 77a7747..684c9eb 100644 --- a/oarepo_model_builder_drafts/invenio/__init__.py +++ b/oarepo_model_builder_drafts/invenio/__init__.py @@ -5,4 +5,5 @@ "drafts-parent-metadata": "templates/invenio_drafts_parent_metadata.py.jinja2", # adds draft parent metadata classes "drafts-record-service-config": "templates/invenio_drafts_record_service_config.py.jinja2", "drafts-parent-state": "templates/invenio_drafts_parent_state.py.jinja2", + "drafts-has-draft-checkfield": "templates/invenio_drafts_has_draft_checkfield.py.jinja2", } diff --git a/oarepo_model_builder_drafts/invenio/invenio_drafts_has_draft_checkfield.py b/oarepo_model_builder_drafts/invenio/invenio_drafts_has_draft_checkfield.py new file mode 100644 index 0000000..fce4c18 --- /dev/null +++ b/oarepo_model_builder_drafts/invenio/invenio_drafts_has_draft_checkfield.py @@ -0,0 +1,10 @@ +from oarepo_model_builder.invenio.invenio_base import InvenioBaseClassPythonBuilder + + +class InvenioDraftsHasDraftCheckfieldBuilder(InvenioBaseClassPythonBuilder): + TYPE = "invenio_drafts_has_draft_checkfield" + section = "record" + template = "drafts-has-draft-checkfield" + + def finish(self, **extra_kwargs): + super().finish(parent_record=self.current_model.parent_record, **extra_kwargs) \ No newline at end of file diff --git a/oarepo_model_builder_drafts/invenio/templates/invenio_drafts_has_draft_checkfield.py.jinja2 b/oarepo_model_builder_drafts/invenio/templates/invenio_drafts_has_draft_checkfield.py.jinja2 new file mode 100644 index 0000000..37b8b6f --- /dev/null +++ b/oarepo_model_builder_drafts/invenio/templates/invenio_drafts_has_draft_checkfield.py.jinja2 @@ -0,0 +1,6 @@ +from oarepo_runtime.drafts.systemfields.has_draftcheck import HasDraftCheckField + +class {{ vars.record|class_header }}: + has_draft = HasDraftCheckField(config_key="HAS_DRAFT_CUSTOM_FIELD") + +{{ parent_record.record.class|base_name }}.has_draft = HasDraftCheckField(draft_cls={{ vars.record.class|base_name }}, config_key="HAS_DRAFT_CUSTOM_FIELD") \ No newline at end of file diff --git a/oarepo_model_builder_drafts/tests/invenio_drafts_test_resources.py b/oarepo_model_builder_drafts/tests/invenio_drafts_test_resources.py index f3c0ba0..1dc4ba4 100644 --- a/oarepo_model_builder_drafts/tests/invenio_drafts_test_resources.py +++ b/oarepo_model_builder_drafts/tests/invenio_drafts_test_resources.py @@ -12,5 +12,5 @@ def _get_output_module(self): def finish(self, **extra_kwargs): tests = getattr(self.current_model, "section_tests") super().finish( - fixtures=tests.fixtures, test_constants=tests.constants, **extra_kwargs + fixtures=tests.fixtures, test_constants=tests.constants, parent_record=self.current_model.parent_record, **extra_kwargs ) diff --git a/oarepo_model_builder_drafts/tests/templates/invenio_conftest.py.jinja2 b/oarepo_model_builder_drafts/tests/templates/invenio_conftest.py.jinja2 index cce9e85..856739b 100644 --- a/oarepo_model_builder_drafts/tests/templates/invenio_conftest.py.jinja2 +++ b/oarepo_model_builder_drafts/tests/templates/invenio_conftest.py.jinja2 @@ -9,4 +9,10 @@ def {{ fixtures.sample_record }}(app, db, input_data): uow.commit() return record +@pytest.fixture() +def vocab_cf(app, db, cache): + from oarepo_runtime.cf.mappings import prepare_cf_indices + + prepare_cf_indices() + diff --git a/oarepo_model_builder_drafts/tests/templates/invenio_test_resources.py.jinja2 b/oarepo_model_builder_drafts/tests/templates/invenio_test_resources.py.jinja2 index 655f7a2..181a50f 100644 --- a/oarepo_model_builder_drafts/tests/templates/invenio_test_resources.py.jinja2 +++ b/oarepo_model_builder_drafts/tests/templates/invenio_test_resources.py.jinja2 @@ -1,7 +1,19 @@ import copy + {{ vars.record.class|generate_import }} +{{ parent_record.record.class|generate_import }} {{ vars.resource_config.class|generate_import }} +#todo move to conftest +from invenio_records_resources.services.custom_fields import BooleanCF +import pytest +@pytest.fixture(scope="module") +def app_config(app_config): + app_config["HAS_DRAFT"] = [ + BooleanCF("has_draft") + ] + return app_config + def _assert_single_item_response(response): """Assert the fields present on a single item response.""" response_fields = response.json.keys() @@ -144,7 +156,7 @@ def test_mutiple_edit(client, input_data, search_clear): assert response.json["revision_id"] == {{ test_constants.revision_id3 }} -def test_redirect_to_latest_version(client, input_data): +def test_redirect_to_latest_version(client, input_data, search_clear): """Creates a new version of a record. Publishes the draft to obtain 2 versions of a record. @@ -167,4 +179,28 @@ def test_redirect_to_latest_version(client, input_data): response = client.get(f"{{"{" }} {{ vars.resource_config.class|base_name }}.url_prefix{{ "}" }}{recid}/versions/latest") assert response.status_code == 301 - assert response.headers["location"] == latest_version_self_link \ No newline at end of file + assert response.headers["location"] == latest_version_self_link + + +def test_list_drafts(client, input_data, vocab_cf, search_clear): + assert len(client.get({{ vars.resource_config.class|base_name }}.url_prefix).json["hits"]["hits"]) == 0 + assert len(client.get(f"user{{"{" }} {{ vars.resource_config.class|base_name }}.url_prefix{{ "}" }}").json["hits"]["hits"]) == 0 + + create_draft_response = client.post(ThesisResourceConfig.url_prefix, json=input_data) + assert create_draft_response.status_code == 201 + recid = create_draft_response.json["id"] + + {{ vars.record.class|base_name }}.index.refresh() + {{ parent_record.record.class|base_name }}.index.refresh() + assert len(client.get({{ vars.resource_config.class|base_name }}.url_prefix).json["hits"]["hits"]) == 0 + assert len(client.get(f"user{{"{" }} {{ vars.resource_config.class|base_name }}.url_prefix{{ "}" }}").json["hits"]["hits"]) == 1 + + response_publish = client.post( + f"{ThesisResourceConfig.url_prefix}{recid}/draft/actions/publish" + ) + assert response_publish.status_code == 202 + + {{ vars.record.class|base_name }}.index.refresh() + {{ parent_record.record.class|base_name }}.index.refresh() + assert len(client.get({{ vars.resource_config.class|base_name }}.url_prefix).json["hits"]["hits"]) == 1 + assert len(client.get(f"user{{"{" }} {{ vars.resource_config.class|base_name }}.url_prefix{{ "}" }}").json["hits"]["hits"]) == 0 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 09b59c9..e5b242b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = oarepo-model-builder-drafts -version = 4.0.0 +version = 4.0.1 description = authors = Ronald Krist readme = README.md @@ -40,6 +40,7 @@ oarepo_model_builder.builders.draft: 0340-invenio_record_dumper = oarepo_model_builder.invenio.invenio_record_dumper:InvenioRecordDumperBuilder 2800-invenio_drafts_record_metadata_extra_fields = oarepo_model_builder_drafts.invenio.invenio_drafts_record_metadata_extra_fields:InvenioDraftsRecordMetadataExtraFieldsBuilder 2900-invenio_drafts_record_extra_fields = oarepo_model_builder_drafts.invenio.invenio_drafts_record_extra_fields:InvenioDraftsRecordExtraFieldsBuilder + 3000-invenio_drafts_has_draft_checkfield = oarepo_model_builder_drafts.invenio.invenio_drafts_has_draft_checkfield:InvenioDraftsHasDraftCheckfieldBuilder 5150-invenio_drafts_parent_state = oarepo_model_builder_drafts.invenio.invenio_drafts_parent_state:InvenioDraftsParentStateBuilder 5200-invenio_drafts_record_service_config = oarepo_model_builder_drafts.invenio.invenio_drafts_record_service_config:InvenioDraftsRecordServiceConfigBuilder 3500-invenio_drafts_setup_cfg = oarepo_model_builder_drafts.invenio.invenio_drafts_setup_cfg:InvenioDraftsSetupCfgBuilder