Coverage for rest_api/data_entry/sample_job.py: 26%

34 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-10 03:22 +0000

1from rest_api.data_entry.sequence_job import clean_unused_sequences 

2from rest_api.models import Alignment 

3from rest_api.models import Sample 

4from rest_api.models import Sample2Property 

5from rest_api.models import Sequence 

6from sonar_backend.settings import DEBUG 

7from sonar_backend.settings import LOGGER 

8 

9 

10def delete_sequences(sequence_list: list): 

11 """ 

12 Delete sequences by name and cascade-delete all related samples, 

13 alignments, properties, annotations, etc. 

14 """ 

15 data = {} 

16 sequences_qs = Sequence.objects.filter(name__in=sequence_list) 

17 

18 if not sequences_qs.exists(): 

19 LOGGER.warning(f"No sequences found for deletion: {sequence_list}") 

20 return {"deleted_sequences_count": 0} 

21 

22 deleted_info = ( 

23 sequences_qs.delete() 

24 ) # cascade deletion, returns (num_deleted, dict_of_models) 

25 LOGGER.info(f"Deleted sequence: {deleted_info}") 

26 

27 # Filter sequences without associated samples 

28 clean_unused_sequences() 

29 

30 data["deleted_sequences_count"] = deleted_info[1].get("rest_api.Sequence", 0) 

31 return data 

32 

33 

34def delete_samples(sample_list: list): 

35 """ 

36 delte samples and all related sequences, alignments, properties 

37 """ 

38 data = {} 

39 samples_qs = Sample.objects.filter(name__in=sample_list) 

40 

41 if not samples_qs.exists(): 

42 LOGGER.warning(f"No samples found for deletion: {sample_list}") 

43 return {"deleted_samples_count": 0} 

44 

45 sample_ids = list(samples_qs.values_list("id", flat=True)) 

46 sequence_ids = list(samples_qs.values_list("sequences__id", flat=True)) 

47 LOGGER.info(f"Deleting samples with IDs: {sample_ids}") 

48 if DEBUG: 

49 LOGGER.info("\nAssociated sequence IDs", sequence_ids) 

50 

51 deleted_info = samples_qs.delete() # returns (num_deleted, dict_of_models) 

52 LOGGER.info(f"Deleted samples: {deleted_info}") 

53 

54 # Filter sequences without associated samples 

55 clean_unused_sequences() 

56 

57 data["deleted_samples_count"] = deleted_info[1].get("rest_api.Sample", 0) 

58 return data