From c6cce8d2fe470b42740258e737877d94d1b3fdb2 Mon Sep 17 00:00:00 2001
From: substantialnoninfringinguser <substantialnoninfringinguser@gmail.com>
Date: Wed, 13 May 2009 05:27:43 +0100
Subject: [PATCH] [svn] Add beginnings of virtual survey binder: new Survey and
 ScannedImage models, survey parser. Still has lots of problems, but I need
 some help with the file upload aspect so am committing now. Biggest problem
 is trying to call save() on the images from the API. It needs arguments that
 I don't understand. Also, the # in our survey paths was causing trouble. I
 worked around this with a correctURL method which  urlencodes the actual URL,
 but admin still tries to use a URL with a # in it. Copied from
 http://cucc@cucc.survex.com/svn/trunk/expoweb/troggle/, rev. 8152 by aaron @
 1/15/2009 6:22 AM

---
 expo/admin.py       |  9 +++++
 expo/models.py      | 56 ++++++++++++++++++++++++++++-
 expo/views_caves.py | 16 +++++++--
 parsers/logbooks.py |  1 +
 parsers/surveys.py  | 86 +++++++++++++++++++++++++++++++++++++++++++++
 templates/base.html | 16 +++++++++
 urls.py             |  7 ++++
 7 files changed, 188 insertions(+), 3 deletions(-)
 create mode 100644 parsers/surveys.py

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>&nbsp;</p>
+<p>&nbsp;</p>
+<p>&nbsp;</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 %}
diff --git a/urls.py b/urls.py
index 787b1ff..309261b 100644
--- a/urls.py
+++ b/urls.py
@@ -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}),
+
+
 )