예제 #1
0
 def test_run_form_invalid_lowercase(self):
     form = RunNameForm({
         'run_name': '1234567_aaa'
     })
     self.assertFalse(form.is_valid())
     try:
         form.cleaned_data.get('run_name')
     except forms.ValidationError as e:
         self.assertEqual('BadRunName', e.code)
예제 #2
0
 def test_run_form_invalid_name_date_second(self):
     form = RunNameForm({
         'run_name': 'M02345_191215'
     })
     self.assertFalse(form.is_valid())
     try:
         form.cleaned_data.get('run_name')
     except forms.ValidationError as e:
         self.assertEqual('BadRunName', e.code)
예제 #3
0
def upload_metadata(request):
    form = RunNameForm()
    if request.method == 'POST':
        form = RunNameForm(request.POST)
        if form.is_valid():
            if not SequencingRun.objects.filter(
                    run_name=form.cleaned_data.get('run_name')).exists():
                sequencing_run, created = SequencingRun.objects.update_or_create(
                    run_name=form.cleaned_data.get('run_name'), seqids=list())
            else:
                sequencing_run = SequencingRun.objects.get(
                    run_name=form.cleaned_data.get('run_name'))
            files = [
                request.FILES.get('file[%d]' % i)
                for i in range(0, len(request.FILES))
            ]
            container_name = sequencing_run.run_name.lower().replace('_', '-')
            blob_client = BlockBlobService(
                account_name=settings.AZURE_ACCOUNT_NAME,
                account_key=settings.AZURE_ACCOUNT_KEY)
            blob_client.create_container(container_name)
            for item in files:
                blob_client.create_blob_from_bytes(
                    container_name=container_name,
                    blob_name=item.name,
                    blob=item.read())
                if item.name == 'SampleSheet.csv':
                    instance = DataFile(sequencing_run=sequencing_run,
                                        data_file=item)
                    instance.save()
                    with open(
                            'olc_webportalv2/media/{run_name}/SampleSheet.csv'.
                            format(run_name=str(sequencing_run))) as f:
                        lines = f.readlines()
                    seqid_start = False
                    seqid_list = list()
                    for i in range(len(lines)):
                        if seqid_start:
                            seqid = lines[i].split(',')[0]
                            seqid_list.append(seqid)
                        if 'Sample_ID' in lines[i]:
                            seqid_start = True
                    SequencingRun.objects.filter(pk=sequencing_run.pk).update(
                        seqids=seqid_list)
            return redirect('cowbat:upload_interop',
                            sequencing_run_pk=sequencing_run.pk)
    return render(request, 'cowbat/upload_metadata.html', {'form': form})
예제 #4
0
 def test_run_form_external_lab(self):
     form = RunNameForm({
         'run_name': '191218_CAL'
     })
     self.assertTrue(form.is_valid())
     self.assertEqual(form.cleaned_data.get('run_name'), '191218_CAL')
예제 #5
0
 def test_run_form_miseq_id(self):
     form = RunNameForm({
         'run_name': '191218_M02345'
     })
     self.assertTrue(form.is_valid())
     self.assertEqual(form.cleaned_data.get('run_name'), '191218_M02345')
def upload_metadata(request):
    form = RunNameForm()
    if request.method == 'POST':
        form = RunNameForm(request.POST)
        if form.is_valid():
            if not SequencingRun.objects.filter(
                    run_name=form.cleaned_data.get('run_name')).exists():
                sequencing_run, created = SequencingRun.objects\
                    .update_or_create(run_name=form.cleaned_data.get('run_name'),
                                      seqids=list())
            else:
                sequencing_run = SequencingRun.objects.get(
                    run_name=form.cleaned_data.get('run_name'))
            files = [
                request.FILES.get('file[%d]' % i)
                for i in range(0, len(request.FILES))
            ]
            container_name = sequencing_run.run_name.lower().replace('_', '-')
            blob_client = BlockBlobService(
                account_name=settings.AZURE_ACCOUNT_NAME,
                account_key=settings.AZURE_ACCOUNT_KEY)
            blob_client.create_container(container_name)
            for item in files:
                blob_client.create_blob_from_bytes(
                    container_name=container_name,
                    blob_name=item.name,
                    blob=item.read())
                if item.name == 'SampleSheet.csv':
                    instance = DataFile(sequencing_run=sequencing_run,
                                        data_file=item)
                    instance.save()
                    with open(
                            'olc_webportalv2/media/{run_name}/SampleSheet.csv'.
                            format(run_name=str(sequencing_run))) as f:
                        lines = f.readlines()
                    seqid_start = False
                    seqid_list = list()
                    realtime_dict = dict()
                    # Sample plate column in SampleSheet should have Lab/Whatever other ID.
                    # Store that data in a dictionary with SeqIDs as keys and LabIDs as values
                    sample_plate_dict = dict()
                    for i in range(len(lines)):
                        if seqid_start:
                            seqid = lines[i].split(',')[0]
                            labid = lines[i].split(',')[2]
                            sample_plate_dict[seqid] = labid
                            try:
                                realtime = lines[i].rstrip().split(',')[9]
                            except IndexError:
                                realtime = ''

                            seqid_list.append(seqid)
                            if realtime == 'TRUE' or realtime == 'VRAI':
                                realtime_dict[
                                    seqid] = 'True'  # Not sure JSONField this gets stored in can handle bool
                            else:
                                realtime_dict[seqid] = 'False'
                        if 'Sample_ID' in lines[i]:
                            seqid_start = True
                    SequencingRun.objects.filter(pk=sequencing_run.pk).update(
                        seqids=seqid_list,
                        realtime_strains=realtime_dict,
                        sample_plate=sample_plate_dict)
            # TODO: Change this back to verify_realtime once we've gotten the OK from external labs to make them
            #  validate their data.
            # return redirect('cowbat:verify_realtime', sequencing_run_pk=sequencing_run.pk)
            return redirect('cowbat:upload_interop',
                            sequencing_run_pk=sequencing_run.pk)
    return render(request, 'cowbat/upload_metadata.html', {'form': form})