2
0
mirror of https://expo.survex.com/repositories/troggle/.git synced 2025-12-16 10:17:47 +00:00
Files
troggle/core/views/cave_kataster.py

147 lines
6.1 KiB
Python

import re
from pathlib import Path
import django.forms as forms
from django.http import HttpResponseRedirect
from django.shortcuts import redirect, render
import troggle.settings as settings
#from troggle.core.models.caves import Entrance, Cave
from troggle.core.utils import (
COOKIE_MAX_AGE,
WriteAndCommitError,
current_expo,
get_cookie,
git_string,
write_and_commit,
)
from troggle.core.views.caves import get_cave_from_slug
"""Forms to handle renaming files and editing contents when a cave
is 'katastered', ie.e moves from an informal number, such as
1623-2024-BL-10 to 1623-999
"""
def kataster(request, slug):
"""Create the page which analyses how to rename a cave and all the files from the unofficial_number
identifier, e.g. 1623-2023-mg-03 to the kataster number e.g. 1623-999
"""
def do_file_finding(knum):
global cavefilename, cave_data, entrance_data, loser_name, loser_data
mvscript = f"cd {settings.CAVEDESCRIPTIONS }\n"
cavefilename = str(cave) + ".html"
cave_data = Path( "cave_data", cavefilename )
if not (settings.CAVEDESCRIPTIONS / cavefilename).is_file: # settings.EXPOWEB / cave_data
cave_data = "does not exist"
mvscript += f"mv {cavefilename} {cave.areacode}-{str(knum)}.html\n"
ent_dir = settings.ENTRANCEDESCRIPTIONS # settings.EXPOWEB / "entrance_data"
mvscript += f"cd {settings.ENTRANCEDESCRIPTIONS }\n"
entrance_data = []
for ent in ent_dir.iterdir():
if str(ent.name).startswith(str(cave)):
print(ent.name)
entrance_data.append("entrance_data/"+ent.name)
mvscript += f"mv {ent.name} {ent.name.replace(str(cave),str(knum))}\n"
loser_name = f"caves-{str(cave.areacode)}/{str(cave.unofficial_number)}"
loser_dir = settings.SURVEX_DATA / loser_name
loser_data = []
if (loser_dir).is_dir():
print(loser_dir)
for svx in loser_dir.iterdir():
print(svx)
loser_data.append(Path(loser_dir , svx).name)
return mvscript
knum = 9999
if cave := get_cave_from_slug(slug.lower()):
pass
elif cave := get_cave_from_slug(slug.upper()):
pass
else:
return HttpResponseRedirect("/caves")
entrances = []
for e in cave.entrances(): # horrid CaveAndEntrance indirection we need to refactor out in due course
if e.entrance.best_station():
entrances.append(e.entrance)
_ = do_file_finding(knum)
try:
# this is a python generator idiom.
# see https://realpython.com/introduction-to-python-generators/
# THIS IS VERY SILLY. We have this in the databse fom when this file was parsed. Don't read it again !
# However we will need to parse the href= and src= strings in the cave description text, notes etc.
with open(settings.CAVEDESCRIPTIONS / cavefilename, 'r') as f:
for line in f:
if match := re.search(r'<entranceslug>(.*?)</entranceslug>', line):
entrance = match.group(1)
print(entrance)
except PermissionError as e:
msg=f"CANNOT save this file.\nPERMISSIONS incorrectly set on server for this file {filepath}. Ask a nerd to fix this: {e}"
print(msg)
raise
except Exception as e:
msg=f"CANNOT write this file {filepath}. Ask a nerd to fix this: {e}"
print(msg)
script = ""
if request.method == "POST": # If the form has been submitted...
form = KatasterForm(request.POST) # A form bound to the POST data
if form.is_valid():
clean = form.cleaned_data
knum = clean['kataster_number']
print(f" # kataster_number {clean['kataster_number']}")
# DETECT if this is an LAREADY USED kataster number in this area ! If so, WARNING!!
# (we might be half-way through, so it might exist)
else: # GET and fall-through if POST is not valid
form = KatasterForm()
script += do_file_finding(knum)
return render(
request,
"cave_kataster.html",
{
"form": form,
"cave": cave, "entrances": entrances,
"cave_data": cave_data, "entrance_data": entrance_data,
"loser_name": loser_name, "loser_data": loser_data,
"knum": knum, "script": script,
}, )
class KatasterForm(forms.Form):
# areacode = forms.CharField(label='Full name', max_length=4, widget=forms.TextInput(attrs={'tabindex': 1, 'placeholder': '1623'}))
# official_name = forms.CharField(label='CUCC name', max_length=160,widget=forms.TextInput(attrs={'tabindex': 2, 'placeholder': '2012-ns-07'}))
kataster_number= forms.IntegerField(label="New kataster no.", widget=forms.TextInput(attrs={'tabindex': 1, 'size':1, 'placeholder': '9999'}))
"""
areacode = models.CharField(max_length=4, blank=True, null=True) # could use models.IntegerChoices
entrances = models.ManyToManyField("Entrance", through="CaveAndEntrance")
filename = models.CharField(max_length=200) # if a cave is 'pending' this is not set. Otherwise it is.
kataster_code = models.CharField(max_length=20, blank=True, null=True)
kataster_number = models.CharField(max_length=10, blank=True, null=True)
kataster_status = models.TextField(blank=True, null=True)
official_name = models.CharField(max_length=160)
survex_file = models.CharField(max_length=100, blank=True, null=True) # should be a foreign key?
unofficial_number = models.CharField(max_length=60, blank=True, null=True)
url = models.CharField(max_length=300, blank=True, null=True, unique = True)
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
"""