2
0
mirror of https://expo.survex.com/repositories/troggle/.git synced 2025-12-18 10:17:06 +00:00

refactoring people import from folk.csv

This commit is contained in:
2025-07-21 15:41:05 +02:00
parent 1cfcbccf76
commit 2039501672
8 changed files with 141 additions and 34 deletions

View File

@@ -67,7 +67,7 @@ class Expedition(TroggleModel):
logbookfile = models.CharField(max_length=100, blank=True, null=True)
def __str__(self):
return self.year
return str(self.year)
class Meta:
ordering = ("-year",)
@@ -85,11 +85,13 @@ class Person(TroggleModel):
definied in django.contrib.auth.models
"""
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
fullname = models.CharField(max_length=200) # display name, but should not be used for lookups
nickname = models.CharField(max_length=200, blank=True)
slug = models.SlugField(max_length=50, blank=True, null=True) # unique, enforced in code not in db
input_name = models.CharField(max_length=100, blank=True, null=True)
input_surname = models.CharField(max_length=100, blank=True, null=True)
first_name = models.CharField(max_length=100, blank=True, null=True)
last_name = models.CharField(max_length=100, blank=True, null=True)
fullname = models.CharField(max_length=200, blank=True, null=True) # display name, but should not be used for lookups
nickname = models.CharField(max_length=200, blank=True, null=True)
slug = models.SlugField(max_length=50) # unique, enforced in code not in db
# no delete cascade. We have users without Persons, and Persons without users
user = models.OneToOneField(User, models.SET_NULL, blank=True, null=True)
@@ -99,6 +101,7 @@ class Person(TroggleModel):
)
is_guest = models.BooleanField(default=False) # This is per-Person, not per-PersonExpedition
mug_shot = models.CharField(max_length=100, blank=True, null=True)
blurbfile = models.CharField(max_length=100, blank=True, null=True)
blurb = models.TextField(blank=True, null=True)
orderref = models.CharField(max_length=200, blank=True) # for alphabetic
@@ -164,6 +167,10 @@ class PersonExpedition(TroggleModel):
expedition = models.ForeignKey(Expedition, on_delete=models.CASCADE, db_index=True)
person = models.ForeignKey(Person, on_delete=models.CASCADE, db_index=True)
slugfield = models.SlugField(max_length=50, blank=True, null=True) # 2022 to be used in future
noncaver = models.BooleanField(
help_text="if flagged as -1 in the folk.csv input file",
default=True,
)
# is_guest = models.BooleanField(default=False) # This is per-Person, not per-PersonExpedition

View File

@@ -316,7 +316,7 @@ def kataster(request, slug=None):
if dir.is_dir():
error += f"STOP: a target directory exists. REMOVE or RENAME it first: {dir}<br>\n"
# 1623 : fixedpts/gps/gps23.svx:26:*fix p2023-mg-03 reference 13.81514 47.69169 1767
# 1623 : fixedpts/gps/gps23.svx:26:*fix p2023-mg-03 13.81514 47.69169 1767
# 1626: fixedpts/1626-no-schoenberg-hs-not-tied-to-caves.svx
return l_script, error

View File

@@ -1,4 +1,5 @@
import re
from datetime import datetime
from pathlib import Path
from django.conf import settings
@@ -10,7 +11,8 @@ from troggle.core.models.caves import Cave
from troggle.core.models.logbooks import LogbookEntry, writelogbook # , PersonLogEntry
# from databaseReset import reinit_db # don't do this. databaseRest runs code *at import time*
from troggle.core.models.troggle import Expedition
from troggle.core.models.troggle import Expedition, Person, PersonExpedition
from troggle.core.utils import current_expo, COOKIE_SHORT_TIMEOUT, PUBLIC_LAPTOP_COOKIE_NAME, PUBLIC_LAPTOP_COOKIE_TEXT
from troggle.parsers.imports import (
import_caves,
@@ -145,7 +147,68 @@ def controlpanel(request):
{"expeditions": Expedition.objects.all(), "year": current_expo()},
)
def folk_export(request):
"""Recreates the folk.csv file from the database contents
WORK IN PROGRESS JULY 2025
"""
def deslugify(slug):
deslug = slug.replace("-"," ",1).title()
return deslug
def real_surname(person):
return deslugify(person.slug).replace(person.first_name,"").strip()
expo = {}
yearlist = range(1976, int(current_expo())+1)
newfile = settings.EXPOWEB / 'folk' / 'new_folk.csv'
with open(newfile, 'w') as f:
f.write("Name,Lastname,Guest,VfHO member,Mugshot")
for y in yearlist:
try:
expo[y] = Expedition.objects.get(year=y)
except:
expo[y] = None
f.write(f",{y}")
f.write("\n")
for person in Person.objects.all().order_by("last_name"):
f.write(f"{person.input_name}")
if person.nickname:
f.write(f" ({person.nickname})")
f.write(f",{person.input_surname}")
if person.is_guest:
f.write(",1")
else:
f.write(",")
if person.is_vfho:
f.write(",1")
else:
f.write(",")
if person.mug_shot:
f.write(f",{person.mug_shot.replace("/folk/","")}")
elif person.blurbfile:
f.write(f",{person.blurbfile.replace("/folk/","")}")
else:
f.write(",")
for y in yearlist:
present = PersonExpedition.objects.filter(expedition=expo[y], person=person)
if present.count() == 1:
if present[0].noncaver:
f.write(f",-1")
else:
f.write(f",1")
else:
f.write(",")
f.write("\n")
return render(
request,
"controlPanel.html",
{"expeditions": Expedition.objects.all(),
"jobs_completed": f"GENERATED {str(newfile)} {datetime.now().strftime("%Y-%m-%d %H:%M")
}"}
)
def exportlogbook(request, year=None):
"""Constructs, from the database, a complete HTML formatted logbook
for the current year. Format available is now just HTML2005.