diff --git a/core/models/troggle.py b/core/models/troggle.py
index 62fe9c1..d34e145 100644
--- a/core/models/troggle.py
+++ b/core/models/troggle.py
@@ -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
diff --git a/core/views/cave_kataster.py b/core/views/cave_kataster.py
index c819ecc..96e2416 100644
--- a/core/views/cave_kataster.py
+++ b/core/views/cave_kataster.py
@@ -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}
\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
diff --git a/core/views/other.py b/core/views/other.py
index ceec79f..a11ef97 100644
--- a/core/views/other.py
+++ b/core/views/other.py
@@ -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.
diff --git a/parsers/logbooks.py b/parsers/logbooks.py
index b2d99aa..82f6fd2 100644
--- a/parsers/logbooks.py
+++ b/parsers/logbooks.py
@@ -61,7 +61,7 @@ ENTRIES = {
"2025": 27,
"2024": 127,
"2023": 131,
- "2022": 94,
+ "2022": 93,
"2019": 55,
"2018": 98,
"2017": 74,
diff --git a/parsers/people.py b/parsers/people.py
index 079ea3e..31e50bf 100644
--- a/parsers/people.py
+++ b/parsers/people.py
@@ -22,38 +22,40 @@ todo = """
- [copy these from paper notes]
"""
-def parse_blurb(personline, header, person):
+def parse_blurb(personline, header):
"""create mugshot Photo instance
Would be better if all this was done before the Person object was created in the db, then it would not
need re-saving (which is slow)"""
+ person = {}
ms_filename = personline[header["Mugshot"]]
ms_path = Path(settings.EXPOWEB, "folk", ms_filename)
if ms_filename:
if not ms_path.is_file():
- message = f"! INVALID mug_shot field '{ms_filename}' for {person.fullname}"
+ message = f"! INVALID mug_shot field '{ms_filename}' for {personline[header["Mugshot"]]}"
print(message)
- DataIssue.objects.create(parser="people", message=message, url=f"/person/{person.fullname}")
+ DataIssue.objects.create(parser="people", message=message, url=f"/person/{personline[header["fullname"]]}")
return
if ms_filename.startswith("i/"):
# if person just has an image, add it. It has format 'i/adama2018.jpg'
- person.mug_shot = str(Path("/folk", ms_filename))
- person.blurb = None
+ person["mug_shot"] = str(Path("/folk", ms_filename))
+ person["blurb"] = None
elif ms_filename.startswith("l/"):
# it has the format 'l/ollybetts.htm' the file may contain
images
+ person["blurbfile"] = str(Path("/folk", ms_filename))
with open(ms_path, "r") as blurbfile:
blrb = blurbfile.read()
pblurb = re.search(r"
+{{jobs_completed}} {% endblock %} \ No newline at end of file diff --git a/urls.py b/urls.py index 8f46e84..0459a66 100644 --- a/urls.py +++ b/urls.py @@ -55,7 +55,7 @@ from troggle.core.views.logbooks import ( person, personexpedition, ) -from troggle.core.views.other import controlpanel, exportlogbook, frontpage, todos, public_laptop +from troggle.core.views.other import controlpanel, exportlogbook, frontpage, todos, public_laptop, folk_export from troggle.core.views.prospect import prospecting from troggle.core.views.user_registration import register, newregister, reset_done, ExpoPasswordResetForm from troggle.core.views.scans import allscans, cavewallets, scansingle, walletslistperson, walletslistyear @@ -155,6 +155,7 @@ trogglepatterns = [ re_path(r'^indxal.htm$', caveindex, name="caveindex"), # ~420 hrefs to this url in expoweb files re_path(r'^people/?$', notablepersons, name="notablepersons"), path('people_ids', people_ids, name="people_ids"), + path('folk_export', folk_export, name="folk_export"), path('caveslist', caveslist, name="caveslist"), path('entrances', entranceindex, name="entranceindex"),