summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Wenham <sam@wenhams.co.uk>2020-02-24 15:04:07 +0000
committerSam Wenham <sam@wenhams.co.uk>2020-02-24 15:04:07 +0000
commit43dfe946b6385037141b94b775112037fe5f032f (patch)
tree72c352e67166f0702ab93d7063c902ff1bd2c621
parent656ddcfe93061f2f82160ff8cc45b98d27e28bd3 (diff)
downloadtroggle-django-1.10.tar.gz
troggle-django-1.10.tar.bz2
troggle-django-1.10.zip
Just removing dud whitespacedjango-1.10
-rw-r--r--core/admin.py14
-rw-r--r--core/fileAbstraction.py4
-rw-r--r--core/forms.py40
-rw-r--r--core/imagekit_specs.py18
-rw-r--r--core/models.py120
-rw-r--r--core/models_survex.py60
-rw-r--r--core/view_surveys.py68
-rw-r--r--core/views_caves.py4
-rw-r--r--core/views_logbooks.py40
-rw-r--r--core/views_other.py56
-rw-r--r--core/views_survex.py46
-rw-r--r--databaseReset.py12
-rw-r--r--export/toqms.py1
-rw-r--r--middleware.py2
-rw-r--r--parsers/QMs.py16
-rw-r--r--parsers/caves.py6
-rw-r--r--parsers/logbooks.py43
-rw-r--r--parsers/people.py30
-rw-r--r--parsers/subcaves.py8
-rw-r--r--parsers/survex.py26
-rw-r--r--parsers/surveys.py44
-rw-r--r--settings.py46
-rw-r--r--templates/person.html6
-rw-r--r--utils.py20
24 files changed, 365 insertions, 365 deletions
diff --git a/core/admin.py b/core/admin.py
index 0b7cf13..c5a1484 100644
--- a/core/admin.py
+++ b/core/admin.py
@@ -9,12 +9,12 @@ from troggle.core.views_other import downloadLogbook
class TroggleModelAdmin(admin.ModelAdmin):
-
+
def save_model(self, request, obj, form, change):
"""overriding admin save to fill the new_since parsing_field"""
obj.new_since_parsing=True
obj.save()
-
+
class Media:
js = ('jquery/jquery.min.js','js/QM_helper.js')
@@ -44,7 +44,7 @@ class OtherCaveInline(admin.TabularInline):
class SurveyAdmin(TroggleModelAdmin):
inlines = (ScannedImageInline,)
- search_fields = ('expedition__year','wallet_number')
+ search_fields = ('expedition__year','wallet_number')
class QMsFoundInline(admin.TabularInline):
@@ -52,7 +52,7 @@ class QMsFoundInline(admin.TabularInline):
fk_name='found_by'
fields=('number','grade','location_description','comment')#need to add foreignkey to cave part
extra=1
-
+
class PhotoInline(admin.TabularInline):
model = DPhoto
@@ -68,7 +68,7 @@ class PersonTripInline(admin.TabularInline):
#class LogbookEntryAdmin(VersionAdmin):
class LogbookEntryAdmin(TroggleModelAdmin):
- prepopulated_fields = {'slug':("title",)}
+ prepopulated_fields = {'slug':("title",)}
search_fields = ('title','expedition__year')
date_heirarchy = ('date')
inlines = (PersonTripInline, PhotoInline, QMsFoundInline)
@@ -77,11 +77,11 @@ class LogbookEntryAdmin(TroggleModelAdmin):
"all": ("css/troggleadmin.css",)
}
actions=('export_logbook_entries_as_html','export_logbook_entries_as_txt')
-
+
def export_logbook_entries_as_html(self, modeladmin, request, queryset):
response=downloadLogbook(request=request, queryset=queryset, extension='html')
return response
-
+
def export_logbook_entries_as_txt(self, modeladmin, request, queryset):
response=downloadLogbook(request=request, queryset=queryset, extension='txt')
return response
diff --git a/core/fileAbstraction.py b/core/fileAbstraction.py
index 86191b7..141ae0e 100644
--- a/core/fileAbstraction.py
+++ b/core/fileAbstraction.py
@@ -15,7 +15,7 @@ def listdir(*path):
for p in os.listdir(root):
if os.path.isdir(os.path.join(root, p)):
l += p + "/\n"
-
+
elif os.path.isfile(os.path.join(root, p)):
l += p + "\n"
#Ignore non-files and non-directories
@@ -28,7 +28,7 @@ def listdir(*path):
c = c.replace("#", "%23")
print("FILE: ", settings.FILES + "listdir/" + c)
return urllib.urlopen(settings.FILES + "listdir/" + c).read()
-
+
def dirsAsList(*path):
return [d for d in listdir(*path).split("\n") if len(d) > 0 and d[-1] == "/"]
diff --git a/core/forms.py b/core/forms.py
index 8265178..15e86d8 100644
--- a/core/forms.py
+++ b/core/forms.py
@@ -16,7 +16,7 @@ class CaveForm(ModelForm):
underground_centre_line = forms.CharField(required = False, widget=forms.Textarea())
notes = forms.CharField(required = False, widget=forms.Textarea())
references = forms.CharField(required = False, widget=forms.Textarea())
- url = forms.CharField(required = True)
+ url = forms.CharField(required = True)
class Meta:
model = Cave
exclude = ("filename",)
@@ -24,9 +24,9 @@ class CaveForm(ModelForm):
def clean(self):
if self.cleaned_data.get("kataster_number") == "" and self.cleaned_data.get("unofficial_number") == "":
- self._errors["unofficial_number"] = self.error_class(["Either the kataster or unoffical number is required."])
+ self._errors["unofficial_number"] = self.error_class(["Either the kataster or unoffical number is required."])
if self.cleaned_data.get("kataster_number") != "" and self.cleaned_data.get("official_name") == "":
- self._errors["official_name"] = self.error_class(["This field is required when there is a kataster number."])
+ self._errors["official_name"] = self.error_class(["This field is required when there is a kataster number."])
if self.cleaned_data.get("area") == []:
self._errors["area"] = self.error_class(["This field is required."])
if self.cleaned_data.get("url") and self.cleaned_data.get("url").startswith("/"):
@@ -82,11 +82,11 @@ class EntranceLetterForm(ModelForm):
# This function returns html-formatted paragraphs for each of the
# wikilink types that are related to this logbookentry. Each paragraph
# contains a list of all of the related wikilinks.
-#
+#
# Perhaps an admin javascript solution would be better.
# """
# res = ["Please use the following wikilinks, which are related to this logbook entry:"]
-#
+#
# res.append(r'</p><p style="float: left;"><b>QMs found:</b>')
# for QM in LogbookEntry.instance.QMs_found.all():
# res.append(QM.wiki_link())
@@ -94,12 +94,12 @@ class EntranceLetterForm(ModelForm):
# res.append(r'</p><p style="float: left;"><b>QMs ticked off:</b>')
# for QM in LogbookEntry.instance.QMs_ticked_off.all():
# res.append(QM.wiki_link())
-
+
# res.append(r'</p><p style="float: left; "><b>People</b>')
# for persontrip in LogbookEntry.instance.persontrip_set.all():
# res.append(persontrip.wiki_link())
# res.append(r'</p>')
-
+
# return string.join(res, r'<br />')
# def __init__(self, *args, **kwargs):
@@ -107,7 +107,7 @@ class EntranceLetterForm(ModelForm):
# self.fields['text'].help_text=self.wikiLinkHints()#
#class CaveForm(forms.Form):
-# html = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
+# html = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
def getTripForm(expedition):
@@ -118,18 +118,18 @@ def getTripForm(expedition):
caves.sort()
caves = ["-----"] + caves
cave = forms.ChoiceField([(c, c) for c in caves], required=False)
- location = forms.CharField(max_length=200, required=False)
+ location = forms.CharField(max_length=200, required=False)
caveOrLocation = forms.ChoiceField([("cave", "Cave"), ("location", "Location")], widget = forms.widgets.RadioSelect())
- html = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
+ html = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
def clean(self):
print(dir(self))
if self.cleaned_data.get("caveOrLocation") == "cave" and not self.cleaned_data.get("cave"):
- self._errors["cave"] = self.error_class(["This field is required"])
+ self._errors["cave"] = self.error_class(["This field is required"])
if self.cleaned_data.get("caveOrLocation") == "location" and not self.cleaned_data.get("location"):
- self._errors["location"] = self.error_class(["This field is required"])
+ self._errors["location"] = self.error_class(["This field is required"])
return self.cleaned_data
-
+
class PersonTripForm(forms.Form):
names = [get_name(pe) for pe in PersonExpedition.objects.filter(expedition = expedition)]
names.sort()
@@ -141,7 +141,7 @@ def getTripForm(expedition):
PersonTripFormSet = formset_factory(PersonTripForm, extra=1)
return PersonTripFormSet, TripForm
-
+
def get_name(pe):
if pe.nickname:
return pe.nickname
@@ -162,18 +162,18 @@ def get_name(pe):
# caves = ["-----"] + caves
# cave = forms.ChoiceField([(c, c) for c in caves], required=False)
-# entrance = forms.ChoiceField([("-----", "Please select a cave"), ], required=False)
-# qm = forms.ChoiceField([("-----", "Please select a cave"), ], required=False)
+# entrance = forms.ChoiceField([("-----", "Please select a cave"), ], required=False)
+# qm = forms.ChoiceField([("-----", "Please select a cave"), ], required=False)
# expeditions = [e.year for e in Expedition.objects.all()]
# expeditions.sort()
# expeditions = ["-----"] + expeditions
-# expedition = forms.ChoiceField([(e, e) for e in expeditions], required=False)
+# expedition = forms.ChoiceField([(e, e) for e in expeditions], required=False)
+
+# logbookentry = forms.ChoiceField([("-----", "Please select an expedition"), ], required=False)
-# logbookentry = forms.ChoiceField([("-----", "Please select an expedition"), ], required=False)
+# person = forms.ChoiceField([("-----", "Please select an expedition"), ], required=False)
-# person = forms.ChoiceField([("-----", "Please select an expedition"), ], required=False)
-
# survey_point = forms.CharField()
diff --git a/core/imagekit_specs.py b/core/imagekit_specs.py
index fd2e0a1..0cec6e5 100644
--- a/core/imagekit_specs.py
+++ b/core/imagekit_specs.py
@@ -1,21 +1,21 @@
from imagekit.specs import ImageSpec
from imagekit import processors
-class ResizeThumb(processors.Resize):
- width = 100
+class ResizeThumb(processors.Resize):
+ width = 100
crop = False
class ResizeDisplay(processors.Resize):
- width = 600
-
-#class EnhanceThumb(processors.Adjustment):
+ width = 600
+
+#class EnhanceThumb(processors.Adjustment):
#contrast = 1.2
#sharpness = 2
-class Thumbnail(ImageSpec):
- access_as = 'thumbnail_image'
- pre_cache = True
- processors = [ResizeThumb]
+class Thumbnail(ImageSpec):
+ access_as = 'thumbnail_image'
+ pre_cache = True
+ processors = [ResizeThumb]
class Display(ImageSpec):
increment_count = True
diff --git a/core/models.py b/core/models.py
index af25107..9029fd3 100644
--- a/core/models.py
+++ b/core/models.py
@@ -27,10 +27,10 @@ def get_related_by_wikilinks(wiki_text):
qm=QM.objects.get(found_by__cave_slug__in = cave_slugs,
found_by__date__year = qmdict['year'],
number = qmdict['number'])
- res.append(qm)
+ res.append(qm)
except QM.DoesNotExist:
print('fail on '+str(wikilink))
-
+
return res
try:
@@ -38,7 +38,7 @@ try:
filename=settings.LOGFILE,
filemode='w')
except:
- subprocess.call(settings.FIX_PERMISSIONS)
+ subprocess.call(settings.FIX_PERMISSIONS)
logging.basicConfig(level=logging.DEBUG,
filename=settings.LOGFILE,
filemode='w')
@@ -58,7 +58,7 @@ class TroggleModel(models.Model):
class TroggleImageModel(models.Model):
new_since_parsing = models.BooleanField(default=False, editable=False)
-
+
def object_name(self):
return self._meta.object_name
@@ -69,23 +69,23 @@ class TroggleImageModel(models.Model):
class Meta:
abstract = True
-#
+#
# single Expedition, usually seen by year
#
class Expedition(TroggleModel):
year = models.CharField(max_length=20, unique=True)
name = models.CharField(max_length=100)
-
+
def __unicode__(self):
return self.year
class Meta:
ordering = ('-year',)
get_latest_by = 'year'
-
+
def get_absolute_url(self):
return urlparse.urljoin(settings.URL_ROOT, reverse('expedition', args=[self.year]))
-
+
# construction function. should be moved out
def get_expedition_day(self, date):
expeditiondays = self.expeditionday_set.filter(date=date)
@@ -95,11 +95,11 @@ class Expedition(TroggleModel):
res = ExpeditionDay(expedition=self, date=date)
res.save()
return res
-
+
def day_min(self):
res = self.Expeditionday_set.all()
return res and res[0] or None
-
+
def day_max(self):
res = self.Expeditionday_set.all()
return res and res[len(res) - 1] or None
@@ -129,23 +129,23 @@ class Person(TroggleModel):
is_vfho = models.BooleanField(help_text="VFHO is the Vereines f&uuml;r H&ouml;hlenkunde in Obersteier, a nearby Austrian caving club.", default=False)
mug_shot = models.CharField(max_length=100, blank=True,null=True)
blurb = models.TextField(blank=True,null=True)
-
+
#href = models.CharField(max_length=200)
- orderref = models.CharField(max_length=200) # for alphabetic
+ orderref = models.CharField(max_length=200) # for alphabetic
user = models.OneToOneField(User, null=True, blank=True)
def get_absolute_url(self):
return urlparse.urljoin(settings.URL_ROOT,reverse('person',kwargs={'first_name':self.first_name,'last_name':self.last_name}))
class Meta:
verbose_name_plural = "People"
- ordering = ('orderref',) # "Wookey" makes too complex for: ('last_name', 'first_name')
-
+ ordering = ('orderref',) # "Wookey" makes too complex for: ('last_name', 'first_name')
+
def __unicode__(self):
if self.last_name:
return "%s %s" % (self.first_name, self.last_name)
return self.first_name
-
+
def notability(self):
notability = Decimal(0)
max_expo_val = 0
@@ -161,15 +161,15 @@ class Person(TroggleModel):
def bisnotable(self):
return self.notability() > Decimal(1)/Decimal(3)
-
+
def surveyedleglength(self):
return sum([personexpedition.surveyedleglength() for personexpedition in self.personexpedition_set.all()])
-
+
def first(self):
return self.personexpedition_set.order_by('-expedition')[0]
def last(self):
return self.personexpedition_set.order_by('expedition')[0]
-
+
#def Sethref(self):
#if self.last_name:
#self.href = self.first_name.lower() + "_" + self.last_name.lower()
@@ -178,7 +178,7 @@ class Person(TroggleModel):
# self.href = self.first_name.lower()
#self.orderref = self.first_name
#self.notability = 0.0 # set temporarily
-
+
#
# Person's attenance to one Expo
@@ -187,8 +187,8 @@ class PersonExpedition(TroggleModel):
expedition = models.ForeignKey(Expedition)
person = models.ForeignKey(Person)
slugfield = models.SlugField(max_length=50,blank=True,null=True)
-
- is_guest = models.BooleanField(default=False)
+
+ is_guest = models.BooleanField(default=False)
COMMITTEE_CHOICES = (
('leader','Expo leader'),
('medical','Expo medical officer'),
@@ -198,7 +198,7 @@ class PersonExpedition(TroggleModel):
)
expo_committee_position = models.CharField(blank=True,null=True,choices=COMMITTEE_CHOICES,max_length=200)
nickname = models.CharField(max_length=100,blank=True,null=True)
-
+
def GetPersonroles(self):
res = [ ]
for personrole in self.personrole_set.order_by('survexblock'):
@@ -214,8 +214,8 @@ class PersonExpedition(TroggleModel):
def __unicode__(self):
return "%s: (%s)" % (self.person, self.expedition)
-
-
+
+
#why is the below a function in personexpedition, rather than in person? - AC 14 Feb 09
def name(self):
if self.nickname:
@@ -226,11 +226,11 @@ class PersonExpedition(TroggleModel):
def get_absolute_url(self):
return urlparse.urljoin(settings.URL_ROOT, reverse('personexpedition',kwargs={'first_name':self.person.first_name,'last_name':self.person.last_name,'year':self.expedition.year}))
-
+
def surveyedleglength(self):
survexblocks = [personrole.survexblock for personrole in self.personrole_set.all() ]
return sum([survexblock.totalleglength for survexblock in set(survexblocks)])
-
+
# would prefer to return actual person trips so we could link to first and last ones
def day_min(self):
res = self.persontrip_set.aggregate(day_min=Min("expeditionday__date"))
@@ -242,7 +242,7 @@ class PersonExpedition(TroggleModel):
#
# Single parsed entry from Logbook
-#
+#
class LogbookEntry(TroggleModel):
LOGBOOK_ENTRY_TYPES = (
@@ -265,7 +265,7 @@ class LogbookEntry(TroggleModel):
verbose_name_plural = "Logbook Entries"
# several PersonTrips point in to this object
ordering = ('-date',)
-
+
def __getattribute__(self, item):
if item == "cave": #Allow a logbookentries cave to be directly accessed despite not having a proper foreignkey
return CaveSlug.objects.get(slug = self.cave_slug).cave
@@ -314,18 +314,18 @@ class LogbookEntry(TroggleModel):
#
class PersonTrip(TroggleModel):
personexpedition = models.ForeignKey("PersonExpedition",null=True)
-
+
#expeditionday = models.ForeignKey("ExpeditionDay")#MJG wants to KILL THIS (redundant information)
#date = models.DateField() #MJG wants to KILL THIS (redundant information)
time_underground = models.FloatField(help_text="In decimal hours")
logbook_entry = models.ForeignKey(LogbookEntry)
is_logbook_entry_author = models.BooleanField(default=False)
-
-
+
+
# sequencing by person (difficult to solve locally)
#persontrip_next = models.ForeignKey('PersonTrip', related_name='pnext', blank=True,null=True)#MJG wants to KILL THIS (and use funstion persontrip_next_auto)
#persontrip_prev = models.ForeignKey('PersonTrip', related_name='pprev', blank=True,null=True)#MJG wants to KILL THIS(and use funstion persontrip_prev_auto)
-
+
def persontrip_next(self):
futurePTs = PersonTrip.objects.filter(personexpedition = self.personexpedition, logbook_entry__date__gt = self.logbook_entry.date).order_by('logbook_entry__date').all()
if len(futurePTs) > 0:
@@ -345,7 +345,7 @@ class PersonTrip(TroggleModel):
def __unicode__(self):
return "%s (%s)" % (self.personexpedition, self.logbook_entry.date)
-
+
##########################################
@@ -375,7 +375,7 @@ class CaveAndEntrance(models.Model):
def __unicode__(self):
return unicode(self.cave) + unicode(self.entrance_letter)
-
+
class CaveSlug(models.Model):
cave = models.ForeignKey('Cave')
slug = models.SlugField(max_length=50, unique = True)
@@ -385,7 +385,7 @@ class CaveSlug(models.Model):
return self.slug
class Cave(TroggleModel):
- # too much here perhaps,
+ # too much here perhaps,
official_name = models.CharField(max_length=160)
area = models.ManyToManyField(Area, blank=True)
kataster_code = models.CharField(max_length=20,blank=True,null=True)
@@ -411,13 +411,13 @@ class Cave(TroggleModel):
#class Meta:
# unique_together = (("area", "kataster_number"), ("area", "unofficial_number"))
- # FIXME Kataster Areas and CUCC defined sub areas need seperating
+ # FIXME Kataster Areas and CUCC defined sub areas need seperating
#href = models.CharField(max_length=100)
-
+
class Meta:
- ordering = ('kataster_code', 'unofficial_number')
+ ordering = ('kataster_code', 'unofficial_number')
def hassurvey(self):
if not self.underground_centre_line:
@@ -432,7 +432,7 @@ class Cave(TroggleModel):
if self.survex_file:
return "Yes"
return "Missing"
-
+
def slug(self):
primarySlugs = self.caveslug_set.filter(primary = True)
if primarySlugs:
@@ -450,7 +450,7 @@ class Cave(TroggleModel):
return "%s-%s" % (self.kat_area(), self.kataster_number)
else:
return "%s-%s" % (self.kat_area(), self.unofficial_number)
-
+
def get_absolute_url(self):
if self.kataster_number:
href = self.kataster_number
@@ -479,13 +479,13 @@ class Cave(TroggleModel):
for a in self.area.all():
if a.kat_area():
return a.kat_area()
-
+
def entrances(self):
return CaveAndEntrance.objects.filter(cave=self)
def singleentrance(self):
return len(CaveAndEntrance.objects.filter(cave=self)) == 1
-
+
def entrancelist(self):
rs = []
res = ""
@@ -513,12 +513,12 @@ class Cave(TroggleModel):
else:
res += "&ndash;" + prevR
return res
-
+
def writeDataFile(self):
try:
f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "w")
except:
- subprocess.call(settings.FIX_PERMISSIONS)
+ subprocess.call(settings.FIX_PERMISSIONS)
f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "w")
t = loader.get_template('dataformat/cave.xml')
c = Context({'cave': self})
@@ -526,7 +526,7 @@ class Cave(TroggleModel):
u8 = u.encode("utf-8")
f.write(u8)
f.close()
-
+
def getArea(self):
areas = self.area.all()
lowestareas = list(areas)
@@ -543,7 +543,7 @@ def getCaveByReference(reference):
#print(areaname, code)
area = Area.objects.get(short_name = areaname)
#print(area)
- foundCaves = list(Cave.objects.filter(area = area, kataster_number = code).all()) + list(Cave.objects.filter(area = area, unofficial_number = code).all())
+ foundCaves = list(Cave.objects.filter(area = area, kataster_number = code).all()) + list(Cave.objects.filter(area = area, unofficial_number = code).all())
print(list(foundCaves))
if len(foundCaves) == 1:
return foundCaves[0]
@@ -555,7 +555,7 @@ class OtherCaveName(TroggleModel):
cave = models.ForeignKey(Cave)
def __unicode__(self):
return unicode(self.name)
-
+
class EntranceSlug(models.Model):
entrance = models.ForeignKey('Entrance')
slug = models.SlugField(max_length=50, unique = True)
@@ -669,28 +669,28 @@ class Entrance(TroggleModel):
for f in self.FINDABLE_CHOICES:
if f[0] == self.findability:
return f[1]
-
+
def tag(self):
return SurvexStation.objects.lookup(self.tag_station)
-
+
def needs_surface_work(self):
return self.findability != "S" or not self.has_photo or self.marking != "T"
def get_absolute_url(self):
-
+
ancestor_titles='/'.join([subcave.title for subcave in self.get_ancestors()])
if ancestor_titles:
res = '/'.join((self.get_root().cave.get_absolute_url(), ancestor_titles, self.title))
-
+
else:
res = '/'.join((self.get_root().cave.get_absolute_url(), self.title))
-
+
return res
def slug(self):
if not self.cached_primary_slug:
primarySlugs = self.entranceslug_set.filter(primary = True)
- if primarySlugs:
+ if primarySlugs:
self.cached_primary_slug = primarySlugs[0].slug
self.save()
else:
@@ -704,7 +704,7 @@ class Entrance(TroggleModel):
try:
f = open(os.path.join(settings.ENTRANCEDESCRIPTIONS, self.filename), "w")
except:
- subprocess.call(settings.FIX_PERMISSIONS)
+ subprocess.call(settings.FIX_PERMISSIONS)
f = open(os.path.join(settings.ENTRANCEDESCRIPTIONS, self.filename), "w")
t = loader.get_template('dataformat/entrance.xml')
c = Context({'entrance': self})
@@ -726,10 +726,10 @@ class CaveDescription(TroggleModel):
return unicode(self.long_name)
else:
return unicode(self.short_name)
-
+
def get_absolute_url(self):
return urlparse.urljoin(settings.URL_ROOT, reverse('cavedescription', args=(self.short_name,)))
-
+
def save(self):
"""
Overridden save method which stores wikilinks in text as links in database.
@@ -798,7 +798,7 @@ class QM(TroggleModel):
return u"%s%s%s" % ('[[QM:',self.code(),']]')
photoFileStorage = FileSystemStorage(location=settings.PHOTOS_ROOT, base_url=settings.PHOTOS_URL)
-class DPhoto(TroggleImageModel):
+class DPhoto(TroggleImageModel):
caption = models.CharField(max_length=1000,blank=True,null=True)
contains_logbookentry = models.ForeignKey(LogbookEntry,blank=True,null=True)
contains_person = models.ManyToManyField(Person,blank=True)
@@ -810,12 +810,12 @@ class DPhoto(TroggleImageModel):
nearest_QM = models.ForeignKey(QM,blank=True,null=True)
lon_utm = models.FloatField(blank=True,null=True)
lat_utm = models.FloatField(blank=True,null=True)
-
+
class IKOptions:
spec_module = 'core.imagekit_specs'
cache_dir = 'thumbs'
image_field = 'file'
-
+
#content_type = models.ForeignKey(ContentType)
#object_id = models.PositiveIntegerField()
#location = generic.GenericForeignKey('content_type', 'object_id')
@@ -832,7 +832,7 @@ def get_scan_path(instance, filename):
number=str(instance.survey.wallet_letter) + number #two strings formatting because convention is 2009#01 or 2009#X01
return os.path.join('./',year,year+r'#'+number,str(instance.contents)+str(instance.number_in_wallet)+r'.jpg')
-class ScannedImage(TroggleImageModel):
+class ScannedImage(TroggleImageModel):
file = models.ImageField(storage=scansFileStorage, upload_to=get_scan_path)
scanned_by = models.ForeignKey(Person,blank=True, null=True)
scanned_on = models.DateField(null=True)
diff --git a/core/models_survex.py b/core/models_survex.py
index 3becffb..91e4621 100644
--- a/core/models_survex.py
+++ b/core/models_survex.py
@@ -9,7 +9,7 @@ from django.core.urlresolvers import reverse
###########################################################
# These will allow browsing and editing of the survex data
###########################################################
-# Needs to add:
+# Needs to add:
# Equates
# reloading
@@ -29,21 +29,21 @@ class SurvexFile(models.Model):
path = models.CharField(max_length=200)
survexdirectory = models.ForeignKey("SurvexDirectory", blank=True, null=True)
cave = models.ForeignKey('Cave', blank=True, null=True)
-
+
class Meta:
ordering = ('id',)
def __unicode__(self):
return self.path + '.svx' or 'no file'
-
+
def exists(self):
fname = os.path.join(settings.SURVEX_DATA, self.path + ".svx")
return os.path.isfile(fname)
-
+
def OpenFile(self):
fname = os.path.join(settings.SURVEX_DATA, self.path + ".svx")
return open(fname)
-
+
def SetDirectory(self):
dirpath = os.path.split(self.path)[0]
survexdirectorylist = SurvexDirectory.objects.filter(cave=self.cave, path=dirpath)
@@ -67,7 +67,7 @@ class SurvexStationLookUpManager(models.Manager):
name__iexact = stationname)
class SurvexStation(models.Model):
- name = models.CharField(max_length=100)
+ name = models.CharField(max_length=100)
block = models.ForeignKey('SurvexBlock')
equate = models.ForeignKey('SurvexEquate', blank=True, null=True)
objects = SurvexStationLookUpManager()
@@ -103,8 +103,8 @@ class SurvexLeg(models.Model):
#
-# Single SurvexBlock
-#
+# Single SurvexBlock
+#
class SurvexBlockLookUpManager(models.Manager):
def lookup(self, name):
if name == "":
@@ -122,20 +122,20 @@ class SurvexBlock(models.Model):
parent = models.ForeignKey('SurvexBlock', blank=True, null=True)
text = models.TextField()
cave = models.ForeignKey('Cave', blank=True, null=True)
-
+
date = models.DateTimeField(blank=True, null=True)
expeditionday = models.ForeignKey("ExpeditionDay", null=True)
expedition = models.ForeignKey('Expedition', blank=True, null=True)
-
+
survexfile = models.ForeignKey("SurvexFile", blank=True, null=True)
begin_char = models.IntegerField() # code for where in the survex data files this block sits
survexpath = models.CharField(max_length=200) # the path for the survex stations
-
- survexscansfolder = models.ForeignKey("SurvexScansFolder", null=True)
+
+ survexscansfolder = models.ForeignKey("SurvexScansFolder", null=True)
#refscandir = models.CharField(max_length=100)
-
+
totalleglength = models.FloatField()
-
+
class Meta:
ordering = ('id',)
@@ -144,7 +144,7 @@ class SurvexBlock(models.Model):
def __unicode__(self):
return self.name and unicode(self.name) or 'no name'
-
+
def GetPersonroles(self):
res = [ ]
for personrole in self.personrole_set.order_by('personexpedition'):
@@ -163,10 +163,10 @@ class SurvexBlock(models.Model):
ss = SurvexStation(name=name, block=self)
ss.save()
return ss
-
+
def DayIndex(self):
return list(self.expeditionday.survexblock_set.all()).index(self)
-
+
class SurvexTitle(models.Model):
survexblock = models.ForeignKey('SurvexBlock')
@@ -195,41 +195,41 @@ class SurvexPersonRole(models.Model):
personname = models.CharField(max_length=100)
person = models.ForeignKey('Person', blank=True, null=True)
personexpedition = models.ForeignKey('PersonExpedition', blank=True, null=True)
- persontrip = models.ForeignKey('PersonTrip', blank=True, null=True)
+ persontrip = models.ForeignKey('PersonTrip', blank=True, null=True)
expeditionday = models.ForeignKey("ExpeditionDay", null=True)
-
+
def __unicode__(self):
return unicode(self.person) + " - " + unicode(self.survexblock) + " - " + unicode(self.nrole)
-
-
+
+
class SurvexScansFolder(models.Model):
fpath = models.CharField(max_length=200)
walletname = models.CharField(max_length=200)
-
+
class Meta:
ordering = ('walletname',)
def __unicode__(self):
return self.walletname or 'no wallet'
-
+
def get_absolute_url(self):
return urlparse.urljoin(settings.URL_ROOT, reverse('surveyscansfolder', kwargs={"path":re.sub("#", "%23", self.walletname)}))
-
+
class SurvexScanSingle(models.Model):
ffile = models.CharField(max_length=200)
name = models.CharField(max_length=200)
survexscansfolder = models.ForeignKey("SurvexScansFolder", null=True)
-
+
class Meta:
ordering = ('name',)
def __unicode__(self):
return self.survexscansfolder.walletname + '/' + self.name
-
+
def get_absolute_url(self):
return urlparse.urljoin(settings.URL_ROOT, reverse('surveyscansingle', kwargs={"path":re.sub("#", "%23", self.survexscansfolder.walletname), "file":self.name}))
-
-
+
+
class TunnelFile(models.Model):
tunnelpath = models.CharField(max_length=200)
tunnelname = models.CharField(max_length=200)
@@ -241,8 +241,8 @@ class TunnelFile(models.Model):
filesize = models.IntegerField(default=0)
npaths = models.IntegerField(default=0)
survextitles = models.ManyToManyField("SurvexTitle")
-
-
+
+
class Meta:
ordering = ('tunnelpath',)
diff --git a/core/view_surveys.py b/core/view_surveys.py
index 04c6ca6..05e617e 100644
--- a/core/view_surveys.py
+++ b/core/view_surveys.py
@@ -8,7 +8,7 @@ from troggle.core.models import SurvexScansFolder, SurvexScanSingle, SurvexBlock
import parsers.surveys
import urllib
-# inline fileabstraction into here if it's not going to be useful anywhere else
+# inline fileabstraction into here if it's not going to be useful anywhere else
# keep things simple and ignore exceptions everywhere for now
@@ -33,7 +33,7 @@ def upload(request, path):
def download(request, path):
#try:
-
+
return HttpResponse(fileAbstraction.readFile(path), content_type=getMimeType(path.split(".")[-1]))
#except:
# raise Http404
@@ -49,32 +49,32 @@ extmimetypes = {".txt": "text/plain",
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
}
-
+
# dead
def jgtfile(request, f):
fp = os.path.join(settings.SURVEYS, f)
# could also surf through SURVEX_DATA
-
+
# directory listing
if os.path.isdir(fp):
listdirfiles = [ ]
listdirdirs = [ ]
-
+
for lf in sorted(os.listdir(fp)):
hpath = os.path.join(f, lf) # not absolute path
if lf[0] == "." or lf[-1] == "~":
continue
-
+
hpath = hpath.replace("\\", "/") # for windows users
href = hpath.replace("#", "%23") # '#' in file name annoyance
-
+
flf = os.path.join(fp, lf)
if os.path.isdir(flf):
nfiles = len([sf for sf in os.listdir(flf) if sf[0] != "."])
listdirdirs.append((href, hpath + "/", nfiles))
else:
listdirfiles.append((href, hpath, os.path.getsize(flf)))
-
+
upperdirs = [ ]
lf = f
while lf:
@@ -85,9 +85,9 @@ def jgtfile(request, f):
lf = os.path.split(lf)[0]
upperdirs.append((href, hpath))
upperdirs.append(("", "/"))
-
+
return render(request, 'listdir.html', {'file':f, 'listdirfiles':listdirfiles, 'listdirdirs':listdirdirs, 'upperdirs':upperdirs, 'settings': settings})
-
+
# flat output of file when loaded
if os.path.isfile(fp):
ext = os.path.splitext(fp)[1].lower()
@@ -123,16 +123,16 @@ def SaveImageInDir(name, imgdir, project, fdata, bbinary):
print "*** Making directory", fprojdir
os.path.mkdir(fprojdir)
print "hhh"
-
+
fname = os.path.join(fprojdir, name)
print fname, "fff"
fname = UniqueFile(fname)
-
+
p2, p1 = os.path.split(fname)
p3, p2 = os.path.split(p2)
p4, p3 = os.path.split(p3)
res = os.path.join(p3, p2, p1)
-
+
print "saving file", fname
fout = open(fname, (bbinary and "wb" or "w"))
fout.write(fdata.read())
@@ -175,61 +175,61 @@ def surveyscansingle(request, path, file):
survexscansingle = SurvexScanSingle.objects.get(survexscansfolder=survexscansfolder, name=file)
return HttpResponse(content=open(survexscansingle.ffile), content_type=getMimeType(path.split(".")[-1]))
#return render(request, 'survexscansfolder.html', { 'survexscansfolder':survexscansfolder, 'settings': settings })
-
+
def surveyscansfolders(request):
survexscansfolders = SurvexScansFolder.objects.all()
return render(request, 'survexscansfolders.html', { 'survexscansfolders':survexscansfolders, 'settings': settings })
-
-
+
+
def tunneldata(request):
tunnelfiles = TunnelFile.objects.all()
return render(request, 'tunnelfiles.html', { 'tunnelfiles':tunnelfiles, 'settings': settings })
-
+
def tunnelfile(request, path):
tunnelfile = TunnelFile.objects.get(tunnelpath=urllib.unquote(path))
tfile = os.path.join(settings.TUNNEL_DATA, tunnelfile.tunnelpath)
return HttpResponse(content=open(tfile), content_type="text/plain")
-
+
def tunnelfileupload(request, path):
tunnelfile = TunnelFile.objects.get(tunnelpath=urllib.unquote(path))
tfile = os.path.join(settings.TUNNEL_DATA, tunnelfile.tunnelpath)
-
+
project, user, password, tunnelversion = request.POST["tunnelproject"], request.POST["tunneluser"], request.POST["tunnelpassword"], request.POST["tunnelversion"]
print (project, user, tunnelversion)
-
-
+
+
assert len(request.FILES.values()) == 1, "only one file to upload"
-
+
uploadedfile = request.FILES.values()[0]
-
+
if uploadedfile.field_name != "sketch":
return HttpResponse(content="Error: non-sketch file uploaded", content_type="text/plain")
if uploadedfile.content_type != "text/plain":
return HttpResponse(content="Error: non-plain content type", content_type="text/plain")
-
+
# could use this to add new files
- if os.path.split(path)[1] != uploadedfile.name:
+ if os.path.split(path)[1] != uploadedfile.name:
return HttpResponse(content="Error: name disagrees", content_type="text/plain")
-
+
orgsize = tunnelfile.filesize # = os.stat(tfile)[stat.ST_SIZE]
-
+
ttext = uploadedfile.read()
-
+
# could check that the user and projects agree here
-
+
fout = open(tfile, "w")
fout.write(ttext)
fout.close()
-
- # redo its settings of
+
+ # redo its settings of
parsers.surveys.SetTunnelfileInfo(tunnelfile)
tunnelfile.save()
-
+
uploadedfile.close()
message = "File size %d overwritten with size %d" % (orgsize, tunnelfile.filesize)
return HttpResponse(content=message, content_type="text/plain")
-
-
+
+
diff --git a/core/views_caves.py b/core/views_caves.py
index 5ee0d82..6e7a671 100644
--- a/core/views_caves.py
+++ b/core/views_caves.py
@@ -383,7 +383,7 @@ def mungecoord(x, y, mapcode, img):
# image is 1417 by 2201
# FACTOR1 = 1000.0 / (36670.0-34542.0)
# FACTOR2 = (1201.0-562.0) / (83317 - 81967)
- # FACTOR = (FACTOR1 + FACTOR2)/2
+ # FACTOR = (FACTOR1 + FACTOR2)/2
# The factors aren't the same as the scanned map's at a slight angle. I
# can't be bothered to fix this. Since we zero on the Hinter it makes
# very little difference for caves in the areas round 76 or 204.
@@ -465,7 +465,7 @@ def prospecting_image(request, name):
plot("laser.0_7", "BNase", "Reference", "Br&auml;uning Nase laser point", name, draw, img)
plot("226-96", "BZkn", "Reference", "Br&auml;uning Zinken trig point", name, draw, img)
plot("vd1","VD1","Reference", "VD1 survey point", name, draw, img)
- plot("laser.kt114_96","HSK","Reference", "Hinterer Schwarzmooskogel trig point", name, draw, img)
+ plot("laser.kt114_96","HSK","Reference", "Hinterer Schwarzmooskogel trig point", name, draw, img)
plot("2000","Nipple","Reference", "Nipple (Wei&szlig;e Warze)", name, draw, img)
plot("3000","VSK","Reference", "Vorderer Schwarzmooskogel summit", name, draw, img)
plot("topcamp", "TC", "Reference", "Top Camp", name, draw, img)
diff --git a/core/views_logbooks.py b/core/views_logbooks.py
index ef920d2..c1a7dcb 100644
--- a/core/views_logbooks.py
+++ b/core/views_logbooks.py
@@ -37,7 +37,7 @@ def getNotablePersons():
for person in Person.objects.all():
if person.bisnotable():
notablepersons.append(person)
- return notablepersons
+ return notablepersons
def personindex(request):
@@ -48,7 +48,7 @@ def personindex(request):
nc = (len(persons) + ncols - 1) / ncols
for i in range(ncols):
personss.append(persons[i * nc: (i + 1) * nc])
-
+
notablepersons = []
for person in Person.objects.all():
if person.bisnotable():
@@ -67,13 +67,13 @@ def expedition(request, expeditionname):
for personexpedition in this_expedition.personexpedition_set.all():
prow = [ ]
for date in dates:
- pcell = { "persontrips": PersonTrip.objects.filter(personexpedition=personexpedition,
+ pcell = { "persontrips": PersonTrip.objects.filter(personexpedition=personexpedition,
logbook_entry__date=date) }
- pcell["survexblocks"] = set(SurvexBlock.objects.filter(survexpersonrole__personexpedition=personexpedition,
+ pcell["survexblocks"] = set(SurvexBlock.objects.filter(survexpersonrole__personexpedition=personexpedition,
date=date))
prow.append(pcell)
personexpeditiondays.append({"personexpedition":personexpedition, "personrow":prow})
-
+
if "reload" in request.GET:
LoadLogbookForExpedition(this_expedition)
return render(request,'expedition.html', {'this_expedition': this_expedition,
@@ -97,14 +97,14 @@ class ExpeditionListView(ListView):
def person(request, first_name='', last_name='', ):
this_person = Person.objects.get(first_name = first_name, last_name = last_name)
-
+
# This is for removing the reference to the user's profile, in case they set it to the wrong person
if request.method == 'GET':
if request.GET.get('clear_profile')=='True':
this_person.user=None
this_person.save()
return HttpResponseRedirect(reverse('profiles_select_profile'))
-
+
return render(request,'person.html', {'person': this_person, })
@@ -117,19 +117,19 @@ def GetPersonChronology(personexpedition):
for personrole in personexpedition.survexpersonrole_set.all():
a = res.setdefault(personrole.survexblock.date, { })
a.setdefault("personroles", [ ]).append(personrole.survexblock)
-
+
# build up the tables
rdates = res.keys()
rdates.sort()
-
-
+
+
res2 = [ ]
for rdate in rdates:
persontrips = res[rdate].get("persontrips", [])
personroles = res[rdate].get("personroles", [])
for n in range(max(len(persontrips), len(personroles))):
res2.append(((n == 0 and rdate or "--"), (n < len(persontrips) and persontrips[n]), (n < len(personroles) and personroles[n])))
-
+
return res2
@@ -180,7 +180,7 @@ def experimental(request):
survexleglength += survexblock.totalleglength
legsbyexpo.append((expedition, {"nsurvexlegs":len(survexlegs), "survexleglength":survexleglength}))
legsbyexpo.reverse()
-
+
survexlegs = models.SurvexLeg.objects.all()
totalsurvexlength = sum([survexleg.tape for survexleg in survexlegs])
return render(request, 'experimental.html', { "nsurvexlegs":len(survexlegs), "totalsurvexlength":totalsurvexlength, "legsbyexpo":legsbyexpo })
@@ -198,11 +198,11 @@ def newLogbookEntry(request, expeditionyear, pdate = None, pslug = None):
personTripFormSet = PersonTripFormSet(request.POST)
if tripForm.is_valid() and personTripFormSet.is_valid(): # All validation rules pass
dateStr = tripForm.cleaned_data["date"].strftime("%Y-%m-%d")
- directory = os.path.join(settings.EXPOWEB,
- "years",
- expedition.year,
+ directory = os.path.join(settings.EXPOWEB,
+ "years",
+ expedition.year,
"autologbook")
- filename = os.path.join(directory,
+ filename = os.path.join(directory,
dateStr + "." + slugify(tripForm.cleaned_data["title"])[:50] + ".html")
if not os.path.isdir(directory):
os.mkdir(directory)
@@ -210,7 +210,7 @@ def newLogbookEntry(request, expeditionyear, pdate = None, pslug = None):
delLogbookEntry(previouslbe)
f = open(filename, "w")
template = loader.get_template('dataformat/logbookentry.html')
- context = Context({'trip': tripForm.cleaned_data,
+ context = Context({'trip': tripForm.cleaned_data,
'persons': personTripFormSet.cleaned_data,
'date': dateStr,
'expeditionyear': expeditionyear})
@@ -234,11 +234,11 @@ def newLogbookEntry(request, expeditionyear, pdate = None, pslug = None):
"location": previouslbe.place,
"caveOrLocation": "location",
"html": previouslbe.text})
- personTripFormSet = PersonTripFormSet(initial=[{"name": get_name(py.personexpedition),
- "TU": py.time_underground,
+ personTripFormSet = PersonTripFormSet(initial=[{"name": get_name(py.personexpedition),
+ "TU": py.time_underground,
"author": py.is_logbook_entry_author}
for py in previouslbe.persontrip_set.all()])
- else:
+ else:
tripForm = TripForm() # An unbound form
personTripFormSet = PersonTripFormSet()
diff --git a/core/views_other.py b/core/views_other.py
index 1297e7f..bb7e915 100644
--- a/core/views_other.py
+++ b/core/views_other.py
@@ -35,7 +35,7 @@ def frontpage(request):
return render(request,'frontpage.html', locals())
def todo(request):
- message = "no test message" #reverse('personn', kwargs={"name":"hkjhjh"})
+ message = "no test message" #reverse('personn', kwargs={"name":"hkjhjh"})
if "reloadexpos" in request.GET:
message = LoadPersonsExpos()
message = "Reloaded personexpos"
@@ -52,7 +52,7 @@ def controlPanel(request):
jobs_completed=[]
if request.method=='POST':
if request.user.is_superuser:
-
+
#importlist is mostly here so that things happen in the correct order.
#http post data seems to come in an unpredictable order, so we do it this way.
importlist=['reload_db', 'import_people', 'import_cavetab', 'import_logbooks', 'import_surveys', 'import_QMs']
@@ -85,7 +85,7 @@ def downloadSurveys(request):
return response
def downloadLogbook(request,year=None,extension=None,queryset=None):
-
+
if year:
current_expedition=Expedition.objects.get(year=year)
logbook_entries=LogbookEntry.objects.filter(expedition=current_expedition)
@@ -96,7 +96,7 @@ def downloadLogbook(request,year=None,extension=None,queryset=None):
else:
response = HttpResponse(content_type='text/plain')
return response(r"Error: Logbook downloader doesn't know what year you want")
-
+
if 'year' in request.GET:
year=request.GET['year']
if 'extension' in request.GET:
@@ -108,14 +108,14 @@ def downloadLogbook(request,year=None,extension=None,queryset=None):
elif extension == 'html':
response = HttpResponse(content_type='text/html')
style='2005'
-
+
template='logbook'+style+'style.'+extension
- response['Content-Disposition'] = 'attachment; filename='+filename+'.'+extension
+ response['Content-Disposition'] = 'attachment; filename='+filename+'.'+extension
t=loader.get_template(template)
c=Context({'logbook_entries':logbook_entries})
response.write(t.render(c))
return response
-
+
def downloadQMs(request):
# Note to self: use get_cave method for the below
@@ -131,14 +131,14 @@ def downloadQMs(request):
response['Content-Disposition'] = 'attachment; filename=qm.csv'
toqms.writeQmTable(response,cave)
return response
-
+
def ajax_test(request):
post_text = request.POST['post_data']
- return HttpResponse("{'response_text': '"+post_text+" recieved.'}",
+ return HttpResponse("{'response_text': '"+post_text+" recieved.'}",
content_type="application/json")
-
+
def eyecandy(request):
- return
+ return
def ajax_QM_number(request):
if request.method=='POST':
@@ -158,14 +158,14 @@ def logbook_entry_suggestions(request):
unwiki_QM_pattern=r"(?P<whole>(?P<explorer_code>[ABC]?)(?P<cave>\d*)-?(?P<year>\d\d\d?\d?)-(?P<number>\d\d)(?P<grade>[ABCDXV]?))"
unwiki_QM_pattern=re.compile(unwiki_QM_pattern)
#wikilink_QM_pattern=settings.QM_PATTERN
-
+
slug=request.POST['slug']
date=request.POST['date']
lbo=LogbookEntry.objects.get(slug=slug, date=date)
-
+
#unwiki_QMs=re.findall(unwiki_QM_pattern,lbo.text)
unwiki_QMs=[m.groupdict() for m in unwiki_QM_pattern.finditer(lbo.text)]
-
+
print(unwiki_QMs)
for qm in unwiki_QMs:
#try:
@@ -180,7 +180,7 @@ def logbook_entry_suggestions(request):
lbo=LogbookEntry.objects.get(date__year=qm['year'],title__icontains="placeholder for QMs in")
except:
print("failed to get placeholder for year "+str(qm['year']))
-
+
temp_QM=QM(found_by=lbo,number=qm['number'],grade=qm['grade'])
temp_QM.grade=qm['grade']
qm['wikilink']=temp_QM.wiki_link()
@@ -188,16 +188,16 @@ def logbook_entry_suggestions(request):
#print 'failed'
print(unwiki_QMs)
-
-
+
+
#wikilink_QMs=re.findall(wikilink_QM_pattern,lbo.text)
attached_QMs=lbo.QMs_found.all()
unmentioned_attached_QMs=''#not implemented, fill this in by subtracting wiklink_QMs from attached_QMs
-
+
#Find unattached_QMs. We only look at the QMs with a proper wiki link.
#for qm in wikilink_QMs:
- #Try to look up the QM.
-
+ #Try to look up the QM.
+
print('got 208')
any_suggestions=True
print('got 210')
@@ -217,11 +217,11 @@ def newFile(request, pslug = None):
# personTripFormSet = PersonTripFormSet(request.POST)
# if tripForm.is_valid() and personTripFormSet.is_valid(): # All validation rules pass
# dateStr = tripForm.cleaned_data["date"].strftime("%Y-%m-%d")
-# directory = os.path.join(settings.EXPOWEB,
-# "years",
-# expedition.year,
+# directory = os.path.join(settings.EXPOWEB,
+# "years",
+# expedition.year,
# "autologbook")
-# filename = os.path.join(directory,
+# filename = os.path.join(directory,
# dateStr + "." + slugify(tripForm.cleaned_data["title"])[:50] + ".html")
# if not os.path.isdir(directory):
# os.mkdir(directory)
@@ -229,7 +229,7 @@ def newFile(request, pslug = None):
# delLogbookEntry(previouslbe)
# f = open(filename, "w")
# template = loader.get_template('dataformat/logbookentry.html')
-# context = Context({'trip': tripForm.cleaned_data,
+# context = Context({'trip': tripForm.cleaned_data,
# 'persons': personTripFormSet.cleaned_data,
# 'date': dateStr,
# 'expeditionyear': expeditionyear})
@@ -254,11 +254,11 @@ def newFile(request, pslug = None):
# "location": previouslbe.place,
# "caveOrLocation": "location",
# "html": previouslbe.text})
-# personTripFormSet = PersonTripFormSet(initial=[{"name": get_name(py.personexpedition),
-# "TU": py.time_underground,
+# personTripFormSet = PersonTripFormSet(initial=[{"name": get_name(py.personexpedition),
+# "TU": py.time_underground,
# "author": py.is_logbook_entry_author}
# for py in previouslbe.persontrip_set.all()])
-# else:
+# else:
# fileform = UploadFileForm() # An unbound form
return render(request, 'editfile.html', {
diff --git a/core/views_survex.py b/core/views_survex.py
index 2582e40..cc04cb1 100644
--- a/core/views_survex.py
+++ b/core/views_survex.py
@@ -17,7 +17,7 @@ import troggle.settings as settings
import parsers.survex
survextemplatefile = """; Locn: Totes Gebirge, Austria - Loser/Augst-Eck Plateau (kataster group 1623)
-; Cave:
+; Cave:
*begin [surveyname]
@@ -65,7 +65,7 @@ class SvxForm(forms.Form):
datetime = forms.DateTimeField(widget=forms.TextInput(attrs={"readonly":True}))
outputtype = forms.CharField(widget=forms.TextInput(attrs={"readonly":True}))
code = forms.CharField(widget=forms.Textarea(attrs={"cols":150, "rows":18}))
-
+
def GetDiscCode(self):
fname = settings.SURVEX_DATA + self.data['filename'] + ".svx"
if not os.path.isfile(fname):
@@ -75,7 +75,7 @@ class SvxForm(forms.Form):
svxtext = ReplaceTabs(svxtext).strip()
fin.close()
return svxtext
-
+
def DiffCode(self, rcode):
code = self.GetDiscCode()
difftext = difflib.unified_diff(code.splitlines(), rcode.splitlines())
@@ -86,14 +86,14 @@ class SvxForm(forms.Form):
fname = settings.SURVEX_DATA + self.data['filename'] + ".svx"
if not os.path.isfile(fname):
# only save if appears valid
- if re.search(r"\[|\]", rcode):
+ if re.search(r"\[|\]", rcode):
return "Error: clean up all []s from the text"
mbeginend = re.search(r"(?s)\*begin\s+(\w+).*?\*end\s+(\w+)", rcode)
if not mbeginend:
return "Error: no begin/end block here"
if mbeginend.group(1) != mbeginend.group(2):
return "Error: mismatching beginend"
-
+
fout = open(fname, "w")
res = fout.write(rcode.encode("latin1"))
fout.close()
@@ -118,21 +118,21 @@ def svx(request, survex_file):
dirname += "/"
nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
outputtype = "normal"
- form = SvxForm({'filename':survex_file, 'dirname':dirname, 'datetime':nowtime, 'outputtype':outputtype})
-
+ form = SvxForm({'filename':survex_file, 'dirname':dirname, 'datetime':nowtime, 'outputtype':outputtype})
+
# if the form has been returned
difflist = [ ]
logmessage = ""
message = ""
if request.method == 'POST': # If the form has been submitted...
- rform = SvxForm(request.POST) #
+ rform = SvxForm(request.POST) #
if rform.is_valid(): # All validation rules pass (how do we check it against the filename and users?)
rcode = rform.cleaned_data['code']
outputtype = rform.cleaned_data['outputtype']
difflist = form.DiffCode(rcode)
#print "ssss", rform.data
-
+
if "revert" in rform.data:
pass
if "process" in rform.data:
@@ -153,20 +153,20 @@ def svx(request, survex_file):
form.data['code'] = rcode
if "diff" in rform.data:
form.data['code'] = rcode
-
-
+
+
#process(survex_file)
- if 'code' not in form.data:
+ if 'code' not in form.data:
form.data['code'] = form.GetDiscCode()
-
+
if not difflist:
difflist.append("none")
if message:
difflist.insert(0, message)
-
+
#print [ form.data['code'] ]
svxincludes = re.findall(r'\*include\s+(\S+)(?i)', form.data['code'] or "")
-
+
vmap = {'settings': settings,
'has_3d': os.path.isfile(settings.SURVEX_DATA + survex_file + ".3d"),
'title': survex_file,
@@ -227,13 +227,13 @@ def identifycavedircontents(gcavedir):
pass
elif name == "115" and (f in ["115cufix.svx", "115fix.svx"]):
pass
-
+
elif os.path.isdir(os.path.join(gcavedir, f)):
if f[0] != ".":
subdirs.append(f)
elif f[-4:] == ".svx":
nf = f[:-4]
-
+
if nf.lower() == name.lower() or nf[:3] == "all" or (name, nf) in [("resurvey2005", "145-2005"), ("cucc", "cu115")]:
if primesvx:
if nf[:3] == "all":
@@ -272,16 +272,16 @@ def survexcaveslist(request):
fnumlist += [ (-int(re.match(r"\d*", f).group(0) or "0"), f, area) for f in os.listdir(cavesdir) ]
print(fnumlist)
print(len(fnumlist))
-
+
# first sort the file list
fnumlist.sort()
-
+
onefilecaves = [ ]
multifilecaves = [ ]
subdircaves = [ ]
print(fnumlist)
-
+
# go through the list and identify the contents of each cave directory
for num, cavedir, area in fnumlist:
if cavedir in ["144", "40"]:
@@ -293,10 +293,10 @@ def survexcaveslist(request):
if os.path.isdir(gcavedir) and cavedir[0] != ".":
subdirs, subsvx = identifycavedircontents(gcavedir)
survdirobj = [ ]
-
+
for lsubsvx in subsvx:
survdirobj.append(("caves-" + area + "/"+cavedir+"/"+lsubsvx, lsubsvx))
-
+
# caves with subdirectories
if subdirs:
subsurvdirs = [ ]
@@ -308,7 +308,7 @@ def survexcaveslist(request):
lsurvdirobj.append(("caves-" + area + "/"+cavedir+"/"+subdir+"/"+lsubsvx, lsubsvx))
subsurvdirs.append((lsurvdirobj[0], lsurvdirobj[1:]))
subdircaves.append((cavedir, (survdirobj[0], survdirobj[1:]), subsurvdirs))
-
+
# multifile caves
elif len(survdirobj) > 1:
multifilecaves.append((survdirobj[0], survdirobj[1:]))
diff --git a/databaseReset.py b/databaseReset.py
index 49e4e1b..d181993 100644
--- a/databaseReset.py
+++ b/databaseReset.py
@@ -61,7 +61,7 @@ def import_logbooks():
settings.LOGFILE.write('\nBegun importing logbooks at ' + time.asctime() +'\n'+'-'*60)
except:
pass
-
+
import parsers.logbooks
parsers.logbooks.LoadLogbooks()
@@ -95,7 +95,7 @@ def reset():
import_caves()
import_people()
import_surveyscans()
-
+
import_logbooks()
import_QMs()
@@ -136,13 +136,13 @@ def dumplogbooks():
return pe.person.first_name
for lbe in troggle.core.models.LogbookEntry.objects.all():
dateStr = lbe.date.strftime("%Y-%m-%d")
- directory = os.path.join(settings.EXPOWEB,
+ directory = os.path.join(settings.EXPOWEB,
"years",
- lbe.expedition.year,
+ lbe.expedition.year,
"autologbook")
if not os.path.isdir(directory):
os.mkdir(directory)
- filename = os.path.join(directory,
+ filename = os.path.join(directory,
dateStr + "." + slugify(lbe.title)[:50] + ".html")
if lbe.cave:
print(lbe.cave.reference())
@@ -227,7 +227,7 @@ if __name__ == "__main__":
elif "survexpos" in sys.argv:
# management.call_command('syncdb', interactive=False) # this sets the path so that import settings works in import_survex
import parsers.survex
- parsers.survex.LoadPos()
+ parsers.survex.LoadPos()
elif "logbooks" in sys.argv:
# management.call_command('syncdb', interactive=False) # this sets the path so that import settings works in import_survex
import_logbooks()
diff --git a/export/toqms.py b/export/toqms.py
index 2564094..a54a686 100644
--- a/export/toqms.py
+++ b/export/toqms.py
@@ -33,4 +33,3 @@ def writeQmTable(outfile,cave):
cavewriter.writerow(headers)
for qm in cave.get_QMs():
cavewriter.writerow(qmRow(qm))
- \ No newline at end of file
diff --git a/middleware.py b/middleware.py
index 7c27500..cfdfff3 100644
--- a/middleware.py
+++ b/middleware.py
@@ -46,4 +46,4 @@ def _resolves(url):
return True
except http.Http404:
return False
-
+
diff --git a/parsers/QMs.py b/parsers/QMs.py
index 602b7af..9de3b4d 100644
--- a/parsers/QMs.py
+++ b/parsers/QMs.py
@@ -30,7 +30,7 @@ def parseCaveQMs(cave,inputFile):
kh=Cave.objects.get(official_name="Kaninchenh&ouml;hle")
except Cave.DoesNotExist:
print("KH is not in the database. Please run parsers.cavetab first.")
- parse_KH_QMs(kh, inputFile=inputFile)
+ parse_KH_QMs(kh, inputFile=inputFile)
return
qmPath = settings.EXPOWEB+inputFile
@@ -46,7 +46,7 @@ def parseCaveQMs(cave,inputFile):
if cave=='stein':
placeholder, hadToCreate = LogbookEntry.objects.get_or_create(date__year=year, title="placeholder for QMs in 204", text="QMs temporarily attached to this should be re-attached to their actual trips", defaults={"date": date(year, 1, 1),"cave":steinBr})
elif cave=='hauch':
- placeholder, hadToCreate = LogbookEntry.objects.get_or_create(date__year=year, title="placeholder for QMs in 234", text="QMs temporarily attached to this should be re-attached to their actual trips", defaults={"date": date(year, 1, 1),"cave":hauchHl})
+ placeholder, hadToCreate = LogbookEntry.objects.get_or_create(date__year=year, title="placeholder for QMs in 234", text="QMs temporarily attached to this should be re-attached to their actual trips", defaults={"date": date(year, 1, 1),"cave":hauchHl})
if hadToCreate:
print(cave + " placeholder logbook entry for " + str(year) + " added to database")
QMnum=re.match(r".*?-\d*?-X?(?P<numb>\d*)",line[0]).group("numb")
@@ -59,7 +59,7 @@ def parseCaveQMs(cave,inputFile):
newQM.grade=line[1]
newQM.area=line[2]
newQM.location_description=line[3]
-
+
newQM.completion_description=line[4]
newQM.nearest_station_description=line[5]
if newQM.completion_description: # Troggle checks if QMs are completed by checking if they have a ticked_off_by trip. In the table, completion is indicated by the presence of a completion discription.
@@ -74,11 +74,11 @@ def parseCaveQMs(cave,inputFile):
print("overwriting " + str(preexistingQM) +"\r")
else: # otherwise, print that it was ignored
print("preserving " + str(preexistingQM) + ", which was edited in admin \r")
-
+
except QM.DoesNotExist: #if there is no pre-existing QM, save the new one
- newQM.save()
+ newQM.save()
print("QM "+str(newQM) + ' added to database\r')
-
+
except KeyError: #check on this one
continue
except IndexError:
@@ -106,9 +106,9 @@ def parse_KH_QMs(kh, inputFile):
'nearest_station_name':res['nearest_station'],
'location_description':res['description']
}
-
+
save_carefully(QM,lookupArgs,nonLookupArgs)
-
+
parseCaveQMs(cave='stein',inputFile=r"1623/204/qm.csv")
parseCaveQMs(cave='hauch',inputFile=r"1623/234/qm.csv")
diff --git a/parsers/caves.py b/parsers/caves.py
index 606007f..bd79634 100644
--- a/parsers/caves.py
+++ b/parsers/caves.py
@@ -155,7 +155,7 @@ def readcave(filename):
message = "Can't find text (slug): %s, skipping %s" % (slug, context)
models.DataIssue.objects.create(parser='caves', message=message)
print(message)
-
+
primary = False
for entrance in entrances:
slug = getXML(entrance, "entranceslug", maxItems = 1, context = context)[0]
@@ -167,7 +167,7 @@ def readcave(filename):
message = "Entrance text (slug) %s missing %s" % (slug, context)
models.DataIssue.objects.create(parser='caves', message=message)
print(message)
-
+
def getXML(text, itemname, minItems = 1, maxItems = None, printwarnings = True, context = ""):
items = re.findall("<%(itemname)s>(.*?)</%(itemname)s>" % {"itemname": itemname}, text, re.S)
@@ -177,7 +177,7 @@ def getXML(text, itemname, minItems = 1, maxItems = None, printwarnings = True,
"min": minItems} + context
models.DataIssue.objects.create(parser='caves', message=message)
print(message)
-
+
if maxItems is not None and len(items) > maxItems and printwarnings:
message = "%(count)i %(itemname)s found, no more than %(max)i expected" % {"count": len(items),
"itemname": itemname,
diff --git a/parsers/logbooks.py b/parsers/logbooks.py
index 5bbbd98..0bd7370 100644
--- a/parsers/logbooks.py
+++ b/parsers/logbooks.py
@@ -18,7 +18,7 @@ from fuzzywuzzy import fuzz
from utils import save_carefully
-#
+#
# When we edit logbook entries, allow a "?" after any piece of data to say we've frigged it and
# it can be checked up later from the hard-copy if necessary; or it's not possible to determin (name, trip place, etc)
#
@@ -111,7 +111,7 @@ def EnterLogIntoDbase(date, place, title, text, trippeople, expedition, logtime_
lookupAttribs={'date':date, 'title':title}
nonLookupAttribs={'place':place, 'text':text, 'expedition':expedition, 'cave':cave, 'slug':slugify(title)[:50], 'entry_type':entry_type}
lbo, created=save_carefully(models.LogbookEntry, lookupAttribs, nonLookupAttribs)
-
+
for tripperson, time_underground in trippersons:
lookupAttribs={'personexpedition':tripperson, 'logbook_entry':lbo}
nonLookupAttribs={'time_underground':time_underground, 'is_logbook_entry_author':(tripperson == author)}
@@ -216,7 +216,7 @@ def Parseloghtml01(year, expedition, txt):
tripdate, triptitle, trippeople = tripheader.split("|")
ldate = ParseDate(tripdate.strip(), year)
-
+
mtu = re.search(r'<p[^>]*>(T/?U.*)', triptext)
if mtu:
tu = mtu.group(1)
@@ -228,7 +228,7 @@ def Parseloghtml01(year, expedition, txt):
tripcave = triptitles[0].strip()
ltriptext = triptext
-
+
mtail = re.search(r'(?:<a href="[^"]*">[^<]*</a>|\s|/|-|&amp;|</?p>|\((?:same day|\d+)\))*$', ltriptext)
if mtail:
#print mtail.group(0)
@@ -240,7 +240,6 @@ def Parseloghtml01(year, expedition, txt):
ltriptext = re.sub(r"</?u>", "_", ltriptext)
ltriptext = re.sub(r"</?i>", "''", ltriptext)
ltriptext = re.sub(r"</?b>", "'''", ltriptext)
-
#print ldate, trippeople.strip()
# could includ the tripid (url link for cross referencing)
@@ -301,7 +300,7 @@ def SetDatesFromLogbookEntries(expedition):
def LoadLogbookForExpedition(expedition):
""" Parses all logbook entries for one expedition """
-
+
expowebbase = os.path.join(settings.EXPOWEB, "years")
yearlinks = settings.LOGBOOK_PARSER_SETTINGS
@@ -344,7 +343,7 @@ def LoadLogbooks():
expos = models.Expedition.objects.all()
for expo in expos:
print("\nLoading Logbook for: " + expo.year)
-
+
# Load logbook for expo
LoadLogbookForExpedition(expo)
@@ -378,17 +377,17 @@ def parseAutoLogBookEntry(filename):
expedition = models.Expedition.objects.get(year = expeditionYearMatch.groups()[0])
personExpeditionNameLookup = GetPersonExpeditionNameLookup(expedition)
except models.Expedition.DoesNotExist:
- errors.append("Expedition not in database")
+ errors.append("Expedition not in database")
else:
- errors.append("Expediton Year could not be parsed")
+ errors.append("Expediton Year could not be parsed")
titleMatch = titleRegex.search(contents)
if titleMatch:
title, = titleMatch.groups()
if len(title) > settings.MAX_LOGBOOK_ENTRY_TITLE_LENGTH:
- errors.append("Title too long")
+ errors.append("Title too long")
else:
- errors.append("Title could not be found")
+ errors.append("Title could not be found")
caveMatch = caveRegex.search(contents)
if caveMatch:
@@ -397,24 +396,24 @@ def parseAutoLogBookEntry(filename):
cave = models.getCaveByReference(caveRef)
except AssertionError:
cave = None
- errors.append("Cave not found in database")
+ errors.append("Cave not found in database")
else:
cave = None
locationMatch = locationRegex.search(contents)
if locationMatch:
- location, = locationMatch.groups()
+ location, = locationMatch.groups()
else:
location = None
-
+
if cave is None and location is None:
- errors.append("Location nor cave could not be found")
+ errors.append("Location nor cave could not be found")
reportMatch = reportRegex.search(contents)
if reportMatch:
report, = reportMatch.groups()
else:
- errors.append("Contents could not be found")
+ errors.append("Contents could not be found")
if errors:
return errors # Easiest to bail out at this point as we need to make sure that we know which expedition to look for people from.
people = []
@@ -429,7 +428,7 @@ def parseAutoLogBookEntry(filename):
author = bool(author)
else:
errors.append("Persons name could not be found")
-
+
TUMatch = TURegex.search(contents)
if TUMatch:
TU, = TUMatch.groups()
@@ -439,15 +438,15 @@ def parseAutoLogBookEntry(filename):
people.append((name, author, TU))
if errors:
return errors # Bail out before commiting to the database
- logbookEntry = models.LogbookEntry(date = date,
+ logbookEntry = models.LogbookEntry(date = date,
expedition = expedition,
- title = title, cave = cave, place = location,
+ title = title, cave = cave, place = location,
text = report, slug = slugify(title)[:50],
filename = filename)
logbookEntry.save()
for name, author, TU in people:
- models.PersonTrip(personexpedition = personExpo,
- time_underground = TU,
- logbook_entry = logbookEntry,
+ models.PersonTrip(personexpedition = personExpo,
+ time_underground = TU,
+ logbook_entry = logbookEntry,
is_logbook_entry_author = author).save()
print(logbookEntry)
diff --git a/parsers/people.py b/parsers/people.py
index 28a036a..0d253c9 100644
--- a/parsers/people.py
+++ b/parsers/people.py
@@ -12,22 +12,22 @@ def saveMugShot(mugShotPath, mugShotFilename, person):
mugShotFilename=mugShotFilename[2:]
else:
mugShotFilename=mugShotFilename # just in case one doesn't
-
+
dummyObj=models.DPhoto(file=mugShotFilename)
-
+
#Put a copy of the file in the right place. mugShotObj.file.path is determined by the django filesystemstorage specified in models.py
if not os.path.exists(dummyObj.file.path):
shutil.copy(mugShotPath, dummyObj.file.path)
-
+
mugShotObj, created = save_carefully(
models.DPhoto,
lookupAttribs={'is_mugshot':True, 'file':mugShotFilename},
nonLookupAttribs={'caption':"Mugshot for "+person.first_name+" "+person.last_name}
)
-
+
if created:
mugShotObj.contains_person.add(person)
- mugShotObj.save()
+ mugShotObj.save()
def parseMugShotAndBlurb(personline, header, person):
"""create mugshot Photo instance"""
@@ -45,20 +45,20 @@ def parseMugShotAndBlurb(personline, header, person):
person.save()
def LoadPersonsExpos():
-
+
persontab = open(os.path.join(settings.EXPOWEB, "folk", "folk.csv"))
personreader = csv.reader(persontab)
headers = personreader.next()
header = dict(zip(headers, range(len(headers))))
-
+
# make expeditions
print("Loading expeditions")
years = headers[5:]
-
+
for year in years:
lookupAttribs = {'year':year}
nonLookupAttribs = {'name':"CUCC expo %s" % year}
-
+
save_carefully(models.Expedition, lookupAttribs, nonLookupAttribs)
# make persons
@@ -91,7 +91,7 @@ def LoadPersonsExpos():
person, created = save_carefully(models.Person, lookupAttribs, nonLookupAttribs)
parseMugShotAndBlurb(personline=personline, header=header, person=person)
-
+
# make person expedition from table
for year, attended in zip(headers, personline)[5:]:
expedition = models.Expedition.objects.get(year=year)
@@ -108,10 +108,10 @@ def GetPersonExpeditionNameLookup(expedition):
res = Gpersonexpeditionnamelookup.get(expedition.name)
if res:
return res
-
+
res = { }
duplicates = set()
-
+
print("Calculating GetPersonExpeditionNameLookup for " + expedition.year)
personexpeditions = models.PersonExpedition.objects.filter(expedition=expedition)
htmlparser = HTMLParser()
@@ -139,16 +139,16 @@ def GetPersonExpeditionNameLookup(expedition):
possnames.append(personexpedition.nickname.lower() + " " + l[0])
if str(personexpedition.nickname.lower() + l[0]) not in possnames:
possnames.append(personexpedition.nickname.lower() + l[0])
-
+
for possname in possnames:
if possname in res:
duplicates.add(possname)
else:
res[possname] = personexpedition
-
+
for possname in duplicates:
del res[possname]
-
+
Gpersonexpeditionnamelookup[expedition.name] = res
return res
diff --git a/parsers/subcaves.py b/parsers/subcaves.py
index 739af44..364da0d 100644
--- a/parsers/subcaves.py
+++ b/parsers/subcaves.py
@@ -1,5 +1,7 @@
'''
-This module is the part of troggle that parses descriptions of cave parts (subcaves) from the legacy html files and saves them in the troggle database as instances of the model Subcave. Unfortunately, this parser can not be very flexible because the legacy format is poorly structured.
+This module is the part of troggle that parses descriptions of cave parts (subcaves) from the legacy html
+files and saves them in the troggle database as instances of the model Subcave.
+Unfortunately, this parser can not be very flexible because the legacy format is poorly structured.
'''
import sys, os
@@ -29,12 +31,12 @@ def importSubcaves(cave):
link[0])
subcaveFile=open(subcaveFilePath,'r')
description=subcaveFile.read().decode('iso-8859-1').encode('utf-8')
-
+
lookupAttribs={'title':link[1], 'cave':cave}
nonLookupAttribs={'description':description}
newSubcave=save_carefully(Subcave,lookupAttribs=lookupAttribs,nonLookupAttribs=nonLookupAttribs)
- logging.info("Added " + unicode(newSubcave) + " to " + unicode(cave))
+ logging.info("Added " + unicode(newSubcave) + " to " + unicode(cave))
except IOError:
logging.info("Subcave import couldn't open "+subcaveFilePath)
diff --git a/parsers/survex.py b/parsers/survex.py
index 01f6d21..c70a80b 100644
--- a/parsers/survex.py
+++ b/parsers/survex.py
@@ -19,12 +19,12 @@ def LoadSurvexLineLeg(survexblock, stardata, sline, comment, cave):
ls = sline.lower().split()
ssfrom = survexblock.MakeSurvexStation(ls[stardata["from"]])
ssto = survexblock.MakeSurvexStation(ls[stardata["to"]])
-
+
survexleg = models.SurvexLeg(block=survexblock, stationfrom=ssfrom, stationto=ssto)
if stardata["type"] == "normal":
try:
survexleg.tape = float(ls[stardata["tape"]])
- except ValueError:
+ except ValueError:
print("Tape misread in", survexblock.survexfile.path)
print("Stardata:", stardata)
print("Line:", ls)
@@ -69,7 +69,7 @@ def LoadSurvexLineLeg(survexblock, stardata, sline, comment, cave):
# only save proper legs
survexleg.save()
-
+
itape = stardata.get("tape")
if itape:
try:
@@ -106,7 +106,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
stardata = stardatadefault
teammembers = [ ]
- # uncomment to print out all files during parsing
+ # uncomment to print out all files during parsing
print(" - Reading file: " + survexblock.survexfile.path)
stamp = datetime.now()
lineno = 0
@@ -198,7 +198,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
#print('Cave -sline ' + str(cave))
if not sline:
continue
-
+
# detect the star command
mstar = regex_star.match(sline)
if not mstar:
@@ -214,7 +214,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
# print(' - Passage: ')
#Missing "station" in stardata.
continue
-
+
# detect the star command
cmd, line = mstar.groups()
cmd = cmd.lower()
@@ -238,7 +238,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
survexblock.save()
fininclude = includesurvexfile.OpenFile()
RecursiveLoad(survexblock, includesurvexfile, fininclude, textlines)
-
+
elif re.match("begin$(?i)", cmd):
if line:
newsvxpath = os.path.join(os.path.split(survexfile.path)[0], re.sub(r"\.svx$", "", line))
@@ -265,7 +265,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
RecursiveLoad(survexblockdown, survexfile, fin, textlinesdown)
else:
iblankbegins += 1
-
+
elif re.match("end$(?i)", cmd):
if iblankbegins:
iblankbegins -= 1
@@ -277,7 +277,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
timetaken = endstamp - stamp
# print(' - Time to process: ' + str(timetaken))
return
-
+
elif re.match("date$(?i)", cmd):
if len(line) == 10:
#print(' - Date found: ' + line)
@@ -288,7 +288,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
survexblock.expedition = expeditions[0]
survexblock.expeditionday = survexblock.expedition.get_expedition_day(survexblock.date)
survexblock.save()
-
+
elif re.match("team$(?i)", cmd):
pass
# print(' - Team found: ')
@@ -304,13 +304,13 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
if personexpedition:
personrole.person=personexpedition.person
personrole.save()
-
+
elif cmd == "title":
#print(' - Title found: ')
survextitle = models.SurvexTitle(survexblock=survexblock, title=line.strip('"'), cave=survexfile.cave)
survextitle.save()
pass
-
+
elif cmd == "require":
# should we check survex version available for processing?
pass
@@ -329,7 +329,7 @@ def RecursiveLoad(survexblock, survexfile, fin, textlines):
stardata = stardatadefault
else:
assert ls[0] == "passage", line
-
+
elif cmd == "equate":
#print(' - Equate found: ')
LoadSurvexEquate(survexblock, line)
diff --git a/parsers/surveys.py b/parsers/surveys.py
index 0eed6f0..d5dc128 100644
--- a/parsers/surveys.py
+++ b/parsers/surveys.py
@@ -24,7 +24,7 @@ def readSurveysFromCSV():
try: # could probably combine these two
surveytab = open(os.path.join(settings.SURVEY_SCANS, "Surveys.csv"))
except IOError:
- import cStringIO, urllib
+ import cStringIO, urllib
surveytab = cStringIO.StringIO(urllib.urlopen(settings.SURVEY_SCANS + "/Surveys.csv").read())
dialect=csv.Sniffer().sniff(surveytab.read())
surveytab.seek(0,0)
@@ -37,7 +37,7 @@ def readSurveysFromCSV():
print("There are no expeditions in the database. Please run the logbook parser.")
sys.exit()
-
+
logging.info("Deleting all scanned images")
ScannedImage.objects.all().delete()
@@ -48,7 +48,7 @@ def readSurveysFromCSV():
for survey in surveyreader:
# I hate this, but some surveys have a letter eg 2000#34a. The next line deals with that.
- walletNumberLetter = re.match(r'(?P<number>\d*)(?P<letter>[a-zA-Z]*)',survey[header['Survey Number']])
+ walletNumberLetter = re.match(r'(?P<number>\d*)(?P<letter>[a-zA-Z]*)',survey[header['Survey Number']])
# print(walletNumberLetter.groups())
year=survey[header['Year']]
@@ -139,7 +139,7 @@ def parseSurveys(logfile=None):
except (IOError, OSError):
print("Survey CSV not found..")
pass
-
+
for expedition in Expedition.objects.filter(year__gte=2000): #expos since 2000, because paths and filenames were nonstandard before then
parseSurveyScans(expedition)
@@ -169,21 +169,21 @@ def GetListDir(sdir):
def LoadListScansFile(survexscansfolder):
gld = [ ]
-
+
# flatten out any directories in these book files
for (fyf, ffyf, fisdiryf) in GetListDir(survexscansfolder.fpath):
if fisdiryf:
gld.extend(GetListDir(ffyf))
else:
gld.append((fyf, ffyf, fisdiryf))
-
+
for (fyf, ffyf, fisdiryf) in gld:
#assert not fisdiryf, ffyf
if re.search(r"\.(?:png|jpg|jpeg)(?i)$", fyf):
survexscansingle = SurvexScanSingle(ffile=ffyf, name=fyf, survexscansfolder=survexscansfolder)
survexscansingle.save()
-
+
# this iterates through the scans directories (either here or on the remote server)
# and builds up the models we can access later
def LoadListScans():
@@ -194,17 +194,17 @@ def LoadListScans():
SurvexScansFolder.objects.all().delete()
# first do the smkhs (large kh survey scans) directory
- survexscansfoldersmkhs = SurvexScansFolder(fpath=os.path.join(settings.SURVEY_SCANS, "smkhs"), walletname="smkhs")
+ survexscansfoldersmkhs = SurvexScansFolder(fpath=os.path.join(settings.SURVEY_SCANS, "smkhs"), walletname="smkhs")
if os.path.isdir(survexscansfoldersmkhs.fpath):
survexscansfoldersmkhs.save()
LoadListScansFile(survexscansfoldersmkhs)
-
-
+
+
# iterate into the surveyscans directory
for f, ff, fisdir in GetListDir(os.path.join(settings.SURVEY_SCANS, "surveyscans")):
if not fisdir:
continue
-
+
# do the year folders
if re.match(r"\d\d\d\d$", f):
for fy, ffy, fisdiry in GetListDir(ff):
@@ -213,13 +213,13 @@ def LoadListScans():
survexscansfolder = SurvexScansFolder(fpath=ffy, walletname=fy)
survexscansfolder.save()
LoadListScansFile(survexscansfolder)
-
- # do the
+
+ # do the
elif f != "thumbs":
survexscansfolder = SurvexScansFolder(fpath=ff, walletname=f)
survexscansfolder.save()
LoadListScansFile(survexscansfolder)
-
+
def FindTunnelScan(tunnelfile, path):
scansfolder, scansfile = None, None
@@ -235,12 +235,12 @@ def FindTunnelScan(tunnelfile, path):
print(scansfilel, len(scansfilel))
assert len(scansfilel) == 1
scansfile = scansfilel[0]
-
+
if scansfolder:
tunnelfile.survexscansfolders.add(scansfolder)
if scansfile:
tunnelfile.survexscans.add(scansfile)
-
+
elif path and not re.search(r"\.(?:png|jpg|jpeg)$(?i)", path):
name = os.path.split(path)[1]
print("ttt", tunnelfile.tunnelpath, path, name)
@@ -260,22 +260,22 @@ def SetTunnelfileInfo(tunnelfile):
fin = open(ff)
ttext = fin.read()
fin.close()
-
+
mtype = re.search("<(fontcolours|sketch)", ttext)
#assert mtype, ff
if mtype:
tunnelfile.bfontcolours = (mtype.group(1)=="fontcolours")
tunnelfile.npaths = len(re.findall("<skpath", ttext))
tunnelfile.save()
-
+
# <tunnelxml tunnelversion="version2009-06-21 Matienzo" tunnelproject="ireby" tunneluser="goatchurch" tunneldate="2009-06-29 23:22:17">
# <pcarea area_signal="frame" sfscaledown="12.282584" sfrotatedeg="-90.76982" sfxtrans="11.676667377221136" sfytrans="-15.677173422877454" sfsketch="204description/scans/plan(38).png" sfstyle="" nodeconnzsetrelative="0.0">
for path, style in re.findall('<pcarea area_signal="frame".*?sfsketch="([^"]*)" sfstyle="([^"]*)"', ttext):
FindTunnelScan(tunnelfile, path)
-
+
# should also scan and look for survex blocks that might have been included
- # and also survex titles as well.
-
+ # and also survex titles as well.
+
tunnelfile.save()
@@ -295,6 +295,6 @@ def LoadTunnelFiles():
elif f[-4:] == ".xml":
tunnelfile = TunnelFile(tunnelpath=lf, tunnelname=os.path.split(f[:-4])[1])
tunnelfile.save()
-
+
for tunnelfile in TunnelFile.objects.all():
SetTunnelfileInfo(tunnelfile)
diff --git a/settings.py b/settings.py
index 4470361..418c77c 100644
--- a/settings.py
+++ b/settings.py
@@ -65,30 +65,30 @@ LOGBOOK_PARSER_SETTINGS = {
"2017": ("2017/logbook.html", "Parseloghtmltxt"),
"2016": ("2016/logbook.html", "Parseloghtmltxt"),
"2015": ("2015/logbook.html", "Parseloghtmltxt"),
- "2014": ("2014/logbook.html", "Parseloghtmltxt"),
- "2013": ("2013/logbook.html", "Parseloghtmltxt"),
- "2012": ("2012/logbook.html", "Parseloghtmltxt"),
- "2011": ("2011/logbook.html", "Parseloghtmltxt"),
- "2010": ("2010/logbook.html", "Parselogwikitxt"),
- "2009": ("2009/2009logbook.txt", "Parselogwikitxt"),
- "2008": ("2008/2008logbook.txt", "Parselogwikitxt"),
- "2007": ("2007/logbook.html", "Parseloghtmltxt"),
- "2006": ("2006/logbook/logbook_06.txt", "Parselogwikitxt"),
- "2005": ("2005/logbook.html", "Parseloghtmltxt"),
- "2004": ("2004/logbook.html", "Parseloghtmltxt"),
- "2003": ("2003/logbook.html", "Parseloghtml03"),
- "2002": ("2002/logbook.html", "Parseloghtmltxt"),
- "2001": ("2001/log.htm", "Parseloghtml01"),
- "2000": ("2000/log.htm", "Parseloghtml01"),
- "1999": ("1999/log.htm", "Parseloghtml01"),
- "1998": ("1998/log.htm", "Parseloghtml01"),
- "1997": ("1997/log.htm", "Parseloghtml01"),
+ "2014": ("2014/logbook.html", "Parseloghtmltxt"),
+ "2013": ("2013/logbook.html", "Parseloghtmltxt"),
+ "2012": ("2012/logbook.html", "Parseloghtmltxt"),
+ "2011": ("2011/logbook.html", "Parseloghtmltxt"),
+ "2010": ("2010/logbook.html", "Parselogwikitxt"),
+ "2009": ("2009/2009logbook.txt", "Parselogwikitxt"),
+ "2008": ("2008/2008logbook.txt", "Parselogwikitxt"),
+ "2007": ("2007/logbook.html", "Parseloghtmltxt"),
+ "2006": ("2006/logbook/logbook_06.txt", "Parselogwikitxt"),
+ "2005": ("2005/logbook.html", "Parseloghtmltxt"),
+ "2004": ("2004/logbook.html", "Parseloghtmltxt"),
+ "2003": ("2003/logbook.html", "Parseloghtml03"),
+ "2002": ("2002/logbook.html", "Parseloghtmltxt"),
+ "2001": ("2001/log.htm", "Parseloghtml01"),
+ "2000": ("2000/log.htm", "Parseloghtml01"),
+ "1999": ("1999/log.htm", "Parseloghtml01"),
+ "1998": ("1998/log.htm", "Parseloghtml01"),
+ "1997": ("1997/log.htm", "Parseloghtml01"),
"1996": ("1996/log.htm", "Parseloghtml01"),
- "1995": ("1995/log.htm", "Parseloghtml01"),
- "1994": ("1994/log.htm", "Parseloghtml01"),
- "1993": ("1993/log.htm", "Parseloghtml01"),
- "1992": ("1992/log.htm", "Parseloghtml01"),
- "1991": ("1991/log.htm", "Parseloghtml01"),
+ "1995": ("1995/log.htm", "Parseloghtml01"),
+ "1994": ("1994/log.htm", "Parseloghtml01"),
+ "1993": ("1993/log.htm", "Parseloghtml01"),
+ "1992": ("1992/log.htm", "Parseloghtml01"),
+ "1991": ("1991/log.htm", "Parseloghtml01"),
}
APPEND_SLASH = False
diff --git a/templates/person.html b/templates/person.html
index 48dafb7..5b0c7e9 100644
--- a/templates/person.html
+++ b/templates/person.html
@@ -18,8 +18,8 @@
{% if pic.is_mugshot %}
<div class="figure">
<p> <img src="{{ pic.thumbnail_image.url }}" class="thumbnail" />
- <p> {{ pic.caption }}</p>
- <p> <a href="{{ pic.get_admin_url }}">edit {{pic}}</a> </>
+ <p> {{ pic.caption }} </p>
+ <p> <a href="{{ pic.get_admin_url }}">edit {{pic}}</a>
</p>
</p>
</div>
@@ -32,7 +32,7 @@
<ul>
{% for personexpedition in person.personexpedition_set.all %}
<li> <a href="{{ personexpedition.get_absolute_url }}">{{personexpedition.expedition.year}}</a>
- <span style="padding-left:{{personexpedition.persontrip_set.all|length}}0px; background-color:red"></span>
+ <span style="padding-left:{{ personexpedition.persontrip_set.all|length }}0px; background-color:red"></span>
{{personexpedition.persontrip_set.all|length}} trips
</li>
{% endfor %}
diff --git a/utils.py b/utils.py
index ffb9f66..a6c8539 100644
--- a/utils.py
+++ b/utils.py
@@ -23,12 +23,12 @@ def randomLogbookSentence():
#Choose again if there are no sentances (this happens if it is a placeholder entry)
while len(re.findall('[A-Z].*?\.',randSent['entry'].text))==0:
randSent['entry']=LogbookEntry.objects.order_by('?')[0]
-
+
#Choose a random sentence from that entry. Store the sentence as randSent['sentence'], and the number of that sentence in the entry as randSent['number']
sentenceList=re.findall('[A-Z].*?\.',randSent['entry'].text)
randSent['number']=random.randrange(0,len(sentenceList))
randSent['sentence']=sentenceList[randSent['number']]
-
+
return randSent
@@ -37,10 +37,10 @@ def save_carefully(objectType, lookupAttribs={}, nonLookupAttribs={}):
-if instance does not exist in DB: add instance to DB, return (new instance, True)
-if instance exists in DB and was modified using Troggle: do nothing, return (existing instance, False)
-if instance exists in DB and was not modified using Troggle: overwrite instance, return (instance, False)
-
+
The checking is accomplished using Django's get_or_create and the new_since_parsing boolean field
defined in core.models.TroggleModel.
-
+
"""
instance, created=objectType.objects.get_or_create(defaults=nonLookupAttribs, **lookupAttribs)
@@ -49,17 +49,17 @@ def save_carefully(objectType, lookupAttribs={}, nonLookupAttribs={}):
for k, v in list(nonLookupAttribs.items()): #overwrite the existing attributes from the logbook text (except date and title)
setattr(instance, k, v)
instance.save()
-
+
if created:
logging.info(str(instance) + ' was just added to the database for the first time. \n')
-
+
if not created and instance.new_since_parsing:
logging.info(str(instance) + " has been modified using Troggle, so the current script left it as is. \n")
if not created and not instance.new_since_parsing:
logging.info(str(instance) + " existed in the database unchanged since last parse. It was overwritten by the current script. \n")
return (instance, created)
-
+
re_body = re.compile(r"\<body[^>]*\>(.*)\</body\>", re.DOTALL)
re_title = re.compile(r"\<title[^>]*\>(.*)\</title\>", re.DOTALL)
@@ -80,7 +80,7 @@ def get_single_match(regex, text):
def href_to_wikilinks(matchobj):
"""
Given an html link, checks for possible valid wikilinks.
-
+
Returns the first valid wikilink. Valid means the target
object actually exists.
"""
@@ -91,7 +91,7 @@ def href_to_wikilinks(matchobj):
return matchobj.group()
#except:
#print 'fail'
-
+
re_subs = [(re.compile(r"\<b[^>]*\>(.*?)\</b\>", re.DOTALL), r"'''\1'''"),
(re.compile(r"\<i\>(.*?)\</i\>", re.DOTALL), r"''\1''"),
@@ -107,7 +107,7 @@ re_subs = [(re.compile(r"\<b[^>]*\>(.*?)\</b\>", re.DOTALL), r"'''\1'''"),
(re.compile(r"\<a\s+href=['\"]#([^'\"]*)['\"]\s*\>(.*?)\</a\>", re.DOTALL), r"[[cavedescription:\1|\2]]"), #assumes that all links with target ids are cave descriptions. Not great.
(re.compile(r"\[\<a\s+href=['\"][^'\"]*['\"]\s+id=['\"][^'\"]*['\"]\s*\>([^\s]*).*?\</a\>\]", re.DOTALL), r"[[qm:\1]]"),
(re.compile(r'<a\shref="?(?P<target>.*)"?>(?P<text>.*)</a>'),href_to_wikilinks),
-
+
]
def html_to_wiki(text, codec = "utf-8"):