diff --git a/src/InSillyCloWeb/assemblies/models.py b/src/InSillyCloWeb/assemblies/models.py index 69d436e714a37e895f49a83fd5322868af34df40..799c5b4128f4510cbceb4a7db15d6c76c13947fa 100644 --- a/src/InSillyCloWeb/assemblies/models.py +++ b/src/InSillyCloWeb/assemblies/models.py @@ -342,6 +342,14 @@ class SimulatorJob(models.Model): return settings.MEDIA_URL / file.relative_to(settings.MEDIA_ROOT) return '' + # Restriction enzyme + @cached_property + def enzyme_image_url(self) -> str: + file = self.results_dir / 'digestion.png' + if file.exists(): + return settings.MEDIA_URL / file.relative_to(settings.MEDIA_ROOT) + return '' + # Others def save(self, *args, **kwargs): self.job_dir.mkdir(parents=True, exist_ok=True) @@ -399,6 +407,7 @@ class SimulatorJob(models.Model): data_source=insillyclo.data_source.DataSourceHardCodedImplementation(), primers_file=primers_file, primer_id_pairs=list(self.pcr_pairs) if primers_file else None, + enzyme_names=[self.restriction_enzyme_gel], ) @property diff --git a/src/InSillyCloWeb/assemblies/templates/assemblies/simulatorjob_detail.html b/src/InSillyCloWeb/assemblies/templates/assemblies/simulatorjob_detail.html index 48844e710894269b7e16ec3972b153fb10ba9261..1fa7b63ad1ade60925aeca67876b271566382bc9 100644 --- a/src/InSillyCloWeb/assemblies/templates/assemblies/simulatorjob_detail.html +++ b/src/InSillyCloWeb/assemblies/templates/assemblies/simulatorjob_detail.html @@ -40,7 +40,7 @@ <div class="card card-result context-simulator"> <div class="card-header"> Simulate Verification - <a class="btn btn-auto {%if not object.pcr_image_url%}collapsed{%endif%}" + <a class="btn btn-auto {%if not object.pcr_image_url and not object.enzyme_image_url%}collapsed{%endif%}" data-bs-toggle="collapse" href="#verification" role="button" @@ -53,7 +53,8 @@ <div class="card-body"> Simulate the agarose gel obtained after a PCR or a restriction digestion reaction. </div> - <div class="collapse {%if object.pcr_image_url%}show{%endif%} border-top border-simulator" id="verification"> + <div class="collapse {%if object.pcr_image_url or object.enzyme_image_url%}show{%endif%} border-top border-simulator" + id="verification"> {%if object.pcr_image_url%} <div class="card-header"> PCR gel simulation @@ -102,6 +103,55 @@ </div> </div> {%endif%} + {%if object.enzyme_image_url%} + <div class="card-header"> + Restriction enzyme gel simulation + <a href="#" data-bs-toggle="modal" data-bs-target="#enzymeModal"> + <i class="bi bi-pencil text-simulator"></i> + </a> + <!-- Modal --> + <div class="modal fade" id="enzymeModal" tabindex="-1" aria-labelledby="enzymeModalLabel" + aria-hidden="true"> + <div class="modal-dialog border-simulator"> + <div class="modal-content"> + <div class="modal-header"> + <h1 class="modal-title fs-5" id="enzymeModalLabel">Modal title</h1> + <button type="button" class="btn-close" data-bs-dismiss="modal" + aria-label="Close"></button> + </div> + <form method="post" enctype="multipart/form-data" + action="{%url 'assemblies:simulator-enzyme-edit' object.pk %}"> + <div class="modal-body"> + {% csrf_token %} + {{form_enzyme|crispy}} + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close + </button> + <button type="submit" class="btn btn-auto">Run simulation</button> + </div> + </form> + </div> + </div> + </div> + </div> + <div class="card-body text-center"> + <img class="w-auto" src="{{object.enzyme_image_url}}"/> + </div> + {%else%} + <div class="card-body"> + <div class="card card-result"> + <form class="card-body" method="post" enctype="multipart/form-data" + action="{%url 'assemblies:simulator-enzyme-edit' object.pk %}"> + {% csrf_token %} + {{form_enzyme|crispy}} + <div class="text-center"> + <button type="submit" class="btn btn-auto">Run simulation</button> + </div> + </form> + </div> + </div> + {%endif%} </div> </div> </div> diff --git a/src/InSillyCloWeb/assemblies/views.py b/src/InSillyCloWeb/assemblies/views.py index 81f4c88ffa644c5aba572773e207057f69b2b5f6..0793b9fd597da049e2cb5f2c248e009ac768bfdb 100644 --- a/src/InSillyCloWeb/assemblies/views.py +++ b/src/InSillyCloWeb/assemblies/views.py @@ -120,6 +120,7 @@ class JobSimulatorResult(DetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['form_pcr'] = forms.PCRModelForm(instance=self.object) + context['form_enzyme'] = forms.RestrictionEnzymeModelForm(instance=self.object) return context