2011-07-11 02:10:22 +01:00
from django . shortcuts import render_to_response
from troggle . core . models import Expedition , Person , PersonExpedition , PersonTrip , LogbookEntry , SurvexBlock
import troggle . core . models as models
import troggle . settings as settings
import django . db . models
from troggle . parsers . logbooks import LoadLogbookForExpedition
from troggle . parsers . people import GetPersonExpeditionNameLookup
#from troggle.core.forms import PersonForm, getTripForm, get_name
from django . core . urlresolvers import reverse
from django . http import HttpResponseRedirect , HttpResponse
from django . template import Context , loader
from utils import render_with_context
import os . path
import troggle . parsers . logbooks as logbookparsers
from django . template . defaultfilters import slugify
from troggle . helper import login_required_if_public
import datetime
# Django uses Context, not RequestContext when you call render_to_response. We always want to use RequestContext, so that django adds the context from settings.TEMPLATE_CONTEXT_PROCESSORS. This way we automatically get necessary settings variables passed to each template. So we use a custom method, render_response instead of render_to_response. Hopefully future Django releases will make this unnecessary.
#from troggle.alwaysUseRequestContext import render_response
import re
@django.db.models.permalink #this allows the nice get_absolute_url syntax we are using
def getNotablePersons ( ) :
notablepersons = [ ]
for person in Person . objects . all ( ) :
if person . bisnotable ( ) :
notablepersons . append ( person )
return notablepersons
def personindex ( request ) :
persons = Person . objects . all ( )
# From what I can tell, "persons" seems to be the table rows, while "personss" is the table columns. - AC 16 Feb 09
personss = [ ]
ncols = 4
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 ( ) :
notablepersons . append ( person )
return render_with_context ( request , ' personindex.html ' , { ' persons ' : persons , ' personss ' : personss , ' notablepersons ' : notablepersons , } )
def expedition ( request , expeditionname ) :
expedition = Expedition . objects . get ( year = int ( expeditionname ) )
expeditions = Expedition . objects . all ( )
personexpeditiondays = [ ]
dateditems = list ( expedition . logbookentry_set . all ( ) ) + list ( expedition . survexblock_set . all ( ) )
dates = list ( set ( [ item . date for item in dateditems ] ) )
dates . sort ( )
for personexpedition in expedition . personexpedition_set . all ( ) :
prow = [ ]
for date in dates :
pcell = { " persontrips " : PersonTrip . objects . filter ( personexpedition = personexpedition ,
logbook_entry__date = date ) }
pcell [ " survexblocks " ] = set ( SurvexBlock . objects . filter ( survexpersonrole__personexpedition = personexpedition ,
date = date ) )
prow . append ( pcell )
personexpeditiondays . append ( { " personexpedition " : personexpedition , " personrow " : prow } )
message = " "
if " reload " in request . GET :
message = LoadLogbookForExpedition ( expedition )
return render_with_context ( request , ' expedition.html ' , { ' expedition ' : expedition , ' expeditions ' : expeditions , ' personexpeditiondays ' : personexpeditiondays , ' message ' : message , ' settings ' : settings , ' dateditems ' : dateditems } )
def get_absolute_url ( self ) :
return ( ' expedition ' , ( expedition . year ) )
def person ( request , first_name = ' ' , last_name = ' ' , ) :
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 ' :
person . user = None
person . save ( )
return HttpResponseRedirect ( reverse ( ' profiles_select_profile ' ) )
return render_with_context ( request , ' person.html ' , { ' person ' : person , } )
def GetPersonChronology ( personexpedition ) :
res = { }
for persontrip in personexpedition . persontrip_set . all ( ) :
a = res . setdefault ( persontrip . date , { } )
a . setdefault ( " persontrips " , [ ] ) . append ( persontrip )
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
def personexpedition ( request , first_name = ' ' , last_name = ' ' , year = ' ' ) :
person = Person . objects . get ( first_name = first_name , last_name = last_name )
expedition = Expedition . objects . get ( year = year )
personexpedition = person . personexpedition_set . get ( expedition = expedition )
personchronology = GetPersonChronology ( personexpedition )
return render_with_context ( request , ' personexpedition.html ' , { ' personexpedition ' : personexpedition , ' personchronology ' : personchronology } )
def logbookentry ( request , date , slug ) :
logbookentry = LogbookEntry . objects . filter ( date = date , slug = slug )
if len ( logbookentry ) > 1 :
return render_with_context ( request , ' object_list.html ' , { ' object_list ' : logbookentry } )
else :
logbookentry = logbookentry [ 0 ]
return render_with_context ( request , ' logbookentry.html ' , { ' logbookentry ' : logbookentry } )
def logbookSearch ( request , extra ) :
query_string = ' '
found_entries = None
if ( ' q ' in request . GET ) and request . GET [ ' q ' ] . strip ( ) :
query_string = request . GET [ ' q ' ]
entry_query = search . get_query ( query_string , [ ' text ' , ' title ' , ] )
found_entries = LogbookEntry . objects . filter ( entry_query )
return render_with_context ( request , ' logbooksearch.html ' ,
{ ' query_string ' : query_string , ' found_entries ' : found_entries , } )
#context_instance=RequestContext(request))
def personForm ( request , pk ) :
person = Person . objects . get ( pk = pk )
form = PersonForm ( instance = person )
return render_with_context ( request , ' personform.html ' , { ' form ' : form , } )
def experimental ( request ) :
legsbyexpo = [ ]
for expedition in Expedition . objects . all ( ) :
survexblocks = expedition . survexblock_set . all ( )
survexlegs = [ ]
survexleglength = 0.0
for survexblock in survexblocks :
survexlegs . extend ( survexblock . survexleg_set . all ( ) )
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_with_context ( request , ' experimental.html ' , { " nsurvexlegs " : len ( survexlegs ) , " totalsurvexlength " : totalsurvexlength , " legsbyexpo " : legsbyexpo } )
@login_required_if_public
def newLogbookEntry ( request , expeditionyear , pdate = None , pslug = None ) :
expedition = Expedition . objects . get ( year = expeditionyear )
PersonTripFormSet , TripForm = getTripForm ( expedition )
if pslug and pdate :
previousdate = datetime . date ( * [ int ( x ) for x in pdate . split ( " - " ) ] )
previouslbe = LogbookEntry . objects . get ( slug = pslug , date = previousdate , expedition = expedition )
assert previouslbe . 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 and pdate :
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 :
tripForm = TripForm ( ) # An unbound form
personTripFormSet = PersonTripFormSet ( )
return render_with_context ( request , ' newlogbookentry.html ' , {
' tripForm ' : tripForm ,
' personTripFormSet ' : personTripFormSet ,
} )
@login_required_if_public
def deleteLogbookEntry ( 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 delLogbookEntry ( lbe ) :
for pt in lbe . persontrip_set . all ( ) :
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 ( ) ] } )