CUCC Expedition Handbook - troggle

Troggle Data Model (python)

Troggle data architecture


Class Diagram
(Click to enlarge)
Auto-generated on 3 April 2020 with troggle$ python3 manage.py inspectdb. (Omitting all the 'Meta' sub-classes. )
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.

All the classes below inherit from the django class (models.Model) and are thereby made persistent in the database. All persistent instance variables are defined with e.g. "models.BooleanField()" types which is why they look so strange to a normal python programmer.

See the online auto-documentation 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.
This webpage is manually maintained and may be out of date.

# 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 django.db import models


class Area(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 Cave(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 CaveArea(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    cave_id = models.IntegerField()
    area = models.ForeignKey (CoreArea)


class Caveandentrance(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 Caveslug(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 Dataissue(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 Entrance(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 Entranceslug(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 Expedition(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 Logbookentry(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    new_since_parsing = models.BooleanField()
    non_public = models.BooleanField()
    date = models.DateField()
    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 Person(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 Personexpedition(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)



class PersonLogbookEntry(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 Qm(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    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)
    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)


class Survexblock(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)
    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 Survexdirectory(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 Survexfile(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 Survexleg(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 Survexpersonrole(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)
    personlogbookentry_id = models.IntegerField(blank=True, null=True)


class Survexscansfolder(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    fpath = models.CharField(max_length=200)
    walletname = models.CharField(max_length=200)


class Survexscansingle(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 Survexstation(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 Survextitle(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 Dwgfile(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    dwgpath = models.CharField(max_length=200)
    dwgname = models.CharField(max_length=200)
    bfontcolours = models.BooleanField()
    filesize = models.IntegerField()
    npaths = models.IntegerField()


class DwgfileSurvexblocks(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    dwgfile_id = models.IntegerField()
    survexblock = models.ForeignKey (CoreSurvexblock)


class DwgfileSurvexscans(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    dwgfile_id = models.IntegerField()
    survexscansingle = models.ForeignKey (CoreSurvexscansingle)


class DwgfileSurvexscansfolders(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    dwgfile_id = models.IntegerField()
    survexscansfolder = models.ForeignKey (CoreSurvexscansfolder)


class DwgfileSurvextitles(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    dwgfile_id = models.IntegerField()
    survextitle = models.ForeignKey (CoreSurvextitle)


class DwgfileDwgcontains(models.Model):
    id = models.IntegerField(primary_key =True)  # AutoField? 
    from_dwgfile_id = models.IntegerField()
    to_dwgfile_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 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
Return to: Troggle intro
Troggle index: Index of all troggle documents