From 25f9430fac3ab0968d64dcc1567896e97ad01239 Mon Sep 17 00:00:00 2001 From: Philip Sargent Date: Wed, 22 Apr 2020 19:37:10 +0100 Subject: [PATCH] grey banner and lots of to-do fixes, to do items all updated from scribbled notes on printout --- handbook/computing/browsers-icons.jpg | Bin 0 -> 81792 bytes handbook/computing/folkupdate.html | 16 +- handbook/computing/hbmanual1.html | 22 +- handbook/computing/manual.html | 20 +- handbook/computing/onlinesystems.html | 11 +- handbook/computing/qstart-git.html | 7 +- handbook/computing/regular.html | 22 +- handbook/computing/todo-data.html | 386 ++++++++++++++++++ handbook/computing/todo-styles.css | 3 + handbook/computing/todo.html | 492 +++++++---------------- handbook/computing/todo.js | 71 ++++ handbook/computing/useany.html | 119 ++++++ handbook/computing/wookey-slides.html | 214 ++++++++++ handbook/computing/yourlaptop.html | 15 +- handbook/survey/index.htm | 10 +- handbook/troggle/datamodel.html | 545 ++++++++++++++++++++++++++ handbook/troggle/menudesign.html | 2 +- handbook/troggle/otherscripts.html | 17 +- handbook/troggle/placeholder.html | 2 +- handbook/troggle/scriptscurrent.html | 2 +- handbook/troggle/scriptsqms.html | 156 ++++++++ handbook/troggle/serverconfig.html | 2 +- handbook/troggle/trogarch.html | 7 +- handbook/troggle/trogdesign.html | 3 +- handbook/troggle/trogdesignx.html | 94 +++++ handbook/troggle/trogdocm.html | 1 + handbook/troggle/trogintro.html | 2 +- handbook/troggle/trogmanual.html | 2 +- handbook/troggle/trognotes.html | 2 +- handbook/troggle/trogstatus.html | 2 +- intro.htm | 2 +- 31 files changed, 1828 insertions(+), 421 deletions(-) create mode 100644 handbook/computing/browsers-icons.jpg create mode 100644 handbook/computing/todo-data.html create mode 100644 handbook/computing/todo.js create mode 100644 handbook/computing/useany.html create mode 100644 handbook/computing/wookey-slides.html create mode 100644 handbook/troggle/datamodel.html create mode 100644 handbook/troggle/scriptsqms.html create mode 100644 handbook/troggle/trogdesignx.html diff --git a/handbook/computing/browsers-icons.jpg b/handbook/computing/browsers-icons.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8ba2026a0c1cae56741bde0106014ccef274fbd GIT binary patch literal 81792 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 A3IG5A literal 0 HcmV?d00001 diff --git a/handbook/computing/folkupdate.html b/handbook/computing/folkupdate.html index dbbc5a006..4ea67ffd9 100644 --- a/handbook/computing/folkupdate.html +++ b/handbook/computing/folkupdate.html @@ -23,7 +23,7 @@ This is adding an extra column to every line in the file.

Add new lines for new people, with the right number of columns. -

This process is tedious and error-prone and ripe for improvement especially as expo proceeds and youhave many more names to add. Adding a list of people from the bier book and their aliases (the name in brackets) would be a lot better, but some way to make sure that names match with previous years would be good. +

This process is tedious and error-prone and ripe for improvement especially as expo proceeds and you have many more names to add. Adding a list of people from the bier book and their aliases (the name in brackets) would be a lot better, but some way to make sure that names match with previous years would be good.

Contrary to what you might expect we find that it is much more reliable to edit this using a text editor rather than a spreadsheet program. @@ -33,23 +33,19 @@ Contrary to what you might expect we find that it is much more reliable to edit

The nerd needs to do this:

  1. Upload the edited copy of folk.csv to the server using the version control system. -
  2. Log in to the expo server and run the update script (see below for details) +
  3. Log in to the expo server and run the update script (see below)
  4. Watch any error messages scroll by.
  5. Look at the new folk list HTML file at http://expo.survex.com/folk/
  6. Re-run the import script until you have got rid of all the import errors.

This is how you login and run the script:

ssh  expo@expo.survex.com
-cd folk
+cd expoweb/folk
+chmod +w index.htm
 python ../scripts/make-folklist.py <folk.csv >index.htm
 
-

If there are no errors, you will just see this on your ssh session: - -

- -

And you will see the result online at http://expo.survex.com/folk/. +

If there are no errors, you will just see the prompt reappear in your ssh session +and you will see the result online at http://expo.survex.com/folk/.

It is recommended that the nerd does this locally on their own laptop first. It does not need to be an expo laptop, even a Windows 10 laptop is fine if the script is run in a WSL terminal. The only software you need to install is the default python package.


diff --git a/handbook/computing/hbmanual1.html b/handbook/computing/hbmanual1.html index 1907b396c..46e0def6f 100644 --- a/handbook/computing/hbmanual1.html +++ b/handbook/computing/hbmanual1.html @@ -47,15 +47,27 @@ so you cannot use "Edit this page". These pages will not show "Edit this page" i

Then once created, you can edit it the same way that you edit a pre-existing page.

Linking in New Pages

-

You link your new page into the handbook by editing another page in which you want to create a link. For example if you have created a new page describing your wonderful new sleeping bag/hammock technique, then you might want to add a link in to Expo Personal Gear List. Unfortunately the "create link" icon (a picture of 3 links of a chain) is disabled in the on-line editor so you would have to click on the HTML icon and insert the link by editing the HTML directly. +

You link your new page into the handbook by editing another page in which you want to create a link. For example if you have created a new page describing your wonderful new sleeping bag/hammock technique, then you might want to add a link in to Expo Personal Gear List. Unfortunately the "create link" icon (a picture of 3 links of a chain) is disabled in the on-line editor so you would have to click on the HTML icon and insert the link by editing the HTML directly using an <a href="filename"> tag.

Conventions

Encoding

  • We specify that pages are encoded using UTF-8 for all content. +
  • We are using HTML5 and + CSS3 but a great many pages still use obsolescent tags such as <font>. These are being removed whenever a page is edited. +
  • All the pages use a single CSS stylesheet /css/main2.css. +
  • We do not use any javascript framework: just HTML and CSS. You may come across historic references to jquery but this is not used.
  • When editing webpages, use HTML entities for characters with umlauts, e.g. &ouml; for ö.
  • Only use a UTF-8 encoding if there is no HTML entity, e.g. biohazard:
+

Automated formatting

+
    +
  • When any .html page is loaded by troggle it replaces all the <head>...</head> material with the expo standard header. So don't put anything in the header of any page you edit as it will be ignored. This is also where troggle inserts the /css/main2.css standard stylesheet. +
  • On loading a .html page troggle also inserts a standard menu - normally visible to the top left of the page. This is not inserted if the .html page has its own menu: <div id="menu"><ul id="links"> ... various <li>items .. </ul></div> +
  • If you add the header line +<meta name="keywords" content="NOEDIT"> +it will be stripped out by troggle when it replaces the header, but it will notice it and will not insert "Edit this page" at the end of the inserted menu. +

Filenames

  • No spaces in filenames. Use underscores or hyphens. @@ -68,8 +80,16 @@ Otherwise it's easy to make pages that work on Windows, but which don't on Linux
  • Never create two files spelt the same except for capitalisation. They will overwrite each other if edited on a Windows machine without any warning. This is particularly a problem for the filenames generated on phones for photographs.
+

Images

+
    +
  • Older parts of the website have sub-folders "i/", "l/", and "t/" holding respectively
    +i/ - the image file at full resolution (600px width usually)
    +l/ - an html file which displays the full image with a caption and some description
    +t/ - a thumbnail image which is usually used inside an <a> tag to link to the l/ html file. +
+

Tidying up and commiting the edits

'Edit This Page' edits the file served on the web but it does not update the file in the version control diff --git a/handbook/computing/manual.html b/handbook/computing/manual.html index 6bd5f84ef..862c90551 100644 --- a/handbook/computing/manual.html +++ b/handbook/computing/manual.html @@ -53,10 +53,10 @@ processes that a maintainer would want to do.

Version control system

We use a distributed revision control system (git, and formerly mercurial) for all the important data. (Note that we just use git: not GitHub, not GitLab, just git.) This means that many people can edit and merge their changes with the expo -server in Cambridge at the same time: including people still on expo in the Tatty Hut +server in Cambridge at the same time: inlcuding people still on expo in the Tatty Hut and those who have returned to the UK. Also anyone who is up to date can take their laptop somewhere and enter data even if they have no internet access, -and the updates can be merged when they get back to civilization. +and the updates will be merged when they get back to civilization.

In principle, survey notes can be typed into a laptop up on the plateau which would then get synchronised when it next gets internet access. @@ -65,9 +65,8 @@ then get synchronised when it next gets internet access. do not get modified, so they are kept as a plain directory of files 'expofiles'. The same goes for holiday photographs and GPS logs.

-

From 2012-2019 we used mercurial (aka 'hg'), but completed the move to git -before the 2020 expo.

- +

In 2019 we had half our version-controlled repositories under mercurial and half under git. +The intention is to move entirely to git before the 2020 expo.

Contents

    @@ -84,6 +83,7 @@ Appendices:

    Getting a username, password and key

    @@ -113,12 +113,12 @@ editing and keeps track of all changes so we can roll back and have branches if

    The site has been split into four parts:

      -
    • loser - the survex cave survey data (hg)
    • -
    • drawings - the tunnel and therion cave data and drawings (git)
    • -
    • expoweb - the website pages, handbook, generation scripts (git)
    • -
    • troggle - the database/software part of the survey data management system - see notes on troggle for further explanation (git)
    • +
    • loser - the survex cave survey data (hg)
    • +
    • drawings - the tunnel and therion cave data and drawings (git)
    • +
    • expoweb - the website pages, handbook, generation scripts (hg)
    • +
    • troggle - the database/software part of the survey data management system - see notes on troggle for further explanation (git)
    -

    We have migrated three of these to git but loser is still mercurial for a few more days. +

    We have migrated two of these to git but the other two still use mercurial.

    Updating cave pages

    diff --git a/handbook/computing/onlinesystems.html b/handbook/computing/onlinesystems.html index bb602cd94..4d6aa3aa2 100644 --- a/handbook/computing/onlinesystems.html +++ b/handbook/computing/onlinesystems.html @@ -6,7 +6,14 @@ +

    CUCC Expedition Handbook - Online overview

    +

    Expo Online Systems Overview

    The cave data and online publishing system (aka "the website") is now large and complicated. @@ -15,6 +22,7 @@ This page is the overview. The online systems manuals are split into these secti

    • Data maintenance - for cavers finding and updating cave survey data using the software tools. @@ -22,6 +30,7 @@ This page is the overview. The online systems manuals are split into these secti
    • Handbook maintenance - how to improve and update what you are reading now.
    • System maintenance - how to fix and enhance the software tools we have written:
        +
      • To-do - online systems to-do list
      • Troggle - the system framework
      • Other scripts
      • Server configuration @@ -43,7 +52,7 @@ This page is the overview. The online systems manuals are split into these secti A fuller list of "How do I..." instruction pages are on the handbook opening page. If you are new to this you may need a beer.
        -

        We have an Overview Presentation (many parts out of date) +

        We have an Overview Presentation (2015: many parts out of date) on how the cave data, handbook and public website are constructed and managed. It contains material which will be merged into these online manuals. diff --git a/handbook/computing/qstart-git.html b/handbook/computing/qstart-git.html index eb3b4b727..2dbca1bdd 100644 --- a/handbook/computing/qstart-git.html +++ b/handbook/computing/qstart-git.html @@ -22,7 +22,7 @@ have key-pair setup already set up before any of

        Open a terminal in a new directory, e.g. /tmp/experiments/ in which you want to create the repo. It will automatically create a folder with the repo name e.g.'troggle' in that directory.

        -
        expoweb (The website/data management system)
        +
        expoweb (The data management system) - this will fail until it is moved from hg to git
        git clone ssh://expo@expo.survex.com:/home/expo/expoweb (read/write)
        @@ -42,9 +42,6 @@ have key-pair setup already set up before any of git clone ssh://expo@expo.survex.com:/home/expo/drawings (read/write)
        - -

        The repositories are browseable at http://expo.survex.com/repositories/

        -

        Using git in Windows

        @@ -62,7 +59,7 @@ have key-pair setup already set up before any of

        git commit (you can specify filenames to be specific)

        -

        The first time you do this on a Windows machine it will probably not work as it does not recognise the server key exchange. +

        The first time you do this on a Windows machineit will probably not work as it does not recognise the server key echnage. Fix this by running putty (downloading it from https://www.chiark.greenend.org.uk/~sgtatham/putty/), and connecting to the server 'expo@expo.survex.com' (on port 22). Confirm that this is the right server. If you succeed in getting a shell prompt then ssh connection are working and git should be able to clone the repo, and send changes back.

        diff --git a/handbook/computing/regular.html b/handbook/computing/regular.html index 51521af15..94effa551 100644 --- a/handbook/computing/regular.html +++ b/handbook/computing/regular.html @@ -9,24 +9,32 @@

        CUCC Expedition Handbook - Online systems

        Expo Data Maintenance - Regular tasks

        -

        Regular operations

        +

        Regular operations

        -

        This page is a checklist who are helping the survey data reduction process during and after expo. +

        This page is a checklist who are helping the survey data reduction process during and after expo. +

        All of these things should be checked every week for a couple of months after expo, and then every couple of months. Then again when preparing for the new expo in May. +

        Data entry TO-DO list

        +

        A user-editable online to-do list for data management is now part of the expo online systems. Review this regularly to see what needs doing, and please *delete* jobs that have been done.

        Wallets and Surveyscans

        -

        Run dos2unix to convert any uploaded Windows text files to the format expected by our software. e.g. -

        cd expofiles/surveyscans
        +

        2020#00

        +

        The #00 wallet directory (e.g. /2020/2020#00/ ) contains orphan files that have been found on the expo laptop in odd places, or have been scanned from bits of notebook found inside other documents. Keep an eye on it and re-file the contents as you discover what they are. +

        EOL

        +

        Run dos2unix to convert any uploaded Windows text files to the format expected by our software. e.g.

        cd expofiles/surveyscans
         find . -not -type d -exec file "{}" ";" | grep CRLF >crlf.txt
        -`awk -F: '// {print "dos2unix \"" $1 "\""}' crlf.txt`
        -
        -

        Also a good idea to run on all of expofiles once every few years as many GPX +`awk -F: '// {print "dos2unix \"" $1 "\""}' crlf.txt`

        +

        Also a good idea to run on all of expofiles once every few years as many GPX exports +from phones are a bit variable in how they do EOL characters.

        Tunnel files (Drawings)

        Survex files

        +

        Folk

        +

        During prep. for the new expo the folklist will be updated with all the new people expected, but after expo the mugshots and blurb text for the new people will need to be added. See folkupdate for the procedure. +


        Annual tasks New expo year jobs. Return to the main online systems manual. diff --git a/handbook/computing/todo-data.html b/handbook/computing/todo-data.html new file mode 100644 index 000000000..538c20bb6 --- /dev/null +++ b/handbook/computing/todo-data.html @@ -0,0 +1,386 @@ + + + +Expo Systems - Data To-Do List + + + + + + + + +

        Data Updating To-Do List

        + + + + +

        How this works

        + +

        Click twice on a sub-heading to reveal the individual to-do items. Click again to hide.
        +If a heading is in italics, then there are hidden items. +

        Click on the main "How this works" heading to toggle reveal/hide everything. +

        Printing this page uses a much smaller font. Complain to the nerd list if you don't like this behaviour. + +

        Edit this page by clicking on the big blue button. It uses the same "Edit this page" function that you may have used before. Just be careful not to touch the code at the top of the page. + +

        We are working on a more capable and easier-to-use system which will mimic how GitHub Issues do this sort of thing. + + +

        Cave Data Updating

        +

        To see the "handbook updating" and "troggle/system" to-do lists, go to the other TO-DO list + +

        Logbook fettling

        +
        +
        2019 Logbook
        +
        + transcribe the rest of those UKcaving blog entries into expoweb/years/2019/logbook.html
        +
        + copy the photos from the UKCaving blog into expofiles/photos/2019// -- in fact many of those photos are already there
        +
        edit in the links to those photos in the right place in 2019/logbook.html
        + +
        Garlic cave +
        edit logbook entries 2018, 2019 to link to extensive photos of Garlic cave area {Withnall 2018} , {Becka 2019} +
        Past logbooks - missing images? +
        Which previous years HTML logbooks are missing images extracted from scanned PDF copies of the logbooks? + + +
        2018 Logbook
        +
        Check Natalie Uomini's typed entries and extensive photos are minimized and linked in properly to the HTML logbook + + +
        Add missing images to logbooks
        +
        + 2000, 2008, 2009, 2011
        +
        + fix corrupted image in 2001 log
        + +
        2011 logbook:
        +
        type up via-ferrate & bolt-testing writeups (In paper book, not in scan or HTML)
        + +
        200? logbook:
        +
        + Type up "list of GPS locations still to type"
        + +
        +

        Tunneling to do

        +
        +
        1623/251
        +
        Put in tunnel plan instead of scan of drawn-up notes.
        +
        Draw up elevation (therion)
        +
        +

        Tackle Store Records

        +
        +
        No authoritative list of where the expo paper records are! +
        NO expo paperwork at all prior to 2008 in Tackle Store - where is it ? +
        FIND where all the wallet binders are, and the logbooks. +<
        BUY A4 plastic boxes for filing cabinet for logbooks getting damp there. +
        2017, 2018, 2019 wallet binders are in Philip S.'s house. +
        + +

        :expoweb:/1623/264/cavedescription2016

        (All moved verbatim, now deleted)

        +
        +
        +tightyorkshireman +
        +person size phreatic tube, left passage emerges at pitch head, right passage becomes too tight. +
        +rabbitwarrens +
        +Sandy crabwalk turning into a tube parallel to main passage connecting to ein und zwanzig +
        +noserock2 +
        +Pitch dropped round the corner from the pitch in noserock. Lots of +break-down and pitch ended in a choked chamber floor. +
        +northhole +
        +;Small grotty hole in the floor of eis koek aven, which connects through to the nearby large hole down to a circular ice floor. +
        +northhole2 +
        +; continuing north from northhole, there is a series of freeclimbable avens going upward, the final survey station is at an awkward but not impassable squeeze. A handline would be very helpful in coming back down. There are also two connections to the frozen north, one is a tube at head height and the other is a small crawl at the start of the choss slope leading to the first aven climb. +
        +icecockLC1 +
        +;linking icecock aven to the ice pit in north hole. +
        +icecock3 +
        +;small sandy floored tube connecting the icecock bypass to the northhole passage +
        +gosserwager2 +
        +linking the bottom of the pitch (name?) to the rift above gosser wager and the pitch down to it, continuing to a boulder choke. +
        +gosserwager3 +
        +Rift passage heading South, with a 15m pitch at head. Clean walls, rubble floor. Leads to short down climb before more rift and another pitch series. +
        +frozennorth +
        +climb up between wall and block, aided by two bolts, to enter ice lake +chamber. Ahead is a large aven with snow slope entering. Just before +this is a small passage on the right. Climb up into this and follow +ice inlet until breaks out into large aven and trench area at station +12. To the south is/was unexplored, but later connected to rest of +cave. To left is small sanding tube to view into same trench system. +
        +frozennorth4 +
        +left juction in frozennorth where there are sandy crawls, comes out on +a precarious ledge above a big hole. Traversing around this leads to a +medium sized sandy crawl sloping downwards to a huge chamber with a +pitch suspected to be the north end of lead 93B from the start of +expo2015 in turtlehead. +
        +frozennorth3: +
        +A rift passage that loops round and links 2 chambers, with possible leads at the end at station 5. +
        +darkartsiv: +
        +continuing A lead at south end of dark arts, went in then surveyed out but didn't make it all the way to connect up the surveys. +
        +cathedralLC2: +
        +Linking avalancheexperience to cathedralchasm without having to use the dodgy data in chamber90b survey +
        +cathedralchasm: +
        +really fucking huge chamber with many good leads. turns out it was already surveyed as chamber90b be Julian. +
        +catherdralchasm2 +
        +Coming fdrom Cathedral Kazam a wet traverse across a pitch David +dropped a setter down. Passage continues to chamber with a loop coming +off to the left up and emerging at top of chamber en route. from +cahmber a rift goes off up right with main passgae continueing +straight. Also a small lead to left leads round to two small 5m pitchs +containg crystal formations. A traverse continues on with another +pitch. Taking the main route from the chamber a sandy passage leads +past three bat skeletons before becoming a crawl, eventually reaching +a junction. the larger passge to the left links back to the passge +near trident junction/ gear dump. This bypass is now the recommended +wat to reach cathedral kazam. +
        +bipedal: +
        +heading south out of amalgamation you arrive at a large long hole in the floor. Partial completion of traverse over hole, plus exploratin of two small side leads. Left over small rock bridge ends in blind pot. Right hand small passage soon becomes too tight. +
        +bipedalpassage5 +
        +short pitch down to large aven chamber with vedose rift in floorway. +
        +hiltigalactica +
        +After dropping initial pitch (Deep Space 9) approx 25m in hilt-a-plenty. +After dropping initial pitch (Deep Space 9) approx 25m in hilt-a-plenty. +Long rocky chamber from bottom of pitch to next unexplored pitch. +Slope near end up left ends after short distance. Small side passage near +start on right continues to small sandy chamber with several leads. +From here archway leads onto bouldery ledge in side of very large chamber +to be explored. +
        + +

        /expofiles/surveyscans/2017/2017notes.txt

        (All moved verbatim, now deleted)

        +
        +
        258 +
        +
        +import other 258 files:
        +   pawpaw
        +   notthebeast
        +To draw up!!!
        +
        +258/whatwouldyourmothersay.svx needs drawing up from notes in 2016#27  (we missed it out)
        +
        +
        264 +
        +
        264/doublescoop from notes in 2016#34
        +nothingtosee3:  264/wallet 2017#52 needs printing out and drawing up
        +
        +dogendseries:   2017#42   notesplan
        +
        +Need to find the snow symbol
        +How to make the jar file work again (and then update all copies in svn)
        +
        +nothingtosee --> imported
        +sloppyseconds2 --> imported
        +naturecalls --> imported
        +
        +created 264post2017b
        +created sloppysecondspart
        +
        +Sync 2016#19 snowhole back to expo computer (as well as whole of 2017)
        +
        +Rescan notes  for 2017#50 (cropped)
        +
        +queries:
        +2017#12. 264/nothingtosee  ULSA distoX. Length calibration -0.05 ('tape too long'). Is that right?
        +2017#15 not_the_best elevation drawn, but not beastsideleads? Plans for bth
        +
        +======================
        +To get the files here:
        +rsync -av expo@expo.survex.com:expofiles/surveyscans/2017/ /home/julian/data/expodata/expofiles/surveyscans/2017/
        +To copy a rendered survey up:
        +scp /home/julian/data/expodata/tunneldata/2017-09-28incomplete1.png expo@expo.survex.com:expofiles/surveys/
        +======================
        +
        +tunnocks high level
        +not_the_beast          2017#15
        +rigormortis            2017#43
        +
        +
        tunnocks deep stuff +
        +
        +mastercave             2017#16    drawnin
        +gryke of the earth     2017#17
        +loserlido              2017#44
        +snakecharmer           2017#06   
        +slackerstidyup         2017#05 background
        +raisinhell             2017#04
        +therestherub           2017#02    drawn
        +snakecharmer2          2017#31   
        +snakecharmer3          2017#32
        +hipsterreturn          2017#35
        +lowersnakebite         2017#40
        +beckoningsilence       2017#41    drawnin
        +bahama                 2017#45
        +
        +
        cathedralchasm offshoots +
        +
        +the_mendips        2017#18  !!!Missing folder!!!  no drawing
        +mysterious_schlag  2017#19  is a pitch in cathedralchasm
        +pointless_dig      2017#20
        +naturecalls        2017#47  not tied in from bottom of Ash's pitch in cathedral chasm bit (have faked it)
        +
        +
        galactica area fuckups +
        +
        +sloppyseconds1  2017#01
        +galactica       2017#03
        +sloppyseconds2  2017#07
        +sloppyseconds   2017#42   dogendseries
        +secondhand      2017#49   
        +
        +missing bit     2017#52
        +nothingtosee    2017#12
        +nothing2see     ???  lost wallet #24 centreline typed
        +nothingtosee3   2017#52  recovered
        +
        +hilti_nts_bones_pitch  2017#21   -linked in now
        +hilti_nts_near_bats    2017#22   -linked in now
        +hilti_nts_near_start   2017#23
        +
        +nothingtosee    2017#39
        +
        +
        surface crap +
        +
        +prospecting   2017#08
        +prospecting   2017#09
        +prospecting   2017#10
        +prospecting   2017#11
        +prospecting   2017#24   !!! not nothing2see as documented
        +watermelon    2017#28
        +kitten-helicopter 2017#33
        +prospecting   2017#34
        +
        +
        Fish Gesicht (2017-cucc-28) +
        +
        +fishface      2017#38
        +fishface      2017#46
        +windytube     2017#37
        +icytube       2017#48
        +fgh           2017#50
        +blitzen       2017#53
        +
        +
        +
        GSH +
        +
        +gsh entrance  2017#25
        +gsh           2017#26
        +coulda        2017#27
        +gsh           2017#29
        +riftpiece     2017#30
        +
        +
        Bad Forecast (2017-pw-01) +
        +
        +gardeningshoots        2017#13
        +thirdentrance          2017#14
        +badforecast            2017#51
        +
        +
        + +

        :expoweb:/1623/264/trident_to_little_boy.txt

        (All moved verbatim, now deleted)

        +
        +
        +Cave: Balcony (Far Side to Deep Balcony) +
        +Trident is a four way junction- take the left fork to an alcove on the left with an obscure mud floored crawl. This is followed for 10m, improving to walking height. Follow past two bat skeletons then right turn to another bat; continue ~20m. A mud floored junction, turn right to the head of a traverse then pitch after 10m. Straight on would have led you to a noteworthy drippy pitch (Kathedral Chasm). +
        +----Honeycomb---- +
        +The traverse to pitch is the beginning of Honeycomb (50m of pitches). This swings to a window, following the rope to a ledge 10m above the floor. From here there's a narrow popcorn-lined climb to the head of a 7m pitch. At the bottom, climb the slope and follow obvious continuation (draught) to the head of 12m pitch. This pitch lands at the top of Hangman (p30), on account of the huge hanging boulder. (The near side of the boulder descends to the way on to the top of Mongol Rally, whereas the far side of the boulder is rigged to swing into a window half way down, Myopia. This is a passage heading north, traversing around a large pit, leading to another pitch which could be traversed around, ?a.) +
        +----Nature Calls---- +
        +At the bottom, follow the traverse round to a mudslope. At the top of the mudslope there is an awkward crawl for 10m, soon improves to walking. Follow this passage for 30m. There's a p5, follow the rope to the head of the Mongol Rally (p200). +
        +----Mongol Rally and Little Boy---- +
        +Descending this rope lands into a roomy boulder chamber. Walking down the slope between boulders (distinguished path in the mud), leads to a blind pit and big aven. A right turn takes you to stooping height passage, for 50m to the head of Little Boy pitch (20m). There is a significant draught here; follow this. The camp is currently at the base of the pitch (August 2018). +
        +----Water collection---- +
        +There are three exits to the chamber.
        +1. a short crawl
        +2. a climb down on the far side.
        +Both lead to the same place and draught. +

        +Leave on the far side of the chamber, via a climb down and turn right, climbing down a boulder into pleasent walking passage, very straight and heading north. The floor is soft wet mud. After ~100m a stream trench enters on the right, followed round a corner into a drippy aven. Collect water here, scoop (mug) advisable. +
        +(Currently unconnected from Grand Prix) +
        +----One direction---- +
        +A little further on from the right turn towards the water cllection, is a muddy ledge on the left hand side (1m from ground). Low crawl continues for 100m in straight line, over three puddles. Stal, but largely unnoteworthy. Ends at the Tsection into clean washed tall rift with sounds of water. Downhill leads to promising a lead, in clean washed rock, sketchy c6, requires rope, heads into rifty stuff. Uphill, includes split (meander) to scoopy loopy junction. +
        +----Scoopy Loopy---- +
        +Scoop it until you loop it. Junction has small a lead on right hand wall, to sound of wet rift. Obvious way on cuts left, walking passage heading upwards until low crawl into breakdown chamber. A climb on the right links into Grand Prix. +
        +----Nothing to do with you traverse---- (ntdwyt) +
        +The passage towards the water collection is followed, beyond the turning for water. This leads to a pitch down (Indy Rally) or a traverse left. The traverse left goes ~10m, before muddy walking passage ~30m until it chokes. +
        +----Little boy beneath the boulders---- +
        +A short 2m climb through a boulder choke leads to break down chamber directly below grand prix. Qmc at station 8, p10, probably drops level with station 6 (lbbeneaththeboulders). +
        +----Little boy bolt climbs---- +
        +From the grand prix, left from little boy beneath the boulders is a large hanging boulder. Traverse along massive choked boulder on left hand side of grand prix. Not derigged. Climbs up steep mud slope into rift that shortly forks (station 4). P15 qmc down from here, leads probably to lbbeneaththeboulders. Sketchy rift climb qmc from here, dispute about seeing a human sized passage beyond here. + + +
        + + +
        Demonstration text as initially read from disc
        +
        +See also System Maintenance to-do list
        +Back to Data Maintenance manual + +
        + diff --git a/handbook/computing/todo-styles.css b/handbook/computing/todo-styles.css index 5e5c21fb4..06215e6ea 100644 --- a/handbook/computing/todo-styles.css +++ b/handbook/computing/todo-styles.css @@ -68,6 +68,8 @@ dd { dd:before { content: "» "; + font-weight: bold; + color: red; } /* Default State */ @@ -99,6 +101,7 @@ input[type=checkbox]:checked ~ dl dd { } dt, p { font: 1.0em Calibri, sanserif; + font-weight: bold; } dd { font: 0.8em Calibri, sanserif; diff --git a/handbook/computing/todo.html b/handbook/computing/todo.html index c28dee07f..c700031e1 100644 --- a/handbook/computing/todo.html +++ b/handbook/computing/todo.html @@ -4,159 +4,144 @@ Expo Systems - To-Do List + -

        Expo To-Do List

        - - - - + + + + +

        Expo Systems To-Do List

        + + - +

        How this works

        -

        Click on a sub-heading to reveal the individual to-do items. Click again to hide.
        +

        Click twice on a sub-heading to reveal the individual to-do items. Click again to hide.
        If a heading is in italics, then there are hidden items.

        Click on the main "How this works" heading to toggle reveal/hide everything.

        Printing this page uses a much smaller font. Complain to the nerd list if you don't like this behaviour.

        Edit this page by clicking on the big blue button. It uses the same "Edit this page" function that you may have used before. Just be careful not to touch the code at the top and bottom of the page. -

        We are working on a more capable and easier-to-use system (see x-todo.html) which will mimic how GitHub Issues do this sort of thing. +

        We are working on a more capable and easier-to-use system which will mimic how GitHub Issues do this sort of thing. +

        To see the "data maintenance" and "survey data-entry" to-do lists, go to the other TO-DO list

        Process Documentation

        Wallets and new-cave
        -
        Explain (in the wallets process) how to view the surveys - online so that
          (1) you can see an example of how to do your new one, - and
          (2) so that you can check that you have done it properly when you - have finished.
        -
        Explain how to link a new cave into the other caves in - troggle filesystem
        -
        Explain how to add photos with the correct URL format to sub-HTML files attached to New Caves
        +
        Explain (in the wallets process) how to view the surveys + online so that
          (1) you can see an example of how to do your new one, + and
          (2) so that you can check that you have done it properly when you + have finished.
        +
        Explain how to link a new cave into the other caves in + troggle filesystem
        +
        Explain how to add photos with the correct URL format to sub-HTML files attached to New Caves
        svx check
        explain command line to run on newly typed survex file to check for format errors '$cavern xxxx.svx' -
        explain when to use svxtrace.py current scripts +
        explain when to use svxtrace.py current scripts +
        Making an svx - explain how to make link to *ref to wallet folder +
        explain how to put stuff in the wallet folder and how to look at expofiles/photos/xml/ +
        Add to user data manual how to upload to expofiles - in the "survey manual" +
        Add in description of *where* to put the drawings files
        QMs check
        -
        explain when to use svx2qm.py -> qms.csv-> tablize-qms.pl current scripts -
        explain when to use find-dead-qms.py and qmreader.pl current scripts +
        explain when to use svx2qm.py -> qms.csv-> tablize-qms.pl current scripts +
        explain when to use find-dead-qms.py and qmreader.pl current scripts
        -

        Surveys data entry

        -
        -
        QMs check
        -
        Collect together the old "to do" and "readme" notes and put them in a standard place: expoweb/[year]/TODO.html(with self-edit instructionslike this page) -
        Write code to automatically extract ref info about wallets from tunnel xml files -
        This will replace :drawings:chk-xml.txt as used by :drawings:check-xml.sh -
        Do similar for Therion files when people start using #REF comments - -
        2019 surveyscans - -
        edit all the content.json
        -
        try to autocomplete the content.json by parsing .svx files
        -
        Put personal names into canonical form
        -
        2014 contents.json -
        parse all the svx files to extract people, dates & svx references -
        - - -

        Logbook fettling

        -
        -
        2019 Logbook
        -
        - transcribe the rest of those UKcaving blog entries into expoweb/years/2019/logbook.html
        -
        - copy the photos from the UKCaving blog into expofiles/photos/2019// -- in fact many of those photos are already there
        -
        edit in the links to those photos in the right place in 2019/logbook.html
        - -
        Garlic cave -
        edit logbook entries 2018, 2019 to link to extensive photos of Garlic cave area {Withnall 2018} , {Becka 2019} -
        Past logbooks - missing images? -
        Which previous years HTML logbooks are missing images extracted from scanned PDF copies of the logbooks? - -
        imagemagick convert -
        Not working for PDFs on current version of xubuntu ! Fix & document. Also not working on WSL ubuntu. Needed to work with logbook images easily. - -
        2018 Logbook
        -
        Check Natalie Uomini's typed entries and extensive photos are minimized and linked in properly to the HTML logbook - - -
        Add missing images to logbooks
        -
        - 2000, 2008, 2009, 2011
        -
        - fix corrupted image in 2001 log
        - -
        2011 logbook:
        -
        type up via-ferrate & bolt-testing writeups (In paper book, not in scan or HTML)
        - -
        200? logbook:
        -
        - Type up "list of GPS locations still to type"
        - -

        Handbook

        -
        Desperately needs Navigation - Location Context, Situational Awareness -
        No overall view of what there is: need a user-friendly diagrammatic overview sitemap. There are 4,869 files in :expoweb:
        -
        Not fixed by menus - breadcrumbs needed?
        -
        Diagrams of major sections: survey handbook, rigging handbook, computing handbook, Areas, cave data..
        -
        Chase Airoa to help fix the menus for phones
        -
        Look at gov.uk guidelines for inspiration
        +
        No overall view of what there is: need a user-friendly diagrammatic overview sitemap. There are 4,869 files in :expoweb:
        +
        Not fixed by menus - breadcrumbs needed?
        +
        Diagrams of major sections: survey handbook, rigging handbook, computing handbook, Areas, cave data..
        +
        Chase Airoa to help fix the menus for phones
        +
        Look at gov.uk guidelines for inspiration
        When git migration done
        Edit out all mercurial
        Split the TortoiseHg/PuTTy documentationa nd retain only PuTTy -
        Wookey Overview presentation -
        extract content from Troggle which does not render properly and extract the HTML not in slide format - correcting things now outdated. +
        NOEDIT flag +
        When editing multiple pages (using git), describe how this is implemented using <meta name="keywords" content="NOEDIT"> +
        Editing Logbooks +
        DOCUMENT how to pout the "cave" or "locatoion" into the logbook entry title +
        add the triptitle "location - " to logbook template (example) file (where?)

        Photos

        Fix the BINS package -
        set up git on the BINS software? Fix base url sautret.org
        -
        set up a cron / Makefile job to run BINS
        -
        why is 'updatephotos' script in expofiles?
        -
        Document the ~expo/webphotos/ directory and how it works -
        Why does expofiles/photos/xml/ get created containing all the generated xml files? Fix this. +
        set up git on the BINS software? Fix base url sautret.org
        +
        set up a cron / Makefile job to run BINS
        +
        why is 'updatephotos' script in expofiles?
        +
        Document the ~expo/webphotos/ directory and how it works +
        Why does expofiles/photos/xml/ get created containing all the generated xml files? Fix this. +
        galley thumbs etc. +
        :expoweb:/galley/0.htm thumbnails not loading
        +

        Surveys data entry documentation

        +
        +
        QMs check
        +
        3 ways to do it: archaic (as in databaseRest, new troggle & the Withnall script) +
        Write code to automatically extract ref info about wallets from tunnel xml files +
        This will replace :drawings:chk-xml.txt as used by :drawings:check-xml.sh +
        Do similar for Therion files when people start using #REF comments +
        2019 surveyscans + +
        edit all the content.json
        +
        try to autocomplete the content.json by parsing .svx files
        +
        Put personal names into canonical form
        +
        2014 contents.json +
        parse all the svx files to extract people, dates & svx references +
        +

        Laptop config.

        +
        +
        imagemagick convert +
        Not working for PDFs on current version of xubuntu ! Fix & document. Also not working on WSL ubuntu. Needed to work with logbook images easily & to extract PDFs, JPEGs. Need to edit /etc/ImageMagick-6/policy.xml +cromwell-intl.com/open-source/pdf-not-authorized.html + +

        System Documentation

        Document how we generate the SMK overall lengths and stats
        -
        scripts and manual actions in cavern - +
        scripts and manual actions in cavern +
        smklengths.sh script +
        smklengsths.odt +
        :loser:/docs/ files +
        Questions.txt +
        SMKlog.txt +
        "other scripts" - DOCUMENT +
        finish writing notes on files already identified
        Troggle architecture
        -
        Handbook: add more to the new troggle architecture documentation. For future system maintainers
        -
        Regenerate the diagram of the tables in the database & document
        -
        Describe the parsing/import procedures so non-nerds can do it
        -
        Copy [some of] the .wiki material into the documentation somewhere
        +
        Handbook: add more to the new troggle architecture documentation. For future system maintainers
        +
        Regenerate the diagram of the tables in the database & document
        +
        Describe the parsing/import procedures so non-nerds can do it
        +
        Copy [some of] the .wiki material into the documentation somewhere
        Surveyscans
        -
        explain where the image files are referenced from: svx, tunnel/therion, and
        -
        why there are so many broken links
        -
        Apache & MySQL configuration -
        DOCUMENT How to set up a server -
        Explain why Docker containers can be a maintenance nightmare +
        explain where the image files are referenced from: svx, tunnel/therion, and
        +
        why there are so many broken links
        +
        non-troggle scripts -
        DOCUMENT them all - have we got a full list? +
        DOCUMENT them all - have we got a full list?
        @@ -164,294 +149,81 @@ If a heading is in italics, then there are hidden items.

        Troggle

        Better import error messages -
        REPORT if import surveyscan file failure -
        Why are so many surveyscan foolder missing after import? -
        WHY are total lengths of surveyed cave different between expo server and WSL server for 2019 and a few other years only ? -
        NOEDIT flag -
        Describe how this is implemented using <meta name="keywords" content="NOEDIT"> +
        REPORT if import surveyscan file failure into database error log +
        REPORT 'folder not recognised' errors into error log inside database +
        WHY are total lengths of surveyed cave different between expo server and WSL server for 2019 and a few other years only ? +
        DEBUG - too many messages - reduce the number unless we need them +
        Why is "kataster' not found ?! +
        What is "GPS "not parsed in survex" mean +
        Test import when: +
        no profile logging .json file present +
        Troggle Menus +
        Explain how FLATPAGES work +
        NOEDIT flag Describe how this is implemented using <meta name="keywords" content="NOEDIT"> e.g. for auto-generated pages such as folk script -
        Logbook data model: unfilled fields? -
        'cave' of location field missing on nearly all logbook entroies. Missing from logbook templates. Where is this used and how can we fill it it in? Is it useful? -
        +
        Logbook data model: unfilled fields? +
        'cave' of location field missing on nearly all logbook entries. Missing from logbook templates. Fill in manually for pre-2017 logbooks. +

        Expo Server

        document directory structure +
        as per Julian's GitHub list - then close that issue
        +
        Makefile +
        Get it working ! -
        as per Julian's GitHub list - then close that issue
        permissions +
        do we need a cron job or has the group membership fix fixed it ? either way, document it. +
        Makefile - and permissions. -
        do we need a cron job or has the group membership fix fixed it ? either way, document it. -
        +
        Apache & MySQL configuration +
        DOCUMENT How to set up a server +
        Fix and document permissions for cron jobs +
        Explain why Docker containers can be a maintenance nightmare
        -

        Tackle Store Records

        -
        -
        No authoritative list of where the expo paper records are! -
        NO expo paperwork at all prior to 2008 in Tackle Store - where is it ? -
        FIND where all the wallet binders are, and the logbooks. -<
        BUY A4 plastic boxes for filing cabinet for logbooks getting damp there. -
        2017, 2018, 2019 wallet binders are in Philip S.'s house. -

        - This to-do-list gadget itself +This to-do-list gadget itself

        -
        Status -
        Try the Experimental to-do list - no extra display capabilities yet. -
        Fix the "click twice" on startup. Make it only click once to change display state of the DT tag +
        Status +
        Make it only click once to change display state of the DT tag
        Eventual aim -
        to replace GitHub - CUCCexposurveyissues for non-tunnel, non-GIS issues.
        -
        We need two of these:
        1.for expo systems work (troggle & scripts) - the current priority as we have nowhere currently that Wookey is willing to use -
        2.for survey data progress/issues (though troggle itself can be used for some of this if cleaned up a bit) - -
        +
        to replace GitHub +CUCCexposurveyissues for non-tunnel, non-GIS issues.
        Try to automate simple functions in javascript -
        to control this document - in-place (tick, delete) instead of using the - tinymce HTML editor in Django
        -
        Maybe restructure whole page as JSON and use - javascript editor to create (edit), re-order and demote items.
        -
        if using tinymcs, use the INLINE mode.
        -
        Implement comments on an issue, mimicking GitHub issues wiki
        -
        Use javascript to skip over the _edit page and submit changes - direct to server when updating. Needs direct POST and include the javascript in the posted content.
        -
        checkboxes so that items can be ticked (which also does strike-through)
        -
        promotion/demotion options?
        -
        bin icon to delete an item? Better to have an archive process.
        +
        to control this document +in-place (tick, delete) instead of using the +tinymce HTML editor in Django
        +
        Maybe restructure whole page as JSON and use +javascript editor to create (edit), re-order and demote items.
        +
        if using tinymcs, use the INLINE mode.
        +
        Implement comments on an issue, mimicking GitHub issues wiki
        +
        Use javascript to skip over the _edit page and submit changes +direct to server when updating. Needs direct POST and include the javascript in the posted content.
        +
        checkboxes so that items can be ticked (which also does strike-through)
        +
        promotion/demotion options?
        +
        bin icon to delete an item? Better to have an archive process.
        Local WSL server -
        Why is it using recuced-capability tinymce, a paths problem ? +
        Why is it using recuced-capability tinymce, a paths problem ?
        Italics management -
        Hide ALL DD if any Heading clicked. -
        Put DL into italics when *any* DD is hidden - - -
        -

        Cave Updating

        -
        -
        1623/251
        -
        Put in tunnel plan instead of scan of drawn-up notes.
        -
        Draw up elevation (therion)
        - -
        All copied verbatim from :expoweb:/1623/264/cavedescription2016
        which has now been deleted. - -
        -tightyorkshireman
        -
        -person size phreatic tube, left passage emerges at pitch head, right passage becomes too tight.
        -
        -rabbitwarrens
        -Sandy crabwalk turning into a tube parallel to main passage connecting to ein und zwanzig
        -
        -noserock2
        -Pitch dropped round the corner from the pitch in noserock. Lots of
        -break-down and pitch ended in a choked chamber floor.
        -
        -northhole
        -;Small grotty hole in the floor of eis koek aven, which connects through to the nearby large hole down to a circular ice floor.
        -
        -northhole2
        -; continuing north from northhole, there is a series of freeclimbable avens going upward, the final survey station is at an awkward but not impassable squeeze. A handline would be very helpful in coming back down. There are also two connections to the frozen north, one is a tube at head height and the other is a small crawl at the start of the choss slope leading to the first aven climb. 
        -
        -icecockLC1
        -;linking icecock aven to the ice pit in north hole.
        -
        -icecock3
        -;small sandy floored tube connecting the icecock bypass to the northhole passage
        -
        -gosserwager2
        -linking the bottom of the pitch (name?) to the rift above gosser wager and the pitch down to it, continuing to a boulder choke.
        -
        -gosserwager3
        -Rift passage heading South, with a 15m pitch at head. Clean walls, rubble floor. Leads to short down climb before more rift and another pitch series.
        -
        -frozennorth
        -climb up between wall and block, aided by two bolts, to enter ice lake
        -chamber. Ahead is a large aven with snow slope entering. Just before
        -this is a small passage on the right. Climb up into this and follow
        -ice inlet until breaks out into large aven and trench area at station
        -12. To the south is/was unexplored, but later connected to rest of
        -cave. To left is small sanding tube to view into same trench system.
        -
        -frozennorth4
        -left juction in frozennorth where there are sandy crawls, comes out on
        -a precarious ledge above a big hole. Traversing around this leads to a
        -medium sized sandy crawl sloping downwards to a huge chamber with a
        -pitch suspected to be the north end of lead 93B from the start of
        -expo2015 in turtlehead.
        -
        -frozennorth3:
        -A rift passage that loops round and links 2 chambers, with possible leads at the end at station 5. 
        -
        -darkartsiv:
        -continuing A lead at south end of dark arts, went in then surveyed out but didn't make it all the way to connect up the surveys.
        -
        -cathedralLC2:
        -Linking avalancheexperience to cathedralchasm without having to use the dodgy data in chamber90b survey
        -
        -cathedralchasm:
        -really fucking huge chamber with many good leads. turns out it was already surveyed as chamber90b be Julian.
        -
        -catherdralchasm2
        -Coming fdrom Cathedral Kazam a wet traverse across a pitch David
        -dropped a setter down. Passage continues to chamber with a loop coming
        -off to the left up and emerging at top of chamber en route. from
        -cahmber a rift goes off up right with main passgae continueing
        -straight. Also a small lead to left leads round to two small 5m pitchs
        -containg crystal formations. A traverse continues on with another
        -pitch. Taking the main route from the chamber a sandy passage leads
        -past three bat skeletons before becoming a crawl, eventually reaching
        -a junction. the larger passge to the left links back to the passge
        -near trident junction/ gear dump. This bypass is now the recommended
        -wat to reach cathedral kazam.
        -
        -bipedal:
        -heading south out of amalgamation you arrive at a large long hole in the floor. Partial completion of traverse over hole, plus exploratin of two small side leads. Left over small rock bridge ends in blind pot. Right hand small passage soon becomes too tight. 
        -
        -bipedalpassage5
        -short pitch down to large aven chamber with vedose rift in floorway.
        -
        -hiltigalactica
        -After dropping initial pitch (Deep Space 9) approx 25m in hilt-a-plenty.
        -Long rocky chamber from bottom of pitch to next unexplored pitch.
        -Slope near end up left ends after short distance. Small side passage near
        -start on right continues to small sandy chamber with several leads.
        -From here archway leads onto bouldery ledge in side of very large chamber
        -to be explored.
        -
        -
        -
        - -
        All copied verbatim from :expoweb:/1623/264/trident_to_little_boy.txt
        which has now been deleted. - -
        -Cave: Balcony (Far Side to Deep Balcony)
        -
        -Trident is a four way junction- take the left fork to an alcove on the left with an obscure mud floored crawl. This is followed for 10m, improving to walking height. Follow past two bat skeletons then right turn to another bat; continue ~20m. A mud floored junction, turn right to the head of a traverse then pitch after 10m. Straight on would have led you to a noteworthy drippy pitch (Kathedral Chasm). 
        -
        -----Honeycomb----
        -The traverse to pitch is the beginning of Honeycomb (50m of pitches). This swings to a window, following the rope to a ledge 10m above the floor. From here there's a narrow popcorn-lined climb to the head of a 7m pitch. At the bottom, climb the slope and follow obvious continuation (draught) to the head of 12m pitch. This pitch lands at the top of Hangman (p30), on account of the huge hanging boulder. (The near side of the boulder descends to the way on to the top of Mongol Rally, whereas the far side of the boulder is rigged to swing into a window half way down, Myopia. This is a passage heading north, traversing around a large pit, leading to another pitch which could be traversed around, ?a.)
        -
        -----Nature Calls----
        -At the bottom, follow the traverse round to a mudslope. At the top of the mudslope there is an awkward crawl for 10m, soon improves to walking. Follow this passage for 30m. There's a p5, follow the rope to the head of the Mongol Rally (p200). 
        -
        -----Mongol Rally and Little Boy----
        -Descending this rope lands into a roomy boulder chamber. Walking down the slope between boulders (distinguished path in the mud), leads to a blind pit and big aven. A right turn takes you to stooping height passage, for 50m to the head of Little Boy pitch (20m). There is a significant draught here; follow this. The camp is currently at the base of the pitch (August 2018). 
        -
        -----Water collection----
        -There are three exits to the chamber. 
        -1. a short crawl 
        -2. a climb down on the far side. 
        -Both lead to the same place and draught. 
        -
        -Leave on the far side of the chamber, via a climb down and turn right, climbing down a boulder into pleasent walking passage, very straight and heading north. The floor is soft wet mud. After ~100m a stream trench enters on the right, followed round a corner into a drippy aven. Collect water here, scoop (mug) advisable. 
        -
        -
        -
        -
        -(Currently unconnected from Grand Prix)
        -
        -----One direction----
        -A little further on from the right turn towards the water cllection, is a muddy ledge on the left hand side (1m from ground). Low crawl continues for 100m in straight line, over three puddles. Stal, but largely unnoteworthy. Ends at the Tsection into clean washed tall rift with sounds of water. Downhill leads to promising a lead, in clean washed rock, sketchy c6, requires rope, heads into rifty stuff. Uphill, includes split (meander) to scoopy loopy junction.
        -
        -----Scoopy Loopy----
        -Scoop it until you loop it. Junction has small a lead on right hand wall, to sound of wet rift. Obvious way on cuts left, walking passage heading upwards until low crawl into breakdown chamber. A climb on the right links into Grand Prix.
        -
        -----Nothing to do with you traverse---- (ntdwyt)
        -The passage towards the water collection is followed, beyond the turning for water. This leads to a pitch down (Indy Rally) or a traverse left. The traverse left goes ~10m, before muddy walking passage ~30m until it chokes.
        -
        -----Little boy beneath the boulders----
        -A short 2m climb through a boulder choke leads to break down chamber directly below grand prix. Qmc at station 8, p10, probably drops level with station 6 (lbbeneaththeboulders).
        -
        -----Little boy bolt climbs----
        -From the grand prix, left from little boy beneath the boulders is a large hanging boulder. Traverse along massive choked boulder on left hand side of grand prix. Not derigged. Climbs up steep mud slope into rift that shortly forks (station 4). P15 qmc down from here, leads probably to lbbeneaththeboulders. Sketchy rift climb qmc from here, dispute about seeing a human sized passage beyond here. 
        -
        -
        +
        Put DL into italics when *any* DD is hidden
        -
        - - Testing area..
        Demonstation text as initially read from disc
        - - -
        diff --git a/handbook/computing/todo.js b/handbook/computing/todo.js new file mode 100644 index 000000000..8765a0e82 --- /dev/null +++ b/handbook/computing/todo.js @@ -0,0 +1,71 @@ + +document.getElementById("demo").innerHTML = "Script working CONFIRMED"; + +// TO DO - make the
        italic when any of the
        following it are hidden. + +// Set up the click handlers: +var itemlist = document.getElementsByTagName('dd'); +for (i = 0; i < itemlist.length; i++) { + itemlist[i].onclick = hideable; +} + +var itemlist = document.getElementsByTagName('dt'); +for (i = 0; i < itemlist.length; i++) { + itemlist[i].onclick = showable; +} + +var itemlist = document.getElementsByTagName('h2'); +for (i = 0; i < itemlist.length; i++) { + itemlist[i].onclick = h2toggle; +} + +function showable () { +// When clicking on a
        item, show or not all the following
        elements + if (this.style.fontStyle != "italic") { + this.style.fontStyle = "italic"; + } else { + this.style.fontStyle = "normal"; + } + var ddO = this.nextElementSibling; + while((ddO !== null) && (ddO.nodeName.toLowerCase() == 'dd')){ + if (this.style.fontStyle != "normal") { + ddO.style.display = 'none'; + } else { + ddO.style.display = 'block'; + } + ddO = ddO.nextElementSibling; + } + +} + +function hideable () { +// When clicking on a
        item, show or not itself + var x = this; + if (x.style.display != "block") { + x.style.display = "block"; + } else { + x.style.display = "none"; + } +} + +function h2toggle () { +// When clicking on a

        item, toggle the display of absolutely everything + var itemlist = document.getElementsByTagName('dd'); + for (i = 0; i < itemlist.length; i++) { + x = itemlist[i] + if (x.style.display != "block") { + x.style.display = "block"; + } else { + x.style.display = "none"; + } + } + var dtlist = document.getElementsByTagName('dt'); + for (i = 0; i < dtlist.length; i++) { + x = dtlist[i] + if (x.style.fontStyle != "normal") { + x.style.fontStyle = "normal"; + } else { + x.style.fontStyle = "italic"; + } + } +} diff --git a/handbook/computing/useany.html b/handbook/computing/useany.html new file mode 100644 index 000000000..3b960eda3 --- /dev/null +++ b/handbook/computing/useany.html @@ -0,0 +1,119 @@ + + + + +CUCC Website - Platform portability + + + +

        CUCC Expedition Handbook - Online overview

        + +

        Platform portability - Oct.2006

        +

        [This is an archive page. It significantly pre-dates troggle.] +

        +What browser do you want to use ? + +

        The maintainers of the CUCC website are acutely sensitive to the +difficulties of our users on a variety of platforms. Indeed, most of the +editing is done on an Acorn platform (using !Zap), the website on cucc.survex.com +is served from an OpenBSD server, and pages are most commonly viewed on an +expedition PC running some shade of Linux or Windows (and now we have at least one +Linux Laptop). On the plateau, the pages live on a Psion. Pages may come from +local disc, flashcard, CD or over a network from a server which may (or may +not) be running Apache. + +

        +Open Content +In keeping with the aims of the +Any Browser Campaign, +we aim to make the pages work on any browser, on any platform, degrading +gracefully when used with no images, old browsers, tiny screen resolutions +and/or no colour. We have also aimed to keep transfer and rendering times +to a minimum, especially for entry pages which new users will see first. + +

        On the other hand, we think the site is improved by the use of bits of +cave survey, photographs, maps and data laid out for legibility. Images, +imagemaps, tables and even frames are all used on the site where the +content is significantly enhanced. We have endeavoured to provide links +for non-framed browsers, text alternatives to imagemaps and descriptions +which make sense without accompanying photos or diagrams. + +

        Sometimes this has failed - for example we have not found a good way of +indexing the survey data. The way that those pages should work "intuitively" +is not actually supported by current html. Methods which overcome this when +the pages come from a server don't work when the pages are browsed locally, +and you may see this symbol in a few places as a consequence: + +

            looks broken with any browser :-( + +

        Multi-language support

        + +

        Our readership is international, and in particular we are an English +group writing mainly about activities in a German-speaking area. We +cooperate with cavers who are and have been active in the area, from +Austria, Germany, France, Belgium and elsewhere. Some of the material +here has been translated from publications by these other groups. Some of +it has been translated from English into other languages. We are trying +to build a scheme under which you can easily see when translations exist, +and which will also let Apache serve you a version of the page in your +preferred language where this exists. + +

        It is another aim to support speech-synthesising browsers by flagging the +language of every phrase which differs from the base-language of the page in +which it is embedded, so you don't get joke pronunciation. This is proving to +be a lot of work, invisible to most users, and still not fully supported by +html itself (eg. we can't find official language codes for Mallorcain, nor +Pidgin, both of which appear in articles in Cambridge Underground). + +


        +

        The CUCC pages are typically tested on the following platforms, via +net connections (LAN, and very occasionally dial-up) and on local disc, +except where stated: + +

          +
        • Acorn RISC PC (RISC OS 3.5, 1024x768 screen) +
        • Acorn StrongARM RISC PC (RISC OS 4.02) +
        • Moderately slow PC (MS Windows 95, large screen) +
        • Faster PC (MS Windows NT 4, large screen) +
        • and again (RedHat Linux 6.0, Gnome, 1600x1200) +
        • Moderately slow PC (RedHat Linux 6.0, Gnome, 800x600) +
        • Hewlett Packard Omnibook XE2 (Windows 98, 800x600, from CD-RW) +
        • same again (Mandrake Linux 6.1 + XFree86 3.3.6, KDE, 800x600, from CD-RW) +
        • Acorn A4 (RISC OS 3.1, VGA screen or 16-grey LCD) +
        • Psion 5 (EPOC, 640x240, from flash memory) +
        + +

        and with the following browsers: +

          +
        • !ArcWeb 1.92 +
        • !Fresco (1.72 on RO3, 2.02 on RO4) +
        • Amaya 2.4 (Linux and Windows) +
        • Internet Explorer 2 +
        • Internet Explorer 3 +
        • Internet Explorer 4 +
        • Internet Explorer 5 +
        • Netscape 3 (just Windows) +
        • Netscape 4 (Windows and Linux) +
        • Psion/Symbian Web v2.50 +
        + +

        That's not to say that every page gets looked at with every combination of +browser and platform every time it is changed ! A few pages have been tested +with HotJava and !BookWorm, and Opera might be on the list in the near +future. We don't have a platform that runs BeOS. Notable by its absence is +the Mac and any browser that runs on it. I haven't got one, and the last time +I had the chance to use one, it was a little 12" monochrome screen model with +a single-button mouse, before the world-wide web was invented. Things have +moved on a bit since then ... +


        +

        [Rescued from old CUCC website archive - file dated 2 October 2006 - almost certainly written by Andy Waddington] +

        See also: +

        +

        + + + \ No newline at end of file diff --git a/handbook/computing/wookey-slides.html b/handbook/computing/wookey-slides.html new file mode 100644 index 000000000..92e279c8e --- /dev/null +++ b/handbook/computing/wookey-slides.html @@ -0,0 +1,214 @@ + + + + +CUCC Expedition Handbook: Online systems presentation + + + +

        CUCC Expedition Handbook - Online systems presentation

        + +

        CUCC Austria Expeditions: Slides

        + +

        Expo Computer & website - Wookey's Presentation 22 Aug 2015

        + +

        Original presentation is online. +This copy includes corrections of fact as of April 2020 [in square brackets]. +

        + +
        +

        The annual CUCC expedition to Austria lasts around five weeks each summer +and concentrates mainly on new exploration in the high alpine karst of the +Loser plateau (about 80km E of Salzburg). Recent large projects are: + +

        Data Storage
        +

        +
          +
        • Version-controlled repositories
          +
        • +
            +
          • website ('expoweb')
            +
          • +
          • troggle
            +
          • +
          • loser
          • +
          • drawings (tunneldata)
          • +
          +
        • expofiles - just files
        • +
            +
          • photos
          • +
          • presentations
          • +
          • posters
          • +
          • maps
          • +
          • documents
          • +
          +
        + +

        Website Structure [as in 2015]

        +
          +
        • Static web pages +
            +
          • indexes, festering, background, handbook< +
          + +
        • Generated web pages +
            + +
          • prospecting guide +
          +
        • Troggle pages +
            +
          • cave pages,survey scans, logbook entries, triplists +
          • Troggle also 'wraps' the other [static] stuff
            +
          +
        +

        WEBSITE LAYOUT [as in 2015]

        +
          +
        • + + years + has per-year info (reports, lists, policy, logbooks)
        • +
        • + + handbook + contains handbook
        • +
        • 1626, 1623 are the [Austrian kataster] areas
        • +
        • + + noinfo +   - dir used to be hidden on public web
          +
        • +
            +
          • scripts are in noinfo/ [or scripts/ ] +
          • +
          +
        • generated files are regenerated with 'Make' in expoweb dir
            (click on 'others'-> 'Regenerate website' is the same)
        • +
            +
          • prospecting guide is in noinfo/prospecting_guide_scripts [broken] + +
          • +
          +
        • folk is people list, now generated from folk/folk.csv by scripts/make-folklist.py +
          +
        • +
        +

        Editing [as in 2015]

        + Don't try to edit generated files.
        + Can edit in various ways: +
          +
        • In expo file manager (best)
          +
        • +
        • Live on website (not recommended)
          +
        • +
        • (Clone and) edit on another computer
        • +
        +

        You always have to commit [version control] afterwards, however you edited. + +

        Managing Files

        + +EVERYTHING should be on the website!
        +(HUGE BINARIES SHOULD NOT BE IN version control)
        + +
      • Info should go in the website handbook (as html, or PDF) +
      • Layout files edited every year make sense as ODT docs:
        +       (survey index, labels, accounting procedure) +
      • Link from website, store in website or expofiles/uploads +
      • Don't just create a random doc and leave it in 'Desktop'. +
      • Think about where some info would be found
        + +

        Survex Dataset

        + + +
      • caves
      • +
      • surface
      • +
      • surface/terrain
        +
      • +
      • fixedpts
      • +
      • template: example files
        +
      • +
      • docs/datamaintenance.txt has some rules.
        +        Should be in the handbook +
      • +
      • + surface/caves connected by ents.svx, which is generated by make-ents.py, which
        +        fishes out every point marked with *entrance in the dataset. 
               ARGE do this wrong, with *fix in cave +
      • +
      • + all* make various groupings of data +
        +
      • + +

        Adding a CAVE

        +
          +
        • Location
          +
        • +
        • Photo
        • +
        • Survey data
        • +
        • Survey notes
          +
        • +
        • Description
        • +
            +
          • rigging guide
            +
          • +
          +
        • Tag status
        • +
        • Question marks
          +
        • +
        • Drawn up (paper/tunnel/therion)
          +
        • +
        • [Now go to the current documentation for adding a cave] +
        + +

        You are not finished until all of these are done +

        Actually adding a cave (1)

        +
          +
        • Survey data [as survex file] in loser/caves/<number> +
        • Simple caves go in:
            +
          • location, name, description in expoweb/1623/cave_data/ +
          +
        • Complex caves go in: +
            +
          • expoweb/1623/<cavenumber>/ +
          +
        • [Now go to the current documentation for adding a cave] +
        +

        Actually adding a cave (2)

        +
          +
        • Notes go into physical survey folder. +
        • Scans go into expofiles/surveyscans/<year>/<year>-<folderID> + +
        • QMs don't seem to have a plan. Needs standardising [now as ;QM in .svx files] + + +
        • Caves with no number are called <year>-<initials>-<nn> and go in file expoweb/cave_data/<kataster_area>-<year>-<initials>-<nn> [e.g. 1623-2018-dm-07.html] +
        • [Now go to the current documentation for adding a cave] +
        +

        Troggle 

        +

        Django-based. +

      • URL list filter /cave, /expedition, /survey +
      • Templates for pages +
      • Processors to generate them
        + +
      • Parsers to read in from website files. +
      • Database back end (mysql)
        + + +
      • The files are the 'real' database. +
      • Run databaseReset.py reset
        + +

        Troggle updating

        + +
      • For a new year, edit expoweb/noinfo/folk.csv +
      • This is the thing that 'creates' a new 'expedition' (not the logbook!)
        + +
      • Run databaseReset.py reset +to reparse everything. +

        + +
      • +
        +Return to Systems Overview +
        + + \ No newline at end of file diff --git a/handbook/computing/yourlaptop.html b/handbook/computing/yourlaptop.html index b4e2a8dfa..51c015b2a 100644 --- a/handbook/computing/yourlaptop.html +++ b/handbook/computing/yourlaptop.html @@ -72,15 +72,21 @@ but all the recommended software here is open source (and please don't install p -

        Note that on a Debian/Ubuntu machine you should normally install the versions that come with the distro, not be getting things fromthe above sites

        +

        Note that on a Debian/Ubuntu machine you should normally install the versions that come with the distro, not be getting things from the above sites

        -

        For Linux users only: +

        For Linux users only:

        • GUI for git - There is a choice on Linux but many people just use the command line.
        • Your favourite text editor. gedit is installed on the expo laptop and has syntax highlighting for .svx files too. This works with all GtkSourceView-based editors (thanks to Phil Withnall).
        +

        For Linux and WSL (text mode only) Windows users only:

        +
          +
        • Survex is a package on debian and ubuntu but is not up to date. You need to attach to a ppa to get the latest survex: +ubuntu and debian download. This is also the version to use on WSL for doing 'cavern' command-line things in WSL (such as doing troggle imports of all the svx data) +
        -

        For Windows users only: + +

        For Windows users only:

        None of this works until you set up the key-pair setup using PuTty/Pageant.
          @@ -99,7 +105,8 @@ but all the recommended software here is open source (and please don't install p

        A short note about the phenomenon of VS code is in order. In case you didn't know, by 2018 over a third of software developers used this editor for their Linux and Windows work and it is undoubtedly more now. Not for beginners. -

        For Android phones: + +

        For Android phones:

      • More resources on surveying
      • +
      • History of cave data archiving here (broken links).
      • More obscure methods: -
      • GPS for Surveying: Austrian Coordinate Systems and how to convert between them
      diff --git a/handbook/troggle/datamodel.html b/handbook/troggle/datamodel.html new file mode 100644 index 000000000..a3aee257b --- /dev/null +++ b/handbook/troggle/datamodel.html @@ -0,0 +1,545 @@ + + + + +Handbook Troggle Data Model + + + +

      CUCC Expedition Handbook - troggle

      +

      Troggle Data Model (python)

      + +

      Troggle data architecture

      +Auto-generated on 3 April 2020. (Omitting all the 'Meta' sub-classes.)
      
      +# This is an auto-generated Django model module.
      +# You'll have to do the following manually to clean this up:
      +#   * Rearrange models' order
      +#   * Make sure each model has one field with primary_key=True
      +#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
      +# Feel free to rename the models, but don't rename db_table values or field names.
      +#
      +# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [app_label]'
      +# into your database.
      +
      +from __future__ import unicode_literals
      +from django.db import models
      +
      +
      +class CoreArea(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    short_name = models.CharField(max_length=100)
      +    name = models.CharField(max_length=200, blank=True)
      +    description = models.TextField(blank=True)
      +    parent = models.ForeignKey ('self', blank=True, null=True)
      +
      +
      +class CoreCave(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    official_name = models.CharField(max_length=160)
      +    kataster_code = models.CharField(max_length=20, blank=True)
      +    kataster_number = models.CharField(max_length=10, blank=True)
      +    unofficial_number = models.CharField(max_length=60, blank=True)
      +    explorers = models.TextField(blank=True)
      +    underground_description = models.TextField(blank=True)
      +    equipment = models.TextField(blank=True)
      +    references = models.TextField(blank=True)
      +    survey = models.TextField(blank=True)
      +    kataster_status = models.TextField(blank=True)
      +    underground_centre_line = models.TextField(blank=True)
      +    notes = models.TextField(blank=True)
      +    length = models.CharField(max_length=100, blank=True)
      +    depth = models.CharField(max_length=100, blank=True)
      +    extent = models.CharField(max_length=100, blank=True)
      +    survex_file = models.CharField(max_length=100, blank=True)
      +    description_file = models.CharField(max_length=200, blank=True)
      +    url = models.CharField(max_length=200, blank=True)
      +    filename = models.CharField(max_length=200)
      +
      +
      +class CoreCaveArea(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    cave_id = models.IntegerField()
      +    area = models.ForeignKey (CoreArea)
      +
      +
      +class CoreCaveandentrance(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    cave_id = models.IntegerField()
      +    entrance_id = models.IntegerField()
      +    entrance_letter = models.CharField(max_length=20, blank=True)
      +
      +
      +class CoreCavedescription(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    short_name = models.CharField(unique=True, max_length=50)
      +    long_name = models.CharField(max_length=200, blank=True)
      +    description = models.TextField(blank=True)
      +
      +
      +class CoreCavedescriptionLinkedEntrances(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    cavedescription_id = models.IntegerField()
      +    entrance = models.ForeignKey ('CoreEntrance')
      +
      +
      +class CoreCavedescriptionLinkedQms(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    cavedescription_id = models.IntegerField()
      +    qm_id = models.IntegerField()
      +
      +
      +class CoreCavedescriptionLinkedSubcaves(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    cavedescription_id = models.IntegerField()
      +    newsubcave_id = models.IntegerField()
      +
      +
      +class CoreCaveslug(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    cave_id = models.IntegerField()
      +    slug = models.CharField(unique=True, max_length=50)
      +    primary = models.BooleanField()
      +
      +
      +class CoreDataissue(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    date = models.DateTimeField()
      +    parser = models.CharField(max_length=50, blank=True)
      +    message = models.CharField(max_length=400, blank=True)
      +
      +
      +class CoreDphoto(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    caption = models.CharField(max_length=1000, blank=True)
      +    contains_logbookentry = models.ForeignKey ('CoreLogbookentry', blank=True, null=True)
      +    file = models.CharField(max_length=100)
      +    is_mugshot = models.BooleanField()
      +    contains_cave = models.ForeignKey (CoreCave, blank=True, null=True)
      +    contains_entrance = models.ForeignKey ('CoreEntrance', blank=True, null=True)
      +    nearest_qm = models.ForeignKey ('CoreQm', db_column='nearest_QM_id', blank=True, null=True)  # Field name made lowercase. 
      +    lon_utm = models.FloatField(blank=True, null=True)
      +    lat_utm = models.FloatField(blank=True, null=True)
      +
      +
      +class CoreDphotoContainsPerson(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    dphoto_id = models.IntegerField()
      +    person = models.ForeignKey ('CorePerson')
      +
      +
      +class CoreEntrance(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    name = models.CharField(max_length=100, blank=True)
      +    entrance_description = models.TextField(blank=True)
      +    explorers = models.TextField(blank=True)
      +    map_description = models.TextField(blank=True)
      +    location_description = models.TextField(blank=True)
      +    approach = models.TextField(blank=True)
      +    underground_description = models.TextField(blank=True)
      +    photo = models.TextField(blank=True)
      +    marking = models.CharField(max_length=2)
      +    marking_comment = models.TextField(blank=True)
      +    findability = models.CharField(max_length=1, blank=True)
      +    findability_description = models.TextField(blank=True)
      +    alt = models.TextField(blank=True)
      +    northing = models.TextField(blank=True)
      +    easting = models.TextField(blank=True)
      +    tag_station = models.TextField(blank=True)
      +    exact_station = models.TextField(blank=True)
      +    other_station = models.TextField(blank=True)
      +    other_description = models.TextField(blank=True)
      +    bearings = models.TextField(blank=True)
      +    url = models.CharField(max_length=200, blank=True)
      +    filename = models.CharField(max_length=200)
      +    cached_primary_slug = models.CharField(max_length=200, blank=True)
      +
      +
      +class CoreEntranceslug(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    entrance_id = models.IntegerField()
      +    slug = models.CharField(unique=True, max_length=50)
      +    primary = models.BooleanField()
      +
      +
      +class CoreExpedition(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    year = models.CharField(unique=True, max_length=20)
      +    name = models.CharField(max_length=100)
      +
      +
      +class CoreExpeditionday(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    expedition = models.ForeignKey (CoreExpedition)
      +    date = models.DateField()
      +
      +
      +class CoreLogbookentry(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    date = models.DateField()
      +    expeditionday = models.ForeignKey (CoreExpeditionday, blank=True, null=True)
      +    expedition = models.ForeignKey (CoreExpedition, blank=True, null=True)
      +    title = models.CharField(max_length=200)
      +    cave_slug = models.CharField(max_length=50)
      +    place = models.CharField(max_length=100, blank=True)
      +    text = models.TextField()
      +    slug = models.CharField(max_length=50)
      +    filename = models.CharField(max_length=200, blank=True)
      +    entry_type = models.CharField(max_length=50, blank=True)
      +
      +
      +class CoreNewsubcave(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    name = models.CharField(unique=True, max_length=200)
      +
      +
      +class CoreOthercavename(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    name = models.CharField(max_length=160)
      +    cave = models.ForeignKey (CoreCave)
      +
      +
      +class CorePerson(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    first_name = models.CharField(max_length=100)
      +    last_name = models.CharField(max_length=100)
      +    fullname = models.CharField(max_length=200)
      +    is_vfho = models.BooleanField()
      +    mug_shot = models.CharField(max_length=100, blank=True)
      +    blurb = models.TextField(blank=True)
      +    orderref = models.CharField(max_length=200)
      +    user_id = models.IntegerField(unique=True, blank=True, null=True)
      +
      +
      +class CorePersonexpedition(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    expedition = models.ForeignKey (CoreExpedition)
      +    person = models.ForeignKey (CorePerson)
      +    slugfield = models.CharField(max_length=50, blank=True)
      +    is_guest = models.BooleanField()
      +    expo_committee_position = models.CharField(max_length=200, blank=True)
      +    nickname = models.CharField(max_length=100, blank=True)
      +
      +
      +class CorePersontrip(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    personexpedition = models.ForeignKey (CorePersonexpedition, blank=True, null=True)
      +    time_underground = models.FloatField()
      +    logbook_entry = models.ForeignKey (CoreLogbookentry)
      +    is_logbook_entry_author = models.BooleanField()
      +
      +
      +class CoreQm(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    found_by = models.ForeignKey (CoreLogbookentry, blank=True, null=True)
      +    ticked_off_by = models.ForeignKey (CoreLogbookentry, blank=True, null=True)
      +    number = models.IntegerField()
      +    grade = models.CharField(max_length=1)
      +    location_description = models.TextField()
      +    nearest_station_description = models.CharField(max_length=400, blank=True)
      +    nearest_station_name = models.CharField(max_length=200, blank=True)
      +    nearest_station = models.ForeignKey ('CoreSurvexstation', blank=True, null=True)
      +    area = models.CharField(max_length=100, blank=True)
      +    completion_description = models.TextField(blank=True)
      +    comment = models.TextField(blank=True)
      +
      +
      +class CoreScannedimage(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    file = models.CharField(max_length=100)
      +    scanned_by = models.ForeignKey (CorePerson, blank=True, null=True)
      +    scanned_on = models.DateField(blank=True, null=True)
      +    survey_id = models.IntegerField()
      +    contents = models.CharField(max_length=20)
      +    number_in_wallet = models.IntegerField(blank=True, null=True)
      +    lon_utm = models.FloatField(blank=True, null=True)
      +    lat_utm = models.FloatField(blank=True, null=True)
      +
      +
      +class CoreSurvexblock(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    name = models.CharField(max_length=100)
      +    parent = models.ForeignKey ('self', blank=True, null=True)
      +    text = models.TextField()
      +    cave_id = models.IntegerField(blank=True, null=True)
      +    date = models.DateField(blank=True, null=True)
      +    expeditionday_id = models.IntegerField(blank=True, null=True)
      +    expedition_id = models.IntegerField(blank=True, null=True)
      +    survexfile = models.ForeignKey ('CoreSurvexfile', blank=True, null=True)
      +    begin_char = models.IntegerField()
      +    survexpath = models.CharField(max_length=200)
      +    survexscansfolder_id = models.IntegerField(blank=True, null=True)
      +    totalleglength = models.FloatField()
      +
      +
      +class CoreSurvexdirectory(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    path = models.CharField(max_length=200)
      +    cave_id = models.IntegerField(blank=True, null=True)
      +    primarysurvexfile_id = models.IntegerField(blank=True, null=True)
      +
      +
      +class CoreSurvexequate(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    cave_id = models.IntegerField(blank=True, null=True)
      +
      +
      +class CoreSurvexfile(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    path = models.CharField(max_length=200)
      +    survexdirectory = models.ForeignKey (CoreSurvexdirectory, blank=True, null=True)
      +    cave_id = models.IntegerField(blank=True, null=True)
      +
      +
      +class CoreSurvexleg(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    block_id = models.IntegerField()
      +    stationfrom = models.ForeignKey ('CoreSurvexstation')
      +    stationto = models.ForeignKey ('CoreSurvexstation')
      +    tape = models.FloatField()
      +    compass = models.FloatField()
      +    clino = models.FloatField()
      +
      +
      +class CoreSurvexpersonrole(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    survexblock = models.ForeignKey (CoreSurvexblock)
      +    nrole = models.CharField(max_length=200, blank=True)
      +    personname = models.CharField(max_length=100)
      +    person_id = models.IntegerField(blank=True, null=True)
      +    personexpedition_id = models.IntegerField(blank=True, null=True)
      +    persontrip_id = models.IntegerField(blank=True, null=True)
      +    expeditionday_id = models.IntegerField(blank=True, null=True)
      +
      +
      +class CoreSurvexscansfolder(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    fpath = models.CharField(max_length=200)
      +    walletname = models.CharField(max_length=200)
      +
      +
      +class CoreSurvexscansingle(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    ffile = models.CharField(max_length=200)
      +    name = models.CharField(max_length=200)
      +    survexscansfolder = models.ForeignKey (CoreSurvexscansfolder, blank=True, null=True)
      +
      +
      +class CoreSurvexstation(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    name = models.CharField(max_length=100)
      +    block_id = models.IntegerField()
      +    equate = models.ForeignKey (CoreSurvexequate, blank=True, null=True)
      +    x = models.FloatField(blank=True, null=True)
      +    y = models.FloatField(blank=True, null=True)
      +    z = models.FloatField(blank=True, null=True)
      +
      +
      +class CoreSurvextitle(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    survexblock = models.ForeignKey (CoreSurvexblock)
      +    title = models.CharField(max_length=200)
      +    cave_id = models.IntegerField(blank=True, null=True)
      +
      +
      +class CoreSurvey(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    new_since_parsing = models.BooleanField()
      +    non_public = models.BooleanField()
      +    expedition = models.ForeignKey (CoreExpedition)
      +    wallet_number = models.IntegerField(blank=True, null=True)
      +    wallet_letter = models.CharField(max_length=1, blank=True)
      +    comments = models.TextField(blank=True)
      +    location = models.CharField(max_length=400, blank=True)
      +    subcave = models.ForeignKey (CoreNewsubcave, blank=True, null=True)
      +    survex_block = models.ForeignKey (CoreSurvexblock, unique=True, blank=True, null=True)
      +    logbook_entry = models.ForeignKey (CoreLogbookentry)
      +    centreline_printed_on = models.DateField(blank=True, null=True)
      +    centreline_printed_by = models.ForeignKey (CorePerson, blank=True, null=True)
      +    tunnel_file = models.CharField(max_length=100, blank=True)
      +    tunnel_main_sketch = models.ForeignKey ('self', blank=True, null=True)
      +    integrated_into_main_sketch_on = models.DateField(blank=True, null=True)
      +    integrated_into_main_sketch_by = models.ForeignKey (CorePerson, blank=True, null=True)
      +    rendered_image = models.CharField(max_length=100, blank=True)
      +
      +
      +class CoreTunnelfile(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    tunnelpath = models.CharField(max_length=200)
      +    tunnelname = models.CharField(max_length=200)
      +    bfontcolours = models.BooleanField()
      +    filesize = models.IntegerField()
      +    npaths = models.IntegerField()
      +
      +
      +class CoreTunnelfileSurvexblocks(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    tunnelfile_id = models.IntegerField()
      +    survexblock = models.ForeignKey (CoreSurvexblock)
      +
      +
      +class CoreTunnelfileSurvexscans(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    tunnelfile_id = models.IntegerField()
      +    survexscansingle = models.ForeignKey (CoreSurvexscansingle)
      +
      +
      +class CoreTunnelfileSurvexscansfolders(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    tunnelfile_id = models.IntegerField()
      +    survexscansfolder = models.ForeignKey (CoreSurvexscansfolder)
      +
      +
      +class CoreTunnelfileSurvextitles(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    tunnelfile_id = models.IntegerField()
      +    survextitle = models.ForeignKey (CoreSurvextitle)
      +
      +
      +class CoreTunnelfileTunnelcontains(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    from_tunnelfile_id = models.IntegerField()
      +    to_tunnelfile_id = models.IntegerField()
      +
      +
      +class DjangoAdminLog(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    action_time = models.DateTimeField()
      +    object_id = models.TextField(blank=True)
      +    object_repr = models.CharField(max_length=200)
      +    action_flag = models.PositiveSmallIntegerField()
      +    change_message = models.TextField()
      +    content_type = models.ForeignKey ('DjangoContentType', blank=True, null=True)
      +    user = models.ForeignKey (AuthUser)
      +
      +
      +class DjangoContentType(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    name = models.CharField(max_length=100)
      +    app_label = models.CharField(max_length=100)
      +    model = models.CharField(max_length=100)
      +
      +
      +class DjangoMigrations(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    app = models.CharField(max_length=255)
      +    name = models.CharField(max_length=255)
      +    applied = models.DateTimeField()
      +
      +
      +class DjangoRedirect(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    site = models.ForeignKey ('DjangoSite')
      +    old_path = models.CharField(max_length=200)
      +    new_path = models.CharField(max_length=200)
      +
      +
      +class DjangoSession(models.Model):
      +    session_key = models.CharField(primary_key =True, max_length=40)
      +    session_data = models.TextField()
      +    expire_date = models.DateTimeField()
      +
      +
      +class DjangoSite(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    domain = models.CharField(max_length=100)
      +    name = models.CharField(max_length=50)
      +
      +
      +class FlatpagesEntranceredirect(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    originalurl = models.CharField(db_column='originalURL', max_length=200)  # Field name made lowercase. 
      +    entrance = models.ForeignKey (CoreEntrance)
      +
      +
      +class FlatpagesRedirect(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    originalurl = models.CharField(db_column='originalURL', unique=True, max_length=200)  # Field name made lowercase. 
      +    newurl = models.CharField(db_column='newURL', max_length=200)  # Field name made lowercase. 
      +
      +
      +class RegistrationRegistrationprofile(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    activation_key = models.CharField(max_length=40)
      +    user = models.ForeignKey (AuthUser, unique=True)
      +
      +
      +class AuthGroup(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    name = models.CharField(unique=True, max_length=80)
      +
      +
      +class AuthGroupPermissions(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    group = models.ForeignKey(AuthGroup)
      +    permission = models.ForeignKey('AuthPermission')
      +
      +
      +class AuthPermission(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    name = models.CharField(max_length=50)
      +    content_type = models.ForeignKey('DjangoContentType')
      +    codename = models.CharField(max_length=100)
      +
      +
      +class AuthUser(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    password = models.CharField(max_length=128)
      +    last_login = models.DateTimeField()
      +    is_superuser = models.BooleanField()
      +    username = models.CharField(unique=True, max_length=30)
      +    first_name = models.CharField(max_length=30)
      +    last_name = models.CharField(max_length=30)
      +    email = models.CharField(max_length=75)
      +    is_staff = models.BooleanField()
      +    is_active = models.BooleanField()
      +    date_joined = models.DateTimeField()
      +
      +
      +class AuthUserGroups(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    user = models.ForeignKey (AuthUser)
      +    group = models.ForeignKey (AuthGroup)
      +
      +
      +class AuthUserUserPermissions(models.Model):
      +    id = models.IntegerField(primary_key =True)  # AutoField? 
      +    user = models.ForeignKey (AuthUser)
      +    permission = models.ForeignKey (AuthPermission)
      +
      +
      +
      +
      +Return to: Troggle architecture
      +
      + + \ No newline at end of file diff --git a/handbook/troggle/menudesign.html b/handbook/troggle/menudesign.html index e86dbbda5..4297c0f97 100644 --- a/handbook/troggle/menudesign.html +++ b/handbook/troggle/menudesign.html @@ -5,7 +5,7 @@ CUCC Expedition Handbook: Website menu design options - +

      CUCC Expedition Handbook - Website menu design options

      What, How and Why : New menus

      diff --git a/handbook/troggle/otherscripts.html b/handbook/troggle/otherscripts.html index d28169e8c..b5e650a41 100644 --- a/handbook/troggle/otherscripts.html +++ b/handbook/troggle/otherscripts.html @@ -1,15 +1,15 @@ + Other scripts supporting troggle - +

      CUCC Expedition Handbook

      Other scripts

      -

      Current Scripts

      • make-folklist.py turns the folk.csv file into a webpage. @@ -23,8 +23,8 @@
      • seshbook.tex LaTeX script for generating the seshbook - works from the same list of names
      • therionpage.tex LaTeX script anbd makefile for generating therion-style protractors

      • wallets.py generates statuspages and to-do list pages for survey data production. -
      • svx2qm.py extracts QMs from the survex files -
      • tablize-qms.pl turns the list of QMs extracted into an HTML file +
      • svx2qm.py extracts QMs from the survex files +
      • tablize-qms.pl turns the list of QMs extracted into an HTML file
      • make_svx.sh generates surface Survex tracks
      • svxtrace.py analyses Survex tracks to help find errors
      • chk-refs.sh analyses Survex files and wallets files to find reference errors

      • @@ -39,15 +39,18 @@

        Old and possibly obsolete scripts

        There are perl and python scripts scattered through the :drawings: and :loser: (svx files) repos. Not all of the functions in these scripts have been recreated in more recent scripts or programmed into troggle. - +

        When you write a script

        +

        Any script that generates an HTML file should insert <meta name="keywords" content="NOEDIT"> +in the HTML header. Then when troggle renders the page it will not allow the user to edit the generated page. See handbook editing for a fuller explanation of troggle post-processing.


        diff --git a/handbook/troggle/placeholder.html b/handbook/troggle/placeholder.html index a80d33cb4..7cb2af0cf 100644 --- a/handbook/troggle/placeholder.html +++ b/handbook/troggle/placeholder.html @@ -5,7 +5,7 @@ Handbook Troggle XXX - +

        CUCC Expedition Handbook

        Handbook Troggle XXX

        This is not the page you are looking for. diff --git a/handbook/troggle/scriptscurrent.html b/handbook/troggle/scriptscurrent.html index 68df8b0be..79bfa7aea 100644 --- a/handbook/troggle/scriptscurrent.html +++ b/handbook/troggle/scriptscurrent.html @@ -5,7 +5,7 @@ Other scripts supporting troggle - + + +

        CUCC Expedition Handbook

        +

        QMs and leads

        + +tl;dr - use svx2qm.py. Look at the output at:
        +qms2019.txt
        +qms2019.csv
        + +

        QMs - the fourfold path

        +

        You will be familiar with documenting newly found QMs in the survex file when you type it in. But QMs are only useful if they can be easily scanned by people planning the next pushing trip. That's what we are discussing here. + +

        There are four ways we have used to manage QMs: +

          +
        1. Perl script - Historically QMs were not in the survex file but typed up in a separate list qms.csv for each cave system. A perl script turned that into an HTML file for the website. +
        2. Perl + troggle - One of troggle's input parsers "QM parser" is specifically designed to import the three HTML files produced from qms.csv but doesn't do anything with that data (yet). +
        3. Python script - Phil Withnall's 2019 script svx2qm.py scans all the QMs in a single survex file. See below for how to run it on all survex files. +
        4. New troggle - Sam's recent addition to troggle's "survex parser" makes it recognise and store QMs when it parses the survex files. +
        + +

        QMs all use the same QM description conventions. + +

        tablize-qms.pl

        +

        This is a perl script dating from November 2004. + +

        it takes a hand-edited CSV file name as the program's argument and generates an HTML page listing all the QMs. +

        Copies of it live in the three cave file folders in :expoweb:/1623/, in 258/, 234/, and 204/ . These generated html files are live pages in the cave descriptions:
        +/1623/258/qm.html
        +/1623/234/qm.html
        +/1623/204/qm.html
        +

        Note that the qms.csv file file used as input by this script is an entirely different format and table structure from the qms.csv file produced by svx2qm.py. + +

        There are also three versions of the QM list for cave 161 (Kaninchenhohle) apparently produced by this method but hand-edited:
        +/1623/161/qmaven.html 1996 version
        +/1623/161/qmtodo.html 1998 version
        +/1623/161/qmdone.html 1999 (incomplete) version +

        +

        In the /1623/204/ folder there is a script qmreader.pl which apparently does the inverse of +tablize-qms.pl: it transforms a QMs' HTML file into a CSV file. + + +

        troggle/parsers/qms.py

        +

        The parser troggle/parsers/qms.py currently imports those same qm.csv files from the perl script into troggle using a mixture of csv and html parsers: +

        parseCaveQMs(cave='stein',inputFile=r"1623/204/qm.csv")
        +parseCaveQMs(cave='hauch',inputFile=r"1623/234/qm.csv")
        +parseCaveQMs(cave='kh', inputFile="1623/161/qmtodo.htm")
        +#parseCaveQMs(cave='balkonhoehle',inputFile=r"1623/264/qm.csv")
        +but does not apparently have any output webpage to display them (yet). +

        +

        Note that the hand-edited qm.csv for Balkonhohle was apparently abandoned unfinished as we transitioned to putting the QMs in the survex files instead. It contains QMs from 2014 and 2016:
        +/1623/264/qm.csv - unused
        + +

        svx2qm.py

        +

        Philip Withnall's 2019 QM extractor svx2qm.py (in :loser:/qms/) can be used to generate a list of all the QMs in all the svx files in either text or CSV format. When run together with file and xargs it will produce a output listing all the QMs: +

        cd loser
        +find -name '*.svx' | xargs qms/svx2qm.py --format csv
        +
        +and --format human produces a simple text format. +

        + +FINISH - the 2019 copies are online HERE and HERE + +

        +This will work on all survex *.svx files even those which have not yet been run through the troggle import process. +

        Phil says (13 April 2020): "The generated files are not meant to be served by the webserver, it’s a tool for people to run locally. Someone could modify it to create HTML output (or post-process the CSV output to do the same), but that is work still to be done." + +

        Sam's parser additions

        +

        Troggle troggle/parsers/survex.py currently parses and stores all the QMs it finds in survex files. The tables where the data is put are listed in the current data model including structure for ticking them off. +

        There is not yet a troggle report listing the QMs. + +

        QMs - other oddments

        + +

        find-dead-qms.py

        +

        This finds references to completed qms in the qm.csv files in the cave folders (/1623/ etc.) in the :expoweb: repository. It looks to see which QMs have been completed but where there is not yet a matching text in the cave description. +

        Quick and dirty Python script to find references to completed qms in the +cave description pages. Run this to find which bits of description +need updating. +
        +The list of qms is read from the qm.csv file and any with an entry in the +"Completion description" column (column 7) are searched for in all the html +files. +
        +The script prints a list of the completed qms that it found references to +and in which file. +
        +Nial Peters - 2011 +
        + +
        +
        +From: Philip Withnall [tecnocode] 
        +Sent: 13 April 2020 23:41
        +To: Philip Sargent (Gmail)
        +Subject: Re: svx2qm
        +
        +Hi Philip,
        +
        +Hope you’re well, thanks for getting in touch about this.
        +
        +The generated files are not meant to be served by the webserver, it’s a tool for people to run locally. 
        +Someone could modify it to create HTML output (or post-process the CSV output to do the same), 
        +but that is work still to be done.
        +
        +I can't see any problem with moving it all to expoweb/scripts/ - so long as it is 
        +run with the loser top level directory specified - but I might be mistaken:
        +find  /home/expo/loser -name '*.svx' | xargs ./svx2qm.py --format human
        +and it should go into the Makefile too at some point.
        +
        +Feel free to move it wherever; I am not planning on doing any further work on it. 
        +The script itself just expects to be passed some (relative or absolute) paths to SVX files, 
        +so can be placed wherever, as long as it’s passed appropriate relative paths.
        +
        +I haven’t written any other scripts which post-process the data or otherwise format it.
        +
        +I guess it all depends on what questions people are trying to answer using the QM data, 
        +as to how (and where) best to present it. I’m afraid I don’t have any suggestions there.
        +
        +:Rob Watson wrote some documentation about QMs
        +:http://expo.survex.com/handbook/survey/qmentry.html 
        +:is there anything subtle missing  as to how they are used ?
        +
        +Nope, I think Rob’s page covers it all. That page also documents the correct QM format 
        +which is what svx2qm.py understands. (There were some older or artisanal QM formats 
        +floating around at one point, although I think I reformatted them all so the tool 
        +would understand them, and so people would hopefully standardise on what Rob’s 
        +documented from then on.)
        +
        +Philip
        + +
        +Return to: Other scripts
        +
        + + diff --git a/handbook/troggle/serverconfig.html b/handbook/troggle/serverconfig.html index ec00e3c2b..8eae6df79 100644 --- a/handbook/troggle/serverconfig.html +++ b/handbook/troggle/serverconfig.html @@ -5,7 +5,7 @@ Handbook - Expo Server - +

        CUCC Expedition Handbook

        The Expo server

        Troggle is the software which runs the the expo cave survey data management and website. It is not the only thing running on the expo server. diff --git a/handbook/troggle/trogarch.html b/handbook/troggle/trogarch.html index 14d2bdf91..598ee8ed4 100644 --- a/handbook/troggle/trogarch.html +++ b/handbook/troggle/trogarch.html @@ -5,7 +5,7 @@ Handbook Troggle Architecture - +

        CUCC Expedition Handbook

        Troggle Architecture

        @@ -20,7 +20,9 @@ The core of troggle is the data architecture: the set of tables into which all t

        Architecture description

        -

        Read the proposal: "Troggle: a novel system for cave exploration information management", by Aaron Curtis. But remember that this paper is an over-ambitious proposal. Only the core datamanagement features have been built. We have none of the person management features and only two forms: for entering cave and cave entrance data. +

        Read the proposal: "Troggle: a novel system for cave exploration information management", by Aaron Curtis. But remember that this paper is an over-ambitious proposal. Only the core data management features have been built. We have none of the person management features and only two forms in use: for entering cave and cave entrance data. +

        +ALSO there have been tables added to the core representation which are not anticipated in that document of this diagram, e.g. Scannedimage, Survexdirectory, Survexscansfolder, Survexscansingle, Tunnelfile, TunnelfileSurvexscansfolders, Survey. See Troggle data model python code (3 April 2020).

        Troggle parsers and input files

        [describe which files they read and which tables they write to. Also say what error messages are likely on import and what to do about them.] @@ -44,6 +46,7 @@ The core of troggle is the data architecture: the set of tables into which all t
        Go on to: Troggle uncategorised notes to be edited
        +See: Troggle data model in python code
        Return to: Troggle intro

        diff --git a/handbook/troggle/trogdesign.html b/handbook/troggle/trogdesign.html index 30767f8c3..1e126cdea 100644 --- a/handbook/troggle/trogdesign.html +++ b/handbook/troggle/trogdesign.html @@ -5,7 +5,7 @@ Handbook Troggle Design - +

        CUCC Expedition Handbook

        Troggle Design Decisions

        @@ -15,6 +15,7 @@

      Go on to: Troggle architecture
      +Go on to: Troggle design: architecture speculation
      Return to: Troggle intro

      diff --git a/handbook/troggle/trogdesignx.html b/handbook/troggle/trogdesignx.html new file mode 100644 index 000000000..2d0f5169c --- /dev/null +++ b/handbook/troggle/trogdesignx.html @@ -0,0 +1,94 @@ + + + + +Handbook Troggle Architecture Speculations + + + +

      CUCC Expedition Handbook

      +

      Troggle Architecture Speculations

      + + +
      +From: Philip Sargent (Gmail) [mailto:philip.sargent@gmail.com] 
      +Sent: 19 April 2020 01:28
      +To: expo-tech@lists.wookware.org
      +Subject: vague thoughts about future troggle architecture
      +
      + +

      +At our last virtual pub Sam confirmed that using today's tools to +re-partition troggle with all the user interface in the user's browser would +be utterly horrible using current tools (javascript frameworks: react, +angular etc.). +

      +These frameworks get out of date in couple of years or so. So they don't +give us the decade-long stability we need to match available maintenance +effort. +

      +A web API to expose the troggle database (read-only) would allow some keen +person to write a special-purpose app on a phone, e.g. an entrance-locator +app, talking directly to the database. But replacing the whole user +interface does not seem feasible yet. +

      +It did occur to me that we are missing a trick: 99+% of the database doesn't +change except for survey data updates which, apart from during expo, happen +only every week or so. And the database is only 10 MB so is entirely +feasible to copy absolutely everything into the browser except for scanned +images and photos. +

      +So we could partition troggle so that all the user display bits run in the +browser (or a progressive web app) using a python interpreter running in +javascript. [yeah, expofiles would need some subset labelled as needing to +be forcibly downloaded, but the rest coming only on demand.] Some django +enthusiast must have done this already surely ? Ah yes, Brython.
      +github.com/brython-dev/brython
      +www.brython.info +

      +Which is fun, but not useful. And not just because it is immature. None of +this addresses our biggest problem: devising something that can be +maintained by fewer, less-expert people who can only devote short snippets +of time and not long-duration immersion. +

      +I know Wookey has been thinking of a loose federation of independent scripts +working on the same data, but the more I look at troggle and the tasks it +does the less I feel that would work. At the core there is a common data +model that everything must understand - and the only unambiguous way of +presenting that data model is working code, e.g. see +Troggle architecture and click on the image +to see a bigger copy. [It is out of date - if someone can quickly generate +an update that would be nice. It's on my to-do list..] Much of what +wallets.py does (originally by Martin Green) is in troggle already - but +better. [There is a many:many relationship between svx files and wallet +directories in reality, not 1:1] +

      +Troggle is very nearly fully working (not with as many functions as +originally envisaged admittedly) but very nearly. There are several +import/parsers which are aborting without producing error messages, so most +of the survey blocks don't get loaded where they actually get displayed, and +the surveyscan images only appear as filename strings which are not checked +for referential integrity, so we are missing a consistency check there, and +the QM data display needs writing; but other than that it's in pretty good +shape. [Ah, yes, we should really add "drawings" as a core concept as well +as "surveyscans". That will be a bit of work.] +

      +The one thing external scripts would be really useful for is syntax checking +and reference checking prior to import. I have found some weird and +wonderful filename paths inside the tunnel and therion drawings, and in +survex *ref paths. +

      +

      Addendum

      +

      There is a templating engine Nunjucks +which is a port to JavaScript of the Django templating system we use +(via Jinja - these are the same people who do Flask). This would be an obvious thing to use if we needed to go in that direction. +

      Several organisations have moved their user-interface layer to the browser using +Nunjucks including +the NHS digital service and Firefox. + +


      +Go on to: Troggle architecture
      +Return to: Troggle intro
      +
      + + diff --git a/handbook/troggle/trogdocm.html b/handbook/troggle/trogdocm.html index 28be0a550..bc430a4ff 100644 --- a/handbook/troggle/trogdocm.html +++ b/handbook/troggle/trogdocm.html @@ -6,6 +6,7 @@ +

      CUCC Expedition Handbook

      Troggle - Fixing things that break

      The guide to the parser-model-view architecture is in the architecture document. diff --git a/handbook/troggle/trogintro.html b/handbook/troggle/trogintro.html index 4e51c28b8..95d3d2315 100644 --- a/handbook/troggle/trogintro.html +++ b/handbook/troggle/trogintro.html @@ -5,7 +5,7 @@ Handbook Troggle Intro - +

      CUCC Expedition Handbook

      Troggle - what it is

      Troggle is the software which runs the the expo cave survey data management and website. diff --git a/handbook/troggle/trogmanual.html b/handbook/troggle/trogmanual.html index 7f662289a..256954883 100644 --- a/handbook/troggle/trogmanual.html +++ b/handbook/troggle/trogmanual.html @@ -5,7 +5,7 @@ Handbook Troggle Intro - +

      CUCC Expedition Handbook

      Troggle - Maintenance Manuals

      Troggle is the software which runs the the expo cave survey data management and website. diff --git a/handbook/troggle/trognotes.html b/handbook/troggle/trognotes.html index 6899192bc..a9eed1d70 100644 --- a/handbook/troggle/trognotes.html +++ b/handbook/troggle/trognotes.html @@ -5,7 +5,7 @@ Handbook Troggle NOTES - +

      CUCC Expedition Handbook

      Troggle - TO BE RESTRUCTURED

      Troggle runs much of the the cave survey data management, presents the data on the website and manages the Expo Handbook. diff --git a/handbook/troggle/trogstatus.html b/handbook/troggle/trogstatus.html index 47dd84bae..536dd9d79 100644 --- a/handbook/troggle/trogstatus.html +++ b/handbook/troggle/trogstatus.html @@ -5,7 +5,7 @@ Handbook Troggle Status - +

      CUCC Expedition Handbook

      Troggle & Expo Systems - status update

      Troggle is the software which runs the the expo cave survey data management and website. diff --git a/intro.htm b/intro.htm index 0e0ee4ff5..e717e9329 100644 --- a/intro.htm +++ b/intro.htm @@ -22,7 +22,7 @@ exploration of these annual expeditions.

      bulk of material can seem a little overwhelming. However, it's important for people to have some idea of what they are coming to, in order that they can get the most out of expo. It is probably worth starting with the -Expedition Primer - a document intended specifically for +Expedition Primer - a document intended specifically for new expo members, and leading to some of the more important pages which you should read in the Expo Handbook.