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