Skip to content

Commit

Permalink
Merge pull request #249 from oarepo/krist/be-217-add-links-to-request…
Browse files Browse the repository at this point in the history
…s-on-main-record

Krist/be 217 add links to requests on main record
  • Loading branch information
SilvyPuzzlewell authored Feb 14, 2024
2 parents 94c7816 + c25ae44 commit bbe0f79
Show file tree
Hide file tree
Showing 20 changed files with 531 additions and 201 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,5 @@ vocabulary-postprocessed-schema.json
complex-model
.venv*

.token
.token
thesis/
4 changes: 4 additions & 0 deletions oarepo_model_builder/datatypes/components/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
PIDModelComponent,
ProxyModelComponent,
RecordDumperModelComponent,
RecordItemModelComponent,
RecordListModelComponent,
RecordMetadataModelComponent,
RecordModelComponent,
ResourceModelComponent,
Expand Down Expand Up @@ -83,4 +85,6 @@
StringMarshmallowComponent,
NumberMarshmallowComponent,
EDTFIntervalDumperModelComponent,
RecordListModelComponent,
RecordItemModelComponent,
]
4 changes: 4 additions & 0 deletions oarepo_model_builder/datatypes/components/model/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
from .proxy import ProxyModelComponent
from .record import RecordModelComponent
from .record_dumper import RecordDumperModelComponent
from .record_item import RecordItemModelComponent
from .record_list import RecordListModelComponent
from .record_metadata import RecordMetadataModelComponent
from .resource import ResourceModelComponent
from .sample import SampleModelComponent
Expand Down Expand Up @@ -46,4 +48,6 @@
"ExtResourceModelComponent",
"SortModelComponent",
"EDTFIntervalDumperModelComponent",
"RecordListModelComponent",
"RecordItemModelComponent",
]
85 changes: 85 additions & 0 deletions oarepo_model_builder/datatypes/components/model/record_item.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import marshmallow as ma

from oarepo_model_builder.datatypes import DataTypeComponent, ModelDataType
from oarepo_model_builder.utils.python_name import (
convert_config_to_qualified_name,
package_name,
)
from oarepo_model_builder.validation.utils import ImportSchema

from .service import ServiceModelComponent
from .utils import set_default


class RecordItemClassSchema(ma.Schema):
class Meta:
unknown = ma.RAISE

generate = ma.fields.Bool(metadata={"doc": "Generate the record item class"})
class_ = ma.fields.Str(
attribute="class",
data_key="class",
metadata={"doc": "Qualified name of the record item class"},
)
base_classes = ma.fields.List(
ma.fields.Str(),
attribute="base-classes",
data_key="base-classes",
metadata={"doc": "List of base classes"},
)
extra_code = ma.fields.Str(
attribute="extra-code",
data_key="extra-code",
metadata={"doc": "Extra code to be put below the record item class"},
)
components = ma.fields.List(
ma.fields.String(), metadata={"doc": "List of record item components"}
)
module = ma.fields.String(metadata={"doc": "Class module"})
imports = ma.fields.List(
ma.fields.Nested(ImportSchema), metadata={"doc": "List of python imports"}
)
skip = ma.fields.Boolean()


class RecordItemModelComponent(DataTypeComponent):
eligible_datatypes = [ModelDataType]
depends_on = [ServiceModelComponent]

class ModelSchema(ma.Schema):
record_item = ma.fields.Nested(
RecordItemClassSchema,
attribute="record-item",
data_key="record-item",
metadata={"doc": "Record item class settings"},
)

def before_model_prepare(self, datatype, *, context, **kwargs):
record_prefix = datatype.definition["module"]["prefix"]

service_package = package_name(datatype.definition["service-config"]["module"])

record_item_config = set_default(datatype, "record-item", {})

record_item_config.setdefault("generate", True)
record_item_module = record_item_config.setdefault(
"module",
f"{service_package}.results",
)
record_item_config.setdefault(
"class",
f"{record_item_module}.{record_prefix}RecordItem",
)
record_item_config.setdefault("extra-code", "")
record_item_config.setdefault(
"base-classes",
[
"oarepo_runtime.services.results.RecordItem",
],
)
record_item_config.setdefault("components", [])
record_item_config.setdefault(
"imports",
[],
)
convert_config_to_qualified_name(record_item_config)
87 changes: 87 additions & 0 deletions oarepo_model_builder/datatypes/components/model/record_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import marshmallow as ma

from oarepo_model_builder.datatypes import DataTypeComponent, ModelDataType
from oarepo_model_builder.utils.python_name import (
convert_config_to_qualified_name,
package_name,
)
from oarepo_model_builder.validation.utils import ImportSchema

from .app import AppModelComponent
from .defaults import DefaultsModelComponent
from .service import ServiceModelComponent
from .utils import set_default


class RecordListClassSchema(ma.Schema):
class Meta:
unknown = ma.RAISE

generate = ma.fields.Bool(metadata={"doc": "Generate the record list class"})
class_ = ma.fields.Str(
attribute="class",
data_key="class",
metadata={"doc": "Qualified name of the record list class"},
)
base_classes = ma.fields.List(
ma.fields.Str(),
attribute="base-classes",
data_key="base-classes",
metadata={"doc": "List of base classes"},
)
extra_code = ma.fields.Str(
attribute="extra-code",
data_key="extra-code",
metadata={"doc": "Extra code to be put below the record list class"},
)
components = ma.fields.List(
ma.fields.String(), metadata={"doc": "List of record list components"}
)
module = ma.fields.String(metadata={"doc": "Class module"})
imports = ma.fields.List(
ma.fields.Nested(ImportSchema), metadata={"doc": "List of python imports"}
)
skip = ma.fields.Boolean()


class RecordListModelComponent(DataTypeComponent):
eligible_datatypes = [ModelDataType]
depends_on = [DefaultsModelComponent, AppModelComponent, ServiceModelComponent]

class ModelSchema(ma.Schema):
record_list = ma.fields.Nested(
RecordListClassSchema,
attribute="record-list",
data_key="record-list",
metadata={"doc": "Record list class settings"},
)

def before_model_prepare(self, datatype, *, context, **kwargs):
record_prefix = datatype.definition["module"]["prefix"]

service_package = package_name(datatype.definition["service-config"]["module"])

record_list_config = set_default(datatype, "record-list", {})

record_list_config.setdefault("generate", True)
record_list_module = record_list_config.setdefault(
"module",
f"{service_package}.results",
)
record_list_config.setdefault(
"class",
f"{record_list_module}.{record_prefix}RecordList",
)
record_list_config.setdefault("extra-code", "")
record_list_config.setdefault(
"base-classes",
[
"oarepo_runtime.services.results.RecordList",
],
)
record_list_config.setdefault("components", [])
record_list_config.setdefault(
"imports",
[],
)
convert_config_to_qualified_name(record_list_config)
7 changes: 0 additions & 7 deletions oarepo_model_builder/datatypes/components/model/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,6 @@ class Meta:
imports = ma.fields.List(
ma.fields.Nested(ImportSchema), metadata={"doc": "List of python imports"}
)
result_list_class = ma.fields.List(
ma.fields.String(attribute="result-list-class", data_key="result-list-class"),
metadata={"doc": "Class of service result list"},
)
skip = ma.fields.Boolean()


Expand Down Expand Up @@ -136,9 +132,6 @@ def before_model_prepare(self, datatype, *, context, **kwargs):
],
)
config.setdefault("components", [])
config.setdefault(
"result-list-class", "oarepo_runtime.services.results.RecordList"
)
convert_config_to_qualified_name(config)

service = set_default(datatype, "service", {})
Expand Down
9 changes: 9 additions & 0 deletions oarepo_model_builder/datatypes/components/model/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ class Meta:
data_key="format-serializer-cls",
metadata={"doc": "Class for serializing the resulting json"},
)
schema_context_args = ma.fields.Dict(
attribute="schema-context-args",
data_key="schema-context-args",
metadata={"doc": "Extra args for ui marshmallow schema context"},
)
imports = ma.fields.List(
ma.fields.Nested(ImportSchema), metadata={"doc": "List of python imports"}
)
Expand Down Expand Up @@ -93,3 +98,7 @@ def before_model_prepare(self, datatype, **kwargs):
json.setdefault(
"format_serializer_cls", "flask_resources.serializers.JSONSerializer"
)
json.setdefault(
"schema-context-args",
{'"object_key"': '"ui"', '"identity"': "{{ flask.g{g.identity} }}"},
)
2 changes: 2 additions & 0 deletions oarepo_model_builder/invenio/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,6 @@
# utils and included
"ext-resource": "templates/ext_resource.py.jinja2",
"edtf-interval-record-dumper": "templates/edtf_interval_record_dumper.py.jinja2",
"record-item": "templates/record_item.py.jinja2",
"record-list": "templates/record_list.py.jinja2",
}
7 changes: 7 additions & 0 deletions oarepo_model_builder/invenio/invenio_record_item.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from .invenio_base import InvenioBaseClassPythonBuilder


class InvenioRecordItemBuilder(InvenioBaseClassPythonBuilder):
TYPE = "invenio_record_item"
section = "record-item"
template = "record-item"
7 changes: 7 additions & 0 deletions oarepo_model_builder/invenio/invenio_record_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from .invenio_base import InvenioBaseClassPythonBuilder


class InvenioRecordListBuilder(InvenioBaseClassPythonBuilder):
TYPE = "invenio_record_list"
section = "record-list"
template = "record-list"
10 changes: 10 additions & 0 deletions oarepo_model_builder/invenio/templates/record_item.py.jinja2
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{{ vars.record_item|imports }}
{% for c in vars.record_item.components %}
{{ c|code_imports }}
{% endfor %}

class {{ vars.record_item|class_header }}:
"""{{ vars.record.class|base_name }} record item."""
components = [ {% for b in vars.record_item.base_classes %}*{{ b|base_name }}.components{% if not loop.last %}, {% endif %}{% endfor %}{% for c in vars.record_item.components %}, {{ c|extra_code }} {% endfor %}]

{{ vars.record_item|extra_code }}
10 changes: 10 additions & 0 deletions oarepo_model_builder/invenio/templates/record_list.py.jinja2
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{{ vars.record_list|imports }}
{% for c in vars.record_list.components %}
{{ c|code_imports }}
{% endfor %}

class {{ vars.record_list|class_header }}:
"""{{ vars.record.class|base_name }} record list."""
components = [ {% for b in vars.record_list.base_classes %}*{{ b|base_name }}.components{% if not loop.last %}, {% endif %}{% endfor %}{% for c in vars.record_list.components %}, {{ c|extra_code }} {% endfor %}]

{{ vars.record_list|extra_code }}
12 changes: 8 additions & 4 deletions oarepo_model_builder/invenio/templates/service_config.py.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@
{{ vars.permissions.class|imports }}
{{ vars.marshmallow.class|imports }}
{{ vars.search_options.class|imports }}
{{ vars.service_config.result_list_class|imports }}
{{ vars.record_item.class|imports }}
{{ vars.record_list.class|imports }}
{% for c in vars.service_config.components %}
{{ c|code_imports }}
{% endfor %}

class {{ vars.service_config|class_header }}:
"""{{ vars.record.class|base_name }} service config."""

result_list_cls = {{ vars.service_config.result_list_class|base_name }}

{% if not vars.record_item.skip %}
result_item_cls = {{ vars.record_item.class|base_name }}
{% endif %}
{% if not vars.record_list.skip %}
result_list_cls = {{ vars.record_list.class|base_name }}
{% endif %}
PERMISSIONS_PRESETS = [{% for p in vars.permissions.presets %}"{{ p }}"{{ ", " if not loop.last else "" }} {% endfor %}]

url_prefix = "{{ vars.resource_config.base_url }}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
{{ vars.ui.marshmallow.class|imports }}
{{ vars.json_serializer.format_serializer_cls|imports }}
{{ vars.json_serializer.list_schema_cls|imports }}
{% for arg in vars.json_serializer.schema_context_args.values() %}
{{arg|code_imports}}
{% endfor %}


class {{ vars.json_serializer|class_header }}:
Expand All @@ -13,7 +16,6 @@ class {{ vars.json_serializer|class_header }}:
format_serializer_cls={{ vars.json_serializer.format_serializer_cls|base_name }},
object_schema_cls={{vars.ui.marshmallow.class|base_name}},
list_schema_cls={{ vars.json_serializer.list_schema_cls|base_name }},
schema_context={"object_key": "ui"},
schema_context={ {{ vars.json_serializer.schema_context_args|generate_dict }} }
)

{{ vars.json_serializer|extra_code }}
1 change: 0 additions & 1 deletion run-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ initialize_server_venv() {
$SERVER_VENV/bin/pip install -U setuptools pip wheel
$SERVER_VENV/bin/pip install "oarepo[tests]==${OAREPO_VERSION}.*"
$SERVER_VENV/bin/pip install -e complex-model
$SERVER_VENV/bin/pip install -U pytest
}

initialize_builder_venv() {
Expand Down
4 changes: 3 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[metadata]
name = oarepo-model-builder
version = 4.0.71
version = 4.0.72
description = A utility library that generates OARepo required data model files from a JSON specification file
authors = Miroslav Bauer <[email protected]>, Miroslav Simek <[email protected]>
readme = README.md
Expand Down Expand Up @@ -160,6 +160,8 @@ oarepo_model_builder.builders.record =
1050-invenio_version = oarepo_model_builder.invenio.invenio_version:InvenioVersionBuilder
2000-model_saver = oarepo_model_builder.builders.model_saver:ModelSaverBuilder
2010-model_registration = oarepo_model_builder.builders.model_saver:ModelRegistrationBuilder
2020-invenio_record_item = oarepo_model_builder.invenio.invenio_record_item:InvenioRecordItemBuilder
2030-invenio_record_list = oarepo_model_builder.invenio.invenio_record_list:InvenioRecordListBuilder

####
#### Extended schema profile
Expand Down
Loading

0 comments on commit bbe0f79

Please sign in to comment.