forked from expo/troggle
fix bugs made visible by py 3.11
This commit is contained in:
parent
b06d1dae42
commit
1eab261b30
@ -50,7 +50,7 @@ Follow the instructions contained in the file to fill out your settings.
|
|||||||
Python3, Django, and Database setup
|
Python3, Django, and Database setup
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
We are now using Django 3.2 and will move to 4.2 in 2024
|
We are now using Django 3.2 and will move to 4.2 in 2024
|
||||||
We are installing with python3.9
|
We are installing with python3.10 or 3.11 (the server is running 3.9)
|
||||||
|
|
||||||
Install Django using pip, not with apt, on your test system in a venv.
|
Install Django using pip, not with apt, on your test system in a venv.
|
||||||
Conventionally on our main master expo server we install everything that we can as debian packages, not using pip.
|
Conventionally on our main master expo server we install everything that we can as debian packages, not using pip.
|
||||||
|
@ -152,9 +152,12 @@ class SubprocessTest(TestCase):
|
|||||||
TROGGLE_PATH = Path(settings.REPOS_ROOT_PATH) / "troggle"
|
TROGGLE_PATH = Path(settings.REPOS_ROOT_PATH) / "troggle"
|
||||||
for cwd in [settings.SURVEX_DATA, settings.EXPOWEB, settings.DRAWINGS_DATA, TROGGLE_PATH]:
|
for cwd in [settings.SURVEX_DATA, settings.EXPOWEB, settings.DRAWINGS_DATA, TROGGLE_PATH]:
|
||||||
sp = subprocess.run([settings.GIT, "status"], cwd=cwd, capture_output=True, text=True)
|
sp = subprocess.run([settings.GIT, "status"], cwd=cwd, capture_output=True, text=True)
|
||||||
print(f'git output: {cwd}:\n # {sp.stderr=}\n # {sp.stdout=} \n # return code: {str(sp.returncode)}')
|
out = str(sp.stdout)
|
||||||
|
if len(out) > 160:
|
||||||
|
out = out[:75] + "\n <Long output curtailed>\n" + out[-75:]
|
||||||
|
print(f'git output: {cwd}:\n # {sp.stderr=}\n # sp.stdout={out} \n # return code: {str(sp.returncode)}')
|
||||||
if sp.returncode != 0:
|
if sp.returncode != 0:
|
||||||
print(f'git output: {cwd}:\n # {sp.stderr=}\n # {sp.stdout=} \n # return code: {str(sp.returncode)}')
|
print(f'git output: {cwd}:\n # {sp.stderr=}\n # sp.stdout={out} \n # return code: {str(sp.returncode)}')
|
||||||
|
|
||||||
self.assertTrue( sp.returncode == 0, f'{cwd} - git is unhappy')
|
self.assertTrue( sp.returncode == 0, f'{cwd} - git is unhappy')
|
||||||
|
|
||||||
@ -180,9 +183,12 @@ class SubprocessTest(TestCase):
|
|||||||
cwd = settings.SURVEX_DATA
|
cwd = settings.SURVEX_DATA
|
||||||
for survey in ["1623.svx", "1626.svx"]:
|
for survey in ["1623.svx", "1626.svx"]:
|
||||||
sp = subprocess.run([settings.CAVERN, survey], cwd=cwd, capture_output=True, text=True)
|
sp = subprocess.run([settings.CAVERN, survey], cwd=cwd, capture_output=True, text=True)
|
||||||
print(f'survex output: {cwd}:\n # {sp.stderr=}\n # {sp.stdout=} \n # return code: {str(sp.returncode)}')
|
out = str(sp.stdout)
|
||||||
|
if len(out) > 160:
|
||||||
|
out = out[:75] + "\n <Long output curtailed>\n" + out[-75:]
|
||||||
|
# print(f'survex output: {cwd}:\n # {sp.stderr=}\n # sp.stdout={out} \n # return code: {str(sp.returncode)}')
|
||||||
if sp.returncode != 0:
|
if sp.returncode != 0:
|
||||||
print(f'survex output: {cwd}:\n # {sp.stderr=}\n # {sp.stdout=} \n # return code: {str(sp.returncode)}')
|
print(f'survex output: {cwd}:\n # {sp.stderr=}\n # sp.stdout={out} \n # return code: {str(sp.returncode)}')
|
||||||
|
|
||||||
self.assertTrue( sp.returncode == 0, f'{cwd} - survex is unhappy')
|
self.assertTrue( sp.returncode == 0, f'{cwd} - survex is unhappy')
|
||||||
|
|
||||||
|
@ -180,11 +180,17 @@ def writetrogglefile(filepath, filecontent):
|
|||||||
#os.chmod(filepath, 0o664) # set file permissions to rw-rw-r--
|
#os.chmod(filepath, 0o664) # set file permissions to rw-rw-r--
|
||||||
sp = subprocess.run([git, "add", filename], cwd=cwd, capture_output=True, check=True, text=True)
|
sp = subprocess.run([git, "add", filename], cwd=cwd, capture_output=True, check=True, text=True)
|
||||||
if sp.returncode != 0:
|
if sp.returncode != 0:
|
||||||
print(f'git ADD {cwd}:\n\n' + str(sp.stderr) + '\n\n' + str(sp.stdout) + '\n\nreturn code: ' + str(sp.returncode))
|
out = sp.stdout
|
||||||
|
if len(out) > 160:
|
||||||
|
out = out[:75] + "\n <Long output curtailed>\n" + out[-75:]
|
||||||
|
print(f'git ADD {cwd}:\n\n' + str(sp.stderr) + '\n\n' + out + '\n\nreturn code: ' + str(sp.returncode))
|
||||||
|
|
||||||
sp = subprocess.run([git, "commit", "-m", f'Troggle online: cave or entrance edit -{filename}'], cwd=cwd, capture_output=True, check=True, text=True)
|
sp = subprocess.run([git, "commit", "-m", f'Troggle online: cave or entrance edit -{filename}'], cwd=cwd, capture_output=True, check=True, text=True)
|
||||||
if sp.returncode != 0:
|
if sp.returncode != 0:
|
||||||
print(f'git COMMIT {cwd}:\n\n' + str(sp.stderr) + '\n\n' + str(sp.stdout) + '\n\nreturn code: ' + str(sp.returncode))
|
out = sp.stdout
|
||||||
|
if len(out) > 160:
|
||||||
|
out = out[:75] + "\n <Long output curtailed>\n" + out[-75:]
|
||||||
|
print(f'git COMMIT {cwd}:\n\n' + str(sp.stderr) + '\n\n' + out + '\n\nreturn code: ' + str(sp.returncode))
|
||||||
# not catching and re-raising any exceptions yet, inc. the stderr etc.,. We should do that.
|
# not catching and re-raising any exceptions yet, inc. the stderr etc.,. We should do that.
|
||||||
|
|
||||||
|
|
||||||
|
@ -273,7 +273,7 @@ def svx(request, survex_file):
|
|||||||
difflist.insert(0, message)
|
difflist.insert(0, message)
|
||||||
|
|
||||||
#print [ form.data['code'] ]
|
#print [ form.data['code'] ]
|
||||||
svxincludes = re.findall(r'\*include\s+(\S+)(?i)', form.data['code'] or "")
|
svxincludes = re.findall(r'(?i)\*include\s+(\S+)', form.data['code'] or "")
|
||||||
|
|
||||||
vmap = {'settings': settings,
|
vmap = {'settings': settings,
|
||||||
'warning': warning,
|
'warning': warning,
|
||||||
|
@ -471,7 +471,7 @@ def scanupload(request, path=None):
|
|||||||
try: # crashes in Django os.chmod call if on WSL, but does save file!
|
try: # crashes in Django os.chmod call if on WSL, but does save file!
|
||||||
saved_filename = fs.save(f.name, content=f)
|
saved_filename = fs.save(f.name, content=f)
|
||||||
except:
|
except:
|
||||||
print(f'\n !! Permissions failure ?! on attempting to save file {f.name}')
|
print(f'\n !! Permissions failure ?! on attempting to save scanfile {f.name}')
|
||||||
if 'saved_filename' in locals():
|
if 'saved_filename' in locals():
|
||||||
if saved_filename.is_file():
|
if saved_filename.is_file():
|
||||||
actual_saved.append(saved_filename)
|
actual_saved.append(saved_filename)
|
||||||
@ -757,7 +757,13 @@ def photoupload(request, folder=None):
|
|||||||
formd = TextForm(request.POST)
|
formd = TextForm(request.POST)
|
||||||
if formd.is_valid():
|
if formd.is_valid():
|
||||||
newphotographer = request.POST["photographer"]
|
newphotographer = request.POST["photographer"]
|
||||||
(yearpath / newphotographer).mkdir(exist_ok=True)
|
try:
|
||||||
|
(yearpath / newphotographer).mkdir(exist_ok=True)
|
||||||
|
except:
|
||||||
|
message =f'\n !! Permissions failure ?! 0 attempting to mkdir "{(yearpath / newphotographer)}"'
|
||||||
|
print(message)
|
||||||
|
return render(request,'errors/generic.html', {'message': message})
|
||||||
|
|
||||||
else:
|
else:
|
||||||
form = FilesRenameForm(request.POST,request.FILES)
|
form = FilesRenameForm(request.POST,request.FILES)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
@ -775,7 +781,7 @@ def photoupload(request, folder=None):
|
|||||||
try: # crashes in Django os.chmod call if on WSL, but does save file!
|
try: # crashes in Django os.chmod call if on WSL, but does save file!
|
||||||
saved_filename = fs.save(renameto, content=f)
|
saved_filename = fs.save(renameto, content=f)
|
||||||
except:
|
except:
|
||||||
print(f'\n !! Permissions failure ?! on attempting to save file {f.name}')
|
print(f'\n !! Permissions failure ?! 1 attempting to save "{f.name}" in "{dirpath}" {renameto=}')
|
||||||
if 'saved_filename' in locals():
|
if 'saved_filename' in locals():
|
||||||
if saved_filename.is_file():
|
if saved_filename.is_file():
|
||||||
actual_saved.append(saved_filename)
|
actual_saved.append(saved_filename)
|
||||||
@ -784,17 +790,17 @@ def photoupload(request, folder=None):
|
|||||||
try: # crashes in Django os.chmod call if on WSL, but does save file!
|
try: # crashes in Django os.chmod call if on WSL, but does save file!
|
||||||
saved_filename = fs.save(f.name, content=f)
|
saved_filename = fs.save(f.name, content=f)
|
||||||
except:
|
except:
|
||||||
print(f'\n !! Permissions failure ?! on attempting to save file {f.name}')
|
print(f'\n !! Permissions failure ?! 2 attempting to save "{f.name}" in "{dirpath}" {renameto=}')
|
||||||
if 'saved_filename' in locals():
|
if 'saved_filename' in locals():
|
||||||
if saved_filename.is_file():
|
if saved_filename.is_file():
|
||||||
actual_saved.append(saved_filename)
|
actual_saved.append(saved_filename)
|
||||||
filesaved = True
|
filesaved = True
|
||||||
else: # multiole is a list of content
|
else: # multiple is a list of content
|
||||||
for f in multiple:
|
for f in multiple:
|
||||||
try: # crashes in Django os.chmod call if on WSL, but does save file!
|
try: # crashes in Django os.chmod call if on WSL, but does save file!
|
||||||
saved_filename = fs.save(f.name, content=f)
|
saved_filename = fs.save(f.name, content=f)
|
||||||
except:
|
except:
|
||||||
print(f'\n !! Permissions failure ?! on attempting to save file {f.name}')
|
print(f'\n !! Permissions failure ?! 3 attempting to save "{f.name}" in "{dirpath}" {renameto=}')
|
||||||
if 'saved_filename' in locals():
|
if 'saved_filename' in locals():
|
||||||
if saved_filename.is_file():
|
if saved_filename.is_file():
|
||||||
actual_saved.append(saved_filename)
|
actual_saved.append(saved_filename)
|
||||||
@ -872,7 +878,8 @@ def dwgupload(request, folder=None, gitdisable='no'):
|
|||||||
# print(f'! - FORM dwgupload - POST valid: "{request.FILES["uploadfiles"]}" ')
|
# print(f'! - FORM dwgupload - POST valid: "{request.FILES["uploadfiles"]}" ')
|
||||||
f = request.FILES["uploadfiles"]
|
f = request.FILES["uploadfiles"]
|
||||||
multiple = request.FILES.getlist('uploadfiles')
|
multiple = request.FILES.getlist('uploadfiles')
|
||||||
fs = FileSystemStorage(os.path.join(settings.DRAWINGS_DATA, folder))
|
savepath = Path(settings.DRAWINGS_DATA, folder)
|
||||||
|
fs = FileSystemStorage(savepath)
|
||||||
|
|
||||||
actual_saved = []
|
actual_saved = []
|
||||||
refused = []
|
refused = []
|
||||||
@ -892,7 +899,7 @@ def dwgupload(request, folder=None, gitdisable='no'):
|
|||||||
try: # crashes in Django os.chmod call if on WSL without metadata drvfs, but does save file!
|
try: # crashes in Django os.chmod call if on WSL without metadata drvfs, but does save file!
|
||||||
saved_filename = fs.save(f.name, content=f)
|
saved_filename = fs.save(f.name, content=f)
|
||||||
except:
|
except:
|
||||||
print(f'! - FORM dwgupload - \n!! Permissions failure ?! on attempting to save file {f.name}. Attempting to continue..')
|
print(f'! - FORM dwgupload - \n!! Permissions failure ?! on attempting to save file "{f.name}" in "{savepath}". Attempting to continue..')
|
||||||
if 'saved_filename' in locals():
|
if 'saved_filename' in locals():
|
||||||
if Path(dirpath, saved_filename).is_file():
|
if Path(dirpath, saved_filename).is_file():
|
||||||
actual_saved.append(saved_filename)
|
actual_saved.append(saved_filename)
|
||||||
@ -912,7 +919,7 @@ def dwgupload(request, folder=None, gitdisable='no'):
|
|||||||
message = f'! - FORM dwgupload - NOT A FILE {Path(dirpath, saved_filename)=}. '
|
message = f'! - FORM dwgupload - NOT A FILE {Path(dirpath, saved_filename)=}. '
|
||||||
print(message)
|
print(message)
|
||||||
else:
|
else:
|
||||||
message = f'! - FORM dwgupload - Save failure for {saved_filename}. Changes NOT saved.'
|
message = f'! - FORM dwgupload - Save failure for {f.name}. Changes NOT saved.'
|
||||||
print(message)
|
print(message)
|
||||||
return render(request,'errors/generic.html', {'message': message})
|
return render(request,'errors/generic.html', {'message': message})
|
||||||
|
|
||||||
|
23
os-trog.sh
23
os-trog.sh
@ -15,7 +15,7 @@ sudo apt install sqlite3 -y
|
|||||||
sudo apt install python3-pip -y
|
sudo apt install python3-pip -y
|
||||||
|
|
||||||
# this installs a shed-load of other stuff: binutils etc.sudo apt install survex-aven
|
# this installs a shed-load of other stuff: binutils etc.sudo apt install survex-aven
|
||||||
sudo apt install git openssh-client tunnelx therion -y
|
sudo apt install git openssh-client -y
|
||||||
# On a clean debian 11 (bullseye) installation with Xfce & ssh,
|
# On a clean debian 11 (bullseye) installation with Xfce & ssh,
|
||||||
|
|
||||||
#on ubuntu 20.04:
|
#on ubuntu 20.04:
|
||||||
@ -26,7 +26,7 @@ sudo apt install git openssh-client tunnelx therion -y
|
|||||||
|
|
||||||
|
|
||||||
# On Ubuntu 20.04, with python10, the pip install fails.
|
# On Ubuntu 20.04, with python10, the pip install fails.
|
||||||
# So you ned to get the pip from source
|
# So you need to get the pip from source
|
||||||
# sudo curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10
|
# sudo curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10
|
||||||
# but really you should be using 22.04
|
# but really you should be using 22.04
|
||||||
# and also, isf using debian,
|
# and also, isf using debian,
|
||||||
@ -36,10 +36,10 @@ sudo apt install git openssh-client tunnelx therion -y
|
|||||||
sudo useradd expo
|
sudo useradd expo
|
||||||
sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
||||||
# default since 22.04
|
# default since 22.04
|
||||||
# sudo apt install python3.11
|
# sudo apt install python3.10
|
||||||
sudo apt install python3.11-venv -y
|
sudo apt install python3.10-venv -y
|
||||||
sudo apt install python3.11-dev -y
|
sudo apt install python3.10-dev -y
|
||||||
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1
|
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1
|
||||||
|
|
||||||
sudo apt install mariadb-server -y
|
sudo apt install mariadb-server -y
|
||||||
sudo apt install libmariadb-dev -y
|
sudo apt install libmariadb-dev -y
|
||||||
@ -54,3 +54,14 @@ sudo apt install tunnelx therion -y
|
|||||||
|
|
||||||
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
||||||
# sudo service mysql start
|
# sudo service mysql start
|
||||||
|
|
||||||
|
git config --global user.email "you@example.com"
|
||||||
|
git config --global user.name "Your Name"
|
||||||
|
|
||||||
|
echo '###'
|
||||||
|
echo '### Currently set version of python'
|
||||||
|
python --version
|
||||||
|
|
||||||
|
echo '###'
|
||||||
|
echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
|
||||||
|
|
||||||
|
@ -362,7 +362,7 @@ def parser_html_01(year, expedition, txt):
|
|||||||
# print(f" #0 - tid: {tid}")
|
# print(f" #0 - tid: {tid}")
|
||||||
try:
|
try:
|
||||||
#print(f" #1 - tid: {tid}")
|
#print(f" #1 - tid: {tid}")
|
||||||
s = re.match(r"(?s)\s*(?:<p>)?(.*?)</?p>(.*)$(?i)", trippara)
|
s = re.match(r"(?i)(?s)\s*(?:<p>)?(.*?)</?p>(.*)$", trippara)
|
||||||
if not s:
|
if not s:
|
||||||
message = " ! - Skipping logentry {year} failure to parse header: " + tid + trippara[:300] + "..."
|
message = " ! - Skipping logentry {year} failure to parse header: " + tid + trippara[:300] + "..."
|
||||||
DataIssue.objects.create(parser='logbooks', message=message)
|
DataIssue.objects.create(parser='logbooks', message=message)
|
||||||
@ -449,6 +449,7 @@ def parser_html_01(year, expedition, txt):
|
|||||||
logdataissues[tid]=message
|
logdataissues[tid]=message
|
||||||
print(message)
|
print(message)
|
||||||
errorcount += 1
|
errorcount += 1
|
||||||
|
raise
|
||||||
if errorcount >5 :
|
if errorcount >5 :
|
||||||
message = f" !!- TOO MANY ERRORS - aborting at '{tid}' logbook: {year}"
|
message = f" !!- TOO MANY ERRORS - aborting at '{tid}' logbook: {year}"
|
||||||
DataIssue.objects.create(parser='logbooks', message=message)
|
DataIssue.objects.create(parser='logbooks', message=message)
|
||||||
|
33
venv-trog.sh
33
venv-trog.sh
@ -8,12 +8,12 @@ echo '-- Run this in a terminal in the real troggle directory: "bash venv-trog.s
|
|||||||
# use the script os-trog.sh
|
# use the script os-trog.sh
|
||||||
|
|
||||||
# If you are using Debian, then stick with the default version of python
|
# If you are using Debian, then stick with the default version of python
|
||||||
# If you are using Ubuntu, then it is easy to use a later version of python, e.g. 3.10 or 3.11
|
# If you are using Ubuntu, then it is easy to use a later version of python, e.g. 3.11
|
||||||
|
|
||||||
|
|
||||||
# NOW we set up troggle
|
# NOW we set up troggle
|
||||||
PYTHON=python3.10
|
PYTHON=python3.10
|
||||||
VENAME=p10d5 # python3.x and django 3.2
|
VENAME=p10d3 # python3.x and django 3.2
|
||||||
echo "** You are logged in as `id -u -n`"
|
echo "** You are logged in as `id -u -n`"
|
||||||
echo "The 50MB pip cache will be in /home/`id -u -n`/.cache/"
|
echo "The 50MB pip cache will be in /home/`id -u -n`/.cache/"
|
||||||
echo "The 150MB venv will created in /home/`id -u -n`/$VENAME/"
|
echo "The 150MB venv will created in /home/`id -u -n`/$VENAME/"
|
||||||
@ -79,9 +79,17 @@ ln -s ${TROGDIR}/../drawings drawings
|
|||||||
if [ -d ${TROGDIR}/../expofiles ]; then
|
if [ -d ${TROGDIR}/../expofiles ]; then
|
||||||
ln -s ${TROGDIR}/../expofiles expofiles
|
ln -s ${TROGDIR}/../expofiles expofiles
|
||||||
else
|
else
|
||||||
ln -s /mnt/f/expofiles expofiles
|
if [ ! -d /mnt/f/expofiles ]; then
|
||||||
|
sudo mkdir /mnt/f
|
||||||
|
sudo mount -t drvfs F: /mnt/f
|
||||||
|
else
|
||||||
|
ln -s /mnt/f/expofiles expofiles
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "### Setting file permissions.. may take a while.."
|
||||||
|
git config --global --add safe.directory '*'
|
||||||
|
sudo chmod -r 0777 *
|
||||||
|
|
||||||
echo "### links to expoweb, troggle etc. complete:"
|
echo "### links to expoweb, troggle etc. complete:"
|
||||||
ls -tla
|
ls -tla
|
||||||
@ -134,8 +142,25 @@ echo "### Now do
|
|||||||
'cd troggle'
|
'cd troggle'
|
||||||
'django-admin'
|
'django-admin'
|
||||||
'python manage.py check'
|
'python manage.py check'
|
||||||
|
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||||
|
## you need to follow the Linux instructions.
|
||||||
|
'ssh expo@expo.survex.com'
|
||||||
|
|
||||||
|
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||||
|
## the tests may ALSO fail because of ssh and permissions errors
|
||||||
|
# Ran 85 tests in 83.492s
|
||||||
|
# FAILED (failures=5)
|
||||||
|
## So you will need to run
|
||||||
|
$sudo chown -Rhv philip:philip ~/$VENAME (if your username is philip)
|
||||||
|
# and then REBOOT (or at least, exit WSL and terminate and restart WSL)
|
||||||
|
# because this chmod only takes effect then.
|
||||||
|
|
||||||
'python manage.py test -v 2'
|
'python manage.py test -v 2'
|
||||||
'./pre-run.sh'
|
'./pre-run.sh' (runs the tests again)
|
||||||
|
|
||||||
'python databaseReset.py reset $VENAME'
|
'python databaseReset.py reset $VENAME'
|
||||||
'python manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
'python manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||||
"
|
"
|
||||||
|
if [ ! -d /mnt/f/expofiles ]; then
|
||||||
|
echo '### No valid expofiles directory. Fix this before any tests will work.
|
||||||
|
fi
|
Loading…
Reference in New Issue
Block a user