From db3cee88d8e75b56dcba46dd02bf912166d76b9c Mon Sep 17 00:00:00 2001 From: Bryan Brancotte <bryan.brancotte@pasteur.fr> Date: Wed, 14 Aug 2019 18:27:25 +0200 Subject: [PATCH] filling ppc_copy_nb and ppp_copy_nb_per_p with values for xlsx file of #33 --- ippisite/ippidb/forms.py | 49 ++++++++++++++++++++++------- ippisite/ippidb/views/contribute.py | 39 +++++++++++++++++++++-- 2 files changed, 74 insertions(+), 14 deletions(-) diff --git a/ippisite/ippidb/forms.py b/ippisite/ippidb/forms.py index 346ea82a..303ec003 100644 --- a/ippisite/ippidb/forms.py +++ b/ippisite/ippidb/forms.py @@ -6,7 +6,7 @@ from collections import OrderedDict from django import forms from django.contrib import messages -from django.core.validators import RegexValidator, MinValueValidator +from django.core.validators import RegexValidator from django.db.models.functions import Upper from django.forms import ModelForm, modelformset_factory, formset_factory, inlineformset_factory from django.utils.translation import ugettext_lazy as _, ugettext @@ -252,29 +252,31 @@ class ComplexCompositionForm(forms.Form): widget=forms.Select(attrs={'class': 'form-control'}), empty_label="Unknown", ) - ppc_copy_nb = forms.IntegerField( + # ppc_copy_nb is Complex>NbcopyP in the xlsx file of #33 + ppc_copy_nb = IntegerFieldDataList( label="Number of copies of the protein in the complex", - initial=1, required=True, ) - cc_nb = forms.IntegerField( + # cc_nb is PPI>NbCopyComplex in the xlsx file of #33 + cc_nb = IntegerFieldDataList( label=_('cc_nb_verbose_name'), - initial=1, required=True, ) - ppp_copy_nb_per_p = forms.IntegerField( + # ppp_copy_nb_per_p is Complex>NbPperPocket in the xlsx file of #33 + ppp_copy_nb_per_p = IntegerFieldDataList( label=_('ppp_copy_nb_per_p'), required=False, widget=forms.NumberInput(attrs={ 'class': 'bound-complex-only', 'data-required': True, }), - validators=[ - MinValueValidator(1), - ], + # validators=[ + # MinValueValidator(1), + # ], ) - def __init__(self, protein_ids=None, has_bound=False, has_partner=False, *args, **kwargs): + def __init__(self, protein_ids=None, has_bound=False, has_partner=False, nb_copy_bound=None, nb_per_pocket=None, + nb_copy_partner=None, *args, **kwargs): super(ComplexCompositionForm, self).__init__(*args, **kwargs) if protein_ids is not None: self.fields['protein'].queryset = Protein.objects.filter(pk__in=protein_ids) @@ -284,6 +286,25 @@ class ComplexCompositionForm(forms.Form): choices.append(('Partner', 'Partner'), ) if has_bound: choices.append(('Bound', 'Bound'), ) + + nb_copy = None + if nb_copy_bound is not None: + nb_copy = nb_copy_bound + if nb_copy_partner is not None: + if nb_copy is None: + nb_copy = nb_copy_partner + else: + nb_copy = itertools.chain(nb_copy, nb_copy_partner) + nb_copy = set(nb_copy) + self.fields['ppc_copy_nb'].widget.attrs['datalist'] = set(nb_copy) + if len(nb_copy) == 1: + self.fields['ppc_copy_nb'].initial = next(iter(nb_copy)) + + nb_per_pocket = set(nb_per_pocket) + self.fields['ppp_copy_nb_per_p'].widget.attrs['datalist'] = nb_per_pocket + if len(nb_per_pocket) == 1: + self.fields['ppp_copy_nb_per_p'].initial = next(iter(nb_per_pocket)) + self.fields['complex_type'].widget.choices = choices def full_clean(self): @@ -310,10 +331,14 @@ class ComplexCompositionBaseFormSet(forms.BaseFormSet): if self.has_bound and self.has_partner and len(complex_type_dict) < 2: self._non_form_errors.append(_("You need at least one bound and one partner")) - def __init__(self, has_bound=False, has_partner=False, form_kwargs=None, *args, **kwargs): + def __init__(self, has_bound=False, has_partner=False, form_kwargs=None, nb_copy_bound=None, nb_per_pocket=None, + nb_copy_partner=None, *args, **kwargs): form_kwargs = form_kwargs or {} form_kwargs["has_bound"] = has_bound form_kwargs["has_partner"] = has_partner + form_kwargs["nb_copy_bound"] = nb_copy_bound + form_kwargs["nb_copy_partner"] = nb_copy_partner + form_kwargs["nb_per_pocket"] = nb_per_pocket self.has_partner = has_partner self.has_bound = has_bound super().__init__(form_kwargs=form_kwargs, *args, **kwargs) @@ -350,7 +375,7 @@ class PpiModelForm(ModelForm): 'family', 'family_name', 'symmetry', - 'pockets_nb', + 'pockets_nb', # pockets_nb is Ppi.pockets_nb in the xlsx file of #33 'diseases', # 'other_diseases', ) diff --git a/ippisite/ippidb/views/contribute.py b/ippisite/ippidb/views/contribute.py index c907c41b..9447c10a 100644 --- a/ippisite/ippidb/views/contribute.py +++ b/ippisite/ippidb/views/contribute.py @@ -83,61 +83,87 @@ TEMPLATES = {"IdForm": "IdForm.html", ARCHITECTURE = { 'Inhib_Hetero2merAB': dict( has_bound=True, + nb_copy_bound=[1], + nb_per_pocket=[1], has_partner=True, + nb_copy_partner=[1], symmetry=['AS'] ), 'Inhib_Homo2merA2': dict( has_bound=True, + nb_copy_bound=[1], + nb_per_pocket=[1], has_partner=False, symmetry=['C2','D2'] ), 'Inhib_Custom': dict( has_bound=True, + nb_copy_bound=[], + nb_per_pocket=[], has_partner=False, symmetry=[] ), 'Stab_Hetero2merAB': dict( has_bound=True, + nb_copy_bound=[1], + nb_per_pocket=[1], has_partner=False, symmetry=['AS'] ), 'Stab_Homo2merA2': dict( has_bound=True, + nb_copy_bound=[2], + nb_per_pocket=[2], has_partner=False, symmetry=['C2','D2'] ), 'Stab_HomoLike2mer': dict( has_bound=True, + nb_copy_bound=[1,2], + nb_per_pocket=[1], has_partner=False, symmetry=['C2','D2'] ), 'Stab_Homo3merA3': dict( has_bound=True, + nb_copy_bound=[3], + nb_per_pocket=[3], has_partner=False, symmetry=['C3','D3'] ), 'Stab_Homo3merA2': dict( has_bound=True, + nb_copy_bound=[2], + nb_per_pocket=[2], has_partner=True, + nb_copy_partner=[1], symmetry=['C3','D3'] ), 'Stab_Homo4merA4': dict( has_bound=True, + nb_copy_bound=[4], + nb_per_pocket=[2], has_partner=False, symmetry=['C2','D2','C4','D4'] ), 'Stab_RingHomo3mer': dict( has_bound=True, + nb_copy_bound=[3], + nb_per_pocket=[2], has_partner=False, symmetry=['C3','D3'] ), 'Stab_RingHomo5mer': dict( has_bound=True, + nb_copy_bound=[5], + nb_per_pocket=[2], has_partner=False, symmetry=['C5','D5'] ), 'Stab_Custom': dict( has_bound=True, + nb_copy_bound=[], + nb_per_pocket=[], has_partner=False, symmetry=[] ), @@ -219,8 +245,17 @@ class IppiWizard(LoginRequiredMixin, NamedUrlSessionWizardView): .get('ProteinDomainComplexTypeForm-complexType', "") ] kwargs['form_kwargs'] = {'protein_ids': protein_ids} - kwargs['has_bound'] = arch['has_bound'] - kwargs['has_partner'] = arch['has_partner'] + for k in [ + 'has_bound', + 'has_partner', + 'nb_copy_bound', + 'nb_per_pocket', + 'nb_copy_partner', + ]: + try: + kwargs[k] = arch[k] + except KeyError: + pass elif step == 'PpiForm': arch = ARCHITECTURE[ self.storage.get_step_data('ProteinDomainComplexTypeForm') -- GitLab