diff --git a/ippisite/ippidb/models.py b/ippisite/ippidb/models.py index 977b0be8d4572fac2e3b4cc83923ed5e1c276027..43128034c806c1ea6bd92232fde803e4ba34c4d8 100644 --- a/ippisite/ippidb/models.py +++ b/ippisite/ippidb/models.py @@ -457,86 +457,24 @@ class PpiComplex(models.Model): def __str__(self): return 'PPI {}, Complex {} ({})'.format(self.ppi, self.complex, self.cc_nb) - -class CompoundManager(models.Manager): +class ValidatedCompoundsManager(models.Manager): """ - CompoundManager adds automatically a number of annotations to the results - of the database query, used for filters and compound card + ValidatedCompoundManager filters only compounds from validated + contributions (or not coming from contributions) in the results + of the database query """ - # def get_queryset(self): - # return super().get_queryset().exclude(compoundaction__ppi__contribution__validated=False) - - def get_queryset_old(self): - # @formatter:off - qs = super().get_queryset() - # with number of publications - qs = qs.annotate(pubs=Count('refcompoundbiblio', distinct=True)) - # with best activity - qs = qs.annotate(best_activity=Max('compoundactivityresult__activity')) - # with LE - qs = qs.annotate(le=Cast(1.37 * Max('compoundactivityresult__activity') / F('nb_atom_non_h'), FloatField())) - # with LLE - qs = qs.annotate(lle=Cast(Max('compoundactivityresult__activity') - F('a_log_p'), FloatField())) - # Lipinsky MW (<=500) - qs = qs.annotate(lipinsky_mw=Case(When(molecular_weight__lte=500, then=True), default=False, output_field=BooleanField())) - # Lipinsky hba (<=10) - qs = qs.annotate(lipinsky_hba=Case(When(nb_acceptor_h__lte=10, then=True), default=False, output_field=BooleanField())) - # Lipinsky hbd (<5) - qs = qs.annotate(lipinsky_hbd=Case(When(nb_donor_h__lte=5, then=True), default=False, output_field=BooleanField())) - # Lipinsky a_log_p (<5) - qs = qs.annotate(lipinsky_a_log_p=Case(When(a_log_p__lte=5, then=True), default=False, output_field=BooleanField())) - # Lipinsky global - qs = qs.annotate(lipinsky_score=Cast(F('lipinsky_mw'), IntegerField()) + Cast(F('lipinsky_hba'), IntegerField()) + - Cast(F('lipinsky_hbd'), IntegerField()) + Cast(F('lipinsky_a_log_p'), IntegerField())) - qs = qs.annotate(lipinsky=Case(When(lipinsky_score__gte=3, then=True), default=False, output_field=BooleanField())) - # Veber hba_hbd (<=12) - qs = qs.annotate(hba_hbd=F('nb_acceptor_h')+F('nb_donor_h')) - qs = qs.annotate(veber_hba_hbd=Case(When(hba_hbd__lte=12, then=True), default=False, output_field=BooleanField())) - # Veber TPSA (<=140) - qs = qs.annotate(veber_tpsa=Case(When(tpsa__lte=140, then=True), default=False, output_field=BooleanField())) - # Veber Rotatable Bonds (<=10) - qs = qs.annotate(veber_rb=Case(When(nb_rotatable_bonds__lte=10, then=True), default=False, output_field=BooleanField())) - # Veber global (Rotatable bonds and (hba_hbd or tpsa)) - qs = qs.annotate(veber=Case(When(Q(Q(nb_rotatable_bonds__lte=10) & (Q(hba_hbd__lte=12) | Q(tpsa__lte=140))), then=True), default=False, output_field=BooleanField())) - # Pfizer AlogP (<=3) - qs = qs.annotate(pfizer_a_log_p=Case(When(a_log_p__lte=3, then=True), default=False, output_field=BooleanField())) - # Pfizer TPSA (>=75) - qs = qs.annotate(pfizer_tpsa=Case(When(tpsa__gte=75, then=True), default=False, output_field=BooleanField())) - # Pfizer global (AlogP and TPSA) - qs = qs.annotate(pfizer=Case(When(Q(Q(a_log_p__lte=3) & Q(tpsa__gte=75)), then=True), default=False, output_field=BooleanField())) - # PDB ligand available - qs = qs.annotate(pdb_ligand_av=Cast(Max(Case(When(ligand_id__isnull=False, then=1), default=0, output_field=IntegerField())), BooleanField())) - # inhibition role - qs = qs.annotate(inhibition_role=Case(When(compoundactivityresult__modulation_type='I', then=True), default=False, output_field=BooleanField())) - # binding role - qs = qs.annotate(binding_role=Case(When(compoundactivityresult__modulation_type='B', then=True), default=False, output_field=BooleanField())) - # stabilisation role - qs = qs.annotate(stabilisation_role=Case(When(compoundactivityresult__modulation_type='S', then=True), default=False, output_field=BooleanField())) - # cellular tests performed - qs = qs.annotate(celltest_av=Cast(Max(Case(When(compoundactivityresult__test_activity_description__test_type='CELL', then=1), default=0, output_field=IntegerField())), BooleanField())) - # inhibition tests performed - qs = qs.annotate(inhitest_av=Cast(Max(Case(When(compoundactivityresult__test_activity_description__test_modulation_type='I', then=1), default=0, output_field=IntegerField())), BooleanField())) - # stabilisation tests performed - qs = qs.annotate(stabtest_av=Cast(Max(Case(When(compoundactivityresult__test_activity_description__test_modulation_type='S', then=1), default=0, output_field=IntegerField())), BooleanField())) - # binding tests performed - qs = qs.annotate(bindtest_av=Cast(Max(Case(When(compoundactivityresult__test_activity_description__test_modulation_type='B', then=1), default=0, output_field=IntegerField())), BooleanField())) - # pharmacokinetic tests performed - qs = qs.annotate(pktest_av=Cast(Max(Case(When(refcompoundbiblio__bibliography__pharmacokinetic=True, then=1), default=0, output_field=IntegerField())), BooleanField())) - # cytotoxicity tests performedudy - qs = qs.annotate(cytoxtest_av=Cast(Max(Case(When(refcompoundbiblio__bibliography__cytotox=True, then=1), default=0, output_field=IntegerField())), BooleanField())) - # in silico st performed - qs = qs.annotate(insilico_av=Cast(Max(Case(When(refcompoundbiblio__bibliography__in_silico=True, then=1), default=0, output_field=IntegerField())), BooleanField())) - # number of tests available - qs = qs.annotate(tests_av=Count('compoundactivityresult', distinct=True)) - # @formatter:on - return qs + def get_queryset(self): + return super().get_queryset().exclude(compoundaction__ppi__contribution__validated=False) class Compound(AutoFillableModel): """ Chemical compound """ - objects = CompoundManager() + + objects = models.Manager() + validated = ValidatedCompoundsManager() + canonical_smile = models.TextField( verbose_name='Canonical Smiles', unique=True, @@ -888,6 +826,7 @@ class Compound(AutoFillableModel): models.Index(fields=['le']), models.Index(fields=['lle']), ] + #default_manager_name = 'ippidb.models.ValidatedCompoundsManager' # indexes = [ # models.Index(fields=['lipinsky']), # models.Index(fields=['veber']), diff --git a/ippisite/ippidb/tests_contribute.py b/ippisite/ippidb/tests_contribute.py index a0a280f60f3e364c53e44a5c3bcfe69a7c614f24..537852443ced19dc6f0af4806939ebb16e3398c9 100644 --- a/ippisite/ippidb/tests_contribute.py +++ b/ippisite/ippidb/tests_contribute.py @@ -53,6 +53,11 @@ class ContributionViewsTestCase(TestCase): models.Compound.objects.count() + len(entry_data["compounds"]), "Compounds count", ), + ( + models.Compound.validated.count, + models.Compound.validated.count(), + "Validated Compounds count", + ), ( models.CompoundAction.objects.count, models.CompoundAction.objects.count() + len(entry_data["compounds"]), @@ -77,6 +82,19 @@ class ContributionViewsTestCase(TestCase): self._process_contribution_wizard_without_sanity_check(entry_data) for fcn, results, msg in future_expected_equals: self.assertEqual(fcn(), results, msg=msg) + post_validation_expected_equals = [ + ( + models.Compound.validated.count, + models.Compound.objects.count(), + "Validated Compounds count", + ), + ] + contribution_to_be_validated = models.Contribution.objects.get(validated=False) + contribution_to_be_validated.validated = True + contribution_to_be_validated.save() + for fcn, results, msg in post_validation_expected_equals: + self.assertEqual(fcn(), results, msg=msg) + def _process_contribution_wizard_without_sanity_check(self, entry_data): """