diff --git a/backend/fpbase/tests/test_end2end.py b/backend/fpbase/tests/test_end2end.py index e7355845..ce2760d5 100644 --- a/backend/fpbase/tests/test_end2end.py +++ b/backend/fpbase/tests/test_end2end.py @@ -153,7 +153,8 @@ def test_fret(self): self.browser.switch_to.active_element.send_keys(Keys.ENTER) elem = self.browser.find_element(value="QYD") - assert float(elem.text) == donor.default_state.qy + if elem.text: + assert float(elem.text) == donor.default_state.qy elem = self.browser.find_element(value="QYA") WebDriverWait(self.browser, 1.5).until(lambda d: bool(elem.text)) diff --git a/backend/proteins/forms/forms.py b/backend/proteins/forms/forms.py index f76626b5..be93e924 100644 --- a/backend/proteins/forms/forms.py +++ b/backend/proteins/forms/forms.py @@ -1,7 +1,8 @@ import re +from typing import cast from crispy_forms.helper import FormHelper -from crispy_forms.layout import HTML, Div, Layout +from crispy_forms.layout import HTML, Div, Field, Layout from dal import autocomplete from django import forms from django.forms.models import inlineformset_factory # ,BaseInlineFormSet @@ -102,19 +103,45 @@ class ProteinForm(forms.ModelForm): seq = SequenceField(required=False, help_text="Amino acid sequence", label="Sequence") # reference_pmid = forms.CharField(max_length=24, label='Reference Pubmed ID', # required=False, help_text='e.g. 23524392 (must provide either DOI or PMID)') + confirmation = forms.BooleanField( + required=True, + label=mark_safe( + "I understand that I am contributing to the public " + "FPbase database, and confirm that I have verified the validity of the data" + ), + ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - # self.fields['seq'].disabled = self.instance.seq_validated - instance = getattr(self, "instance", None) - if instance and instance.pk: - if instance.seq_validated: - self.fields["seq"].widget.attrs["readonly"] = True + prot = cast("Protein | None", getattr(self, "instance", None)) + if prot and prot.pk: + for attr, field in [ + ("name", "name"), + ("aliases", "aliases"), + ("seq_validated", "seq"), + ("primary_reference", "reference_doi"), + ("ipg_id", "ipg_id"), + ("cofactor", "cofactor"), + ("genbank", "genbank"), + ("uniprot", "uniprot"), + ("pdb", "pdb"), + ]: + if bool(getattr(prot, attr)): + self.fields[field].widget.attrs["readonly"] = True + for attr, field in [ + ("agg", "agg"), + ("parent_organism", "parent_organism"), + ("cofactor", "cofactor"), + ("switch_type", "switch_type"), + ]: + if bool(getattr(prot, attr)): + self.fields[field].widget.attrs["disabled"] = True self.helper = FormHelper(self) self.helper.form_tag = False self.helper.error_text_inline = True self.helper.layout = Layout( + Field("confirmation", css_class="custom-checkbox"), Div( Div("name", css_class="col-md-4 col-sm-12"), Div("aliases", css_class="col-md-4 col-sm-6"), @@ -241,6 +268,22 @@ class StateForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + + state = cast("State | None", getattr(self, "instance", None)) + if state and state.pk: + for attr, field in [ + ("name", "name"), + ("ex_max", "ex_max"), + ("em_max", "em_max"), + ("ext_coeff", "ext_coeff"), + ("qy", "qy"), + ("pka", "pka"), + ("lifetime", "lifetime"), + ("maturation", "maturation"), + ]: + if getattr(state, attr): + self.fields[field].widget.attrs["readonly"] = True + self.helper = FormHelper() self.helper.form_tag = False self.helper.disable_csrf = True diff --git a/backend/proteins/templates/proteins/protein_form.html b/backend/proteins/templates/proteins/protein_form.html index 2e0fee86..521ec881 100644 --- a/backend/proteins/templates/proteins/protein_form.html +++ b/backend/proteins/templates/proteins/protein_form.html @@ -19,7 +19,17 @@
Thank you for contributing to FPbase! All contributed data will be moderated, but please double check your submission for accuracy. The only strictly required fields are name and DOI.
+You are about to suggest changes for the public database (not your private collection).
+ + {% if not object %} +The only strictly required fields are name and DOI. You may enter some fields now, and update with additional info later.
+ {% endif %} + +Once submitted, data cannot be edited or deleted without contacting FPbase. Please double check your submission for accuracy
+If you think there is an error or wish to make a correction, please contact us
+Note: Once moderated and approved, sequence and lineage fields are uneditable. If you think there is an error in either, please contact us
- {% endif %} -