ConceptPortal-public/rsconcept/backend/apps/oss/models/OperationSchema.py

133 lines
4.3 KiB
Python
Raw Normal View History

2024-07-19 19:29:27 +03:00
''' Models: OSS API. '''
from typing import Optional
from django.core.exceptions import ValidationError
from django.db import transaction
2024-07-22 21:20:51 +03:00
from django.db.models import Manager, QuerySet
2024-07-19 19:29:27 +03:00
from apps.rsform.models import LibraryItem, LibraryItemType
from shared import messages as msg
from .Argument import Argument
from .Operation import Operation
from .SynthesisSubstitution import SynthesisSubstitution
2024-07-22 21:20:51 +03:00
class OperationSchema(LibraryItem):
2024-07-19 19:29:27 +03:00
''' Operations schema API. '''
2024-07-22 21:20:51 +03:00
class Meta:
''' Model metadata. '''
proxy = True
2024-07-19 19:29:27 +03:00
2024-07-22 21:20:51 +03:00
class InternalManager(Manager):
''' Object manager. '''
def get_queryset(self) -> QuerySet:
return super().get_queryset().filter(item_type=LibraryItemType.OPERATION_SCHEMA)
def create(self, **kwargs):
kwargs.update({'item_type': LibraryItemType.OPERATION_SCHEMA})
return super().create(**kwargs)
# Legit overriding object manager
objects = InternalManager() # type: ignore[misc]
2024-07-19 19:29:27 +03:00
def operations(self) -> QuerySet[Operation]:
''' Get QuerySet containing all operations of current OSS. '''
2024-07-22 21:20:51 +03:00
return Operation.objects.filter(oss=self)
2024-07-19 19:29:27 +03:00
def arguments(self) -> QuerySet[Argument]:
''' Operation arguments. '''
2024-07-22 21:20:51 +03:00
return Argument.objects.filter(operation__oss=self)
2024-07-19 19:29:27 +03:00
def substitutions(self) -> QuerySet[SynthesisSubstitution]:
''' Operation substitutions. '''
2024-07-22 21:20:51 +03:00
return SynthesisSubstitution.objects.filter(operation__oss=self)
2024-07-19 19:29:27 +03:00
def update_positions(self, data: list[dict]):
''' Update positions. '''
lookup = {x['id']: x for x in data}
operations = self.operations()
for item in operations:
if item.pk in lookup:
item.position_x = lookup[item.pk]['position_x']
item.position_y = lookup[item.pk]['position_y']
Operation.objects.bulk_update(operations, ['position_x', 'position_y'])
@transaction.atomic
def create_operation(self, **kwargs) -> Operation:
''' Insert new operation. '''
if kwargs['alias'] != '' and self.operations().filter(alias=kwargs['alias']).exists():
raise ValidationError(msg.aliasTaken(kwargs['alias']))
2024-07-22 21:20:51 +03:00
result = Operation.objects.create(oss=self, **kwargs)
self.save()
2024-07-19 19:29:27 +03:00
result.refresh_from_db()
return result
@transaction.atomic
def delete_operation(self, operation: Operation):
''' Delete operation. '''
operation.delete()
# deal with attached schema
# trigger on_change effects
2024-07-22 21:20:51 +03:00
self.save()
2024-07-19 19:29:27 +03:00
@transaction.atomic
def set_input(self, target: Operation, schema: Optional[LibraryItem]):
''' Set input schema for operation. '''
if schema == target.result:
return
if schema:
target.result = schema
target.alias = schema.alias
target.title = schema.title
target.comment = schema.comment
else:
target.result = None
target.save()
# trigger on_change effects
2024-07-22 21:20:51 +03:00
self.save()
2024-07-19 19:29:27 +03:00
@transaction.atomic
def add_argument(self, operation: Operation, argument: Operation) -> Optional[Argument]:
''' Add Argument to operation. '''
if Argument.objects.filter(operation=operation, argument=argument).exists():
return None
result = Argument.objects.create(operation=operation, argument=argument)
2024-07-22 21:20:51 +03:00
self.save()
2024-07-19 19:29:27 +03:00
return result
@transaction.atomic
def clear_arguments(self, target: Operation):
''' Clear all arguments for operation. '''
if not Argument.objects.filter(operation=target).exists():
return
Argument.objects.filter(operation=target).delete()
SynthesisSubstitution.objects.filter(operation=target).delete()
# trigger on_change effects
2024-07-22 21:20:51 +03:00
self.save()
2024-07-19 19:29:27 +03:00
@transaction.atomic
def set_substitutions(self, target: Operation, substitutes: list[dict]):
''' Clear all arguments for operation. '''
SynthesisSubstitution.objects.filter(operation=target).delete()
for sub in substitutes:
SynthesisSubstitution.objects.create(
operation=target,
original=sub['original'],
substitution=sub['substitution'],
transfer_term=sub['transfer_term']
)
# trigger on_change effects
2024-07-22 21:20:51 +03:00
self.save()