diff options
-rw-r--r-- | expo/admin.py | 9 | ||||
-rw-r--r-- | expo/models.py | 56 | ||||
-rw-r--r-- | expo/views_caves.py | 18 | ||||
-rw-r--r-- | parsers/logbooks.py | 1 | ||||
-rw-r--r-- | parsers/surveys.py | 86 | ||||
-rw-r--r-- | templates/base.html | 16 | ||||
-rw-r--r-- | urls.py | 7 |
7 files changed, 189 insertions, 4 deletions
diff --git a/expo/admin.py b/expo/admin.py index be517b8..ce08334 100644 --- a/expo/admin.py +++ b/expo/admin.py @@ -8,6 +8,13 @@ class RoleInline(admin.TabularInline): class SurvexBlockAdmin(admin.ModelAdmin):
inlines = (RoleInline,)
+class SurveyInline(admin.TabularInline):
+ model = ScannedImage
+ extra = 4
+
+class SurveyAdmin(admin.ModelAdmin):
+ inlines = (SurveyInline,)
+
admin.site.register(Photo)
admin.site.register(Cave)
admin.site.register(Area)
@@ -24,4 +31,6 @@ admin.site.register(Role) admin.site.register(LogbookEntry)
admin.site.register(PersonTrip)
admin.site.register(QM)
+admin.site.register(Survey, SurveyAdmin)
+admin.site.register(ScannedImage)
diff --git a/expo/models.py b/expo/models.py index 1723f4a..a75e8ed 100644 --- a/expo/models.py +++ b/expo/models.py @@ -1,6 +1,10 @@ +import urllib
from django.forms import ModelForm
from django.db import models
from django.contrib import admin
+from django.core.files.storage import FileSystemStorage
+import os
+import troggle.settings as settings
from models_survex import *
class Expedition(models.Model):
@@ -108,7 +112,7 @@ class Cave(models.Model): length = models.CharField(max_length=100,blank=True,null=True)
depth = models.CharField(max_length=100,blank=True,null=True)
extent = models.CharField(max_length=100,blank=True,null=True)
- survex_file = models.CharField(max_length=100,blank=True,null=True)
+ survex_file = models.CharField(max_length=100,blank=True,null=True) #should be filefield, need to fix parser first
def __unicode__(self):
if self.kataster_number:
if self.kat_area():
@@ -296,3 +300,53 @@ class Photo(models.Model): def __str__(self):
return self.caption
+scansFileStorage = FileSystemStorage(location=settings.SURVEYS, base_url=settings.SURVEYS_URL)
+def get_scan_path(instance, filename):
+ year=instance.survey.expedition_year.year
+ number="%02d" % instance.survey.wallet_number + instance.survey.wallet_letter #using %02d string formatting because convention was 2009#01
+ return os.path.join('./',year,year+r'#'+number,instance.contents+str(instance.number_in_wallet)+r'.jpg')
+
+class ScannedImage(models.Model):
+ file = models.ImageField(storage=scansFileStorage, upload_to=get_scan_path)
+ scannedBy = models.ForeignKey(Person,blank=True, null=True)
+ scannedOn = models.DateField(null=True)
+ survey = models.ForeignKey('Survey')
+ contents = models.CharField(max_length=20,choices=(('notes','notes'),('plan','plan_sketch'),('elevation','elevation_sketch')))
+ number_in_wallet = models.IntegerField(null=True)
+ lon_utm = models.FloatField(blank=True,null=True)
+ lat_utm = models.FloatField(blank=True,null=True)
+ #content_type = models.ForeignKey(ContentType)
+ #object_id = models.PositiveIntegerField()
+ #location = generic.GenericForeignKey('content_type', 'object_id')
+
+ def correctURL(self):
+ return urllib.quote(self.file.url)
+
+ def __str__(self):
+ return get_scan_path(self,'')
+
+ class admin():
+ pass
+
+class Survey(models.Model):
+ expedition_year = models.ForeignKey('Expedition')
+ wallet_number = models.IntegerField(blank=True,null=True)
+ wallet_letter = models.CharField(max_length=1,blank=True,null=True)
+ comments = models.TextField(blank=True,null=True)
+ location = models.CharField(max_length=400,blank=True,null=True)
+ #notes_scan = models.ForeignKey('ScannedImage',related_name='notes_scan',blank=True, null=True) #Replaced by contents field of ScannedImage model
+ survex_block = models.ForeignKey('SurvexBlock',blank=True, null=True)
+ centreline_printed_on = models.DateField(blank=True, null=True)
+ centreline_printed_by = models.ForeignKey('Person',related_name='centreline_printed_by',blank=True,null=True)
+ #sketch_scan = models.ForeignKey(ScannedImage,blank=True, null=True) #Replaced by contents field of ScannedImage model
+ tunnel_file = models.FileField(upload_to='surveyXMLfiles',blank=True, null=True)
+ tunnel_main_sketch = models.ForeignKey('Survey',blank=True,null=True)
+ integrated_into_main_sketch_on = models.DateField(blank=True,null=True)
+ integrated_into_main_sketch_by = models.ForeignKey('Person' ,related_name='integrated_into_main_sketch_by', blank=True,null=True)
+ rendered_image = models.ImageField(upload_to='renderedSurveys',blank=True,null=True)
+ def __str__(self):
+ return self.expedition_year.year+"#"+"%02d" % self.wallet_number
+
+ class admin():
+ pass
+
\ No newline at end of file diff --git a/expo/views_caves.py b/expo/views_caves.py index 1f108f8..8d0a4f4 100644 --- a/expo/views_caves.py +++ b/expo/views_caves.py @@ -1,5 +1,5 @@ from django.shortcuts import render_to_response
-from troggle.expo.models import Cave, CaveAndEntrance
+from troggle.expo.models import Cave, CaveAndEntrance, Survey
import troggle.settings as settings
from troggle.expo.forms import CaveForm
import search
@@ -33,5 +33,17 @@ def caveSearch(request): { 'query_string': query_string, 'found_entries': found_entries, 'settings': settings})
#context_instance=RequestContext(request))
-
-
+def surveyindex(request):
+ surveys=Survey.objects.all()
+ return render_to_response('survey.html',{'settings':settings,'surveys':surveys})
+
+def survey(request,survey_id):
+ surveys=Survey.objects.all()
+ current_survey=Survey.objects.get(pk=survey_id)
+ notes=current_survey.scannedimage_set.filter(contents='notes')
+ planSketches=current_survey.scannedimage_set.filter(contents='plan')
+ elevationSketches=current_survey.scannedimage_set.filter(contents='elevation')
+ dictToPass=locals()
+ dictToPass.update({'settings':settings})
+
+ return render_to_response('survey.html',dictToPass)
\ No newline at end of file diff --git a/parsers/logbooks.py b/parsers/logbooks.py index 69f50c0..a9ac5dd 100644 --- a/parsers/logbooks.py +++ b/parsers/logbooks.py @@ -5,6 +5,7 @@ import expo.models as models import csv
import re
import datetime
+import os
persontab = open(os.path.join(settings.EXPOWEB, "noinfo", "folk.csv"))
personreader = csv.reader(persontab)
diff --git a/parsers/surveys.py b/parsers/surveys.py new file mode 100644 index 0000000..29bbd59 --- /dev/null +++ b/parsers/surveys.py @@ -0,0 +1,86 @@ +import sys
+import os
+import types
+sys.path.append('C:\\Expo\\expoweb')
+from troggle import *
+os.environ['DJANGO_SETTINGS_MODULE']='troggle.settings'
+import troggle.settings as settings
+import troggle.expo.models as models
+
+#import settings
+#import expo.models as models
+import csv
+import re
+import datetime
+
+surveytab = open(os.path.join(settings.SURVEYS, "Surveys.csv"))
+dialect=csv.Sniffer().sniff(surveytab.read())
+surveytab.seek(0,0)
+surveyreader = csv.reader(surveytab,dialect=dialect)
+headers = surveyreader.next()
+header = dict(zip(headers, range(len(headers)))) #set up a dictionary where the indexes are header names and the values are column numbers
+
+# test if the expeditions have been added yet
+if len(models.Expedition.objects.all())==0:
+ print "There are no expeditions in the database. Please run the logbook parser."
+ sys.exit()
+models.ScannedImage.objects.all().delete()
+models.Survey.objects.all().delete()
+for survey in surveyreader:
+ walletNumberLetter = re.match(r'(?P<number>\d*)(?P<letter>[a-zA-Z]*)',survey[header['Survey Number']]) #I hate this, but some surveys have a letter eg 2000#34a. This line deals with that.
+# print walletNumberLetter.groups()
+
+ surveyobj = models.Survey(
+ expedition_year = models.Expedition.objects.filter(year=survey[header['Year']])[0],
+ wallet_number = walletNumberLetter.group('number'),
+
+ comments = survey[header['Comments']],
+ location = survey[header['Location']]
+ )
+ surveyobj.wallet_letter = walletNumberLetter.group('letter')
+ if survey[header['Finished']]=='Yes':
+ #try and find the sketch_scan
+ pass
+ surveyobj.save()
+ print "added survey " + survey[header['Year']] + "#" + surveyobj.wallet_number
+
+# add survey scans
+def parseSurveyScans(year):
+ yearPath=os.path.join(settings.SURVEYS, year.year)
+ yearFileList=os.listdir(yearPath)
+ for surveyFolder in yearFileList:
+ try:
+ surveyNumber=re.match(r'\d\d\d\d#0*(\d+)',surveyFolder).groups()
+ scanList=os.listdir(os.path.join(yearPath,surveyFolder))
+ except AttributeError:
+ print surveyFolder + " ignored"
+ continue
+
+ for scan in scanList:
+ try:
+ scanChopped=re.match(r'([a-zA-Z]*)(\d*)\.(png|jpg|JPG|PNG)',scan).groups()
+ scanType,scanNumber,scanFormat=scanChopped
+ except AttributeError:
+ print scan + " ignored"
+ continue
+ if scanNumber=='':
+ scanNumber=1
+
+ if type(surveyNumber)==types.TupleType:
+ surveyNumber=surveyNumber[0]
+ try:
+ survey=models.Survey.objects.get_or_create(wallet_number=surveyNumber, expedition_year=year)[0]
+ except models.Survey.MultipleObjectsReturned:
+ survey=models.Survey.objects.filter(wallet_number=surveyNumber, expedition_year=year)[0]
+
+ scanObj = models.ScannedImage(
+ file=os.path.join(yearPath, surveyFolder, scan),
+ contents=scanType,
+ number_in_wallet=scanNumber,
+ survey=survey
+ )
+ print "Added scanned image at " + str(scanObj)
+ scanObj.save()
+
+for year in models.Expedition.objects.filter(year__gte=2000): #expos since 2000, because paths and filenames were nonstandard before then
+ parseSurveyScans(year)
diff --git a/templates/base.html b/templates/base.html index 66d0529..31169c1 100644 --- a/templates/base.html +++ b/templates/base.html @@ -8,6 +8,22 @@ <script src="{{ settings.MEDIA_URL }}js/base.js" type="text/javascript"></script>
</head>
<body>
+
+<body onLoad="fadeText()">
+<img src="{{ settings.MEDIA_URL }}loserBanner.jpg" style="width:100%;position:absolute; z-index:-4;width:100%;left:0;right:0;height:100px">
+<div id="expoHeader" style="display:inline;">
+ <h1>CUCC Expeditions to Austria: 1976 - </h1>
+ <div id="expoFinalDate" style="display:inline;" >
+ <h1>1976</h1>
+ </div>
+</div>
+<p> </p>
+<p> </p>
+<p> </p>
+<center><iframe src="{{ settings.MEDIA_URL }}intro.html" style="height:600px; width:800px; border:hidden"></iframe></center>
+
+</body>
+
<div id="editLink" style="right:0px; top:0px; text-align: right; position: absolute; top:0; right:0; z-index:1">
{% block editLink %}not editable
{% endblock %}
@@ -27,10 +27,17 @@ urlpatterns = patterns('', (r'^statistics/?$', stats),
+ (r'^survey/?$', surveyindex),
+ (r'^survey/(?P<survey_id>.*)$', survey),
+
(r'^admin/doc/?', include('django.contrib.admindocs.urls')),
(r'^admin/(.*)', admin.site.root),
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
+ (r'^survey_scans/(?P<path>.*)$', 'django.views.static.serve',
+ {'document_root': settings.SURVEYS, 'show_indexes':True}),
+
+
)
|