Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9009049
Implement creating conditions for activity diagram decision edges
MaartenV2002 Apr 28, 2025
8cfe9be
Utilize decision metadata in prototype generation
MaartenV2002 May 2, 2025
cd97c43
Allow for multiple nodes to be active in one active process
MaartenV2002 May 5, 2025
b65edb8
Allow for paralel activities in generated prototypes
MaartenV2002 May 7, 2025
9e04747
Start of positionable edges
MaartenV2002 May 13, 2025
f4b735f
Add positionable edges
MaartenV2002 May 13, 2025
8a47c80
Merge positional edges
MaartenV2002 May 13, 2025
ff764cd
Make dimensions of Join and Fork nodes editable
MaartenV2002 May 19, 2025
1459351
Improve position of condition text on edge
MaartenV2002 May 19, 2025
f0f1a9d
Fix page type not correctly being set
MaartenV2002 May 27, 2025
1621507
Split evaluating nodes into more methods
MaartenV2002 May 29, 2025
06df830
Add activity delete functionality + additional improvements
MaartenV2002 Jun 2, 2025
77aa3b1
Add ability to schedule start of activity using cron
MaartenV2002 Jun 2, 2025
54a1849
Make easier to add aggregators
MaartenV2002 Jun 9, 2025
209da2d
Remove unneeded txt file
Jun 12, 2025
610ba1f
Fix infinite recursion error when completing automatic tasks in proto…
MaartenV2002 Jun 17, 2025
53f28cb
Allow for multi select when creating swimlanes
MaartenV2002 Jun 26, 2025
9cf9968
Allow for removal of swimlanes, Fix moving nodes when connecting to s…
MaartenV2002 Jun 26, 2025
4a66178
Add better defaults when creating nodes, fix create node on enter
MaartenV2002 Jun 26, 2025
048eec8
Add ability to export and import entire systems
MaartenV2002 Jul 17, 2025
650f37d
Make system importing atomic
MaartenV2002 Jul 17, 2025
4fd0cf0
Add buttons to be able to import/export systems
MaartenV2002 Jul 17, 2025
57272a1
Loading a version is possible in any project/system
IrinaMonaEpure Jan 15, 2026
cba8897
Merge
IrinaMonaEpure Jan 22, 2026
371c0ac
Fixes
IrinaMonaEpure Jan 22, 2026
26eb4e4
Add latest generator
MaartenV2002 Jan 23, 2026
0d06412
Fix generator schema
MaartenV2002 Jan 23, 2026
a0eec65
Fix positionhandlers
MaartenV2002 Jan 23, 2026
9f95b2f
Fix swimlanes
MaartenV2002 Jan 23, 2026
122a61d
Merge pull request #56 from ai4mde/version/load-version
IrinaMonaEpure Jan 26, 2026
641a144
Merge branch 'develop' into s3350290-case-study-3
IrinaMonaEpure Jan 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions api/model/diagram/api/schemas/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
ReadDiagram,
UpdateDiagram,
FullDiagram,
ExportDiagram,
)

from diagram.api.schemas.node import (
Expand All @@ -21,6 +22,7 @@
ListEdges,
EdgeSchema,
UpdateEdge,
PatchEdge,
)

__all__ = [
Expand All @@ -37,7 +39,9 @@
"ClassifierUsageResponse",
"RelationUsageResponse",
"CreateEdge",
"PatchEdge",
"ListEdges",
"EdgeSchema",
"UpdateEdge",
"ExportDiagram",
]
94 changes: 91 additions & 3 deletions api/model/diagram/api/schemas/diagram.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

from ninja import ModelSchema, Schema

from diagram.models import Diagram
from .node import CreateNode, NodeSchema
from .edge import CreateEdge, EdgeSchema
from diagram.models import Diagram, Node
from .node import CreateNode, NodeSchema, ExportNode, ImportNode
from .edge import CreateEdge, EdgeSchema, ExportEdge, ImportEdge


class DiagramType(str, Enum):
Expand All @@ -20,6 +20,7 @@ class ReadDiagram(ModelSchema):
project: str
system_id: UUID
system_name: str
system: UUID # TODO Remove later

class Meta:
model = Diagram
Expand All @@ -37,6 +38,11 @@ def resolve_system_id(obj):
def resolve_system_name(obj):
return str(obj.system.name)

# TODO Remove later
@staticmethod
def resolve_system(obj):
return str(obj.system.id)


class CreateDiagram(Schema):
system: str
Expand All @@ -49,9 +55,58 @@ class UpdateDiagram(Schema):
description: Optional[str] = None


class RelatedClassAttribute(Schema):
name: str
type: str

class RelatedNode(ModelSchema):
name: str
type: str
actorNode: Optional[str]
classAttributes: Optional[List[RelatedClassAttribute]] = None

class Meta:
model = Node
fields = ["id"]

@staticmethod
def resolve_name(obj):
return obj.cls.data.get('name') or ""

@staticmethod
def resolve_type(obj):
return obj.cls.data["type"]

@staticmethod
def resolve_actorNode(obj):
return obj.cls.data.get('actorNode')

@staticmethod
def resolve_classAttributes(obj):
if obj.cls.data.get('type') == 'class':
return [
RelatedClassAttribute(name=attribute['name'], type=attribute['type'])
for attribute in obj.cls.data.get('attributes', [])
]
return None


class RelatedDiagram(ModelSchema):
nodes: List[RelatedNode]

class Meta:
model = Diagram
fields = ["id", "name", "type"]

@staticmethod
def resolve_nodes(obj):
return obj.nodes.all()


class FullDiagram(ReadDiagram):
nodes: List[NodeSchema]
edges: List[EdgeSchema]
related_diagrams: List[RelatedDiagram] = []

@staticmethod
def resolve_nodes(obj):
Expand All @@ -61,16 +116,49 @@ def resolve_nodes(obj):
def resolve_edges(obj):
return obj.edges.prefetch_related("rel").all()

@staticmethod
def resolve_related_diagrams(obj):
return Diagram.objects.filter(system=obj.system.id).exclude(id=obj.id)


class ImportDiagram(CreateDiagram):
nodes: List[CreateNode]
edges: List[CreateEdge]


class ExportDiagram(ModelSchema):
nodes: List[ExportNode] = []
edges: List[ExportEdge] = []

class Meta:
model = Diagram
fields = "__all__"

@staticmethod
def resolve_nodes(obj):
return obj.nodes.all()

@staticmethod
def resolve_edges(obj):
return obj.edges.all()


class ImportDiagram(Schema):
id: str
type: DiagramType
name: str
description: Optional[str] = None
system: str
nodes: list[ImportNode]
edges: list[ImportEdge]


__all__ = [
"ReadDiagram",
"ImportDiagram",
"CreateDiagram",
"UpdateDiagram",
"FullDiagram",
"ExportDiagram",
"ImportDiagram",
]
42 changes: 41 additions & 1 deletion api/model/diagram/api/schemas/edge.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from uuid import UUID

from ninja import ModelSchema, Schema
from diagram.models import Edge
from diagram.models import Edge, Relation as RelationModel
from metadata.specification import Relation


Expand Down Expand Up @@ -58,12 +58,52 @@ class UpdateEdge(Schema):
data: Optional[EdgeData] = None


class PatchEdge(Schema):
rel: Optional[dict] = None
data: Optional[EdgeData] = None


class ListEdges(Schema):
nodes: List[EdgeSchema] = []

class ExportRelation(ModelSchema):
class Meta:
model = RelationModel
fields = "__all__"


class ImportRelation(Schema):
id: str
data: dict
system: str
source: str
target: str


class ExportEdge(ModelSchema):
rel_data: ExportRelation

class Meta:
model = Edge
fields = "__all__"

@staticmethod
def resolve_rel_data(obj):
return obj.rel


class ImportEdge(Schema):
id: str
diagram: str
rel: str
data: dict
rel_data: ImportRelation


__all__ = [
"CreateEdge",
"EdgeSchema",
"ListEdges",
"ExportEdge",
"ImportEdge",
]
36 changes: 35 additions & 1 deletion api/model/diagram/api/schemas/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from uuid import UUID

from ninja import ModelSchema, Schema
from diagram.models import Node
from diagram.models import Node, Classifier as ClassifierModel
from metadata.specification import Classifier


Expand Down Expand Up @@ -75,6 +75,38 @@ class RelationUsageResponse(Schema):
usages: List[DiagramUsageItem]


class ExportClassifier(ModelSchema):
class Meta:
model = ClassifierModel
fields = "__all__"


class ImportClassifier(Schema):
id: str
system: str
data: dict


class ExportNode(ModelSchema):
cls_data: ExportClassifier

class Meta:
model = Node
fields = "__all__"

@staticmethod
def resolve_cls_data(obj):
return obj.cls


class ImportNode(Schema):
id: str
cls_data: ImportClassifier
diagram: str
cls: str
data: NodeData


__all__ = [
"CreateNode",
"PatchNode",
Expand All @@ -83,4 +115,6 @@ class RelationUsageResponse(Schema):
"DiagramUsageItem",
"ClassifierUsageResponse",
"RelationUsageResponse",
"ExportNode",
"ImportNode",
]
19 changes: 16 additions & 3 deletions api/model/diagram/api/views/edge.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
from django.shortcuts import get_object_or_404

from ninja import Router
from pydantic import BaseModel

import diagram.api.utils as utils

from diagram.api.schemas import CreateEdge, EdgeSchema, UpdateEdge, DiagramUsageItem, RelationUsageResponse
from diagram.models import Node, Edge
from diagram.api.schemas import CreateEdge, EdgeSchema, UpdateEdge, DiagramUsageItem, RelationUsageResponse, PatchEdge
from diagram.models import Node, Edge, Edge
from diagram.api.utils.edge import fetch_and_update_edges, remove_edge_from_diagram, delete_relation_everywhere
from metadata.specification import Relation


edge = Router()
Expand Down Expand Up @@ -89,6 +91,7 @@ def update_edge(request: HttpRequest, edge_id: UUID, data: UpdateEdge):
if data.rel is not None:
current = edge_obj.rel.data or {}
merged = {**current, **data.rel}
PatchModel.model_validate({"rel": merged})
new_type = merged.get("type", current.get("type"))

# default fallback if type is missing
Expand All @@ -101,6 +104,7 @@ def update_edge(request: HttpRequest, edge_id: UUID, data: UpdateEdge):
mult = merged.get("multiplicity") or {}

cleaned = {
**merged,
"type": new_type,
"label": merged.get("label", ""),
"labels": {
Expand All @@ -115,12 +119,14 @@ def update_edge(request: HttpRequest, edge_id: UUID, data: UpdateEdge):

elif new_type == "dependency":
cleaned = {
**merged,
"type": "dependency",
"label": merged.get("label", ""),
}

elif new_type == "generalization":
cleaned = {
**merged,
"type": "generalization",
}

Expand All @@ -132,7 +138,7 @@ def update_edge(request: HttpRequest, edge_id: UUID, data: UpdateEdge):

if data.data is not None:
current_data = edge_obj.data or {}
updated_data = {**current_data, **data.data}
updated_data = {**current_data, **data.data.model_dump()}
edge_obj.data = updated_data
edge_obj.save()

Expand All @@ -159,6 +165,13 @@ def hard_delete_relation(request: HttpRequest, edge_id: str):
return delete_relation_everywhere(diagram=diagram, edge_id=edge_id)





class PatchModel(BaseModel):
rel: Relation


@edge.get("/{uuid:edge_id}/", response=EdgeSchema)
def edge_node(request: HttpRequest, edge_id: str):
diagram = utils.get_diagram(request)
Expand Down
4 changes: 3 additions & 1 deletion api/model/metadata/api/schemas/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from .project import ReadProject, UpdateProject, CreateProject
from .system import ReadSystem, UpdateSystem, CreateSystem
from .system import ReadSystem, UpdateSystem, CreateSystem, ExportSystem, ImportSystem
from .interface import ReadInterface, UpdateInterface, CreateInterface
from .release import ReadRelease, UpdateRelease
from .meta import MetaSchema, MetaClassifiersSchema, MetaRelationsSchema
Expand All @@ -11,6 +11,8 @@
"ReadSystem",
"UpdateSystem",
"CreateSystem",
"ExportSystem",
"ImportSystem",
"MetaSchema",
"MetaClassifiersSchema",
"MetaRelationsSchema",
Expand Down
Loading