summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/forms.py32
-rw-r--r--core/models.py9
-rw-r--r--core/views_caves.py10
-rw-r--r--core/views_logbooks.py8
-rw-r--r--core/views_other.py77
-rw-r--r--flatpages/__init__.py0
-rw-r--r--flatpages/models.py3
-rw-r--r--flatpages/tests.py23
-rw-r--r--flatpages/views.py62
-rw-r--r--parsers/cavetab.py24
-rw-r--r--templates/csrffaker.py9
-rw-r--r--templates/dataformat/flatfile.html10
-rw-r--r--templates/editfile.html96
-rw-r--r--templates/editflatpage.html12
-rw-r--r--templates/flatpage.html9
-rw-r--r--templates/options.html3
-rw-r--r--urls.py9
17 files changed, 376 insertions, 20 deletions
diff --git a/core/forms.py b/core/forms.py
index 01a9cbe..2a54428 100644
--- a/core/forms.py
+++ b/core/forms.py
@@ -1,5 +1,5 @@
from django.forms import ModelForm
-from models import Cave, Person, PersonExpedition, LogbookEntry, QM
+from models import Cave, Person, PersonExpedition, LogbookEntry, QM, Expedition
import django.forms as forms
from django.forms.formsets import formset_factory
from django.contrib.admin.widgets import AdminDateWidget
@@ -86,3 +86,33 @@ def get_name(pe):
return pe.nickname
else:
return pe.person.first_name
+
+class UploadFileForm(forms.Form):
+ title = forms.CharField(max_length=50)
+ file = forms.FileField()
+ html = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
+ lon_utm = forms.FloatField(required=False)
+ lat_utm = forms.FloatField(required=False)
+ slug = forms.CharField(max_length=50)
+ date = forms.DateField(required=False)
+
+ caves = [cave.slug for cave in Cave.objects.all()]
+ caves.sort()
+ 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)
+
+ expeditions = [e.year for e in Expedition.objects.all()]
+ expeditions.sort()
+ expeditions = ["-----"] + expeditions
+ expedition = forms.ChoiceField([(e, e) for e in expeditions], required=False)
+
+ logbookentry = 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/models.py b/core/models.py
index 87f8ea9..f8e7400 100644
--- a/core/models.py
+++ b/core/models.py
@@ -174,7 +174,7 @@ class Person(TroggleModel):
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)
COMMITTEE_CHOICES = (
@@ -348,6 +348,7 @@ class CaveAndEntrance(TroggleModel):
class Cave(TroggleModel):
# too much here perhaps
+ slug = models.SlugField(max_length=50, unique = True)
official_name = models.CharField(max_length=160)
area = models.ManyToManyField(Area, blank=True, null=True)
kataster_code = models.CharField(max_length=20,blank=True,null=True)
@@ -367,7 +368,7 @@ class Cave(TroggleModel):
extent = models.CharField(max_length=100,blank=True,null=True)
survex_file = models.CharField(max_length=100,blank=True,null=True)
description_file = models.CharField(max_length=200,blank=True,null=True)
-
+
#class Meta:
# unique_together = (("area", "kataster_number"), ("area", "unofficial_number"))
# FIXME Kataster Areas and CUCC defined sub areas need seperating
@@ -472,6 +473,7 @@ class SurveyStation(TroggleModel):
return unicode(self.name)
class Entrance(TroggleModel):
+ slug = models.SlugField(max_length=50, unique = True)
name = models.CharField(max_length=100, blank=True,null=True)
entrance_description = models.TextField(blank=True,null=True)
explorers = models.TextField(blank=True,null=True)
@@ -573,6 +575,9 @@ class QM(TroggleModel):
#"Number","Grade","Area","Description","Page reference","Nearest station","Completion description","Comment"
found_by = models.ForeignKey(LogbookEntry, related_name='QMs_found',blank=True, null=True )
ticked_off_by = models.ForeignKey(LogbookEntry, related_name='QMs_ticked_off',null=True,blank=True)
+ #cave = models.ForeignKey(Cave)
+ #expedition = models.ForeignKey(Expedition)
+
number = models.IntegerField(help_text="this is the sequential number in the year", )
GRADE_CHOICES=(
('A', 'A: Large obvious lead'),
diff --git a/core/views_caves.py b/core/views_caves.py
index 82d4b94..e24e6c2 100644
--- a/core/views_caves.py
+++ b/core/views_caves.py
@@ -78,4 +78,12 @@ def survey(request,year,wallet_number):
def cave_description(request, cavedescription_name):
cave_description = get_object_or_404(CaveDescription, short_name = cavedescription_name)
- return render_with_context(request,'cave_description.html', locals()) \ No newline at end of file
+ return render_with_context(request,'cave_description.html', locals())
+
+def get_entrances(request, caveslug):
+ cave = Cave.objects.get(slug = caveslug)
+ return render_with_context(request,'options.html', {"items": [(e.entrance.slug, e.entrance.slug) for e in cave.entrances()]})
+
+def get_qms(request, caveslug):
+ cave = Cave.objects.get(slug = caveslug)
+ return render_with_context(request,'options.html', {"items": [(e.entrance.slug, e.entrance.slug) for e in cave.entrances()]})
diff --git a/core/views_logbooks.py b/core/views_logbooks.py
index f9190c0..4495f03 100644
--- a/core/views_logbooks.py
+++ b/core/views_logbooks.py
@@ -241,4 +241,12 @@ def delLogbookEntry(lbe):
pt.delete()
lbe.delete()
os.remove(lbe.filename)
+
+def get_people(request, expeditionslug):
+ exp = Expedition.objects.get(year = expeditionslug)
+ return render_with_context(request,'options.html', {"items": [(pe.slug, pe.name) for pe in exp.personexpedition_set.all()]})
+
+def get_logbook_entries(request, expeditionslug):
+ exp = Expedition.objects.get(year = expeditionslug)
+ return render_with_context(request,'options.html', {"items": [(le.slug, "%s - %s" % (le.date, le.title)) for le in exp.logbookentry_set.all()]})
diff --git a/core/views_other.py b/core/views_other.py
index 3acb87d..d840a30 100644
--- a/core/views_other.py
+++ b/core/views_other.py
@@ -1,4 +1,5 @@
from troggle.core.models import Cave, Expedition, Person, LogbookEntry, PersonExpedition, PersonTrip, DPhoto, QM
+from troggle.core.forms import UploadFileForm
from django.conf import settings
from django import forms
from django.template import loader, Context
@@ -9,6 +10,7 @@ from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
from utils import render_with_context
from core.models import *
+from troggle.helper import login_required_if_public
def showrequest(request):
return HttpResponse(request.GET)
@@ -204,4 +206,77 @@ def logbook_entry_suggestions(request):
{
'unwiki_QMs':unwiki_QMs,
'any_suggestions':any_suggestions
- }) \ No newline at end of file
+ })
+
+@login_required_if_public
+def newFile(request, pslug = None):
+# if pslug:
+# previousfile = LogbookEntry.objects.get(slug = pslug, date = previousdate, expedition = expedition)
+# assert previousfile.filename
+ if request.method == 'POST': # If the form has been submitted...
+ tripForm = TripForm(request.POST) # A form bound to the POST data
+# 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,
+# "autologbook")
+# filename = os.path.join(directory,
+# dateStr + "." + slugify(tripForm.cleaned_data["title"])[:50] + ".html")
+# if not os.path.isdir(directory):
+# os.mkdir(directory)
+# if pslug and pdate:
+# delLogbookEntry(previouslbe)
+# f = open(filename, "w")
+# template = loader.get_template('dataformat/logbookentry.html')
+# context = Context({'trip': tripForm.cleaned_data,
+# 'persons': personTripFormSet.cleaned_data,
+# 'date': dateStr,
+# 'expeditionyear': expeditionyear})
+# f.write(template.render(context))
+# f.close()
+# print logbookparsers.parseAutoLogBookEntry(filename)
+# return HttpResponseRedirect(reverse('expedition', args=[expedition.year])) # Redirect after POST
+ else:
+ if pslug:
+ pass
+# if previouslbe.cave:
+# tripForm = TripForm(initial={"date": previousdate,
+# "title": previouslbe.title,
+# "cave": previouslbe.cave.reference(),
+# "location": None,
+# "caveOrLocation": "cave",
+# "html": previouslbe.text})
+# else:
+# tripForm = TripForm(initial={"date": previousdate,
+# "title": previouslbe.title,
+# "cave": None,
+# "location": previouslbe.place,
+# "caveOrLocation": "location",
+# "html": previouslbe.text})
+# 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:
+ fileform = UploadFileForm() # An unbound form
+
+ return render_with_context(request, 'editfile.html', {
+ 'fileForm': fileform,
+
+ })
+
+@login_required_if_public
+def deleteFile(request, expeditionyear, date = None, slug = None):
+ expedition = Expedition.objects.get(year=expeditionyear)
+ previousdate = datetime.date(*[int(x) for x in date.split("-")])
+ previouslbe = LogbookEntry.objects.get(slug = slug, date = previousdate, expedition = expedition)
+ delLogbookEntry(previouslbe)
+ return HttpResponseRedirect(reverse('expedition', args=[expedition.year])) # Redirect after POST
+
+def delFile(f):
+ for pt in lbe.persontrip_set.all():
+ pt.delete()
+ lbe.delete()
+ os.remove(lbe.filename)
diff --git a/flatpages/__init__.py b/flatpages/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/flatpages/__init__.py
diff --git a/flatpages/models.py b/flatpages/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/flatpages/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/flatpages/tests.py b/flatpages/tests.py
new file mode 100644
index 0000000..2247054
--- /dev/null
+++ b/flatpages/tests.py
@@ -0,0 +1,23 @@
+"""
+This file demonstrates two different styles of tests (one doctest and one
+unittest). These will both pass when you run "manage.py test".
+
+Replace these with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+class SimpleTest(TestCase):
+ def test_basic_addition(self):
+ """
+ Tests that 1 + 1 always equals 2.
+ """
+ self.failUnlessEqual(1 + 1, 2)
+
+__test__ = {"doctest": """
+Another way to test that 1 + 1 is equal to 2.
+
+>>> 1 + 1 == 2
+True
+"""}
+
diff --git a/flatpages/views.py b/flatpages/views.py
new file mode 100644
index 0000000..9c7483e
--- /dev/null
+++ b/flatpages/views.py
@@ -0,0 +1,62 @@
+import troggle.settings as settings
+from troggle.helper import login_required_if_public
+from utils import render_with_context
+
+from django.http import HttpResponse, HttpResponseRedirect, Http404
+from django.core.urlresolvers import reverse
+from django.template import Context, loader
+import django.forms as forms
+from tinymce.widgets import TinyMCE
+
+import os
+import re
+
+def flatpage(request, path):
+ print path
+ if path.startswith("noinfo") and settings.PUBLIC_SITE and not request.user.is_authenticated():
+ return HttpResponseRedirect(reverse("auth_login") + '?next=%s' % request.path)
+ try:
+ o = open(os.path.normpath(settings.EXPOWEB + path), "rb")
+ except IOError:
+ raise Http404
+ if path.endswith(".htm") or path.endswith(".html"):
+ html = o.read()
+ m = re.search(r"<head>(.*)</head>.*<body>(.*)</body>", html, re.DOTALL)
+ if m:
+ head, body = m.groups()
+ else:
+ return HttpResponse(html + "Page could not be split into header and body")
+ if re.search(r"iso-8859-1", html):
+ body = unicode(body, "iso-8859-1")
+ return render_with_context(request, 'flatpage.html', {'editable': True, 'path': path, 'head': head, 'body': body})
+ else:
+ return HttpResponse(o.read())
+
+@login_required_if_public
+def editflatpage(request, path):
+ try:
+ filepath = os.path.normpath(settings.EXPOWEB + path)
+ o = open(filepath, "r")
+ except IOError:
+ raise Http404
+ html = o.read()
+ m = re.search(r"<head>(.*)</head>.*<body>(.*)</body>", html, re.DOTALL)
+ if m:
+ head, body = m.groups()
+ else:
+ return HttpResponse("Page could not be split into header and body")
+ if request.method == 'POST': # If the form has been submitted...
+ flatpageForm = FlatPageForm(request.POST) # A form bound to the POST data
+ if flatpageForm.is_valid():# Form valid therefore write file
+ f = open(filepath, "w")
+ template = loader.get_template('dataformat/flatfile.html')
+ context = Context({'form': flatpageForm.cleaned_data, 'head': head})
+ f.write(template.render(context))
+ f.close()
+ return HttpResponseRedirect(reverse('flatpage', args=[path])) # Redirect after POST
+ else:
+ flatpageForm = FlatPageForm({"html": body})
+ return render_with_context(request, 'editflatpage.html', {'path': path, 'form': flatpageForm, })
+
+class FlatPageForm(forms.Form):
+ html = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
diff --git a/parsers/cavetab.py b/parsers/cavetab.py
index 0fbde43..bf61d7f 100644
--- a/parsers/cavetab.py
+++ b/parsers/cavetab.py
@@ -103,7 +103,16 @@ def LoadCaveTab():
addToDefaultArgs(Extent, "extent")
addToDefaultArgs(SurvexFile, "survex_file")
addToDefaultArgs(Notes, "notes")
-
+ if line[Area] == "1626":
+ if line[KatasterNumber] != "":
+ args["slug"] = line[Area] + "-" + line[KatasterNumber]
+ else:
+ args["slug"] = line[Area] + "-" + line[UnofficialNumber]
+ else:
+ if line[KatasterNumber] != "":
+ args["slug"] = "1623" + "-" + line[KatasterNumber]
+ else:
+ args["slug"] = "1623" + "-" + line[UnofficialNumber]
#The following adds the legacy_file_path. This is always in either Autogen file or Link file
for header in (AutogenFile,LinkFile):
if line[header]:
@@ -148,6 +157,12 @@ def LoadCaveTab():
line[MultipleEntrances] == 'entrance' or \
line[MultipleEntrances] == 'last entrance':
args = {}
+
+ if line[Entrances]:
+ entrance_letter = line[Entrances]
+ else:
+ entrance_letter = ''
+
def addToArgs(CSVname, modelName):
if line[CSVname]:
args[modelName] = html_to_wiki(line[CSVname])
@@ -201,15 +216,12 @@ def LoadCaveTab():
addToArgsSurveyStation(GPSpostSA, 'other_station')
args['other_description'] = 'post selective availability GPS'
addToArgs(Bearings, 'bearings')
+ args['slug'] = newCave.slug + entrance_letter
newEntrance = models.Entrance(**args)
newEntrance.save()
logging.info("Added entrance "+str(newEntrance)+"\n")
-
- if line[Entrances]:
- entrance_letter = line[Entrances]
- else:
- entrance_letter = ''
+
newCaveAndEntrance = models.CaveAndEntrance(cave = newCave, entrance = newEntrance, entrance_letter = entrance_letter)
newCaveAndEntrance.save()
diff --git a/templates/csrffaker.py b/templates/csrffaker.py
deleted file mode 100644
index 86b1318..0000000
--- a/templates/csrffaker.py
+++ /dev/null
@@ -1,9 +0,0 @@
-import django
-if django.VERSION[0] >=1 and django.VERSION[1] > 1:
- pass
-else:
- from django import template
-
- register = template.Library()
- @register.tag
- def csrf_token(parser, token): return ""
diff --git a/templates/dataformat/flatfile.html b/templates/dataformat/flatfile.html
new file mode 100644
index 0000000..1ddb7a5
--- /dev/null
+++ b/templates/dataformat/flatfile.html
@@ -0,0 +1,10 @@
+{% autoescape off %}
+<html>
+<head>
+{{ head }}
+</head>
+<body>
+{{ form.html }}
+</body>
+</html>
+{% endautoescape %}
diff --git a/templates/editfile.html b/templates/editfile.html
new file mode 100644
index 0000000..d3a29ec
--- /dev/null
+++ b/templates/editfile.html
@@ -0,0 +1,96 @@
+{% extends "base.html" %}
+{% load csrffaker %}
+{% block title %}File{% endblock %}
+{% block head %}
+<script>
+ $(function() {
+ $("#id_date").datepicker({dateFormat: "yy-mm-dd"});
+ $("#id_cave").change(function() {
+ $('#id_entrance').load('{% url get_entrances caveslug="" %}' + this.value);
+ });
+ $("#id_cave").change(function() {
+ $('#id_qm').load('{% url get_qms caveslug="" %}' + this.value);
+ });
+ $("#id_expedition").change(function() {
+ $('#id_logbookentry').load('{% url get_logbook_entries expeditionslug="" %}' + this.value);
+ });
+ $("#id_expedition").change(function() {
+ $('#id_person').load('{% url get_people expeditionslug="" %}' + this.value);
+ });
+ });
+
+</script>
+<link rel="stylesheet" href="{{ settings.MEDIA_URL }}css/ui-lightness/jquery-ui-1.8.12.custom.css" type="text/css" media="all" />
+<script src="{{ settings.MEDIA_URL }}js/jquery-ui-1.8.12.custom.min.js" type="text/javascript"></script>
+<script src="{{ settings.MEDIA_URL }}js/jquery.formset.min.js" type="text/javascript"></script>
+<script src="{{ settings.TINY_MCE_MEDIA_URL }}tiny_mce.js" type="text/javascript"></script>
+{{ fileForm.media }}
+{% endblock %}
+{% block content %}
+
+<form action="" method="post">{% csrf_token %}
+ {{ fileForm.non_field_errors }}
+ <div class="fieldWrapper">
+ {{ fileForm.title.errors }}
+ <label for="id_title">Title:</label>
+ {{ fileForm.title }}
+ </div>
+ <div class="fieldWrapper">
+ {{ fileForm.slug.errors }}
+ <label for="id_slug">Slug:</label>
+ {{ fileForm.slug }}
+ </div>
+ <div class="fieldWrapper">
+ {{ fileForm.date.errors }}
+ <label for="id_date">Date:</label>
+ {{ fileForm.date }}
+ </div>
+ <div class="fieldWrapper" id="lon_utm">
+ {{ fileForm.lon_utm.errors }}
+ <label for="id_lon_utm">Longitude:</label>
+ {{ fileForm.lon_utm }}
+ </div>
+ <div class="fieldWrapper" id="lat_utm">
+ {{ fileForm.lat_utm.errors }}
+ <label for="id_lat_utm">Latitude:</label>
+ {{ fileForm.lat_utm }}
+ </div>
+ <div class="fieldWrapper" id="cave">
+ {{ fileForm.cave.errors }}
+ <label for="id_cave">Cave:</label>
+ {{ fileForm.cave }}
+ </div>
+ <div class="fieldWrapper" id="entrance">
+ {{ fileForm.entrance.errors }}
+ <label for="id_entrance">Entrance:</label>
+ {{ fileForm.entrance }}
+ </div>
+ <div class="fieldWrapper" id="qm">
+ {{ fileForm.qm.errors }}
+ <label for="id_cavem">QM:</label>
+ {{ fileForm.qm }}
+ </div>
+ <div class="fieldWrapper" id="expedition">
+ {{ fileForm.expedition.errors }}
+ <label for="id_expediton">Expedition:</label>
+ {{ fileForm.expedition }}
+ </div>
+ <div class="fieldWrapper" id="logbookentry">
+ {{ fileForm.logbookentry.errors }}
+ <label for="id_logbookentry">Logbook Entry:</label>
+ {{ fileForm.logbookentry }}
+ </div>
+ <div class="fieldWrapper" id="person">
+ {{ fileForm.person.errors }}
+ <label for="id_expediton">Person:</label>
+ {{ fileForm.person }}
+ </div>
+ <div class="fieldWrapper">
+ {{ fileForm.html.errors }}
+ <label for="id_date">Content:</label>
+ {{ fileForm.html }}
+ </div>
+ <p><input type="submit" value="Sumbit Trip Report" /></p>
+</form>
+
+{% endblock %}
diff --git a/templates/editflatpage.html b/templates/editflatpage.html
new file mode 100644
index 0000000..85a5bcc
--- /dev/null
+++ b/templates/editflatpage.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% block title %}Edit {{ path }}{% endblock %}
+{% block head %}
+{% load csrffaker %}
+<script src="{{ settings.TINY_MCE_MEDIA_URL }}tiny_mce.js" type="text/javascript"></script>
+{% endblock %}
+{% block content %}
+<form action="" method="post">{% csrf_token %}
+{{form}}
+<p><input type="submit" value="Submit" /></p>
+</form>
+{% endblock %}
diff --git a/templates/flatpage.html b/templates/flatpage.html
new file mode 100644
index 0000000..ef8c4ab
--- /dev/null
+++ b/templates/flatpage.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+{{ head|safe }}
+</head>
+<body>
+{{ body|safe }}
+{% if editable %}<a href="{% url editflatpage path %}">Edit</a>{% endif %}
+</body>
+</html>
diff --git a/templates/options.html b/templates/options.html
new file mode 100644
index 0000000..b1d3d97
--- /dev/null
+++ b/templates/options.html
@@ -0,0 +1,3 @@
+{% for value, text in items %}
+<option value="{{value}}">{{text}}</option>
+{% endfor %}
diff --git a/urls.py b/urls.py
index c083c5b..3dc4bc2 100644
--- a/urls.py
+++ b/urls.py
@@ -36,6 +36,12 @@ actualurlpatterns = patterns('',
url(r'^newlogbookentry/(?P<expeditionyear>.*)$', views_logbooks.newLogbookEntry, name="newLogBookEntry"),
url(r'^editlogbookentry/(?P<expeditionyear>[^/]*)/(?P<pdate>[^/]*)/(?P<pslug>[^/]*)/$', views_logbooks.newLogbookEntry, name="editLogBookEntry"),
url(r'^deletelogbookentry/(?P<expeditionyear>[^/]*)/(?P<date>[^/]*)/(?P<slug>[^/]*)/$', views_logbooks.deleteLogbookEntry, name="deleteLogBookEntry"),
+ url(r'^newfile', views_other.newFile, name="newFile"),
+
+ url(r'^getEntrances/(?P<caveslug>.*)', views_caves.get_entrances, name = "get_entrances"),
+ url(r'^getQMs/(?P<caveslug>.*)', views_caves.get_qms, name = "get_qms"),
+ url(r'^getPeople/(?P<expeditionslug>.*)', views_logbooks.get_people, name = "get_people"),
+ url(r'^getLogBookEntries/(?P<expeditionslug>.*)', views_logbooks.get_logbook_entries, name = "get_logbook_entries"),
url(r'^cave/(?P<cave_id>[^/]+)/?$', views_caves.cave, name="cave"),
url(r'^cavedescription/(?P<cavedescription_name>[^/]+)/?$', views_caves.cave_description, name="cavedescription"),
@@ -127,6 +133,9 @@ actualurlpatterns = patterns('',
url(r'^experimental.*$', views_logbooks.experimental, name="experimental"),
#url(r'^trip_report/?$',views_other.tripreport,name="trip_report")
+
+ url(r'^(.*)_edit$', 'flatpages.views.editflatpage', name="editflatpage"),
+ url(r'^(.*)$', 'flatpages.views.flatpage', name="flatpage"),
)
#Allow prefix to all urls