summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--_deploy/debian/serversetup7
-rw-r--r--_deploy/xubuntu/localsettingsXubuntu.py196
-rw-r--r--_deploy/xubuntu/localsettingsXubuntu.py.bak196
-rw-r--r--deprecations.txt6
-rw-r--r--os-trog.sh8
-rwxr-xr-xpre-push-barbie.sh46
-rw-r--r--requirements.txt68
7 files changed, 518 insertions, 9 deletions
diff --git a/_deploy/debian/serversetup b/_deploy/debian/serversetup
index 644baea..1c54546 100644
--- a/_deploy/debian/serversetup
+++ b/_deploy/debian/serversetup
@@ -62,9 +62,12 @@ CREATE DATABASE troggle;
GRANT ALL PRIVILEGES ON troggle.* TO 'expo'@'localhost' IDENTIFIED BY 'somepassword';
install django:
-sudo apt install python-django python-django-registration python-django-imagekit python-django-tinymce fonts-freefont-ttf libapache2-mod-wsgi
+NO!
+This was:sudo apt install python-django python-django-registration python-django-imagekit python-django-tinymce fonts-freefont-ttf libapache2-mod-wsgi
+Should be ?
+sudo apt install python-django python-django-tinymce fonts-freefont-ttf libapache2-mod-wsgi
-python-django-imagekit comes from https://salsa.debian.org/python-team/modules/python-django-imagekit
+CHeck if this is correct:
python-django-tinymce comes from https://salsa.debian.org/python-team/modules/python-django-tinymce
(both modified for stretch/python2). packages under /home/wookey/packages/
diff --git a/_deploy/xubuntu/localsettingsXubuntu.py b/_deploy/xubuntu/localsettingsXubuntu.py
new file mode 100644
index 0000000..3915ff2
--- /dev/null
+++ b/_deploy/xubuntu/localsettingsXubuntu.py
@@ -0,0 +1,196 @@
+import sys
+import os
+import urllib.parse
+from pathlib import Path
+"""Settings for a troggle installation which may vary among different
+installations: for development or deployment, in a docker image or
+python virtual environment (venv), on ubuntu, debian or in Windows
+System for Linux (WSL), on the main server or in the potato hut,
+using SQLite or mariaDB.
+
+It sets the directory locations for the major parts of the system so
+that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
+a system-wide location rather than just a local directory.
+
+This file is included at the end of the main troggle/settings.py file so that
+it overwrites defaults in that file.
+
+Read https://realpython.com/python-pathlib/
+Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
+"""
+
+print(" * importing troggle/localsettings.py")
+
+#-----------------------------------------------------------------
+# THINK before you push this to a repo
+# - have you checked that credentials.py is in .gitignore ?
+# - we don't want to have to change the expo system password !
+#-----------------------------------------------------------------
+# default values, real secrets imported from credentials.py
+
+SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
+EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
+EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
+EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
+
+EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever. Tests are then less accurate.
+#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
+
+SERVERPORT = '8000' # not needed
+
+PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
+
+# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
+# so we use pathlib which has been standard since python 3.4
+# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
+
+# --------------------- MEDIA redirections BEGIN ---------------------
+REPOS_ROOT_PATH = Path(__file__).parent.parent
+LIBDIR = REPOS_ROOT_PATH / 'lib' / PV
+#LIBDIR = REPOS_ROOT_PATH / 'lib' / 'python3.9' # should be finding this automatically: python --version etc.
+
+TROGGLE_PATH = Path(__file__).parent
+TEMPLATE_PATH = TROGGLE_PATH / 'templates'
+MEDIA_ROOT = TROGGLE_PATH / 'media'
+JSLIB_ROOT = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
+
+#FILES = Path('/mnt/d/expofiles/')
+EXPOFILES = Path('/media/philip/sd-huge1/cucc-expo/expofiles/')
+SCANS_ROOT = EXPOFILES / 'surveyscans'
+PHOTOS_ROOT = EXPOFILES / 'photos'
+PHOTOS_YEAR = "2022"
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+MEDIA_URL = '/site-media/'
+
+DIR_ROOT = ''#this should end in / if a value is given
+URL_ROOT = '/'
+# URL_ROOT = 'http://localhost:'+ SERVERPORT +'/'
+
+#Note that these constants are not actually used in urls.py, they should be..
+MEDIA_URL = urllib.parse.urljoin(URL_ROOT , '/site_media/')
+SCANS_URL = urllib.parse.urljoin(URL_ROOT , '/survey_scans/')
+PHOTOS_URL = urllib.parse.urljoin(URL_ROOT , '/photos/')
+SVX_URL = urllib.parse.urljoin(URL_ROOT , '/survex/')
+
+
+STATIC_URL = urllib.parse.urljoin(URL_ROOT , '/static/') # used by Django admin pages. Do not delete.
+JSLIB_URL = urllib.parse.urljoin(URL_ROOT , '/javascript/') # used for CaveViewer JS utility
+
+#STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
+# --------------------- MEDIA redirections END ---------------------
+
+PUBLIC_SITE = True
+DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
+CACHEDPAGES = True # experimental page cache for a handful of page types
+
+# executables:
+CAVERN = 'cavern' # for parsing .svx files and producing .3d files
+SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
+
+DBSQLITE = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+ 'NAME' : 'troggle.sqlite',
+# 'NAME' : ':memory:',
+ 'USER' : 'expo', # Not used with sqlite3.
+ 'PASSWORD' : 'sekrit', # Not used with sqlite3.
+ 'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
+ 'PORT' : '', # Set to empty string for default. Not used with sqlite3.
+ }
+}
+DBMARIADB = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+ 'NAME' : 'troggle', # Or path to database file if using sqlite3.
+ 'USER' : 'expo',
+ 'PASSWORD' : 'my-secret-password-schwatzmooskogel',
+ 'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
+ 'PORT' : '', # Set to empty string for default. Not used with sqlite3.
+ }
+}
+
+# default database for me is squlite
+DBSWITCH = "sqlite"
+
+if DBSWITCH == "sqlite":
+ DATABASES = DBSQLITE
+if DBSWITCH == "mariadb":
+ DATABASES = DBMARIADB
+
+NOTABLECAVESHREFS = [ "290", "291", "359", "264", "258", "204", "76", "107"]
+
+PYTHON_PATH = REPOS_ROOT_PATH / 'troggle'
+sys.path.append(os.fspath(REPOS_ROOT_PATH))
+sys.path.append(os.fspath(PYTHON_PATH))
+
+LOGFILE = PYTHON_PATH / 'troggle.log'
+PYTHON_PATH = os.fspath(PYTHON_PATH)
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [
+ TEMPLATE_PATH
+ ],
+ 'OPTIONS': {
+ 'debug': 'DEBUG',
+ 'context_processors': [
+ # django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
+ 'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
+ 'core.context.troggle_context', # in core/troggle.py - only used in expedition.html
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.i18n',
+ 'django.template.context_processors.media', # includes a variable MEDIA_URL
+ 'django.template.context_processors.static', # includes a variable STATIC_URL used by admin pages
+ 'django.template.context_processors.tz',
+ 'django.template.context_processors.request', # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ 'loaders': [
+ 'django.template.loaders.filesystem.Loader', # default lcation is troggle/templates/
+ 'django.template.loaders.app_directories.Loader', # needed for admin 'app'
+ ]
+ },
+ },
+]
+
+EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
+EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
+
+EXPOUSER = 'expo'
+EXPOUSER_EMAIL = 'philip.sargent@gmail.com'
+EXPOADMINUSER = 'expoadmin'
+EXPOADMINUSER_EMAIL = 'philip.sargent@gmail.com'
+
+EMAIL_HOST = "smtp-auth.mythic-beasts.com"
+EMAIL_HOST_USER = "django-test@klebos.net" # Philip Sargent really
+EMAIL_PORT=587
+EMAIL_USE_TLS = True
+DEFAULT_FROM_EMAIL = 'django-test@klebos.net'
+
+SURVEX_DATA = REPOS_ROOT_PATH / "loser"
+DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
+
+EXPOWEB = REPOS_ROOT_PATH / "expoweb"
+#SURVEYS = REPOS_ROOT_PATH
+CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
+ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
+EXPOWEB_URL = ''
+# SCANS_URL = '/survey_scans/' # defunct, removed.
+
+# Sanitise these to be strings as all other code is expecting strings
+# and we have not made the change to pathlib Path type in the other localsettings-* variants yet.
+CAVEDESCRIPTIONS = os.fspath(CAVEDESCRIPTIONS)
+ENTRANCEDESCRIPTIONS = os.fspath(ENTRANCEDESCRIPTIONS)
+LOGFILE = os.fspath(LOGFILE)
+#SURVEYS = os.fspath(SURVEYS)
+EXPOWEB = os.fspath(EXPOWEB)
+DRAWINGS_DATA = os.fspath(DRAWINGS_DATA)
+SURVEX_DATA = os.fspath(SURVEX_DATA)
+REPOS_ROOT_PATH = os.fspath(REPOS_ROOT_PATH)
+TEMPLATE_PATH = os.fspath(TROGGLE_PATH)
+MEDIA_ROOT = os.fspath(MEDIA_ROOT)
+JSLIB_ROOT = os.fspath(JSLIB_ROOT)
+SCANS_ROOT = os.fspath(SCANS_ROOT)
diff --git a/_deploy/xubuntu/localsettingsXubuntu.py.bak b/_deploy/xubuntu/localsettingsXubuntu.py.bak
new file mode 100644
index 0000000..3915ff2
--- /dev/null
+++ b/_deploy/xubuntu/localsettingsXubuntu.py.bak
@@ -0,0 +1,196 @@
+import sys
+import os
+import urllib.parse
+from pathlib import Path
+"""Settings for a troggle installation which may vary among different
+installations: for development or deployment, in a docker image or
+python virtual environment (venv), on ubuntu, debian or in Windows
+System for Linux (WSL), on the main server or in the potato hut,
+using SQLite or mariaDB.
+
+It sets the directory locations for the major parts of the system so
+that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
+a system-wide location rather than just a local directory.
+
+This file is included at the end of the main troggle/settings.py file so that
+it overwrites defaults in that file.
+
+Read https://realpython.com/python-pathlib/
+Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
+"""
+
+print(" * importing troggle/localsettings.py")
+
+#-----------------------------------------------------------------
+# THINK before you push this to a repo
+# - have you checked that credentials.py is in .gitignore ?
+# - we don't want to have to change the expo system password !
+#-----------------------------------------------------------------
+# default values, real secrets imported from credentials.py
+
+SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
+EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
+EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
+EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
+
+EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever. Tests are then less accurate.
+#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
+
+SERVERPORT = '8000' # not needed
+
+PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
+
+# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
+# so we use pathlib which has been standard since python 3.4
+# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
+
+# --------------------- MEDIA redirections BEGIN ---------------------
+REPOS_ROOT_PATH = Path(__file__).parent.parent
+LIBDIR = REPOS_ROOT_PATH / 'lib' / PV
+#LIBDIR = REPOS_ROOT_PATH / 'lib' / 'python3.9' # should be finding this automatically: python --version etc.
+
+TROGGLE_PATH = Path(__file__).parent
+TEMPLATE_PATH = TROGGLE_PATH / 'templates'
+MEDIA_ROOT = TROGGLE_PATH / 'media'
+JSLIB_ROOT = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
+
+#FILES = Path('/mnt/d/expofiles/')
+EXPOFILES = Path('/media/philip/sd-huge1/cucc-expo/expofiles/')
+SCANS_ROOT = EXPOFILES / 'surveyscans'
+PHOTOS_ROOT = EXPOFILES / 'photos'
+PHOTOS_YEAR = "2022"
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+MEDIA_URL = '/site-media/'
+
+DIR_ROOT = ''#this should end in / if a value is given
+URL_ROOT = '/'
+# URL_ROOT = 'http://localhost:'+ SERVERPORT +'/'
+
+#Note that these constants are not actually used in urls.py, they should be..
+MEDIA_URL = urllib.parse.urljoin(URL_ROOT , '/site_media/')
+SCANS_URL = urllib.parse.urljoin(URL_ROOT , '/survey_scans/')
+PHOTOS_URL = urllib.parse.urljoin(URL_ROOT , '/photos/')
+SVX_URL = urllib.parse.urljoin(URL_ROOT , '/survex/')
+
+
+STATIC_URL = urllib.parse.urljoin(URL_ROOT , '/static/') # used by Django admin pages. Do not delete.
+JSLIB_URL = urllib.parse.urljoin(URL_ROOT , '/javascript/') # used for CaveViewer JS utility
+
+#STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
+# --------------------- MEDIA redirections END ---------------------
+
+PUBLIC_SITE = True
+DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
+CACHEDPAGES = True # experimental page cache for a handful of page types
+
+# executables:
+CAVERN = 'cavern' # for parsing .svx files and producing .3d files
+SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
+
+DBSQLITE = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+ 'NAME' : 'troggle.sqlite',
+# 'NAME' : ':memory:',
+ 'USER' : 'expo', # Not used with sqlite3.
+ 'PASSWORD' : 'sekrit', # Not used with sqlite3.
+ 'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
+ 'PORT' : '', # Set to empty string for default. Not used with sqlite3.
+ }
+}
+DBMARIADB = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+ 'NAME' : 'troggle', # Or path to database file if using sqlite3.
+ 'USER' : 'expo',
+ 'PASSWORD' : 'my-secret-password-schwatzmooskogel',
+ 'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
+ 'PORT' : '', # Set to empty string for default. Not used with sqlite3.
+ }
+}
+
+# default database for me is squlite
+DBSWITCH = "sqlite"
+
+if DBSWITCH == "sqlite":
+ DATABASES = DBSQLITE
+if DBSWITCH == "mariadb":
+ DATABASES = DBMARIADB
+
+NOTABLECAVESHREFS = [ "290", "291", "359", "264", "258", "204", "76", "107"]
+
+PYTHON_PATH = REPOS_ROOT_PATH / 'troggle'
+sys.path.append(os.fspath(REPOS_ROOT_PATH))
+sys.path.append(os.fspath(PYTHON_PATH))
+
+LOGFILE = PYTHON_PATH / 'troggle.log'
+PYTHON_PATH = os.fspath(PYTHON_PATH)
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [
+ TEMPLATE_PATH
+ ],
+ 'OPTIONS': {
+ 'debug': 'DEBUG',
+ 'context_processors': [
+ # django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
+ 'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
+ 'core.context.troggle_context', # in core/troggle.py - only used in expedition.html
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.i18n',
+ 'django.template.context_processors.media', # includes a variable MEDIA_URL
+ 'django.template.context_processors.static', # includes a variable STATIC_URL used by admin pages
+ 'django.template.context_processors.tz',
+ 'django.template.context_processors.request', # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ 'loaders': [
+ 'django.template.loaders.filesystem.Loader', # default lcation is troggle/templates/
+ 'django.template.loaders.app_directories.Loader', # needed for admin 'app'
+ ]
+ },
+ },
+]
+
+EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
+EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
+
+EXPOUSER = 'expo'
+EXPOUSER_EMAIL = 'philip.sargent@gmail.com'
+EXPOADMINUSER = 'expoadmin'
+EXPOADMINUSER_EMAIL = 'philip.sargent@gmail.com'
+
+EMAIL_HOST = "smtp-auth.mythic-beasts.com"
+EMAIL_HOST_USER = "django-test@klebos.net" # Philip Sargent really
+EMAIL_PORT=587
+EMAIL_USE_TLS = True
+DEFAULT_FROM_EMAIL = 'django-test@klebos.net'
+
+SURVEX_DATA = REPOS_ROOT_PATH / "loser"
+DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
+
+EXPOWEB = REPOS_ROOT_PATH / "expoweb"
+#SURVEYS = REPOS_ROOT_PATH
+CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
+ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
+EXPOWEB_URL = ''
+# SCANS_URL = '/survey_scans/' # defunct, removed.
+
+# Sanitise these to be strings as all other code is expecting strings
+# and we have not made the change to pathlib Path type in the other localsettings-* variants yet.
+CAVEDESCRIPTIONS = os.fspath(CAVEDESCRIPTIONS)
+ENTRANCEDESCRIPTIONS = os.fspath(ENTRANCEDESCRIPTIONS)
+LOGFILE = os.fspath(LOGFILE)
+#SURVEYS = os.fspath(SURVEYS)
+EXPOWEB = os.fspath(EXPOWEB)
+DRAWINGS_DATA = os.fspath(DRAWINGS_DATA)
+SURVEX_DATA = os.fspath(SURVEX_DATA)
+REPOS_ROOT_PATH = os.fspath(REPOS_ROOT_PATH)
+TEMPLATE_PATH = os.fspath(TROGGLE_PATH)
+MEDIA_ROOT = os.fspath(MEDIA_ROOT)
+JSLIB_ROOT = os.fspath(JSLIB_ROOT)
+SCANS_ROOT = os.fspath(SCANS_ROOT)
diff --git a/deprecations.txt b/deprecations.txt
index d5d211f..2b967ae 100644
--- a/deprecations.txt
+++ b/deprecations.txt
@@ -1,6 +1,6 @@
-/home/philip/p10d3/lib/python3.10/site-packages/django/utils/version.py:6: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
+/home/philip/.local/lib/python3.10/site-packages/django/utils/version.py:6: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
from distutils.version import LooseVersion
-/home/philip/p10d3/lib/python3.10/site-packages/django/utils/asyncio.py:19: DeprecationWarning: There is no current event loop
+/home/philip/.local/lib/python3.10/site-packages/django/utils/asyncio.py:19: DeprecationWarning: There is no current event loop
event_loop = asyncio.get_event_loop()
-/home/philip/p10d3/lib/python3.10/site-packages/django/utils/asyncio.py:19: DeprecationWarning: There is no current event loop
+/home/philip/.local/lib/python3.10/site-packages/django/utils/asyncio.py:19: DeprecationWarning: There is no current event loop
event_loop = asyncio.get_event_loop()
diff --git a/os-trog.sh b/os-trog.sh
index 02749a4..dfdbbe5 100644
--- a/os-trog.sh
+++ b/os-trog.sh
@@ -9,20 +9,20 @@ python --version : ensure python is an alias for python3 not python2.7
sudo apt update
sudo apt dist-upgrade
sudo apt install sqlite3
-sudo apt install python3-pip # this installs a shed-load of other stuff: binutils etc.
+sudo apt install python3-pip
-sudo apt install survex-aven
+# this installs a shed-load of other stuff: binutils etc.sudo apt install survex-aven
sudo apt install openssh-client tunnelx therion
sudo apt install git sftp
# On a clean debian 11 (bullseye) installation with Xfce & ssh,
# as debian does not install everything that ubuntu does, you need:
sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
-sudo apt install python3.10
+# default since 22.04 # sudo apt install python3.10
sudo apt install python3.10-venv
sudo apt install python3.10-dev
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1
-sudo apt install mariadb-server
+sudo apt install mariadb-server -y
sudo apt install libmariadb-dev
sudo python -m pip install --upgrade pip
diff --git a/pre-push-barbie.sh b/pre-push-barbie.sh
new file mode 100755
index 0000000..5ea1aa0
--- /dev/null
+++ b/pre-push-barbie.sh
@@ -0,0 +1,46 @@
+#! /bin/sh
+# create and sanitise files for pushing to repo, for Babie laptop
+
+echo deprecations.
+python -Wall manage.py check -v 3 2>deprecations.txt >/dev/null
+echo diffsettings.
+rm diffsettings.txt
+if test -f "diffsettings.txt"; then
+ echo "diffsettings.txt not deleted. You have a serious permissions problem. Aborting.."
+ exit
+fi
+python manage.py diffsettings | grep "###" > diffsettings.txt
+echo pip freeze.
+pip freeze > requirements.txt
+echo inspectdb.
+# this next line requires database setting to be troggle.sqlite:
+python manage.py inspectdb > troggle-inspectdb.py
+#egrep -in "unable|error" troggle-inspectdb.py
+echo remove passwords.
+cp localsettings.py localsettingsXubuntu.py
+sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
+sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' localsettingsXubuntu.py
+echo " reset: EXPOUSERPASS = \"nnn:gggggg\" - real-expo-password---imported-from-localsettings.py"
+
+sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
+sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' localsettingsXubuntu.py
+echo " reset: EXPOUSERPASS = \"gggggg:nnn\" - real-expo-password---imported-from-localsettings.py"
+
+sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' diffsettings.txt
+sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' localsettingsXubuntu.py
+echo " reset: EMAIL_HOST_PASSWORD = \"real-email-password--imported-from-localsettings.py\""
+
+sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' diffsettings.txt
+sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' localsettingsXubuntu.py
+echo " reset: SECRET_KEY = \"real-SECRET_KEY--imported-from-localsettings.py\""
+
+mv _deploy/xubuntu/localsettingsXubuntu.py _deploy/xubuntu/localsettingsXubuntu.py.bak
+mv localsettingsXubuntu.py _deploy/xubuntu
+#
+# Do these before final testing, *not* just before pushing:
+# in ./pre-run.sh
+# python reset-django.py
+# python manage.py makemigrations
+# python manage.py test
+# python manage.py inspectdb > troggle-inspectdb.py
+# egrep -i "unable|error" troggle-inspectdb.py
diff --git a/requirements.txt b/requirements.txt
index b05fda2..e7eb9e9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,16 +1,84 @@
+apturl==0.5.2
asgiref==3.5.0
+blinker==1.4
+catfish==4.16.3
+certifi==2020.6.20
+cffi==1.15.0
+chardet==4.0.0
+click==8.0.3
+colorama==0.4.4
+command-not-found==0.3
confusable-homoglyphs==3.2.0
coverage==6.4
+cryptography==3.4.8
+cupshelpers==1.0
+dbus-python==1.2.18
+defer==1.0.6
+distro==1.7.0
+distro-info===1.1build1
Django==3.2
docutils==0.18
+gpg===1.16.0-unknown
gunicorn==20.1.0
+httplib2==0.20.2
+idna==3.3
+importlib-metadata==4.6.4
+jeepney==0.7.1
+keyring==23.5.0
+language-selector==0.1
+launchpadlib==1.10.16
+lazr.restfulclient==0.14.4
+lazr.uri==1.0.6
+lightdm-gtk-greeter-settings==1.2.2
+macaroonbakery==1.3.1
+Mako==1.1.3
mariadb==1.0.11
+MarkupSafe==2.0.1
+menulibre==2.2.2
+mercurial==6.1.1
+more-itertools==8.10.0
+mugshot==0.4.3
mysql-connector-python==8.0.29
mysqlclient==2.1.0
+netifaces==0.11.0
+oauthlib==3.2.0
+olefile==0.46
+onboard==1.4.1
+pexpect==4.8.0
Pillow==9.1.0
+ply==3.11
protobuf==4.21.2
+psutil==5.9.0
+ptyprocess==0.7.0
+pycairo==1.20.1
+pycparser==2.21
+pycups==2.0.1
+PyGObject==3.42.1
+PyJWT==2.4.0
+pymacaroons==0.13.0
+PyNaCl==1.5.0
+pyparsing==2.4.7
+pyRFC3339==1.1
+python-apt==2.3.0+ubuntu2.1
+python-dateutil==2.8.1
+python-debian===0.1.43ubuntu1
pytz==2022.1
+PyYAML==5.4.1
reportlab==3.6.0
+requests==2.25.1
+SecretStorage==3.3.1
+sgt-launcher==0.2.7
+six==1.16.0
sqlparse==0.4.0
+systemd-python==234
typing_extensions==4.2.0
+ubuntu-advantage-tools==27.9
+ubuntu-drivers-common==0.0.0
+ufw==0.36.1
+unattended-upgrades==0.1
Unidecode==1.3.0
+urllib3==1.26.5
+wadllib==1.3.6
+xcffib==0.11.1
+xkit==0.0.0
+zipp==1.0.0