diff --git a/src/InSillyCloWeb/assemblies/forms.py b/src/InSillyCloWeb/assemblies/forms.py index 55ce365fbd577d9dcf90940d6c255a18b3706ed3..1197eb80b04e33af1dafc640d08d9753e21eb8c5 100644 --- a/src/InSillyCloWeb/assemblies/forms.py +++ b/src/InSillyCloWeb/assemblies/forms.py @@ -58,15 +58,18 @@ class SimulatorDataForm(forms.Form): class PCRModelForm(forms.ModelForm): class Meta: model = SimulatorJob - fields = ('pcr_pairs_str',) - widgets = {'pcr_pairs_str': forms.Textarea(attrs={'rows': 2})} - - primers_file = forms.FileField( - required=False, - label=_('Primers file'), - help_text=_('A CSV file where the header is \"primerId;sequence\".\nNote that the separator is \";\".'), - # widget=forms.ClearableFileInput(attrs={'multiple': False}), - ) + fields = ( + 'pcr_pairs_str', + 'primers_file', + ) + widgets = {'pcr_pairs_str': forms.Textarea(attrs={'rows': 2}), 'primers_file': forms.ClearableFileInput()} + + # primers_file = forms.FileField( + # required=False, + # label=_('Primers file'), + # help_text=_('A CSV file where the header is \"primerId;sequence\".\nNote that the separator is \";\".'), + # # widget=forms.ClearableFileInput(attrs={'multiple': False}), + # ) # def __init__(self, *args, **kwargs): # # files=kwargs.pop('files', dict()) diff --git a/src/InSillyCloWeb/assemblies/migrations/0009_simulatorjob_primers_file.py b/src/InSillyCloWeb/assemblies/migrations/0009_simulatorjob_primers_file.py new file mode 100644 index 0000000000000000000000000000000000000000..9b13a953ca303289eb9da5f8db8b528f6ab156d5 --- /dev/null +++ b/src/InSillyCloWeb/assemblies/migrations/0009_simulatorjob_primers_file.py @@ -0,0 +1,25 @@ +# Generated by Django 5.1.8 on 2025-04-18 14:06 + +import assemblies.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assemblies', '0008_simulatorjob_pcr_pairs_str_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='simulatorjob', + name='primers_file', + field=models.FileField( + blank=True, + help_text='A CSV file where the header is "primerId;sequence".\nNote that the separator is ";".', + null=True, + upload_to='assemblies.models.job_dependant_primers_file_upload_to', + verbose_name='Primers file', + ), + ), + ] diff --git a/src/InSillyCloWeb/assemblies/models.py b/src/InSillyCloWeb/assemblies/models.py index d22d772e95c307d74073bb63e73255a738bb134f..066d64b99712ad650e4d7bf7f9f0554f5914fce6 100644 --- a/src/InSillyCloWeb/assemblies/models.py +++ b/src/InSillyCloWeb/assemblies/models.py @@ -257,6 +257,18 @@ class JobStatus(models.IntegerChoices): __empty__ = "(Unknown)" +class FixedFilenameJobDependantUploadTo: + def __init__(self, filename): + self.forced_filename = filename + + def __call__(self, job, filename, *args, **kwargs): + return job.job_dir / self.forced_filename + + +def job_dependant_primers_file_upload_to(job, filename): + return (job.job_dir / insillyclo.main.DEFAULT_PCR_FILENAME).relative_to(settings.MEDIA_ROOT) + + class SimulatorJob(models.Model): ######################################################################### # Job attributs and parameters @@ -286,6 +298,19 @@ class SimulatorJob(models.Model): help_text="In a CSV-like format where you have one pair per line, " "the forward primer first, then the reverse primer.", ) + primers_file = models.FileField( + verbose_name=_('Primers file'), + help_text=_('A CSV file where the header is \"primerId;sequence\".\nNote that the separator is \";\".'), + blank=True, + null=True, + # upload_to=FixedFilenameJobDependantUploadTo(insillyclo.main.DEFAULT_PCR_FILENAME), + # upload_to=lambda o,f:o.run_dir/insillyclo.main.DEFAULT_PCR_FILENAME, + upload_to=job_dependant_primers_file_upload_to, + # validators=[ + # FileExtensionValidator(['pdf']), + # FileMimeTypeValidator(['application/pdf']), + # ], + ) restriction_enzyme_gel = models.TextField( default='', blank=True,