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

119 lines
3.2 KiB
Python
Raw Normal View History

2024-07-19 19:29:27 +03:00
''' Models: Operation in OSS. '''
2025-04-06 15:49:43 +03:00
# pylint: disable=duplicate-code
from typing import Optional
2024-07-19 19:29:27 +03:00
from django.db.models import (
CASCADE,
SET_NULL,
CharField,
ForeignKey,
Model,
2024-07-29 22:31:11 +03:00
QuerySet,
2024-07-19 19:29:27 +03:00
TextChoices,
TextField
)
from apps.library.models import LibraryItem
2024-07-29 22:31:11 +03:00
from .Argument import Argument
from .Reference import Reference
2024-07-29 22:31:11 +03:00
from .Substitution import Substitution
2024-07-19 19:29:27 +03:00
class OperationType(TextChoices):
''' Type of operation. '''
INPUT = 'input'
SYNTHESIS = 'synthesis'
REFERENCE = 'reference'
2024-07-19 19:29:27 +03:00
class Operation(Model):
''' Operational schema Unit.'''
oss = ForeignKey(
2024-07-19 19:29:27 +03:00
verbose_name='Схема синтеза',
to='library.LibraryItem',
2024-07-19 19:29:27 +03:00
on_delete=CASCADE,
related_name='operations'
2024-07-19 19:29:27 +03:00
)
operation_type = CharField(
2024-07-19 19:29:27 +03:00
verbose_name='Тип',
max_length=10,
choices=OperationType.choices,
default=OperationType.INPUT
)
result = ForeignKey(
2024-07-19 19:29:27 +03:00
verbose_name='Связанная КС',
to='library.LibraryItem',
blank=True,
2024-07-19 19:29:27 +03:00
null=True,
on_delete=SET_NULL,
related_name='producer'
)
2025-04-06 15:49:43 +03:00
parent = ForeignKey(
verbose_name='Содержащий блок',
to='oss.Block',
blank=True,
null=True,
on_delete=SET_NULL,
related_name='as_child_operation'
)
alias = CharField(
2024-07-19 19:29:27 +03:00
verbose_name='Шифр',
max_length=255,
blank=True
)
title = TextField(
2024-07-19 19:29:27 +03:00
verbose_name='Название',
blank=True
)
description = TextField(
verbose_name='Описание',
2024-07-19 19:29:27 +03:00
blank=True
)
class Meta:
''' Model metadata. '''
verbose_name = 'Операция'
verbose_name_plural = 'Операции'
def __str__(self) -> str:
return f'Операция {self.alias}'
2024-07-29 22:31:11 +03:00
def getQ_arguments(self) -> QuerySet[Argument]:
''' Operation Arguments for current operation. '''
2024-07-29 22:31:11 +03:00
return Argument.objects.filter(operation=self)
def getQ_as_argument(self) -> QuerySet[Argument]:
''' Operation Arguments where the operation is used as an argument. '''
return Argument.objects.filter(argument=self)
def getQ_substitutions(self) -> QuerySet[Substitution]:
2024-07-29 22:31:11 +03:00
''' Operation substitutions. '''
return Substitution.objects.filter(operation=self)
def getQ_references(self) -> QuerySet[Reference]:
''' Operation references. '''
return Reference.objects.filter(target=self)
def getQ_reference_target(self) -> list['Operation']:
''' Operation target for current reference. '''
return [x.target for x in Reference.objects.filter(reference=self)]
def setQ_result(self, result: Optional[LibraryItem]) -> None:
''' Set result schema. '''
if result == self.result:
return
self.result = result
self.save(update_fields=['result'])
for reference in self.getQ_references():
reference.reference.result = result
reference.reference.save(update_fields=['result'])
def delete(self, *args, **kwargs):
''' Delete operation. '''
for ref in self.getQ_references():
ref.reference.delete()
super().delete(*args, **kwargs)