Export hlasování do CSV
This commit is contained in:
		
							parent
							
								
									fbd75d2f72
								
							
						
					
					
						commit
						7ca7093371
					
				
					 2 changed files with 52 additions and 1 deletions
				
			
		|  | @ -17,6 +17,11 @@ urlpatterns = [ | ||||||
| 		org_required(views.SeznamExportView), | 		org_required(views.SeznamExportView), | ||||||
| 		name='seznam-export' | 		name='seznam-export' | ||||||
| 	), | 	), | ||||||
|  | 	path( | ||||||
|  | 		'prednasky/seznam_prednasek/<int:seznam>/hlasovani.csv', | ||||||
|  | 		org_required(views.PrednaskyExportView), | ||||||
|  | 		name='seznam-export-csv' | ||||||
|  | 	), | ||||||
| 	path( | 	path( | ||||||
| 		'prednasky/seznam_prednasek/<int:seznam>/', | 		'prednasky/seznam_prednasek/<int:seznam>/', | ||||||
| 		org_required(views.SeznamListView.as_view()), | 		org_required(views.SeznamListView.as_view()), | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
|  | import csv | ||||||
| import http | import http | ||||||
| import logging | import logging | ||||||
| 
 | 
 | ||||||
|  | from django.http import HttpResponse | ||||||
| from django.shortcuts import render, get_object_or_404 | from django.shortcuts import render, get_object_or_404 | ||||||
| from django.views import generic | from django.views import generic | ||||||
| from django.shortcuts import HttpResponseRedirect | from django.shortcuts import HttpResponseRedirect | ||||||
|  | @ -31,7 +33,7 @@ def newPrednaska(request): | ||||||
| 		}, status=http.HTTPStatus.NOT_FOUND) | 		}, status=http.HTTPStatus.NOT_FOUND) | ||||||
| 
 | 
 | ||||||
| 	osoba = Osoba.objects.filter(user=request.user).first() | 	osoba = Osoba.objects.filter(user=request.user).first() | ||||||
| 	ucastnik = osoba.plne_jmeno() + ' ' + str(osoba.id) | 	ucastnik = osoba.plne_jmeno() + ' ' + str(osoba.id) # id, kvůli kolizi jmen | ||||||
| 
 | 
 | ||||||
| 	if request.method == 'POST': | 	if request.method == 'POST': | ||||||
| 		form_set_prednasky = HlasovaniPrednaskaFormSet(request.POST, prefix=PREDNASKY_PREFIX) | 		form_set_prednasky = HlasovaniPrednaskaFormSet(request.POST, prefix=PREDNASKY_PREFIX) | ||||||
|  | @ -170,3 +172,47 @@ def SeznamExportView(request, seznam): | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def PrednaskyExportView(request, seznam: int, **kwargs): | ||||||
|  | 	hlasovani = Hlasovani.objects.filter(seznam=seznam).select_related("prednaska") | ||||||
|  | 	hlasovani_o_znalostech = HlasovaniOZnalostech.objects.filter(seznam=seznam).select_related('ucastnik', 'znalost') | ||||||
|  | 
 | ||||||
|  | 	prednasky = list(Prednaska.objects.filter(seznamy=seznam)) | ||||||
|  | 	znalosti = list(Znalost.objects.filter(seznamy=seznam)) | ||||||
|  | 
 | ||||||
|  | 	prednasky_map: dict[int, int] = {p.id: i for i, p in enumerate(prednasky, 1)} | ||||||
|  | 	offset = len(prednasky_map) | ||||||
|  | 	znalosti_map: dict[int, int] = {z.id: i for i, z in enumerate(znalosti, offset + 1)} | ||||||
|  | 	width = offset + len(znalosti_map) | ||||||
|  | 
 | ||||||
|  | 	table: [str, list[str|Prednaska|Znalost,]] = {} | ||||||
|  | 
 | ||||||
|  | 	for h in hlasovani: | ||||||
|  | 		if h.ucastnik not in table: | ||||||
|  | 			table[h.ucastnik] = [h.ucastnik] + ([""] * width) | ||||||
|  | 
 | ||||||
|  | 		if h.prednaska.id in prednasky_map: | ||||||
|  | 			table[h.ucastnik][prednasky_map[h.prednaska.id]] = h.body | ||||||
|  | 		else: | ||||||
|  | 			pass # Padat hlasitě? | ||||||
|  | 
 | ||||||
|  | 	for h in hlasovani_o_znalostech: | ||||||
|  | 		ucastnik = str(h.ucastnik) + ' ' + str(h.ucastnik.id) # id, kvůli kolizi jmen | ||||||
|  | 		if ucastnik not in table: | ||||||
|  | 			table[ucastnik] = [ucastnik] + ([""] * width) | ||||||
|  | 
 | ||||||
|  | 		if h.znalost.id in znalosti_map: | ||||||
|  | 			table[ucastnik][znalosti_map[h.znalost.id]] = h.odpoved | ||||||
|  | 		else: | ||||||
|  | 			pass # Padat hlasitě? | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	response = HttpResponse(content_type="text/csv", charset="utf-8") | ||||||
|  | 	response["Content-Disposition"] = 'attachment; filename="hlasovani.csv"' | ||||||
|  | 
 | ||||||
|  | 	writer = csv.writer(response) | ||||||
|  | 	writer.writerow(["jména \\ přednáška|znalost"] + list(map(str, prednasky + znalosti))) | ||||||
|  | 	for row in table.values(): | ||||||
|  | 		writer.writerow(list(map(str, row))) | ||||||
|  | 	return response | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue