commit b503d3d588474cc41bffc01eca7654bb8c6f4a42 Author: substantialnoninfringinguser Date: Wed May 13 05:13:38 2009 +0100 [svn] Initial troggle checkin This is a development site using Django 1.0 Copied from http://cucc@cucc.survex.com/svn/trunk/expoweb/troggle/, rev. 8034 by julian @ 10/26/2008 9:04 PM diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/expo/__init__.py b/expo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/expo/admin.py b/expo/admin.py new file mode 100644 index 0000000..5b1036b --- /dev/null +++ b/expo/admin.py @@ -0,0 +1,15 @@ +from troggle.expo.models import * +from django.contrib import admin + +admin.site.register(Cave) +admin.site.register(Area) +admin.site.register(OtherCaveName) +admin.site.register(CaveAndEntrance) +admin.site.register(SurveyStation) +admin.site.register(Entrance) +admin.site.register(SurvexBlock) +admin.site.register(Expedition) +admin.site.register(Person) +admin.site.register(PersonExpedition) +admin.site.register(LogbookEntry) +admin.site.register(PersonTrip) diff --git a/expo/models.py b/expo/models.py new file mode 100644 index 0000000..faa79af --- /dev/null +++ b/expo/models.py @@ -0,0 +1,3 @@ +from models_cave import * +from models_survex import * +from models_logbooks import * \ No newline at end of file diff --git a/expo/models_cave.py b/expo/models_cave.py new file mode 100644 index 0000000..3ae6752 --- /dev/null +++ b/expo/models_cave.py @@ -0,0 +1,153 @@ +from django.db import models + +class Area(models.Model): + short_name = models.CharField(max_length=100) + name = models.CharField(max_length=200, blank=True, null=True) + description = models.TextField(blank=True,null=True) + parent = models.ForeignKey('Area', blank=True, null=True) + def __unicode__(self): + if self.parent: + return unicode(self.parent) + u" - " + unicode(self.short_name) + else: + return unicode(self.short_name) + def kat_area(self): + if self.short_name in ["1623", "1626"]: + return self.short_name + elif self.parent: + return self.parent.kat_area() + +class CaveAndEntrance(models.Model): + cave = models.ForeignKey('Cave') + entrance = models.ForeignKey('Entrance') + entrance_letter = models.CharField(max_length=20,blank=True,null=True) + def __unicode__(self): + return unicode(self.cave) + unicode(self.entrance_letter) + +class Cave(models.Model): + official_name = models.CharField(max_length=160) + area = models.ManyToManyField(Area, blank=True, null=True) + kataster_code = models.CharField(max_length=20,blank=True,null=True) + kataster_number = models.CharField(max_length=10,blank=True, null=True) + unofficial_number = models.CharField(max_length=30,blank=True, null=True) + entrances = models.ManyToManyField('Entrance', through='CaveAndEntrance') + explorers = models.TextField(blank=True,null=True) + underground_description = models.TextField(blank=True,null=True) + equipment = models.TextField(blank=True,null=True) + references = models.TextField(blank=True,null=True) + survey = models.TextField(blank=True,null=True) + kataster_status = models.TextField(blank=True,null=True) + underground_centre_line = models.TextField(blank=True,null=True) + notes = models.TextField(blank=True,null=True) + length = models.CharField(max_length=40,blank=True,null=True) + depth = models.CharField(max_length=40,blank=True,null=True) + extent = models.CharField(max_length=40,blank=True,null=True) + survex_file = models.CharField(max_length=100,blank=True,null=True) + def __unicode__(self): + if self.kataster_number: + if self.kat_area(): + return self.kat_area() + u": " + self.kataster_number + else: + return unicode(l) + u": " + self.kataster_number + else: + if self.kat_area(): + return self.kat_area() + u": " + self.unofficial_number + else: + return self.unofficial_number + def kat_area(self): + for a in self.area.all(): + if a.kat_area(): + return a.kat_area() + def entrances(self): + return CaveAndEntrance.objects.filter(cave=self) + def entrancelist(self): + rs = [] + res = "" + for e in CaveAndEntrance.objects.filter(cave=self): + rs.append(e.entrance_letter) + rs.sort() + prevR = None + n = 0 + for r in rs: + if prevR: + if chr(ord(prevR) + 1 ) == r: + prevR = r + n += 1 + else: + if n == 0: + res += ", " + prevR + else: + res += "–" + prevR + else: + prevR = r + n = 0 + res += r + if n == 0: + res += ", " + prevR + else: + res += "–" + prevR + return res + + +class OtherCaveName(models.Model): + name = models.CharField(max_length=160) + cave = models.ForeignKey(Cave) + def __unicode__(self): + return unicode(self.name) + +class SurveyStation(models.Model): + name = models.CharField(max_length=200) + def __unicode__(self): + return unicode(self.name) + +class Entrance(models.Model): + name = models.CharField(max_length=60, blank=True,null=True) + entrance_description = models.TextField(blank=True,null=True) + explorers = models.TextField(blank=True,null=True) + map_description = models.TextField(blank=True,null=True) + location_description = models.TextField(blank=True,null=True) + approach = models.TextField(blank=True,null=True) + underground_description = models.TextField(blank=True,null=True) + photo = models.TextField(blank=True,null=True) + MARKING_CHOICES = ( + ('P', 'Paint'), + ('P?', 'Paint (?)'), + ('T', 'Tag'), + ('T?', 'Tag (?)'), + ('R', 'Retagged'), + ('S', 'Spit'), + ('S?', 'Spit (?)'), + ('U', 'Unmarked'), + ('?', 'Unknown')) + marking = models.CharField(max_length=2, choices=MARKING_CHOICES) + marking_comment = models.TextField(blank=True,null=True) + FINDABLE_CHOICES = ( + ('?', 'To be confirmed ...'), + ('S', 'Surveyed'), + ('L', 'Lost'), + ('R', 'Refindable')) + findability = models.CharField(max_length=1, choices=FINDABLE_CHOICES, blank=True, null=True) + findability_description = models.TextField(blank=True,null=True) + alt = models.TextField(blank=True, null=True) + northing = models.TextField(blank=True, null=True) + easting = models.TextField(blank=True, null=True) + tag_station = models.ForeignKey(SurveyStation, blank=True,null=True, related_name="tag_station") + exact_station = models.ForeignKey(SurveyStation, blank=True,null=True, related_name="exact_station") + other_station = models.ForeignKey(SurveyStation, blank=True,null=True, related_name="other_station") + other_description = models.TextField(blank=True,null=True) + bearings = models.TextField(blank=True,null=True) + def __unicode__(self): + a = CaveAndEntrance.objects.filter(entrance = self) + name = u'' + if self.name: + name = unicode(self.name) + u' ' + if len(a) == 1: + return name + unicode(a[0]) + return name + unicode(a) + def marking_val(self): + for m in self.MARKING_CHOICES: + if m[0] == self.marking: + return m[1] + def findability_val(self): + for f in self.FINDABLE_CHOICES: + if f[0] == self.findability: + return f[1] \ No newline at end of file diff --git a/expo/models_logbooks.py b/expo/models_logbooks.py new file mode 100644 index 0000000..6438f73 --- /dev/null +++ b/expo/models_logbooks.py @@ -0,0 +1,79 @@ +from django.db import models +from django.contrib import admin + + +class Expedition(models.Model): + year = models.CharField(max_length=20, unique=True) + name = models.CharField(max_length=100) + start_date = models.DateField(blank=True,null=True) + end_date = models.DateField(blank=True,null=True) + + def __str__(self): + return self.year + + def GetPersonExpedition(self, name): + if name == "Dour": + name = "Anthony Day" + personyears = PersonExpedition.objects.filter(expedition=self) + res = None + for personyear in personyears: + if name == "%s %s" % (personyear.person.first_name, personyear.person.last_name): + assert not res, "Ambiguous:" + name + res = personyear + if name == "%s %s" % (personyear.person.first_name, personyear.person.last_name[0]): + assert not res, "Ambiguous:" + name + res = personyear + if name == personyear.person.first_name: + assert not res, "Ambiguous:" + name + res = personyear + return res + + +class Person(models.Model): + first_name = models.CharField(max_length=100) + last_name = models.CharField(max_length=100) + is_guest = models.BooleanField() + is_vfho = models.BooleanField() + mug_shot = models.CharField(max_length=100, blank=True,null=True) + def __str__(self): + return "%s %s" % (self.first_name, self.last_name) + +class PersonExpedition(models.Model): + expedition = models.ForeignKey(Expedition) + person = models.ForeignKey(Person) + from_date = models.DateField(blank=True,null=True) + to_date = models.DateField(blank=True,null=True) + nickname = models.CharField(max_length=100,blank=True,null=True) + def __str__(self): + return "%s: (%s)" % (self.person, self.expedition) + +class LogbookEntry(models.Model): + date = models.DateField() + author = models.ForeignKey(PersonExpedition,blank=True,null=True) + title = models.CharField(max_length=100) + + # this will be a foreign key + place = models.CharField(max_length=100,blank=True,null=True) + text = models.TextField() + + #cavers = models.ManyToManyField(PersonYear) + #tu = models.CharField(max_length=50) + def __str__(self): + return "%s: (%s)" % (self.date, self.title) + +class PersonTrip(models.Model): + personexpedition = models.ForeignKey(PersonExpedition) + place = models.CharField(max_length=100) # this will be a foreign key + date = models.DateField() + timeunderground = models.CharField(max_length=100) + logbookentry = models.ForeignKey(LogbookEntry) + + #is_author = models.BooleanField() + + def __str__(self): + return "%s %s (%s)" % (self.personexpedition, self.place, self.date) + + + + + diff --git a/expo/models_survex.py b/expo/models_survex.py new file mode 100644 index 0000000..b00cf1b --- /dev/null +++ b/expo/models_survex.py @@ -0,0 +1,15 @@ +from django.db import models + +class SurvexBlock(models.Model): + name = models.CharField(max_length=100) + text = models.TextField() + notes_person = models.ManyToManyField('PersonTrip', related_name="notes") + pics_person = models.ManyToManyField('PersonTrip', related_name="pics") + tape_person = models.ManyToManyField('PersonTrip', related_name="tape") + insts_person = models.ManyToManyField('PersonTrip', related_name="insts") + begin_file = models.CharField(max_length=200) + begin_char = models.IntegerField() + end_file = models.CharField(max_length=200) + end_char = models.IntegerField() + def __unicode__(self): + return unicode(name) diff --git a/expo/templatetags/__init__.py b/expo/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/expo/templatetags/survex_markup.py b/expo/templatetags/survex_markup.py new file mode 100644 index 0000000..c9992a9 --- /dev/null +++ b/expo/templatetags/survex_markup.py @@ -0,0 +1,51 @@ +from django import template +from django.utils.html import conditional_escape +from django.template.defaultfilters import stringfilter +from django.utils.safestring import mark_safe +import re + +register = template.Library() + +regexes = [] +regexes.append((re.compile(r"(;.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\n')) +regexes.append((re.compile(r"^(\s*)(\*include)(\s+)([^\s]*)(.svx)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4\5')) +regexes.append((re.compile(r"^(\s*)(\*include)(\s+)([^\s]*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*team\s+(?:notes|tape|insts|pics))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*(?:begin|end|copyright|date|entrance|equate|export|fix|prefix|require|SOLVE|title|truncate))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*calibrate\s+(?:TAPE|COMPASS|CLINO|COUNTER|DEPTH|DECLINATION|X|Y|Z)+)(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*data\s+(?:DEFAULT|NORMAL|DIVING|CARTESIAN|TOPOFIL|CYLPOLAR|NOSURVEY|passage)(?:\s+station|\s+from|\s+to|\s+FROMDEPTH|\s+TODEPTH|\s+DEPTHCHANGE|\s+newline|\s+direction|\s+tape|\s+compass|\s+clino|\s+northing|\s+easting|\s+altitude|\s+length|\s+bearing|\s+gradient|\s+ignoreall|\sleft|\sright|\sup|\sdown)*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2')) +regexes.append((re.compile(r"^(\s*)(\*default\s+(?:CALIBRATE|DATA|UNITS)+)(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*flags\s+(?:DUPLICATE|SPLAY|SURFACE|not DUPLICATE|not SPLAY|not SURFACE))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*infer\s+(?:plumbs|equates|exports))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*instrument\s+(?:compass|clino|tape))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*instrument\s+(?:compass|clino|tape))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*sd\s+(?:TAPE|COMPASS|CLINO|COUNTER|DEPTH|DECLINATION|DX|DY|DZ))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*set\s+(?:BLANK|COMMENT|DECIMAL|EOL|KEYWORD|MINUS|NAMES|OMIT|PLUS|ROOT|SEPARATOR))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(\s*)(\*units\s+(?:TAPE|LENGTH|COMPASS|BEARING|CLINO|GRADIENT|COUNTER|DEPTH|DECLINATION|X|Y|Z))(\s+)(.*)$", re.IGNORECASE|re.MULTILINE), + r'\1\2\3\4')) +regexes.append((re.compile(r"^(.*)$", re.IGNORECASE|re.MULTILINE), + r'
\1 
\n')) + +@register.filter() +@stringfilter +def survex_to_html(value, autoescape=None): + if autoescape: + value = conditional_escape(value) + for regex, sub in regexes: + print sub + value = regex.sub(sub, value) + return mark_safe(value) \ No newline at end of file diff --git a/expo/templatetags/wiki_markup.py b/expo/templatetags/wiki_markup.py new file mode 100644 index 0000000..7634485 --- /dev/null +++ b/expo/templatetags/wiki_markup.py @@ -0,0 +1,58 @@ +from django import template +from django.utils.html import conditional_escape +from django.template.defaultfilters import stringfilter +from django.utils.safestring import mark_safe +import re + +register = template.Library() + +def wiki_list(line, listdepth): + l = "" + for d in listdepth: + l += d + mstar = re.match(l + "\*(.*)", line) + if mstar: + listdepth.append("\*") + return ("\n" + t, l) + if prev == "#": + t, l = wiki_list(line, listdepth) + return ("\n" + t, l) + return (line, listdepth) + +@register.filter() +@stringfilter +def wiki_to_html(value, autoescape=None): + if autoescape: + value = conditional_escape(value) + #deescape doubly escaped characters + value = re.sub("&(.*?);", r"&\1;", value, re.DOTALL) + #italics and bold + value = re.sub("''''([^']+)''''", r"\1", value, re.DOTALL) + value = re.sub("'''([^']+)'''", r"\1", value, re.DOTALL) + value = re.sub("''([^']+)''", r"\1", value, re.DOTALL) + #Make lists from lines starting with lists of [stars and hashes] + listdepth = [] + outValue = "" + for line in value.split("\n"): + t, listdepth = wiki_list(line, listdepth) + outValue += t + for item in listdepth: + if item == "\*": + outValue += "\n" + elif item == "#": + outValue += "\n" + return mark_safe(outValue) + +wiki_to_html.needs_autoescape = True diff --git a/expo/views.py b/expo/views.py new file mode 100644 index 0000000..0ffd800 --- /dev/null +++ b/expo/views.py @@ -0,0 +1,2 @@ +from views_caves import * +from views_survex import * \ No newline at end of file diff --git a/expo/views_caves.py b/expo/views_caves.py new file mode 100644 index 0000000..b2e1850 --- /dev/null +++ b/expo/views_caves.py @@ -0,0 +1,19 @@ +from django.shortcuts import render_to_response +from troggle.expo.models import Cave, CaveAndEntrance +import troggle.settings as settings + +def caveindex(request): + caves = Cave.objects.all() + return render_to_response('caveindex.html', {'caves': caves, 'settings': settings}) + +def cave(request, cave_id): + cave = Cave.objects.filter(kataster_number = cave_id)[0] + return render_to_response('cave.html', {'cave': cave, 'settings': settings}) + +def ent(request, cave_id, ent_letter): + cave = Cave.objects.filter(kataster_number = cave_id)[0] + cave_and_ent = CaveAndEntrance.objects.filter(cave = cave).filter(entrance_letter = ent_letter)[0] + return render_to_response('entrance.html', {'cave': cave, + 'entrance': cave_and_ent.entrance, + 'letter': cave_and_ent.entrance_letter, + 'settings': settings}) diff --git a/expo/views_survex.py b/expo/views_survex.py new file mode 100644 index 0000000..c356363 --- /dev/null +++ b/expo/views_survex.py @@ -0,0 +1,44 @@ +from django.shortcuts import render_to_response +from django.http import HttpResponse, Http404 +import re +import os + +import troggle.settings as settings + +def index(request, survex_file): + process(survex_file) + f = open(settings.SURVEX_DATA + survex_file + ".svx", "rb") + a = f.read() + return render_to_response('svxfile.html', {'settings': settings, + 'has_3d': os.path.isfile(settings.SURVEX_DATA + survex_file + ".3d"), + 'title': survex_file, + 'text': unicode(a, "latin1")}) + +def svx(request, survex_file): + svx = open(settings.SURVEX_DATA + survex_file + ".svx", "rb") + return HttpResponse(svx, mimetype="text") + +def threed(request, survex_file): + process(survex_file) + try: + threed = open(settings.SURVEX_DATA + survex_file + ".3d", "rb") + return HttpResponse(threed, mimetype="model/3d") + except: + log = open(settings.SURVEX_DATA + survex_file + ".log", "rb") + return HttpResponse(log, mimetype="text") + +def log(request, survex_file): + process(survex_file) + log = open(settings.SURVEX_DATA + survex_file + ".log", "rb") + return HttpResponse(log, mimetype="text") + +def err(request, survex_file): + process(survex_file) + err = open(settings.SURVEX_DATA + survex_file + ".err", "rb") + return HttpResponse(err, mimetype="text") + +def process(survex_file): + cwd = os.getcwd() + os.chdir(os.path.split(settings.SURVEX_DATA + survex_file)[0]) + os.system(settings.CAVERN + " --log " +settings.SURVEX_DATA + survex_file + ".svx") + os.chdir(cwd) \ No newline at end of file diff --git a/localsettingsserver.py b/localsettingsserver.py new file mode 100644 index 0000000..81f2881 --- /dev/null +++ b/localsettingsserver.py @@ -0,0 +1,10 @@ +DATABASE_ENGINE = 'mysql' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. +DATABASE_NAME = 'undemocracy' # Or path to database file if using sqlite3. +DATABASE_USER = 'undemocracy' # Not used with sqlite3. +DATABASE_PASSWORD = 'aiGohsh5' # Not used with sqlite3. +DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. +DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. + +SURVEX_DATA = '' +CAVERN = 'cavern' +EXPOWEB = '' \ No newline at end of file diff --git a/localsettingswindows.py b/localsettingswindows.py new file mode 100644 index 0000000..179669f --- /dev/null +++ b/localsettingswindows.py @@ -0,0 +1,10 @@ +DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. +DATABASE_NAME = './sqlite.db' # Or path to database file if using sqlite3. +DATABASE_USER = '' # Not used with sqlite3. +DATABASE_PASSWORD = '' # Not used with sqlite3. +DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. +DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. + +SURVEX_DATA = 'c:\\loser\\' +CAVERN = '"C:\\Program Files\\Survex\\cavern"' +EXPOWEB = 'C:\\expoweb\\' \ No newline at end of file diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..b8c4be8 --- /dev/null +++ b/manage.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +from django.core.management import execute_manager +try: + import settings # Assumed to be in the same directory. +except ImportError: + import sys + sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) + sys.exit(1) + +if __name__ == "__main__": + execute_manager(settings) diff --git a/media/css/main2.css b/media/css/main2.css new file mode 100644 index 0000000..8f1f3d2 --- /dev/null +++ b/media/css/main2.css @@ -0,0 +1,43 @@ +.caption { font-size: 8pt; margin-bottom: 0pt; } +.centre { text-align: center; } +.plus2pt { font-size: 160%; } + +body, td, center, ul, p, input { color: #000; font-family: sans-serif; } +a:link, a:visited { text-decoration: none; } +div.centre img { vertical-align: middle; } +h1 { text-align: center; font-size: 210%; + line-height: 100%; } +h2 { color: #009900; } +h3 { color: #2c105e; } +h4 { color: #0d664c; } +img.onright, div.onright { vertical-align: top; float: right; + margin-left: 10pt; margin-bottom: 10pt; + margin-right: 8pt; } +img.onleft, div.onleft { vertical-align: top; float: left; + margin-right: 10pt; margin-bottom: 10pt; + margin-left: 8pt; } +img.icon { vertical-align: middle; } +img.aligntop { vertical-align: top; } +table.imgtable { margin-left: auto; margin-right: auto; } +table.imgtable td { vertical-align: middle; text-align: center; + padding: 10px; } + +/* "Traditional" table with borders.*/ +table.trad { margin: 0pt; border: 1px solid #000; + border-color: #c0c0c0 #8d8d8d #8d8d8d #c0c0c0; } +table.bigfatborder { border-width: 6px; } +table.trad td, table.trad th { margin: 0pt; border: 1px solid #aaa; + border-color: #8d8d8d #c0c0c0 #c0c0c0 #8d8d8d; } + +/* You are not expected to understand this. It is necessary. */ +table.centre { margin-left: auto; margin-right: auto; } +table.centre td { text-align: left; } + +h2#tophead { text-align: center; margin-bottom: -10pt; } +table#cavepage { width: 100%; font-size: 160%; } +table#cavepage th#kat_no { text-align: left; width: 25%; } +table#cavepage th#name { text-align: center; width: 50%; } +table#cavepage th#status { text-align: right; width: 25%; } + +.command { color: #FF0000; } +.comment { color: #888888; font-style:italic;} \ No newline at end of file diff --git a/middleware.py b/middleware.py new file mode 100644 index 0000000..40e14ed --- /dev/null +++ b/middleware.py @@ -0,0 +1,49 @@ +from django.conf import settings +from django import http +from django.core.urlresolvers import resolve + +class SmartAppendSlashMiddleware(object): + """ + "SmartAppendSlash" middleware for taking care of URL rewriting. + + This middleware appends a missing slash, if: + * the SMART_APPEND_SLASH setting is True + * the URL without the slash does not exist + * the URL with an appended slash does exist. + Otherwise it won't touch the URL. + """ + + def process_request(self, request): + """ + Rewrite the URL based on settings.SMART_APPEND_SLASH + """ + + # Check for a redirect based on settings.SMART_APPEND_SLASH + host = http.get_host(request) + old_url = [host, request.path] + new_url = old_url[:] + # Append a slash if SMART_APPEND_SLASH is set and the resulting URL + # resolves. + if settings.SMART_APPEND_SLASH and (not old_url[1].endswith('/')) and not _resolves(old_url[1]) and _resolves(old_url[1] + '/'): + new_url[1] = new_url[1] + '/' + if settings.DEBUG and request.method == 'POST': + raise RuntimeError, "You called this URL via POST, but the URL doesn't end in a slash and you have SMART_APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to %s%s (note the trailing slash), or set SMART_APPEND_SLASH=False in your Django settings." % (new_url[0], new_url[1]) + if new_url != old_url: + # Redirect + if new_url[0]: + newurl = "%s://%s%s" % (request.is_secure() and 'https' or 'http', new_url[0], new_url[1]) + else: + newurl = new_url[1] + if request.GET: + newurl += '?' + request.GET.urlencode() + return http.HttpResponsePermanentRedirect(newurl) + + return None + +def _resolves(url): + try: + resolve(url) + return True + except http.Http404: + return False + diff --git a/parsers/__init__.py b/parsers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/parsers/cavetab.py b/parsers/cavetab.py new file mode 100644 index 0000000..bd3d81b --- /dev/null +++ b/parsers/cavetab.py @@ -0,0 +1,272 @@ +# -*- coding: utf-8 -*- + +import settings +import expo.models as models +import csv +import time +import sqlite3 +import re +import os + +##format of CAVETAB2.CSV is +KatasterNumber = 0 +KatStatusCode = 1 +Entrances = 2 +UnofficialNumber = 3 +MultipleEntrances = 4 +AutogenFile = 5 +LinkFile = 6 +LinkEntrance = 7 +Name = 8 +UnofficialName = 9 +Comment = 10 +Area = 11 +Explorers = 12 +UndergroundDescription = 13 +Equipment = 14 +QMList = 15 +KatasterStatus = 16 +References = 17 +UndergroundCentreLine = 18 +UndergroundDrawnSurvey = 19 +SurvexFile = 20 +Length = 21 +Depth = 22 +Extent = 23 +Notes = 24 +EntranceName = 25 +TagPoint = 26 +OtherPoint = 27 +DescriptionOfOtherPoint = 28 +ExactEntrance = 29 +TypeOfFix = 30 +GPSpreSA = 31 +GPSpostSA = 32 +Northing = 33 +Easting = 34 +Altitude = 35 +Bearings = 36 +Map = 37 +Location = 38 +Approach = 39 +EntranceDescription = 40 +PhotoOfLocation = 41 +Marking = 42 +MarkingComment = 43 +Findability = 44 +FindabilityComment = 45 + +cavetab = open(os.path.join(settings.EXPOWEB, "noinfo", "CAVETAB2.CSV")) +caveReader = csv.reader(cavetab) +caveReader.next() # Strip out column headers + + +def save(x): #There seems to be an intermitent problem with sqlite and Vista, this should fix it + try: + x.save() + except sqlite3.OperationalError: + print "Error" + time.sleep(1) + save(x) + +def html_to_wiki(text): + if type(text) != str: + return text + text = unicode(text, "utf-8") + #Characters + #text = re.sub("ü", u"\xfc", text) + #text = re.sub("ö", u"\xf6", text) + #text = re.sub("ä", u"\xe4", text) + #text = re.sub("°", u"\xb0", text) + #text = re.sub("©", u"\xa9", text) + #text = re.sub("&", u"\x26", text) + #text = re.sub("ß", u"\xdf", text) + #text = re.sub("ß", u"\xdf", text) + #text = re.sub("<", u"<", text) + #text = re.sub(">", u">", text) + #text = re.sub("è", u"\xe8", text) + #text = re.sub("é", u"\xe9", text) + #text = re.sub(""e;", u'"', text) + #text = re.sub(""", u'"', text) + #text = re.sub("Ö", u'\xd6', text) + #text = re.sub("×", u'"', text) + + #text = re.sub("&(.*);", "/1", text) + #if s: + # print s.groups() + #Lists + text = re.sub("^

(.*)", r"\1", text) + text = re.sub("(.*)

$", r"\1", text) + out = "" + lists = "" + while text: + mstar = re.match("^(.*?)

(.*)$", text, re.DOTALL) + mhash = re.match("^(.*?)
    \s*]*>(.*?)(.*)$", text, re.DOTALL) + munhash = re.match("^(\s*)
(.*)$", text, re.DOTALL) + mitem = re.match("^(\s*)]*>(.*?)(.*)$", text, re.DOTALL) + ms = [len(m.groups()[0]) for m in [mstar, munstar, mhash, munhash, mitem] if m] + def min_(i, l): + try: + v = i.groups()[0] + l.remove(len(v)) + return len(v) < min(l, 1000000000) + except: + return False + if min_(mstar, ms): + lists += "*" + pre, val, post = mstar.groups() + out += pre + "\n" + lists + " " + val + text = post + elif min_(mhash, ms): + lists += "#" + pre, val, post = mhash.groups() + out += pre + "\n" + lists + " " + val + text = post + elif min_(mitem, ms): + pre, val, post = mitem.groups() + out += "\n" + lists + " " + val + text = post + elif min_(munstar, ms): + lists = lists[:-1] + text = munstar.groups()[1] + elif min_(munhash, ms): + lists.pop() + text = munhash.groups()[1] + else: + out += text + text = "" + text2 = out + while text2: + mtag = re.match("^(.*?)<(.*?)>(.*)$", text, re.DOTALL) + if mtag: + text2 = mtag.groups()[2] + print mtag.groups()[1] + else: + text2 = "" + return out + +for katArea in ['1623', '1626']: + if not models.Area.objects.filter(short_name = katArea): + newArea = models.Area(short_name = katArea) + save(newArea) +area1626 = models.Area.objects.filter(short_name = '1626')[0] +area1623 = models.Area.objects.filter(short_name = '1623')[0] + +counter=0 +for line in caveReader : + if line[Area] == 'nonexistent': + continue + entranceLetters=[] #Used in caves that have mulitlple entrances, which are not described on seperate lines + if line[MultipleEntrances] == 'yes' or line[MultipleEntrances]=='': + args = {} + def addToArgs(CSVname, modelName): + if line[CSVname]: + args[modelName] = html_to_wiki(line[CSVname]) + addToArgs(KatasterNumber, "kataster_number") + addToArgs(KatStatusCode, "kataster_code") + addToArgs(UnofficialNumber, "unofficial_number") + addToArgs(Name, "official_name") + addToArgs(Comment, "notes") + addToArgs(Explorers, "explorers") + addToArgs(UndergroundDescription, "underground_description") + addToArgs(Equipment, "equipment") + addToArgs(KatasterStatus, "kataster_status") + addToArgs(References, "references") + addToArgs(UndergroundCentreLine, "underground_centre_line") + addToArgs(UndergroundDrawnSurvey, "survey") + addToArgs(Length, "length") + addToArgs(Depth, "depth") + addToArgs(Extent, "extent") + addToArgs(SurvexFile, "survex_file") + addToArgs(Notes, "notes") + + newCave = models.Cave(**args) + save(newCave) + + if line[Area]: + if line[Area] == "1626": + newCave.area.add(area1626) + else: + area = models.Area.objects.filter(short_name = line[Area]) + if area: + newArea = area[0] + else: + newArea = models.Area(short_name = line[Area], parent = area1623) + save(newArea) + newCave.area.add(newArea) + else: + newCave.area.add(area1623) + + save(newCave) + + if line[UnofficialName]: + newUnofficialName = models.OtherCaveName(cave = newCave, name = line[UnofficialName]) + save(newUnofficialName) + if line[MultipleEntrances] == '' or \ + line[MultipleEntrances] == 'entrance' or \ + line[MultipleEntrances] == 'last entrance': + args = {} + def addToArgs(CSVname, modelName): + if line[CSVname]: + args[modelName] = html_to_wiki(line[CSVname]) + def addToArgsViaDict(CSVname, modelName, dictionary): + if line[CSVname]: + args[modelName] = dictionary[html_to_wiki(line[CSVname])] + addToArgs(EntranceName, 'name') + addToArgs(Explorers, 'explorers') + addToArgs(Map, 'map_description') + addToArgs(Location, 'location_description') + addToArgs(Approach, 'approach') + addToArgs(EntranceDescription, 'entrance_description') + addToArgs(UndergroundDescription, 'underground_description') + addToArgs(PhotoOfLocation, 'photo') + addToArgsViaDict(Marking, 'marking', {"Paint": "P", + "Paint (?)": "P?", + "Tag": "T", + "Tag (?)": "T?", + "Retagged": "R", + "Retag": "R", + "Spit": "S", + "Spit (?)": "S?", + "Unmarked": "U", + "": "?", + }) + addToArgs(MarkingComment, 'marking_comment') + addToArgsViaDict(Findability, 'findability', {"Surveyed": "S", + "Lost": "L", + "Refindable": "R", + "": "?", + "?": "?", + }) + addToArgs(FindabilityComment, 'findability_description') + addToArgs(Easting, 'easting') + addToArgs(Northing, 'northing') + addToArgs(Altitude, 'alt') + addToArgs(DescriptionOfOtherPoint, 'other_description') + def addToArgsSurveyStation(CSVname, modelName): + if line[CSVname]: + surveyPoint = models.SurveyStation(name = line[CSVname]) + save(surveyPoint) + args[modelName] = html_to_wiki(surveyPoint) + addToArgsSurveyStation(TagPoint, 'tag_station') + addToArgsSurveyStation(ExactEntrance, 'exact_station') + addToArgsSurveyStation(OtherPoint, 'other_station') + addToArgs(OtherPoint, 'other_description') + if line[GPSpreSA]: + addToArgsSurveyStation(GPSpreSA, 'other_station') + args['other_description'] = 'pre selective availability GPS' + if line[GPSpostSA]: + addToArgsSurveyStation(GPSpostSA, 'other_station') + args['other_description'] = 'post selective availability GPS' + addToArgs(Bearings, 'bearings') + newEntrance = models.Entrance(**args) + save(newEntrance) + + if line[Entrances]: + entrance_letter = line[Entrances] + else: + entrance_letter = '' + + newCaveAndEntrance = models.CaveAndEntrance(cave = newCave, entrance = newEntrance, entrance_letter = entrance_letter) + save(newCaveAndEntrance) \ No newline at end of file diff --git a/parsers/logbooks.py b/parsers/logbooks.py new file mode 100644 index 0000000..5c38d41 --- /dev/null +++ b/parsers/logbooks.py @@ -0,0 +1,197 @@ +#.-*- coding: utf-8 -*- + +import settings +import expo.models as models +import csv +import sqlite3 +import re +import os +import datetime + +# Dave Johnson (Stonker) is hacked -- are there two of this DJ name +# Dave Collins (Scout) is hacked +# Letty ten Harkel has middle , tu = timeug or ""name removed +# the have been removed +# Dave Milne (Lummat) +# Ben van Millingen +# Rebecca Lawson (Becka) + +persontab = open(os.path.join(settings.EXPOWEB, "noinfo", "folk.csv")) +personreader = csv.reader(persontab) +headers = personreader.next() +header = dict(zip(headers, range(len(headers)))) + + +def LoadExpos(): + models.Expedition.objects.all().delete() + y = models.Expedition(year = "2008", name = "CUCC expo2008") + y.save() + for year in headers[5:]: + y = models.Expedition(year = year, name = "CUCC expo%s" % y) + y.save() + +def LoadPersons(): + models.Person.objects.all().delete() + models.PersonExpedition.objects.all().delete() + expoers2008 = """Edvin Deadman,Kathryn Hopkins,Djuke Veldhuis,Becka Lawson,Julian Todd,Natalie Uomini,Aaron Curtis,Tony Rooke,Ollie Stevens,Frank Tully,Martin Jahnke,Mark Shinwell,Jess Stirrups,Nial Peters,Serena Povia,Olly Madge,Steve Jones,Pete Harley,Eeva Makiranta,Keith Curtis""".split(",") + expomissing = set(expoers2008) + + for person in personreader: + name = person[header["Name"]] + name = re.sub("<.*?>", "", name) + lname = name.split() + if len(lname) >= 2: + firstname, lastname = lname[0], lname[1] + else: + firstname, lastname = lname[0], "" + print firstname, lastname + #assert lastname == person[header[""]], person + pObject = models.Person(first_name = firstname, + last_name = lastname, + is_guest = person[header["Guest"]] == "1", + is_vfho = person[header["VfHO member"]], + mug_shot = person[header["Mugshot"]]) + pObject.save() + + for year, attended in zip(headers, person)[5:]: + yo = models.Expedition.objects.filter(year = year)[0] + if attended == "1" or attended == "-1": + pyo = models.PersonExpedition(person = pObject, expedition = yo) + pyo.save() + + if name in expoers2008: + print "2008:", name + expomissing.discard(name) + yo = models.Expedition.objects.filter(year = "2008")[0] + pyo = models.PersonExpedition(person = pObject, expedition = yo) + pyo.save() + + + print expomissing + for name in expomissing: + firstname, lastname = name.split() + pObject = models.Person(first_name = firstname, + last_name = lastname, + is_guest = name in ["Eeva Makiranta", "Kieth Curtis"], + is_vfho = False, + mug_shot = "") + pObject.save() + yo = models.Expedition.objects.filter(year = "2008")[0] + pyo = models.PersonExpedition(person = pObject, expedition = yo) + pyo.save() + + +# +# the logbook loading section +# +def GetTripPersons(trippeople, expedition): + res = [ ] + author = None + for tripperson in re.split(",|\+|&| and ", trippeople): + tripperson = tripperson.strip() + mul = re.match("(.*?)$", tripperson) + if mul: + tripperson = mul.group(1) + if tripperson and tripperson[0] != '*': + #assert tripperson in personyearmap, "'%s' << %s\n\n %s" % (tripperson, trippeople, personyearmap) + personyear = expedition.GetPersonExpedition(tripperson) + print personyear + res.append(personyear) + if mul: + author = personyear + if not author: + author = res[-1] + return res, author + +def Parselogwikitxt(year, personyearmap, txt): + trippara = re.findall("===(.*?)===([\s\S]*?)(?====)", txt) + for triphead, triptext in trippara: + tripheadp = triphead.split("|") + assert len(tripheadp) == 3, tripheadp + tripdate, tripplace, trippeople = tripheadp + tripsplace = tripplace.split(" - ") + tripcave = tripsplace[0] + + tul = re.findall("T/?U:?\s*(\d+(?:\.\d*)?|unknown)\s*(hrs|hours)?", triptext) + if tul: + #assert len(tul) <= 1, (triphead, triptext) + #assert tul[0][1] in ["hrs", "hours"], (triphead, triptext) + triptime = tul[0][0] + else: + triptime = "" + #assert tripcave == "Journey", (triphead, triptext) + + assert re.match("\d\d\d\d-\d\d-\d\d", tripdate), tripdate + ldate = datetime.date(int(tripdate[:4]), int(tripdate[5:7]), int(tripdate[8:10])) + lbo = models.LogbookEntry(date = ldate, cave = tripcave, title = tripsplace[-1], text = triptext, tu = triptime) + lbo.save() + + trippersons, author = GetTripPersons(trippeople, personyearmap) + for tripperson in trippersons: + lbo.cavers.add(tripperson) + # add the author + +def Parseloghtmltxt(year, expedition, txt): + tripparas = re.findall("([\s\S]*?)(?=)? + \s*(.*?) + \s*(.*?) + \s*(.*?) + ([\s\S]*?) + \s*(?:(.*?))? + \s*$ + ''', trippara) + assert s, trippara + + tripid, tripid1, tripdate, trippeople, triptitle, triptext, timeug = s.groups() + mdatestandard = re.match("(\d\d\d\d)-(\d\d)-(\d\d)", tripdate) + mdategoof = re.match("(\d\d?)/(\d)/(\d\d)", tripdate) + if mdatestandard: + year, month, day = int(mdatestandard.group(1)), int(mdatestandard.group(2)), int(mdatestandard.group(3)) + elif mdategoof: + day, month, year = int(mdategoof.group(1)), int(mdategoof.group(2)), int(mdategoof.group(3)) + 2000 + else: + assert False, tripdate + ldate = datetime.date(year, month, day) + #assert tripid[:-1] == "t" + tripdate, (tripid, tripdate) + trippersons, author = GetTripPersons(trippeople, expedition) + tripcave = "" + lbo = models.LogbookEntry(date = ldate, place = tripcave, title = triptitle, text = triptext, author=author) + lbo.save() + tu = timeug or "" + + for tripperson in trippersons: + pto = models.PersonTrip(personexpedition = tripperson, place=tripcave, date=ldate, timeunderground=tu, logbookentry=lbo) + pto.save() + + + +def LoadLogbooks(): + models.LogbookEntry.objects.all().delete() + expowebbase = os.path.join(settings.EXPOWEB, "years") # this could be a url + yearlinks = [ +# ("2008", "2008/logbook/2008logbook.txt"), +# ("2007", "2007/logbook/2007logbook.txt"), +# ("2005", "2005/logbook.html"), + ("2004", "2004/logbook.html"), +# ("2003", "2003/logbook.html"), + ] + + for year, lloc in yearlinks: + expedition = models.Expedition.objects.filter(year = year)[0] + fin = open(os.path.join(expowebbase, lloc)) + txt = fin.read() + fin.close() + #print personyearmap + if year >= "2007": + Parselogwikitxt(year, personyearmap, txt) + else: + Parseloghtmltxt(year, expedition, txt) + +# command line run through the loading stages +LoadExpos() +LoadPersons() +LoadLogbooks() + + diff --git a/parsers/survex.py b/parsers/survex.py new file mode 100644 index 0000000..0f75e06 --- /dev/null +++ b/parsers/survex.py @@ -0,0 +1,31 @@ +import settings +import expo.models as models +import re +import os + +def readFile(filename): + for line in fileIterator(settings.SURVEX_DATA, filename): + print line + +re_include_extension = re.compile(r"^\s*\*include\s+([^\s]*).svx$", re.IGNORECASE) +re_include_no_extension = re.compile(r"^\s*\*include\s+([^\s]*)$", re.IGNORECASE) + +def fileIterator(directory, filename): + f = open(os.path.join(directory, filename + ".svx"), "rb") + for line in f.readlines(): + include_extension = re_include_extension.match(line) + include_no_extension = re_include_no_extension.match(line) + def a(include): + link = re.split(r"/|\\", include) + print os.path.join(directory, *link[:-1]), link[-1] + return fileIterator(os.path.join(directory, *link[:-1]), link[-1]) + if include_extension: + for b in a(include_extension.groups()[0]): + yield b + elif include_no_extension: + for b in a(include_no_extension.groups()[0]): + yield b + else: + yield line + +readFile("all") \ No newline at end of file diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..7a83050 --- /dev/null +++ b/settings.py @@ -0,0 +1,84 @@ +from localsettings import * +# Django settings for troggle2 project. + +DEBUG = True +TEMPLATE_DEBUG = DEBUG + +ADMINS = ( + # ('Your Name', 'your_email@domain.com'), +) + +MANAGERS = ADMINS + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# If running in a Windows environment this must be set to the same as your +# system time zone. +TIME_ZONE = 'Europe/London' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'en-uk' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True + +# Absolute path to the directory that holds media. +# Example: "/home/media/media.lawrence.com/" +MEDIA_ROOT = '/media-admin/' + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash if there is a path component (optional in other cases). +# Examples: "http://media.lawrence.com", "http://example.com/media/" +MEDIA_URL = 'http://127.0.0.1:8000/site_media/' + +SVX_URL = 'http://127.0.0.1:8000/troggle/survex/' + +# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a +# trailing slash. +# Examples: "http://foo.com/media/", "/media/". +ADMIN_MEDIA_PREFIX = '/media-admin/' + +APPEND_SLASH = False +SMART_APPEND_SLASH = True + +# Make this unique, and don't share it with anybody. +SECRET_KEY = 'a#vaeozn0)uz_9t_%v5n#tj)m+%ace6b_0(^fj!355qki*v)j2' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.load_template_source', + 'django.template.loaders.app_directories.load_template_source', +# 'django.template.loaders.eggs.load_template_source', +) + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', + 'troggle.middleware.SmartAppendSlashMiddleware' +) + +ROOT_URLCONF = 'troggle.urls' + +TEMPLATE_DIRS = ( + "templates" + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. +) + +INSTALLED_APPS = ( + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.redirects', + 'troggle.expo' +) diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..cb84590 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,12 @@ + + + + + + {% block title %}{% endblock %} + + + {% block content %}{% endblock %} + {% block footer %}{% endblock %} + + \ No newline at end of file diff --git a/templates/cave.html b/templates/cave.html new file mode 100644 index 0000000..a043e7f --- /dev/null +++ b/templates/cave.html @@ -0,0 +1,76 @@ +{% extends "base.html" %} +{% load wiki_markup %} + +{% block title %}{{ cave.official_name|wiki_to_html }}{% endblock %} + +{% block content %} + + + + + + +
+ {% if cave.kataster_number %} + {{ cave.kataster_number|wiki_to_html }} + {% if cave.entrancelist %} + - {{ cave.entrancelist|wiki_to_html }} + {% endif %} + {% if cave.unofficial_number %} +
({{ cave.unofficial_number|wiki_to_html }}) + {% endif %} + {% endif %} +
+ {{ cave.official_name|wiki_to_html }} + + {{ cave.kataster_code|wiki_to_html }} +
+ +{% if cave.entrances %} +

Entrances

+ {% for ent in cave.entrances %} + {{ ent.entrance_letter|wiki_to_html }} + {% if ent.entrance.marking %} + Marking: {{ ent.entrance.marking_val|wiki_to_html }} + {% endif %} +
+ {% endfor %} +{% endif %} + +{% if cave.explorers %} +

Explorers

+ {{ cave.explorers|wiki_to_html }} +{% endif %} +{% if cave.underground_description %} +

Underground Description

+ {{ cave.underground_description|wiki_to_html }} +{% endif %} +{% if cave.equipment %} +

Equipment

+ {{ cave.equipment|wiki_to_html }} +{% endif %} +{% if cave.references %} +

References

+ {{ cave.references|wiki_to_html }} +{% endif %} +{% if cave.survey %} +

Survey

+ {{ cave.survey|wiki_to_html }} +{% endif %} +{% if cave.kataster_status %} +

Kataster_status

+ {{ cave.kataster_status|wiki_to_html }} +{% endif %} +{% if cave.underground_centre_line %} +

Underground Centre Line

+ {{ cave.underground_centre_line|wiki_to_html }} +{% endif %} +{% if cave.survex_file %} +

Survex File

+ {{ cave.survex_file|wiki_to_html }} +{% endif %} +{% if cave.notes %} +

Notes

+ {{ cave.notes|wiki_to_html }} +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/caveindex.html b/templates/caveindex.html new file mode 100644 index 0000000..a19752f --- /dev/null +++ b/templates/caveindex.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% load wiki_markup %} + +{% block title %}Cave Index{% endblock %} + +{% block content %} +{% for cave in caves %} +

{{ cave }} {{ cave.official_name|wiki_to_html }}

+{% endfor %} +{% endblock %} \ No newline at end of file diff --git a/templates/entrance.html b/templates/entrance.html new file mode 100644 index 0000000..7aa7fe8 --- /dev/null +++ b/templates/entrance.html @@ -0,0 +1,80 @@ +{% extends "base.html" %} +{% load wiki_markup %} + + +{% block title %}{{ cave.official_name|wiki_to_html }} - {{ entrance_letter|wiki_to_html }}{% endblock %} + +{% block content %} + + + + + + +
+ {% if cave.kataster_number %} + {{ cave.kataster_number|wiki_to_html }}{{ letter|wiki_to_html }} + {% if cave.unofficial_number %} +
({{ cave.unofficial_number|wiki_to_html }}) + {% endif %} + {% endif %} +
+ {% if entrance.name %} + {{ entrance.name|wiki_to_html }} + {% else %} + Unnamed + {% endif %} - {{ cave.official_name|wiki_to_html }} + + {{ cave.kataster_code|wiki_to_html }} +
+ +{% if entrance.entrance_description %} +

Entrance Description

+ {{ entrance.entrance_description|wiki_to_html }} +{% endif %} +{% if entrance.explorers %} +

Explorers

+ {{ entrance.explorers|wiki_to_html }} +{% endif %} +{% if entrance.map_description %} +

Map

+ {{ entrance.map_description|wiki_to_html }} +{% endif %} +{% if entrance.explorers %} +

Entrance Description

+ {{ entrance.entrance_description|wiki_to_html }} +{% endif %} +{% if entrance.location_description %} +

Location Description

+ {{ entrance.location_description|wiki_to_html }} +{% endif %} +{% if entrance.approach %} +

Approach

+ {{ entrance.approach|wiki_to_html }} +{% endif %} +{% if entrance.underground_description %} +

Underground Description

+ {{ entrance.underground_description|wiki_to_html }} +{% endif %} +{% if entrance.photo %} +

Photo

+ {{ entrance.photo|wiki_to_html }} +{% endif %} +{% if entrance.marking %} +

Marking - {{ entrance.marking_val|wiki_to_html }}

+ {% if entrance.marking_comment %} + {{ entrance.marking_comment|wiki_to_html }} + {% endif %} +{% endif %} +{% if entrance.findability %} +

Findability - {{ entrance.findability_val|wiki_to_html }}

+ {% if entrance.findability_description %} + {{ entrance.findability_description|wiki_to_html }} + {% endif %} +{% endif %} +{% if entrance.bearings %} +

Bearings

+ {{ entrance.bearings|wiki_to_html }} +{% endif %} + +{% endblock %} diff --git a/templates/svxfile.html b/templates/svxfile.html new file mode 100644 index 0000000..1fc4e1b --- /dev/null +++ b/templates/svxfile.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% load survex_markup %} + +{% block title %}{{ title }}{% endblock %} +{% block content %} +

{{ title }}

+ + + {% if has_3d %} + + + {% else %} +
Processing failed
+ {% endif %} + + + {{ text|survex_to_html }} + +{% endblock %} \ No newline at end of file diff --git a/urls.py b/urls.py new file mode 100644 index 0000000..f621090 --- /dev/null +++ b/urls.py @@ -0,0 +1,23 @@ +from django.conf.urls.defaults import * +from expo.views import * + +from django.contrib import admin +admin.autodiscover() + +urlpatterns = patterns('', + # Example: + (r'^troggle/cave/$', caveindex), + (r'^troggle/cave/(?P[^/]+)/$', cave), + (r'^troggle/cave/(?P[^/]+)/(?P[^/]?)$', ent), + (r'^troggle/survex/(?P.*)\.index$', index), + (r'^troggle/survex/(?P.*)\.svx$', svx), + (r'^troggle/survex/(?P.*)\.3d$', threed), + (r'^troggle/survex/(?P.*)\.log$', log), + (r'^troggle/survex/(?P.*)\.err$', err), + (r'^admin/doc/', include('django.contrib.admindocs.urls')), + (r'^admin/(.*)', admin.site.root), + + (r'^site_media/(?P.*)$', 'django.views.static.serve', + {'document_root': 'c:/expodjango/troggle/media/'}), + +)