[svn r8305] Added QM wiki markup. The format is [[cave:204 QM:2005-04A]] with the grade (A) being optional. The links color red if the QM does not exist, and in that case clicking on them goes to an admin add page with fields prepopulated.

Various other little things, e.g. filled in the footer with links.
This commit is contained in:
aaron 2009-03-16 09:53:24 +01:00
parent e57ac77f24
commit bcd223bc71
14 changed files with 118 additions and 61 deletions

View File

@ -1,5 +1,7 @@
from troggle.expo.models import * from troggle.expo.models import *
from django.contrib import admin from django.contrib import admin
from django.forms import ModelForm
import django.forms as forms
#from troggle.reversion.admin import VersionAdmin #django-reversion version control #from troggle.reversion.admin import VersionAdmin #django-reversion version control
class RoleInline(admin.TabularInline): class RoleInline(admin.TabularInline):
@ -16,9 +18,14 @@ class ScannedImageInline(admin.TabularInline):
class SurveyAdmin(admin.ModelAdmin): class SurveyAdmin(admin.ModelAdmin):
inlines = (ScannedImageInline,) inlines = (ScannedImageInline,)
class QMInline(admin.TabularInline):
model=QM
extra = 4
#class LogbookEntryAdmin(VersionAdmin): #class LogbookEntryAdmin(VersionAdmin):
class LogbookEntryAdmin(admin.ModelAdmin): class LogbookEntryAdmin(admin.ModelAdmin):
search_fields = ('title','expedition__year') search_fields = ('title','expedition__year')
#inlines = (QMInline,) #doesn't work because QM has two foreignkeys to Logbookentry- need workaround
class PersonExpeditionInline(admin.TabularInline): class PersonExpeditionInline(admin.TabularInline):
model = PersonExpedition model = PersonExpedition
@ -29,15 +36,17 @@ class PersonAdmin(admin.ModelAdmin):
inlines = (PersonExpeditionInline,) inlines = (PersonExpeditionInline,)
class QMAdmin(admin.ModelAdmin): class QMAdmin(admin.ModelAdmin):
search_fields = ('found_by__cave__kataster_number','number')
def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
obj.new_since_parsing=True obj.new_since_parsing=True
obj.save() obj.save()
class PersonExpeditionAdmin(admin.ModelAdmin): class PersonExpeditionAdmin(admin.ModelAdmin):
search_fields = ('person__first_name','expedition__year') search_fields = ('person__first_name','expedition__year')
class CaveAdmin(admin.ModelAdmin): class CaveAdmin(admin.ModelAdmin):
search_fields = ('official_name','kataster_number','unofficial_number') search_fields = ('official_name','kataster_number','unofficial_number')
#inlines = (QMInline,)
extra = 4 extra = 4
@ -57,7 +66,7 @@ admin.site.register(PersonExpedition,PersonExpeditionAdmin)
admin.site.register(Role) admin.site.register(Role)
admin.site.register(LogbookEntry, LogbookEntryAdmin) admin.site.register(LogbookEntry, LogbookEntryAdmin)
admin.site.register(PersonTrip) admin.site.register(PersonTrip)
admin.site.register(QM) admin.site.register(QM, QMAdmin)
admin.site.register(Survey, SurveyAdmin) admin.site.register(Survey, SurveyAdmin)
admin.site.register(ScannedImage) admin.site.register(ScannedImage)

View File

@ -7,4 +7,4 @@ class CaveForm(ModelForm):
class PersonForm(ModelForm): class PersonForm(ModelForm):
class Meta: class Meta:
model = Person model = Person

View File

@ -19,7 +19,7 @@ class TroggleModel(models.Model):
new_since_parsing = models.BooleanField(default=False, editable=False) new_since_parsing = models.BooleanField(default=False, editable=False)
def get_admin_url(self): def get_admin_url(self):
return settings.URL_ROOT + "/admin/expo/" + self._meta.object_name + "/" + str(self.pk) return settings.URL_ROOT + "/admin/expo/" + self._meta.object_name.lower() + "/" + str(self.pk)
class Meta: class Meta:
abstract = True abstract = True
@ -214,8 +214,8 @@ class LogbookEntry(TroggleModel):
#href = models.CharField(max_length=100) #href = models.CharField(max_length=100)
logbookentry_next = models.ForeignKey('LogbookEntry', related_name='pnext', blank=True,null=True) #logbookentry_next = models.ForeignKey('LogbookEntry', related_name='pnext', blank=True,null=True)
logbookentry_prev = models.ForeignKey('LogbookEntry', related_name='pprev', blank=True,null=True) #logbookentry_prev = models.ForeignKey('LogbookEntry', related_name='pprev', blank=True,null=True)
class Meta: class Meta:
verbose_name_plural = "Logbook Entries" verbose_name_plural = "Logbook Entries"

View File

@ -2,7 +2,8 @@ from django import template
from django.utils.html import conditional_escape from django.utils.html import conditional_escape
from django.template.defaultfilters import stringfilter from django.template.defaultfilters import stringfilter
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
import troggle.settings as settings from django.conf import settings
from expo.models import QM
import re import re
register = template.Library() register = template.Library()
@ -55,7 +56,35 @@ def wiki_to_html_short(value, autoescape=None):
value = re.sub("&#39;&#39;&#39;([^']+)&#39;&#39;&#39;", r"<b>\1</b>", value, re.DOTALL) value = re.sub("&#39;&#39;&#39;([^']+)&#39;&#39;&#39;", r"<b>\1</b>", value, re.DOTALL)
value = re.sub("&#39;&#39;([^']+)&#39;&#39;", r"<i>\1</i>", value, re.DOTALL) value = re.sub("&#39;&#39;([^']+)&#39;&#39;", r"<i>\1</i>", value, re.DOTALL)
#make cave links #make cave links
value = re.sub("\[\[\s*cave:([^\s]+)\s*\s*\]\]", r'<a href="%s/troggle/cave/\1/">\1</a>' % settings.URL_ROOT, value, re.DOTALL) value = re.sub("\[\[\s*cave:([^\s]+)\s*\s*\]\]", r'<a href="%s/cave/\1/">\1</a>' % settings.URL_ROOT, value, re.DOTALL)
#function for replacing wikicode qm links with html qm links
def qmrepl(matchobj):
if len(matchobj.groups())==4:
grade=matchobj.groups()[3]
else:
grade=''
qmdict={'urlroot':settings.URL_ROOT,'cave':matchobj.groups()[0],'year':matchobj.groups()[1],'number':matchobj.groups()[2],'grade':grade}
try:
qm=QM.objects.get(found_by__cave__kataster_number=qmdict['cave'],found_by__date__year=qmdict['year'], number=qmdict['number'])
url=r'<a href=' + str(qm.get_absolute_url()) +'>' + str(qm) + '</a>'
except QM.DoesNotExist:
url = r'<a class="redtext" href="%(urlroot)s/cave/%(cave)s/%(year)s-%(number)s%(grade)s">%(cave)s:%(year)s-%(number)s%(grade)s</a>' % qmdict
return url
#make qm links
value = re.sub("\[\[\s*cave:([^\s]+)\s*\s*\QM:(\d*)-(\d*)([ABCDX]?)\]\]",qmrepl, value, re.DOTALL)
#qms=qmfinder.search(value)
#for qm in qms:
#if QM.objects.filter(cave__kataster_number=qm[0], found_by__year=qm[1], number=qm[2]).count >= 1: # If there is at lesat one QM matching this query
#replace qm with link in red
#else
#replace qm with link in blue
#turn qm links red if nonexistant
#Make lists from lines starting with lists of [stars and hashes] #Make lists from lines starting with lists of [stars and hashes]
outValue = "" outValue = ""
listdepth = [] listdepth = []

View File

@ -1,9 +1,12 @@
from troggle.expo.models import Cave, CaveAndEntrance, Survey, Expedition from troggle.expo.models import Cave, CaveAndEntrance, Survey, Expedition, QM
import troggle.expo.models as models import troggle.expo.models as models
import troggle.settings as settings import troggle.settings as settings
from troggle.expo.forms import CaveForm from django.forms.models import formset_factory
import search import search
from django.core.urlresolvers import reverse
from troggle.alwaysUseRequestContext import render_response # see views_logbooks for explanation on this. from troggle.alwaysUseRequestContext import render_response # see views_logbooks for explanation on this.
from django.http import HttpResponseRedirect
from django.conf import settings
def getCave(cave_id): def getCave(cave_id):
"""Returns a cave object when given a cave name or number. It is used by views including cavehref, ent, and qm.""" """Returns a cave object when given a cave name or number. It is used by views including cavehref, ent, and qm."""
@ -21,11 +24,19 @@ def caveindex(request):
def cavehref(request, cave_id='', offical_name=''): def cavehref(request, cave_id='', offical_name=''):
return render_response(request,'cave.html', {'cave': getCave(cave_id),}) return render_response(request,'cave.html', {'cave': getCave(cave_id),})
def qm(request,cave_id,qm_id,year): def qm(request,cave_id,qm_id,year,grade=None):
year=int(year) year=int(year)
qm=getCave(cave_id).get_QMs().get(number=qm_id,found_by__date__year=year) try:
return render_response(request,'qm.html',{'qm':qm,}) qm=getCave(cave_id).get_QMs().get(number=qm_id,found_by__date__year=year)
return render_response(request,'qm.html',locals())
except QM.DoesNotExist:
url= settings.URL_ROOT + r'/admin/expo/qm/add/?'+ r'number=' + qm_id
if grade:
url += r'&grade=' + grade
return HttpResponseRedirect(url)
def ent(request, cave_id, ent_letter): def ent(request, cave_id, ent_letter):
cave = Cave.objects.filter(kataster_number = cave_id)[0] cave = Cave.objects.filter(kataster_number = cave_id)[0]

View File

@ -71,7 +71,18 @@ def personexpedition(request, first_name='', last_name='', year=''):
def logbookentry(request, logbookentry_pk): def logbookentry(request, logbookentry_pk):
logbookentry = LogbookEntry.objects.get(pk = logbookentry_pk) logbookentry = LogbookEntry.objects.get(pk = logbookentry_pk)
return render_response(request, 'logbookentry.html', {'logbookentry': logbookentry, }) logsforcave=logbookentry.cave.logbookentry_set.all()
biggestQMnumber=0
for log in logsforcave:
try:
biggestQMnumberInLog = logbookentry.QMs_found.order_by('-number')[0].number
except IndexError:
biggestQMnumberInLog = 0
if biggestQMnumberInLog > biggestQMnumber:
biggestQMnumber = biggestQMnumberInLog
nextQMnumber=biggestQMnumber+1
newQMlink=settings.URL_ROOT + r'/admin/expo/qm/add/?' + r'found_by=' + str(logbookentry.pk) +'&number=' + str(nextQMnumber)
return render_response(request, 'logbookentry.html', {'logbookentry': logbookentry, 'newQMlink':newQMlink})
def logbookSearch(request, extra): def logbookSearch(request, extra):
query_string = '' query_string = ''

View File

@ -6,10 +6,14 @@ from troggle.parsers.people import LoadPersonsExpos
import re import re
from troggle.parsers.survex import LoadAllSurvexBlocks from troggle.parsers.survex import LoadAllSurvexBlocks
import randSent import randSent
from django.http import HttpResponse
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from troggle.alwaysUseRequestContext import render_response # see views_logbooks for explanation on this. from troggle.alwaysUseRequestContext import render_response # see views_logbooks for explanation on this.
def showrequest(request):
return HttpResponse(request.GET)
def stats(request): def stats(request):
statsDict={} statsDict={}
statsDict['expoCount'] = int(Expedition.objects.count()) statsDict['expoCount'] = int(Expedition.objects.count())

View File

@ -55,7 +55,7 @@ div#content
div#footer div#footer
{ {
clear:both; clear:both;
background-color:black; background-color:#999;
color:white; color:white;
text-align:center; text-align:center;
margin-left:auto; margin-left:auto;
@ -294,6 +294,17 @@ td {
} }
.redtext{
color:#F00;
}
a.redtext:link {
color:#F00;
}
.redtext
.menuBarItem { .menuBarItem {
font-variant: small-caps; font-variant: small-caps;
text-align: right; text-align: right;

View File

@ -33,9 +33,9 @@ def parseCaveQMs(cave,pathToCSV):
year=int(line[0][1:5]) year=int(line[0][1:5])
#check if placeholder exists for given year, create it if not #check if placeholder exists for given year, create it if not
if cave=='stein': if cave=='stein':
placeholder, hadToCreate = LogbookEntry.objects.get_or_create(date__year=year, text="placeholder for QMs in 204", defaults={"date": date(year, 1, 1),"cave":steinBr}) 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': elif cave=='hauch':
placeholder, hadToCreate = LogbookEntry.objects.get_or_create(date__year=year, text="placeholder for QMs in 234", 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: if hadToCreate:
print cave+" placeholder logbook entry for " + str(year) + " added to database" print cave+" placeholder logbook entry for " + str(year) + " added to database"
QMnum=re.match(r".*?-\d*?-X?(?P<numb>\d*)",line[0]).group("numb") QMnum=re.match(r".*?-\d*?-X?(?P<numb>\d*)",line[0]).group("numb")

View File

@ -3,16 +3,12 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="{{ settings.MEDIA_URL }}css/main3.css" /> <link rel="stylesheet" type="text/css" href="{{ settings.MEDIA_URL }}css/main3.css" />
<title>{% block title %}THE TITLE{% endblock %}</title> <title>{% block title %}THE TITLE{% endblock %}</title>
<script src="{{ settings.MEDIA_URL }}js/base.js" type="text/javascript"></script> <script src="{{ settings.MEDIA_URL }}js/base.js" type="text/javascript"></script>
{% block head %}{% endblock %} {% block head %}{% endblock %}
</head> </head>
<body> <body>
<div class="wrapper">
<div>
<div id="expoHeader"> <img id="frontPageBanner" src="{{ settings.MEDIA_URL }}loserBanner.jpg"/> <div id="expoHeader"> <img id="frontPageBanner" src="{{ settings.MEDIA_URL }}loserBanner.jpg"/>
<div id="expoHeaderText"> <div id="expoHeaderText">
<h1>CUCC Expeditions to Austria: 1976 - </h1> <h1>CUCC Expeditions to Austria: 1976 - </h1>
@ -22,46 +18,28 @@
</div> </div>
</div> </div>
<hr/> <hr/>
<div id="editLink"> <div id="editLink"> {% block loginInfo %}
{% block loginInfo %} {% if user.username %}
{% if user.username %} You are logged in as {{ user.username }}.
You are logged in as {{ user.username }}. | <a href="{{ settings.URL_ROOT }}/accounts/logout/">Log out</a> {% else %} <a href="{{ settings.URL_ROOT }}/accounts/register">Sign up</a> | <a href="{{ settings.URL_ROOT }}/accounts/login/">Log in</a> {% endif %}
| <a href="{{ settings.URL_ROOT }}/accounts/logout">Log out</a>
{% else %}
<a href="{{ settings.URL_ROOT }}/accounts/register">Sign up</a>
| <a href="{{ settings.URL_ROOT }}/accounts/login">Log in</a>
{% endif %}
{% endblock%} {% endblock%}
| <a href="{{ settings.URL_ROOT }}">Home </a> | | <a href="{{ settings.URL_ROOT }}">Home </a> |
{% block editLink %} {% block editLink %}
{% endblock %} {% endblock %} </div>
</div>
</div>
{% block nav %} {% block nav %}
<!-- Use id="nav" for the left side menu --> <!-- Use id="nav" for the left side menu -->
{% endblock %} {% endblock %}
<div id="content" > {% block contentheader %}
{% endblock %}
{% block content %}
<div id="content" >
{% block contentheader %}
{% endblock %}
{% block content %}
REPLACE : The content REPLACE : The content
{% endblock %} {% endblock %} <br class="clearfloat" />
<br class="clearfloat" /> <!--This is to ensure that the content div expands around floated objects*/--> <!--This is to ensure that the content div expands around floated objects*/-->
</div>
</div> </div>
<div class="push"></div>
<div id="footer">
{% block footer %}
THE FOOTER
{% endblock %}
</div> </div>
<div id="footer"> {% block footer %} <a href="http://cucc.survex.com"> CUCC website</a>| <a href="http://cucc.survex.com/expo"> Expedition website </a>| <a href="{% url frontpage %}"> Troggle front page </a>| <a href="{% url caveindex %}"> All caves </a>| <a href="{% url personindex %}"> All cavers </a>| <a href="{% url caveindex %}"> Virtual survey binder </a>| <a href="{% url survey %}"> Expedition statistics </a>| <a href="{% url calendar 2007 %}"> Expedition calendar </a> {% endblock %} </div>
</body> </body>
</html> </html>

View File

@ -56,6 +56,7 @@
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
<a href="{{newQMlink}}">Add QM found on this trip</a>
</div> </div>
<div id="col1"> <div id="col1">

View File

@ -18,6 +18,7 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<h3>Location</h3> <h3>Location</h3>
{{qm.location_description}} {{qm.location_description}}

View File

@ -9,5 +9,5 @@ registration_complete.html | {{ block.super }}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
Thank you for signing up, {{ user.username }}. An email with the activation code has been sent to your inbox. If you have been on the expedition in the past, you already have a profile in the system; <a href={% url profiles_select_profile %}>click here </a> to find it and link it to your account. Otherwise, please <a href={% url profiles_create_profile %}> create yourself a new profile</a>. If you have been on the expedition in the past, this step allows existing expedition data to be linked to your new account. Thank you for signing up, {{ user.username }}. An email with the activation code has been sent to your inbox. If you have been on the expedition in the past, you already have a profile in the system; <a href={% url profiles_select_profile %}>click here </a> to find it and link it to your account. Otherwise, please <a href={% url profiles_create_profile %}> create yourself a new profile</a>.
{% endblock %} {% endblock %}

View File

@ -4,7 +4,8 @@ import troggle.settings as settings
from expo.views import * # flat import from expo.views import * # flat import
from expo.views_caves import * from expo.views_caves import *
from expo.views_survex import * from expo.views_survex import *
from expo.models import *
from django.views.generic.create_update import create_object
from django.contrib import admin from django.contrib import admin
admin.autodiscover() admin.autodiscover()
@ -41,7 +42,7 @@ urlpatterns = patterns('',
url(r'^survex/(.*?)\.index$', views_survex.index, name="survexindex"), url(r'^survex/(.*?)\.index$', views_survex.index, name="survexindex"),
url(r'^cave/(?P<cave_id>[^/]+)/?$', views_caves.cavehref), url(r'^cave/(?P<cave_id>[^/]+)/?$', views_caves.cavehref),
url(r'^cave/(?P<cave_id>[^/]+)/(?P<year>\d\d\d\d)-(?P<qm_id>\d\d)?$', views_caves.qm), url(r'^cave/(?P<cave_id>[^/]+)/(?P<year>\d\d\d\d)-(?P<qm_id>\d\d)(?P<grade>[ABCDX]?)?$', views_caves.qm, name="qm"),
(r'^survex/(?P<survex_file>.*)\.svx$', svx), (r'^survex/(?P<survex_file>.*)\.svx$', svx),
(r'^survex/(?P<survex_file>.*)\.3d$', threed), (r'^survex/(?P<survex_file>.*)\.3d$', threed),
(r'^survex/(?P<survex_file>.*)\.log$', log), (r'^survex/(?P<survex_file>.*)\.log$', log),
@ -59,7 +60,8 @@ urlpatterns = patterns('',
url(r'^survey/(?P<year>\d\d\d\d)\#(?P<wallet_number>\d*)$', survey, name="survey"), url(r'^survey/(?P<year>\d\d\d\d)\#(?P<wallet_number>\d*)$', survey, name="survey"),
(r'^admin/doc/?', include('django.contrib.admindocs.urls')), (r'^admin/doc/?', include('django.contrib.admindocs.urls')),
(r'^admin/(.*)', admin.site.root),
url(r'^admin/', include(admin.site.urls),name="admin"),
(r'^accounts/', include('registration.urls')), (r'^accounts/', include('registration.urls')),
(r'^profiles/', include('profiles.urls')), (r'^profiles/', include('profiles.urls')),