forked from enviPath/enviPy
95 lines
2.6 KiB
Python
95 lines
2.6 KiB
Python
from typing import List
|
|
|
|
from django.conf import settings as s
|
|
from django.db import models
|
|
from django.db.models import QuerySet
|
|
|
|
from epdb.models import (
|
|
EnviPathModel,
|
|
ParallelRule,
|
|
SequentialRule,
|
|
SimpleAmbitRule,
|
|
SimpleRDKitRule,
|
|
)
|
|
|
|
|
|
class Package(EnviPathModel):
|
|
reviewed = models.BooleanField(verbose_name="Reviewstatus", default=False)
|
|
license = models.ForeignKey(
|
|
"epdb.License", on_delete=models.SET_NULL, blank=True, null=True, verbose_name="License"
|
|
)
|
|
|
|
class Classification(models.IntegerChoices):
|
|
INTERNAL = 0, "Internal"
|
|
RESTRICTED = 10 , "Restricted"
|
|
SECRET = 20, "Secret"
|
|
|
|
classification_level = models.IntegerField(
|
|
choices=Classification,
|
|
default=Classification.RESTRICTED,
|
|
)
|
|
|
|
def delete(self, *args, **kwargs):
|
|
# explicitly handle related Rules
|
|
for r in self.rules.all():
|
|
r.delete()
|
|
super().delete(*args, **kwargs)
|
|
|
|
def __str__(self):
|
|
return f"{self.name} (pk={self.pk})"
|
|
|
|
@property
|
|
def compounds(self) -> QuerySet:
|
|
return self.compound_set.all()
|
|
|
|
@property
|
|
def rules(self) -> QuerySet:
|
|
return self.rule_set.all()
|
|
|
|
@property
|
|
def reactions(self) -> QuerySet:
|
|
return self.reaction_set.all()
|
|
|
|
@property
|
|
def pathways(self) -> QuerySet:
|
|
return self.pathway_set.all()
|
|
|
|
@property
|
|
def scenarios(self) -> QuerySet:
|
|
return self.scenario_set.all()
|
|
|
|
@property
|
|
def models(self) -> QuerySet:
|
|
return self.epmodel_set.all()
|
|
|
|
def _url(self):
|
|
return "{}/package/{}".format(s.SERVER_URL, self.uuid)
|
|
|
|
def get_applicable_rules(self) -> List["Rule"]:
|
|
"""
|
|
Returns a ordered set of rules where the following applies:
|
|
1. All Composite will be added to result
|
|
2. All SimpleRules will be added if theres no CompositeRule present using the SimpleRule
|
|
Ordering is based on "url" field.
|
|
"""
|
|
rules = []
|
|
rule_qs = self.rules
|
|
|
|
reflected_simple_rules = set()
|
|
|
|
for r in rule_qs:
|
|
if isinstance(r, ParallelRule) or isinstance(r, SequentialRule):
|
|
rules.append(r)
|
|
for sr in r.simple_rules.all():
|
|
reflected_simple_rules.add(sr)
|
|
|
|
for r in rule_qs:
|
|
if isinstance(r, SimpleAmbitRule) or isinstance(r, SimpleRDKitRule):
|
|
if r not in reflected_simple_rules:
|
|
rules.append(r)
|
|
|
|
rules = sorted(rules, key=lambda x: x.url)
|
|
return rules
|
|
|
|
class Meta:
|
|
db_table = "epdb_package" |