[Feature] Package Export/Import (#116)

Fixes #90
Fixes #91
Fixes #115
Fixes #104

Co-authored-by: Tim Lorsbach <tim@lorsba.ch>
Reviewed-on: enviPath/enviPy#116
This commit is contained in:
2025-09-16 02:41:10 +12:00
parent ce349a287b
commit 762a6b7baf
32 changed files with 2500683 additions and 145 deletions

View File

@ -578,32 +578,38 @@ class Package(EnviPathModel):
license = models.ForeignKey('epdb.License', on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='License')
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):
return Compound.objects.filter(package=self)
return self.compound_set.all()
@property
def rules(self):
return Rule.objects.filter(package=self)
return self.rule_set.all()
@property
def reactions(self):
return Reaction.objects.filter(package=self)
return self.reaction_set.all()
@property
def pathways(self) -> 'Pathway':
return Pathway.objects.filter(package=self)
return self.pathway_set.all()
@property
def scenarios(self):
return Scenario.objects.filter(package=self)
return self.scenario_set.all()
@property
def models(self):
return EPModel.objects.filter(package=self)
return self.epmodel_set.all()
def _url(self):
return '{}/package/{}'.format(s.SERVER_URL, self.uuid)
@ -911,7 +917,6 @@ class CompoundStructure(EnviPathModel, AliasMixin, ScenarioMixin, ChemicalIdenti
class Rule(PolymorphicModel, EnviPathModel, AliasMixin, ScenarioMixin):
package = models.ForeignKey('epdb.Package', verbose_name='Package', on_delete=models.CASCADE, db_index=True)
# I think this only affects Django Admin which we are barely using
# # https://github.com/django-polymorphic/django-polymorphic/issues/229
# _non_polymorphic = models.Manager()
#
@ -1128,6 +1133,7 @@ class ParallelRule(Rule):
return res
class SequentialRule(Rule):
simple_rules = models.ManyToManyField('epdb.SimpleRule', verbose_name='Simple rules',
through='SequentialRuleOrdering')
@ -1959,7 +1965,7 @@ class RuleBasedRelativeReasoning(PackageBasedModel):
rbrr.package = package
if name is None or name.strip() == '':
name = f"MLRelativeReasoning {RuleBasedRelativeReasoning.objects.filter(package=package).count() + 1}"
name = f"RuleBasedRelativeReasoning {RuleBasedRelativeReasoning.objects.filter(package=package).count() + 1}"
rbrr.name = name