From c6cce8d2fe470b42740258e737877d94d1b3fdb2 Mon Sep 17 00:00:00 2001 From: substantialnoninfringinguser 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\d*)(?P[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 @@ + + + +
+

CUCC Expeditions to Austria: 1976 -

+
+

1976

+
+
+

 

+

 

+

 

+
+ + +