mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 01:12:08 +01:00 
			
		
		
		
	[WEI] Add script to import bus scores
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
This commit is contained in:
		
							
								
								
									
										50
									
								
								apps/wei/management/commands/import_scores.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								apps/wei/management/commands/import_scores.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					# Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					import argparse
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.core.management import BaseCommand
 | 
				
			||||||
 | 
					from django.db import transaction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from ...forms import CurrentSurvey
 | 
				
			||||||
 | 
					from ...forms.surveys.wei2021 import WORDS   # WARNING: this is specific to 2021
 | 
				
			||||||
 | 
					from ...models import Bus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Command(BaseCommand):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    This script is used to load scores for buses from a CSV file.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    def add_arguments(self, parser):
 | 
				
			||||||
 | 
					        parser.add_argument('file', nargs='?', type=argparse.FileType('r'), default=sys.stdin, help='Input CSV file')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @transaction.atomic
 | 
				
			||||||
 | 
					    def handle(self, *args, **options):
 | 
				
			||||||
 | 
					        file = options['file']
 | 
				
			||||||
 | 
					        head = file.readline().replace('\n', '')
 | 
				
			||||||
 | 
					        bus_names = head.split(';')
 | 
				
			||||||
 | 
					        bus_names = [name for name in bus_names if name]
 | 
				
			||||||
 | 
					        buses = []
 | 
				
			||||||
 | 
					        for name in bus_names:
 | 
				
			||||||
 | 
					            qs = Bus.objects.filter(name__iexact=name)
 | 
				
			||||||
 | 
					            if not qs.exists():
 | 
				
			||||||
 | 
					                raise ValueError(f"Bus '{name}' does not exist")
 | 
				
			||||||
 | 
					            buses.append(qs.get())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        informations = {bus: CurrentSurvey.get_algorithm_class().get_bus_information(bus) for bus in buses}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for line in file:
 | 
				
			||||||
 | 
					            elem = line.split(';')
 | 
				
			||||||
 | 
					            word = elem[0]
 | 
				
			||||||
 | 
					            if word not in WORDS:
 | 
				
			||||||
 | 
					                raise ValueError(f"Word {word} is not used")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for i, bus in enumerate(buses):
 | 
				
			||||||
 | 
					                info = informations[bus]
 | 
				
			||||||
 | 
					                info.scores[word] = float(elem[i + 1].replace(',', '.'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for bus, info in informations.items():
 | 
				
			||||||
 | 
					            info.save()
 | 
				
			||||||
 | 
					            bus.save()
 | 
				
			||||||
 | 
					            if options['verbosity'] > 0:
 | 
				
			||||||
 | 
					                self.stdout.write(f"Bus {bus.name} saved!")
 | 
				
			||||||
		Reference in New Issue
	
	Block a user