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"