Skip to content

Commit

Permalink
generating record items and lists
Browse files Browse the repository at this point in the history
  • Loading branch information
Ronald Krist committed Feb 13, 2024
1 parent 584286e commit 3671cad
Show file tree
Hide file tree
Showing 15 changed files with 485 additions and 198 deletions.
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",
]
88 changes: 88 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,88 @@
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 .app import AppModelComponent
# from .defaults import DefaultsModelComponent
from .utils import set_default


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

generate = ma.fields.Bool(metadata={"doc": "Generate the service config"})
class_ = ma.fields.Str(
attribute="class",
data_key="class",
metadata={"doc": "Qualified name of the service config 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 service config class"},
)
components = ma.fields.List(
ma.fields.String(), metadata={"doc": "List of service 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 service config"})
class_ = ma.fields.Str(
attribute="class",
data_key="class",
metadata={"doc": "Qualified name of the service config 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 service config class"},
)
components = ma.fields.List(
ma.fields.String(), metadata={"doc": "List of service 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: 3 additions & 4 deletions oarepo_model_builder/datatypes/components/model/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,7 @@ class Meta:
schema_context_args = ma.fields.Dict(
attribute="schema-context-args",
data_key="schema-context-args",
metadata={
"doc": "Extra args for ui marshmallow schema context"
},
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 @@ -101,5 +99,6 @@ def before_model_prepare(self, datatype, **kwargs):
"format_serializer_cls", "flask_resources.serializers.JSONSerializer"
)
json.setdefault(
"schema-context-args", {'"object_key"': '"ui"', '"identity"': "{{ flask.g{g.identity} }}"}
"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 }}
13 changes: 8 additions & 5 deletions oarepo_model_builder/invenio/templates/service_config.py.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@
{{ vars.permissions.class|imports }}
{{ vars.marshmallow.class|imports }}
{{ vars.search_options.class|imports }}
{{ vars.service_config.result_list_class|imports }}
{{ vars.service_config.result_item_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_item_cls = {{ vars.service_config.result_item_class|base_name }}
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
2 changes: 2 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
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 3671cad

Please sign in to comment.