expoweb/handbook/troggle/datamodel.html

430 lines
25 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Handbook Troggle Data Model</title>
<link rel="stylesheet" type="text/css" href="../../css/main2.css" />
</head>
<body><style>body { background: #fff url(/images/style/bg-system.png) repeat-x 0 0 }</style>
<h2 id="tophead">CUCC Expedition Handbook - troggle</h2>
<h1>Troggle Data Model (python)</h1>
<h3>Troggle data architecture</h3>
2023-03-11 20:52:08 +00:00
<figure class="onright">
<a href="../l/trogclass-1.html"><img src="../t/trogclass-2.jpg"></a>
<br><figcaption>Class Diagram<br />(Click to enlarge)</figcaption>
</figure>
2023-01-30 22:27:46 +00:00
Auto-generated on 3 April 2020 with <var>troggle$ python3 manage.py inspectdb</var>. (Omitting all the 'Meta' sub-classes. )<br>
Several classes have been edited out of this file between then and 30 January 2023 as they have been deleted as troggle has been tidied up.
2020-07-27 01:42:09 +01:00
<p>All the classes below inherit from the django class (models.Model) and are thereby made persistent in the database. All <a href="https://docs.djangoproject.com/en/1.11/ref/models/fields/">persistent instance variables</a> are defined with e.g. "models.BooleanField()" types which is why they look so strange to a normal python programmer.
<p>See <a href="/admin/doc/models/">the online auto-documentation</a> for the current set of core objects and their instance variables and foreign keys (anything below with "models.ForeignKey" in the type field is a foreign key. <br>
This webpage is manually maintained and may be out of date.<code><pre><span style="color: green"># 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.</span>
from django.db import models
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Area</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
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)
<span style="color:blue">parent</span> = models.<span style="color:blue">ForeignKey</span> ('self', blank=True, null=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Cave</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
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)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>CaveArea</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
cave_id = models.IntegerField()
<span style="color:blue">area</span> = models.<span style="color:blue">ForeignKey</span> (CoreArea)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Caveandentrance</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
cave_id = models.IntegerField()
entrance_id = models.IntegerField()
entrance_letter = models.CharField(max_length=20, blank=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Caveslug</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
cave_id = models.IntegerField()
slug = models.CharField(unique=True, max_length=50)
primary = models.BooleanField()
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Dataissue</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
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)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Entrance</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
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)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Entranceslug</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
entrance_id = models.IntegerField()
slug = models.CharField(unique=True, max_length=50)
primary = models.BooleanField()
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Expedition</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
new_since_parsing = models.BooleanField()
non_public = models.BooleanField()
year = models.CharField(unique=True, max_length=20)
name = models.CharField(max_length=100)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Logbookentry</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
new_since_parsing = models.BooleanField()
non_public = models.BooleanField()
date = models.DateField()
<span style="color:blue">expedition</span> = models.<span style="color:blue">ForeignKey</span> (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)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Person</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
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)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Personexpedition</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
new_since_parsing = models.BooleanField()
non_public = models.BooleanField()
<span style="color:blue">expedition</span> = models.<span style="color:blue">ForeignKey</span> (CoreExpedition)
<span style="color:blue">person</span> = models.<span style="color:blue">ForeignKey</span> (CorePerson)
slugfield = models.CharField(max_length=50, blank=True)
is_guest = models.BooleanField()
expo_committee_position = models.CharField(max_length=200, blank=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>PersonLogbookEntry</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
new_since_parsing = models.BooleanField()
non_public = models.BooleanField()
<span style="color:blue">personexpedition</span> = models.<span style="color:blue">ForeignKey</span> (CorePersonexpedition, blank=True, null=True)
time_underground = models.FloatField()
<span style="color:blue">logbook_entry</span> = models.<span style="color:blue">ForeignKey</span> (CoreLogbookentry)
is_logbook_entry_author = models.BooleanField()
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Qm</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
new_since_parsing = models.BooleanField()
non_public = models.BooleanField()
number = models.IntegerField()
grade = models.CharField(max_length=1)
location_description = models.TextField()
nearest_station_name = models.CharField(max_length=200, blank=True)
area = models.CharField(max_length=100, blank=True)
completion_description = models.TextField(blank=True)
2023-03-17 20:02:08 +00:00
resolution_station_name = models.CharField(max_length=200, blank=True, null=True)
area = models.CharField(max_length=100, blank=True, null=True)
page_ref = models.TextField(blank=True, null=True)
comment = models.TextField(blank=True, null=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survexblock</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
name = models.CharField(max_length=100)
<span style="color:blue">parent</span> = models.<span style="color:blue">ForeignKey</span> ('self', blank=True, null=True)
text = models.TextField()
cave_id = models.IntegerField(blank=True, null=True)
date = models.DateField(blank=True, null=True)
expedition_id = models.IntegerField(blank=True, null=True)
<span style="color:blue">survexfile</span> = models.<span style="color:blue">ForeignKey</span> ('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()
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survexdirectory</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
path = models.CharField(max_length=200)
cave_id = models.IntegerField(blank=True, null=True)
primarysurvexfile_id = models.IntegerField(blank=True, null=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survexfile</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
path = models.CharField(max_length=200)
<span style="color:blue">survexdirectory</span> = models.<span style="color:blue">ForeignKey</span> (CoreSurvexdirectory, blank=True, null=True)
cave_id = models.IntegerField(blank=True, null=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survexleg</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
block_id = models.IntegerField()
<span style="color:blue">stationfrom</span> = models.<span style="color:blue">ForeignKey</span> ('CoreSurvexstation')
<span style="color:blue">stationto</span> = models.<span style="color:blue">ForeignKey</span> ('CoreSurvexstation')
tape = models.FloatField()
compass = models.FloatField()
clino = models.FloatField()
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survexpersonrole</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
<span style="color:blue">survexblock</span> = models.<span style="color:blue">ForeignKey</span> (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)
2023-01-30 22:27:46 +00:00
personlogbookentry_id = models.IntegerField(blank=True, null=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survexscansfolder</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
fpath = models.CharField(max_length=200)
walletname = models.CharField(max_length=200)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survexscansingle</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
ffile = models.CharField(max_length=200)
name = models.CharField(max_length=200)
<span style="color:blue">survexscansfolder</span> = models.<span style="color:blue">ForeignKey</span> (CoreSurvexscansfolder, blank=True, null=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survexstation</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
name = models.CharField(max_length=100)
block_id = models.IntegerField()
<span style="color:blue">equate</span> = models.<span style="color:blue">ForeignKey</span> (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)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Survextitle</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
<span style="color:blue">survexblock</span> = models.<span style="color:blue">ForeignKey</span> (CoreSurvexblock)
title = models.CharField(max_length=200)
cave_id = models.IntegerField(blank=True, null=True)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>Dwgfile</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
2021-05-04 15:08:44 +01:00
dwgpath = models.CharField(max_length=200)
dwgname = models.CharField(max_length=200)
bfontcolours = models.BooleanField()
filesize = models.IntegerField()
npaths = models.IntegerField()
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>DwgfileSurvexblocks</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
2021-05-04 15:08:44 +01:00
dwgfile_id = models.IntegerField()
<span style="color:blue">survexblock</span> = models.<span style="color:blue">ForeignKey</span> (CoreSurvexblock)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>DwgfileSurvexscans</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
2021-05-04 15:08:44 +01:00
dwgfile_id = models.IntegerField()
<span style="color:blue">survexscansingle</span> = models.<span style="color:blue">ForeignKey</span> (CoreSurvexscansingle)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>DwgfileSurvexscansfolders</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
2021-05-04 15:08:44 +01:00
dwgfile_id = models.IntegerField()
<span style="color:blue">survexscansfolder</span> = models.<span style="color:blue">ForeignKey</span> (CoreSurvexscansfolder)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>DwgfileSurvextitles</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
2021-05-04 15:08:44 +01:00
dwgfile_id = models.IntegerField()
<span style="color:blue">survextitle</span> = models.<span style="color:blue">ForeignKey</span> (CoreSurvextitle)
2023-01-30 22:27:46 +00:00
<span style="color: lime">class</span> <span style="color:blue"><b>DwgfileDwgcontains</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
2021-05-04 15:08:44 +01:00
from_dwgfile_id = models.IntegerField()
to_dwgfile_id = models.IntegerField()
<span style="color: lime">class</span> <span style="color:blue"><b>DjangoAdminLog</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
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()
<span style="color:blue">content_type</span> = models.<span style="color:blue">ForeignKey</span> ('DjangoContentType', blank=True, null=True)
<span style="color:blue">user</span> = models.<span style="color:blue">ForeignKey</span> (AuthUser)
<span style="color: lime">class</span> <span style="color:blue"><b>DjangoContentType</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
name = models.CharField(max_length=100)
app_label = models.CharField(max_length=100)
model = models.CharField(max_length=100)
<span style="color: lime">class</span> <span style="color:blue"><b>DjangoMigrations</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
app = models.CharField(max_length=255)
name = models.CharField(max_length=255)
applied = models.DateTimeField()
<span style="color: lime">class</span> <span style="color:blue"><b>DjangoRedirect</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
<span style="color:blue">site</span> = models.<span style="color:blue">ForeignKey</span> ('DjangoSite')
old_path = models.CharField(max_length=200)
new_path = models.CharField(max_length=200)
<span style="color: lime">class</span> <span style="color:blue"><b>DjangoSession</b></span>(models.Model):
session_key = models.CharField(<span style="color: magenta">primary_key</span> =True, max_length=40)
session_data = models.TextField()
expire_date = models.DateTimeField()
<span style="color: lime">class</span> <span style="color:blue"><b>DjangoSite</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
domain = models.CharField(max_length=100)
name = models.CharField(max_length=50)
<span style="color: lime">class</span> <span style="color:blue"><b>RegistrationRegistrationprofile</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
activation_key = models.CharField(max_length=40)
<span style="color:blue">user</span> = models.<span style="color:blue">ForeignKey</span> (AuthUser, unique=True)
<span style="color: lime">class</span> <span style="color:blue"><b>AuthGroup</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
name = models.CharField(unique=True, max_length=80)
<span style="color: lime">class</span> <span style="color:blue"><b>AuthGroupPermissions</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
<span style="color:blue">group</span> = models.<span style="color:blue">ForeignKey</span>(AuthGroup)
<span style="color:blue"><span style="color:blue">permission</span></span> = models.<span style="color:blue">ForeignKey</span>('AuthPermission')
<span style="color: lime">class</span> <span style="color:blue"><b>AuthPermission</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
name = models.CharField(max_length=50)
<span style="color:blue">content_type</span> = models.<span style="color:blue">ForeignKey</span>('DjangoContentType')
codename = models.CharField(max_length=100)
<span style="color: lime">class</span> <span style="color:blue"><b>AuthUser</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
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()
<span style="color: lime">class</span> <span style="color:blue"><b>AuthUserGroups</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
<span style="color:blue">user</span> = models.<span style="color:blue">ForeignKey</span> (AuthUser)
<span style="color:blue">group</span> = models.<span style="color:blue">ForeignKey</span> (AuthGroup)
<span style="color: lime">class</span> <span style="color:blue"><b>AuthUserUserPermissions</b></span>(models.Model):
id = models.IntegerField(<span style="color: magenta">primary_key</span> =True) <span style="color: green"># AutoField?</span>
<span style="color:blue">user</span> = models.<span style="color:blue">ForeignKey</span> (AuthUser)
<span style="color:blue">permission</span> = models.<span style="color:blue">ForeignKey</span> (AuthPermission)
</pre></code>
<hr />
Return to: <a href="trogarch.html">Troggle architecture</a><br />
2020-07-27 01:42:09 +01:00
Return to: <a href="trogintro.html">Troggle intro</a><br />
Troggle index:
<a href="trogindex.html">Index of all troggle documents</a><br />
<hr />
</body>
</html>