From 12b460a98e020d4813957a4088977ffd4dc14f87 Mon Sep 17 00:00:00 2001 From: Cyril Jacquet Date: Mon, 22 Jan 2024 02:01:28 +0100 Subject: [PATCH] add "hidden" and "read_only" option fix conflict with update function --- README.md | 9 +++- .../qleany/generator/application_generator.py | 2 +- .../qleany/generator/controller_generator.py | 10 ++-- tools/qleany/generator/dto_generator.py | 51 ++++++++++++++----- .../qleany/generator/generation_dict_tools.py | 7 ++- tools/qleany/generator/presenter_generator.py | 7 +++ tools/qleany/generator/qml_generator.py | 4 +- .../controllers/controller.qml.jinja2 | 2 +- .../controllers/signals.qml.jinja2 | 2 +- .../controllers/foreign_controller.h.jinja2 | 4 +- .../models/foreign_model.h.jinja2 | 2 +- .../singles/foreign_single.h.jinja2 | 2 +- .../controller/controller.cpp.jinja2 | 6 +-- .../templates/controller/controller.h.jinja2 | 6 +-- .../templates/controller/signals.h.jinja2 | 15 +++--- .../presenter/entity_list_model.cpp.jinja2 | 4 +- .../presenter/entity_list_model.h.jinja2 | 2 + .../templates/presenter/list_model.cpp.jinja2 | 4 +- .../templates/presenter/list_model.h.jinja2 | 2 + .../presenter/ordered_list_model.cpp.jinja2 | 4 +- .../presenter/ordered_list_model.h.jinja2 | 2 + .../templates/presenter/single.cpp.jinja2 | 6 ++- .../templates/presenter/single.h.jinja2 | 8 +-- 23 files changed, 110 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index bebfef26..fcb73988 100755 --- a/README.md +++ b/README.md @@ -107,16 +107,19 @@ entities: # basic: - type: DataType name: fieldName + hidden: true/false (default: false) # one-to-one relationship: - type: OtherEntityName name: fieldName strong: true/false + hidden: true/false (default: false) # one-to-many relationship: - type: QList name: fieldName strong: true/false ordered: true/false - # other fields + hidden: true/false (default: false) + # other fields ... # other entities export: EXPORT_MACRO_NAME export_header_file: header_file_name.h @@ -255,8 +258,9 @@ presenter: export_header_file: header_file_name.h create_undo_and_redo_singles: true/false (default false) singles: - - name: SingleName + - name: SingleName (or "auto") entity: EntityName + read_only: true/false (default: false) # Additional singles... list_models: - name: ListModelName (or auto) @@ -264,6 +268,7 @@ presenter: displayed_field: fieldName in_relation_of: RelationEntity relation_field_name: relationFieldName + read_only: true/false (default: false) # Additional list models... ``` diff --git a/tools/qleany/generator/application_generator.py b/tools/qleany/generator/application_generator.py index 577d6d3b..c9cf4936 100755 --- a/tools/qleany/generator/application_generator.py +++ b/tools/qleany/generator/application_generator.py @@ -146,7 +146,7 @@ def get_generation_dict( } update_data = crud_data.get("update", {}) if update_data.get("enabled", False) and update_data.get("generate", True): - crud_handlers["update"] = { + crud_handlers["update_"] = { "generate": True, "templates": [ "update_handler.cpp.jinja2", diff --git a/tools/qleany/generator/controller_generator.py b/tools/qleany/generator/controller_generator.py index edf65b50..4c8ca5bf 100755 --- a/tools/qleany/generator/controller_generator.py +++ b/tools/qleany/generator/controller_generator.py @@ -25,6 +25,8 @@ def get_other_entities_relation_fields( fields = data["fields"] for field in fields: + if field.get("hidden", False): + continue field_type = field["type"] if tools.is_unique_foreign_entity( field_type, entities_by_name @@ -116,7 +118,7 @@ def get_generation_dict( final_feature_dict["crud"]["entity_name_camel"] = entity_camel_name final_feature_dict["crud"][ "entity_has_relation_fields" - ] = tools.does_entity_have_relation_fields(entity_name, entities_by_name) + ] = tools.does_entity_have_relation_fields(entity_name, entities_by_name, False) final_feature_dict["crud"]["get"] = ( feature["CRUD"].get("get", {}).get("enabled", False) @@ -130,7 +132,7 @@ def get_generation_dict( final_feature_dict["crud"]["create"] = ( feature["CRUD"].get("create", {}).get("enabled", False) ) - final_feature_dict["crud"]["update"] = ( + final_feature_dict["crud"]["update_"] = ( feature["CRUD"].get("update", {}).get("enabled", False) ) final_feature_dict["crud"]["remove"] = ( @@ -460,7 +462,7 @@ def generate_event_dispatcher_files( print(f"Successfully wrote file {event_dispatcher_file}") -def generate_controller_h_and_cpp_files( +def _generate_controller_h_and_cpp_files( root_path: str, generation_dict: dict, files_to_be_generated: dict[str, bool] = None ): template_env = Environment(loader=FileSystemLoader("templates/controller")) @@ -882,7 +884,7 @@ def generate_controller_files( generate_cmakelists(root_path, generation_dict, files_to_be_generated) generate_export_header_file(root_path, generation_dict, files_to_be_generated) generate_signal_files(root_path, generation_dict, files_to_be_generated) - generate_controller_h_and_cpp_files( + _generate_controller_h_and_cpp_files( root_path, generation_dict, files_to_be_generated ) if create_undo_redo_controller: diff --git a/tools/qleany/generator/dto_generator.py b/tools/qleany/generator/dto_generator.py index 1f4bdab9..0145433b 100755 --- a/tools/qleany/generator/dto_generator.py +++ b/tools/qleany/generator/dto_generator.py @@ -52,12 +52,15 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: } # add fields without foreign entities - - dto_dict[dto_type_name]["fields"] = tools.get_fields_without_foreign_entities( + fields = tools.get_fields_without_foreign_entities( entities_by_name[entity_mappable_with]["fields"], entities_by_name, entity_mappable_with, ) + # remove if hidden + fields = [field for field in fields if not field["hidden"]] + + dto_dict[dto_type_name]["fields"] = fields dto_dict[dto_type_name]["dto_dependencies"] = [] @@ -76,12 +79,15 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: } # add fields with foreign entities - dto_dict[dto_type_name]["fields"] = tools.get_fields_with_foreign_entities( + fields = tools.get_fields_with_foreign_entities( entities_by_name[entity_mappable_with]["fields"], entities_by_name, entity_mappable_with, ) + # remove if hidden + fields = [field for field in fields if not field["hidden"]] + dto_dict[dto_type_name]["fields"] = fields dto_dict[dto_type_name][ "dto_dependencies" ] = determine_dto_dependencies_from_fields( @@ -101,8 +107,8 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: if crud_data["enabled"]: generate_create = crud_data.get("create", {}).get("enabled", False) generate_update = crud_data.get("update", {}).get("enabled", False) - generate_insert_relation = crud_data.get("insert_relation", {}).get( - "enabled", False + generate_insert_relation = tools.does_entity_have_relation_fields( + entity_mappable_with, entities_by_name, False ) generate_move = crud_data.get("move_in_relative", {}).get( "enabled", False @@ -119,11 +125,14 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: } # add fields with foreign entities but without id - dto_dict[dto_type_name]["fields"] = tools.get_fields_with_foreign_entities( + fields = tools.get_fields_with_foreign_entities( entities_by_name[entity_mappable_with]["fields"], entities_by_name, entity_mappable_with, ) + # remove hidden fields + fields = [field for field in fields if not field["hidden"]] + dto_dict[dto_type_name]["fields"] = fields # remove id field dto_dict[dto_type_name]["fields"] = [ @@ -183,11 +192,15 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: } # add fields with foreign entities - dto_dict[dto_type_name]["fields"] = tools.get_fields_with_foreign_entities( + fields = tools.get_fields_with_foreign_entities( entities_by_name[entity_mappable_with]["fields"], entities_by_name, entity_mappable_with, ) + # remove hidden fields + fields = [field for field in fields if not field["hidden"]] + + dto_dict[dto_type_name]["fields"] = fields dto_dict[dto_type_name][ "dto_dependencies" @@ -239,7 +252,7 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: "is_foreign": False, "type": "int", } - ) + ) # add relationship fields @@ -268,9 +281,13 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: } # add fields with foreign entities - dto_dict[dto_type_name]["fields"] = tools.get_fields_with_foreign_entities( + fields = tools.get_fields_with_foreign_entities( dto_in["fields"], entities_by_name ) + # remove hidden fields + fields = [field for field in fields if not field["hidden"]] + dto_dict[dto_type_name]["fields"] = fields + dto_dict[dto_type_name][ "dto_dependencies" ] = determine_dto_dependencies_from_fields( @@ -289,9 +306,12 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: } # add fields with foreign entities - dto_dict[dto_type_name]["fields"] = tools.get_fields_with_foreign_entities( + fields = tools.get_fields_with_foreign_entities( dto_out["fields"], entities_by_name ) + # remove hidden fields + fields = [field for field in fields if not field["hidden"]] + dto_dict[dto_type_name]["fields"] = fields dto_dict[dto_type_name][ "dto_dependencies" ] = determine_dto_dependencies_from_fields( @@ -313,9 +333,13 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: } # add fields with foreign entities - dto_dict[dto_type_name]["fields"] = tools.get_fields_with_foreign_entities( + fields = tools.get_fields_with_foreign_entities( dto_in["fields"], entities_by_name ) + # remove hidden fields + fields = [field for field in fields if not field["hidden"]] + dto_dict[dto_type_name]["fields"] = fields + dto_dict[dto_type_name][ "dto_dependencies" ] = determine_dto_dependencies_from_fields( @@ -334,9 +358,12 @@ def determine_dto_dependencies_from_fields(fields: list) -> list: } # add fields with foreign entities - dto_dict[dto_type_name]["fields"] = tools.get_fields_with_foreign_entities( + fields = tools.get_fields_with_foreign_entities( dto_out["fields"], entities_by_name ) + # remove hidden fields + fields = [field for field in fields if not field["hidden"]] + dto_dict[dto_type_name]["fields"] = fields dto_dict[dto_type_name][ "dto_dependencies" ] = determine_dto_dependencies_from_fields( diff --git a/tools/qleany/generator/generation_dict_tools.py b/tools/qleany/generator/generation_dict_tools.py index 3f69eea4..39e4bdee 100644 --- a/tools/qleany/generator/generation_dict_tools.py +++ b/tools/qleany/generator/generation_dict_tools.py @@ -23,7 +23,7 @@ def is_list_foreign_entity(field_type: str, entities_by_name: dict) -> bool: return False -def does_entity_have_relation_fields(entity_name: str, entities_by_name: dict) -> bool: +def does_entity_have_relation_fields(entity_name: str, entities_by_name: dict, keep_hidden: bool = True) -> bool: entity = entities_by_name.get(entity_name, None) if entity is None: return False @@ -31,6 +31,8 @@ def does_entity_have_relation_fields(entity_name: str, entities_by_name: dict) - fields = entity["fields"] for field in fields: field_type = field["type"] + if keep_hidden is False and field.get("hidden", False): + continue if is_unique_foreign_entity( field_type, entities_by_name ) or is_list_foreign_entity(field_type, entities_by_name): @@ -61,6 +63,7 @@ def determine_owner(entity_name: str, entities_by_name: dict) -> dict: owner_dict["name"] = possible_owner_name owner_dict["field"] = field["name"] owner_dict["ordered"] = field.get("ordered", False) + owner_dict["hidden"] = field.get("hidden", False) owner_dict["is_list"] = field["type"] == f"QList<{entity_name}>" return owner_dict @@ -92,6 +95,7 @@ def get_fields_with_foreign_entities( # add fields with foreign entities for field in fields: field["pascal_name"] = stringcase.pascalcase(field["name"]) + field["hidden"] = field.get("hidden", False) if is_unique_foreign_entity( field["type"], entities_by_name @@ -140,6 +144,7 @@ def get_fields_without_foreign_entities( for field in fields: field["pascal_name"] = stringcase.pascalcase(field["name"]) field["camel_name"] = stringcase.camelcase(field["name"]) + field["hidden"] = field.get("hidden", False) if is_unique_foreign_entity( field["type"], entities_by_name diff --git a/tools/qleany/generator/presenter_generator.py b/tools/qleany/generator/presenter_generator.py index 9c8d4329..f83a091b 100755 --- a/tools/qleany/generator/presenter_generator.py +++ b/tools/qleany/generator/presenter_generator.py @@ -87,6 +87,8 @@ def get_fields_without_foreign_entities( generation_dict["singles_list"] = [] for single in singles_list: + read_only = single.get("read_only", False) + entity_name = single["entity"] entity_name_snake = stringcase.snakecase(entity_name) entity_name_pascal = stringcase.pascalcase(entity_name) @@ -117,6 +119,7 @@ def get_fields_without_foreign_entities( entities_by_name, single["entity"], ), + "read_only": read_only, } ) generation_dict["all_presenter_files"].append( @@ -138,6 +141,8 @@ def get_fields_without_foreign_entities( generation_dict["list_models"] = [] for model in list_models_list: + read_only = model.get("read_only", False) + entity_name = model["entity"] entity_name_snake = stringcase.snakecase(entity_name) entity_name_pascal = stringcase.pascalcase(entity_name) @@ -220,6 +225,8 @@ def get_fields_without_foreign_entities( ), "is_ordered_list": is_ordered_list, "is_related_list": is_related_list, + "read_only": read_only, + } ) generation_dict["all_presenter_files"].append( diff --git a/tools/qleany/generator/qml_generator.py b/tools/qleany/generator/qml_generator.py index 3bdb2285..c03e3555 100755 --- a/tools/qleany/generator/qml_generator.py +++ b/tools/qleany/generator/qml_generator.py @@ -107,10 +107,10 @@ def _get_generation_dict( "get_with_details": get_with_details_enabled, "get_all": get_all_enabled, "create": create_enabled, - "update": update_enabled, + "update_": update_enabled, "remove": remove_enabled, "entity_has_relation_fields": tools.does_entity_have_relation_fields( - feature_pascal_name, entities_by_name + feature_pascal_name, entities_by_name, False ), }, "custom_commands": custom_commands, diff --git a/tools/qleany/generator/templates/QML/mock_imports/controllers/controller.qml.jinja2 b/tools/qleany/generator/templates/QML/mock_imports/controllers/controller.qml.jinja2 index 6abe7ee8..e7649653 100755 --- a/tools/qleany/generator/templates/QML/mock_imports/controllers/controller.qml.jinja2 +++ b/tools/qleany/generator/templates/QML/mock_imports/controllers/controller.qml.jinja2 @@ -76,7 +76,7 @@ QtObject { return task } {% endif -%} -{% if controller.crud.update %} +{% if controller.crud.update_ %} function getUpdateDTO() { return { "id": 0, diff --git a/tools/qleany/generator/templates/QML/mock_imports/controllers/signals.qml.jinja2 b/tools/qleany/generator/templates/QML/mock_imports/controllers/signals.qml.jinja2 index fd2005e0..9328bc00 100755 --- a/tools/qleany/generator/templates/QML/mock_imports/controllers/signals.qml.jinja2 +++ b/tools/qleany/generator/templates/QML/mock_imports/controllers/signals.qml.jinja2 @@ -21,7 +21,7 @@ QtObject { {%- if controller.crud.create %} signal created(var dto) {%- endif %} -{%- if controller.crud.update %} +{%- if controller.crud.update_ %} signal updated(var dto) signal allRelationsInvalidated(int itemId) {%- endif %} diff --git a/tools/qleany/generator/templates/QML/real_imports/controllers/foreign_controller.h.jinja2 b/tools/qleany/generator/templates/QML/real_imports/controllers/foreign_controller.h.jinja2 index 548b0d5f..0dbd1b1f 100755 --- a/tools/qleany/generator/templates/QML/real_imports/controllers/foreign_controller.h.jinja2 +++ b/tools/qleany/generator/templates/QML/real_imports/controllers/foreign_controller.h.jinja2 @@ -51,7 +51,7 @@ public: } {% endif %} - {%if controller.crud.update %} + {%if controller.crud.update_ %} Q_INVOKABLE Update{{ controller.feature_pascal_name }}DTO getUpdateDTO() { return s_controllerInstance->getUpdateDTO(); @@ -75,7 +75,7 @@ public: } {% endif %} - {% if controller.crud.update %} + {% if controller.crud.update_ %} Q_INVOKABLE QCoro::QmlTask update(const Update{{ controller.feature_pascal_name }}DTO &dto) { return s_controllerInstance->update(dto); diff --git a/tools/qleany/generator/templates/QML/real_imports/models/foreign_model.h.jinja2 b/tools/qleany/generator/templates/QML/real_imports/models/foreign_model.h.jinja2 index 0bc369e2..90d9557c 100644 --- a/tools/qleany/generator/templates/QML/real_imports/models/foreign_model.h.jinja2 +++ b/tools/qleany/generator/templates/QML/real_imports/models/foreign_model.h.jinja2 @@ -7,6 +7,6 @@ struct Foreign{{ model.list_model_pascal_name}} { Q_GADGET - QML_FOREIGN(Simple::Presenter::{{ model.list_model_pascal_name}}) + QML_FOREIGN({{ application_cpp_domain_name }}::Presenter::{{ model.list_model_pascal_name}}) QML_NAMED_ELEMENT({{ model.list_model_pascal_name}}) }; diff --git a/tools/qleany/generator/templates/QML/real_imports/singles/foreign_single.h.jinja2 b/tools/qleany/generator/templates/QML/real_imports/singles/foreign_single.h.jinja2 index 5d502ac4..53d2b994 100644 --- a/tools/qleany/generator/templates/QML/real_imports/singles/foreign_single.h.jinja2 +++ b/tools/qleany/generator/templates/QML/real_imports/singles/foreign_single.h.jinja2 @@ -5,6 +5,6 @@ struct Foreign{{ single.class_name_pascal}} { Q_GADGET - QML_FOREIGN(Simple::Presenter::{{ single.class_name_pascal}}) + QML_FOREIGN({{ application_cpp_domain_name }}::Presenter::{{ single.class_name_pascal}}) QML_NAMED_ELEMENT({{ single.class_name_pascal}}) }; diff --git a/tools/qleany/generator/templates/controller/controller.cpp.jinja2 b/tools/qleany/generator/templates/controller/controller.cpp.jinja2 index 123cdddc..cde302d5 100755 --- a/tools/qleany/generator/templates/controller/controller.cpp.jinja2 +++ b/tools/qleany/generator/templates/controller/controller.cpp.jinja2 @@ -21,7 +21,7 @@ #include "{{ feature_name_snake }}/commands/remove_{{ entity_name_snake }}_command.h" #include "{{ feature_name_snake }}/commands/remove_{{ entity_name_snake }}_command_handler.h" {% endif -%} - {%if feature.crud.update -%} + {%if feature.crud.update_ -%} #include "{{ feature_name_snake }}/commands/update_{{ entity_name_snake }}_command.h" #include "{{ feature_name_snake }}/commands/update_{{ entity_name_snake }}_command_handler.h" {% endif -%} @@ -222,7 +222,7 @@ QCoro::Task<{{ entity_name_pascal }}DTO> {{ feature_name_pascal }}Controller::cr co_return optional_result.value(); } {% endif %} - {%if feature.crud.update %} + {%if feature.crud.update_ %} QCoro::Task<{{ entity_name_pascal }}DTO> {{ feature_name_pascal }}Controller::update(const Update{{ entity_name_pascal }}DTO &dto) { @@ -300,7 +300,7 @@ Create{{ entity_name_pascal }}DTO {{ feature_name_pascal }}Controller::getCreate return Create{{ entity_name_pascal }}DTO(); } {% endif %} - {%if feature.crud.update %} + {%if feature.crud.update_ %} Update{{ entity_name_pascal }}DTO {{ feature_name_pascal }}Controller::getUpdateDTO() { return Update{{ entity_name_pascal }}DTO(); diff --git a/tools/qleany/generator/templates/controller/controller.h.jinja2 b/tools/qleany/generator/templates/controller/controller.h.jinja2 index a13b7974..9de0e3d6 100755 --- a/tools/qleany/generator/templates/controller/controller.h.jinja2 +++ b/tools/qleany/generator/templates/controller/controller.h.jinja2 @@ -13,7 +13,7 @@ {% if feature.crud.create -%} #include "{{ feature_name_snake }}/create_{{ entity_name_snake }}_dto.h" {% endif -%} - {% if feature.crud.update -%} + {% if feature.crud.update_ -%} #include "{{ feature_name_snake }}/update_{{ entity_name_snake }}_dto.h" {% endif -%} {% endif -%} @@ -68,7 +68,7 @@ class {{ export }} {{ feature_name_pascal }}Controller : public QObject {% if feature.crud.create %} Q_INVOKABLE static Contracts::DTO::{{ entity_name_pascal }}::Create{{ entity_name_pascal }}DTO getCreateDTO(); {% endif %} - {% if feature.crud.update %} + {% if feature.crud.update_ %} Q_INVOKABLE static Contracts::DTO::{{ entity_name_pascal }}::Update{{ entity_name_pascal }}DTO getUpdateDTO(); {% endif %} {% endif %} @@ -79,7 +79,7 @@ class {{ export }} {{ feature_name_pascal }}Controller : public QObject {%if feature.crud.create %} QCoro::Task<{{ entity_name_pascal }}DTO> create(const Create{{ entity_name_pascal }}DTO &dto); {% endif %} - {%if feature.crud.update %} + {%if feature.crud.update_ %} QCoro::Task<{{ entity_name_pascal }}DTO> update(const Update{{ entity_name_pascal }}DTO &dto); {% endif %} {%if feature.crud.remove %} diff --git a/tools/qleany/generator/templates/controller/signals.h.jinja2 b/tools/qleany/generator/templates/controller/signals.h.jinja2 index dd6f8c23..9745b3ff 100755 --- a/tools/qleany/generator/templates/controller/signals.h.jinja2 +++ b/tools/qleany/generator/templates/controller/signals.h.jinja2 @@ -35,10 +35,13 @@ class {{ export }} {{ feature.feature_name_pascal }}Signals : public QObject } signals: - void removed(QList removedIds); - void activeStatusChanged(QList changedIds, bool isActive); {%- if feature.crud.enabled %} + void removed(QList removedIds); + void activeStatusChanged(QList changedIds, bool isActive); + void created({{ feature.crud.entity_name_pascal }}DTO dto); + void updated({{ feature.crud.entity_name_pascal }}DTO dto); + void allRelationsInvalidated(int id); {%if feature.crud.get -%} void getReplied({{ feature.crud.entity_name_pascal }}DTO dto); {% endif -%} @@ -48,13 +51,7 @@ class {{ export }} {{ feature.feature_name_pascal }}Signals : public QObject {%if feature.crud.get_all -%} void getAllReplied(QList<{{ feature.crud.entity_name_pascal }}DTO> dtoList); {% endif -%} - {%if feature.crud.create -%} - void created({{ feature.crud.entity_name_pascal }}DTO dto); - {% endif -%} - {%if feature.crud.update -%} - void updated(Contracts::DTO::{{ feature.crud.entity_name_pascal }}::{{ feature.crud.entity_name_pascal }}DTO dto); - void allRelationsInvalidated(int id); - {% endif -%} + {% if feature.crud.entity_has_relation_fields %} void relationInserted({{ feature.crud.entity_name_pascal }}RelationDTO dto); diff --git a/tools/qleany/generator/templates/presenter/entity_list_model.cpp.jinja2 b/tools/qleany/generator/templates/presenter/entity_list_model.cpp.jinja2 index e3d0f3da..1ce3ab02 100755 --- a/tools/qleany/generator/templates/presenter/entity_list_model.cpp.jinja2 +++ b/tools/qleany/generator/templates/presenter/entity_list_model.cpp.jinja2 @@ -93,9 +93,10 @@ Qt::ItemFlags {{ model.class_name_pascal }}::flags(const QModelIndex &index) con if (!index.isValid()) return Qt::NoItemFlags; - return Qt::ItemIsEditable | QAbstractItemModel::flags(index); + return {% if not model.read_only %}Qt::ItemIsEditable | {% endif %}QAbstractItemModel::flags(index); } +{% if not model.read_only %} bool {{ model.class_name_pascal }}::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid()) @@ -140,6 +141,7 @@ bool {{ model.class_name_pascal }}::setData(const QModelIndex &index, const QVar return false; } +{% endif %} void {{ model.class_name_pascal }}::populate() { diff --git a/tools/qleany/generator/templates/presenter/entity_list_model.h.jinja2 b/tools/qleany/generator/templates/presenter/entity_list_model.h.jinja2 index 93664aac..20ab666f 100755 --- a/tools/qleany/generator/templates/presenter/entity_list_model.h.jinja2 +++ b/tools/qleany/generator/templates/presenter/entity_list_model.h.jinja2 @@ -34,7 +34,9 @@ class {{ export }} {{ model.class_name_pascal }} : public QAbstractListModel QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex &index) const override; + {% if not model.read_only %} bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; + {% endif %} QHash roleNames() const override; signals: diff --git a/tools/qleany/generator/templates/presenter/list_model.cpp.jinja2 b/tools/qleany/generator/templates/presenter/list_model.cpp.jinja2 index 2cea0381..de585f40 100755 --- a/tools/qleany/generator/templates/presenter/list_model.cpp.jinja2 +++ b/tools/qleany/generator/templates/presenter/list_model.cpp.jinja2 @@ -192,9 +192,10 @@ Qt::ItemFlags {{ model.class_name_pascal }}::flags(const QModelIndex &index) con if (!index.isValid()) return Qt::NoItemFlags; - return Qt::ItemIsEditable | QAbstractItemModel::flags(index); + return {% if not model.read_only %}Qt::ItemIsEditable | {% endif %} QAbstractItemModel::flags(index); } +{% if not model.read_only %} bool {{ model.class_name_pascal }}::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid()) @@ -241,6 +242,7 @@ bool {{ model.class_name_pascal }}::setData(const QModelIndex &index, const QVar return false; } +{% endif %} void {{ model.class_name_pascal }}::populate() { diff --git a/tools/qleany/generator/templates/presenter/list_model.h.jinja2 b/tools/qleany/generator/templates/presenter/list_model.h.jinja2 index ff9f8239..536789f2 100755 --- a/tools/qleany/generator/templates/presenter/list_model.h.jinja2 +++ b/tools/qleany/generator/templates/presenter/list_model.h.jinja2 @@ -39,7 +39,9 @@ class {{ export }} {{ model.class_name_pascal }} : public QAbstractListModel void reset{{ model.related_name_pascal }}Id(); Qt::ItemFlags flags(const QModelIndex &index) const override; + {% if not model.read_only %} bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; + {% endif %} QHash roleNames() const override; signals: diff --git a/tools/qleany/generator/templates/presenter/ordered_list_model.cpp.jinja2 b/tools/qleany/generator/templates/presenter/ordered_list_model.cpp.jinja2 index e1fd92c3..bce49d76 100755 --- a/tools/qleany/generator/templates/presenter/ordered_list_model.cpp.jinja2 +++ b/tools/qleany/generator/templates/presenter/ordered_list_model.cpp.jinja2 @@ -209,9 +209,10 @@ Qt::ItemFlags {{ model.class_name_pascal }}::flags(const QModelIndex &index) con if (!index.isValid()) return Qt::NoItemFlags; - return Qt::ItemIsEditable | QAbstractItemModel::flags(index); + return {% if not model.read_only %}Qt::ItemIsEditable | {% endif %} QAbstractItemModel::flags(index); } +{% if not model.read_only %} bool {{ model.class_name_pascal }}::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid()) @@ -257,6 +258,7 @@ bool {{ model.class_name_pascal }}::setData(const QModelIndex &index, const QVar return false; } +{% endif %} void {{ model.class_name_pascal }}::populate() { diff --git a/tools/qleany/generator/templates/presenter/ordered_list_model.h.jinja2 b/tools/qleany/generator/templates/presenter/ordered_list_model.h.jinja2 index 036d4ac6..395a0867 100755 --- a/tools/qleany/generator/templates/presenter/ordered_list_model.h.jinja2 +++ b/tools/qleany/generator/templates/presenter/ordered_list_model.h.jinja2 @@ -39,7 +39,9 @@ class {{ export }} {{ model.class_name_pascal }} : public QAbstractListModel void reset{{ model.related_name_pascal }}Id(); Qt::ItemFlags flags(const QModelIndex &index) const override; + {% if not model.read_only %} bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; + {% endif %} QHash roleNames() const override; signals: diff --git a/tools/qleany/generator/templates/presenter/single.cpp.jinja2 b/tools/qleany/generator/templates/presenter/single.cpp.jinja2 index 7e73cd5c..b007dae4 100755 --- a/tools/qleany/generator/templates/presenter/single.cpp.jinja2 +++ b/tools/qleany/generator/templates/presenter/single.cpp.jinja2 @@ -56,7 +56,7 @@ void {{ single.class_name_pascal }}::setId(int newId) else { {{ single.entity_name_pascal }}::{{ single.entity_name_pascal }}Controller::instance()->get(m_id).then( - [this](const Simple::Contracts::DTO::{{ single.entity_name_pascal }}::{{ single.entity_name_pascal }}DTO &{{ single.entity_name_camel }}) { + [this](const {{ application_cpp_domain_name }}::Contracts::DTO::{{ single.entity_name_pascal }}::{{ single.entity_name_pascal }}DTO &{{ single.entity_name_camel }}) { if({{ single.entity_name_camel }}.isInvalid()){ qCritical() << Q_FUNC_INFO << "Invalid {{ single.entity_name_camel }}Id"; return; @@ -83,6 +83,7 @@ void {{ single.class_name_pascal }}::resetId() return m_{{ field.name_camel }}; } +{% if not single.read_only -%} void {{ single.class_name_pascal }}::set{{ field.name_pascal }}({% if field.type in ['int', 'double', 'float', 'bool'] %}{{ field.type }} new{{ field.name_pascal }}{% else %} const {{ field.type }} &new{{ field.name_pascal }}{% endif %}) { if (m_{{ field.name_camel }} == new{{ field.name_pascal }}) @@ -92,7 +93,7 @@ void {{ single.class_name_pascal }}::set{{ field.name_pascal }}({% if field.type dto.setId(id()); dto.set{{ field.name_pascal }}(new{{ field.name_pascal }}); {{ single.entity_name_pascal }}::{{ single.entity_name_pascal }}Controller::instance()->update(dto).then( - [this](const Simple::Contracts::DTO::{{ single.entity_name_pascal }}::{{ single.entity_name_pascal }}DTO &{{ single.entity_name_camel }}) { + [this](const {{ application_cpp_domain_name }}::Contracts::DTO::{{ single.entity_name_pascal }}::{{ single.entity_name_pascal }}DTO &{{ single.entity_name_camel }}) { if({{ single.entity_name_camel }}.isInvalid()){ qCritical() << Q_FUNC_INFO << "Invalid {{ single.entity_name_camel }}Id"; return; @@ -102,4 +103,5 @@ void {{ single.class_name_pascal }}::set{{ field.name_pascal }}({% if field.type }); } {% endif %} +{% endif %} {%- endfor %} diff --git a/tools/qleany/generator/templates/presenter/single.h.jinja2 b/tools/qleany/generator/templates/presenter/single.h.jinja2 index bd82b782..833f0dba 100755 --- a/tools/qleany/generator/templates/presenter/single.h.jinja2 +++ b/tools/qleany/generator/templates/presenter/single.h.jinja2 @@ -45,7 +45,7 @@ class {{ export }} {{ single.class_name_pascal }} : public QObject Q_PROPERTY(int itemId READ id WRITE setId RESET resetId NOTIFY idChanged FINAL) {% for field in single.fields %} {%- if field.name_camel != "id" %} - Q_PROPERTY({{ field.type }} {{ field.name_camel }} READ {{ field.name_camel }} WRITE set{{ field.name_pascal }} NOTIFY {{ field.name_camel }}Changed FINAL) + Q_PROPERTY({{ field.type }} {{ field.name_camel }} READ {{ field.name_camel }} {% if not single.read_only %}WRITE set{{ field.name_pascal }}{% endif %} NOTIFY {{ field.name_camel }}Changed FINAL) {%- endif %} {%- endfor %} @@ -57,10 +57,12 @@ class {{ export }} {{ single.class_name_pascal }} : public QObject void resetId(); {% for field in single.fields %} - {% if field.name_camel != "id" %} + {% if field.name_camel != "id" -%} {{ field.type }} {{ field.name_camel }}() const; + {% if not single.read_only -%} void set{{ field.name_pascal }}({% if field.type in ['int', 'double', 'float', 'bool'] %}{{ field.type }} new{{ field.name_pascal }}{% else %} const {{ field.type }} &new{{ field.name_pascal }}{% endif %}); - {% endif %} + {% endif -%} + {% endif -%} {%- endfor %} signals: