import re from django import forms from django.conf import settings from django.urls import reverse from django.db.models import Q from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render from django.template import Context, loader import troggle.parsers.imports from troggle.core.models import Expedition, Person, PersonExpedition from troggle.core.models_caves import LogbookEntry, QM, Cave, PersonTrip from troggle.helper import login_required_if_public from troggle.core.forms import UploadFileForm print("** importing troggle/core/views_other.py") """Utility functions and code to serve the control panel and individual user's progress and task list (deprecated as we do not have individual user login). Also has code to download a logbook in a choice of formats (why?!) and to download all QMs (not working) """ def troggle404(request): # cannot get this to work. Handler404 in urls.py not right syntax '''Custom 404 page to be used even when Debug=True https://blog.juanwolf.fr/posts/programming/how-to-create-404-page-django/ ''' context = RequestContext(request) #context['caves'] = Cave.objects.all() return render(request, ('404.html', context.flatten())) def showrequest(request): return HttpResponse(request.GET) def frontpage(request): '''never seen in practice''' # bthe messages system does a popup on this page if there is a recent message, e.g. from the admin site actions. # via django.contrib.messages.middleware.MessageMiddleware # this is set in the templates. if request.user.is_authenticated(): return render(request,'tasks.html') expeditions = Expedition.objects.order_by("-year") logbookentry = LogbookEntry cave = Cave #from django.contrib.admin.templatetags import log return render(request,'frontpage.html', locals()) def controlPanel(request): jobs_completed=[] if request.method=='POST': if request.user.is_superuser: # NONE of this works now that databaseReset (now parsers.imports) has been so extensively rewritten reinit_db() import_caves() import_people() import_surveyscans() import_logbooks() import_QMs() import_tunnelfiles() import_survexblks() import_survexpos() else: if request.user.is_authenticated(): #The user is logged in, but is not a superuser. return render(request,'controlPanel.html', {'caves':Cave.objects.all(),'error':'You must be a superuser to use that feature.'}) else: return HttpResponseRedirect(reverse('auth_login')) return render(request,'controlPanel.html', {'caves':Cave.objects.all(),'expeditions':Expedition.objects.all(),'jobs_completed':jobs_completed}) 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) filename='logbook'+year elif queryset: logbook_entries=queryset filename='logbook' 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: extension=request.GET['extension'] if extension =='txt': response = HttpResponse(content_type='text/plain') style='2008' elif extension == 'html': response = HttpResponse(content_type='text/html') style='2005' template='logbook'+style+'style.'+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 if request.method=='GET': try: cave=Cave.objects.get(kataster_number=request.GET['cave_id']) except Cave.DoesNotExist: cave=Cave.objects.get(name=request.GET['cave_id']) from export import toqms response = HttpResponse(content_type='text/csv') 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.'}", content_type="application/json") def eyecandy(request): return def ajax_QM_number(request): res="" if request.method=='POST': cave=Cave.objects.get(id=request.POST['cave']) print(cave) exp=Expedition.objects.get(pk=request.POST['year']) print(exp) res=cave.new_QM_number(exp.year) return HttpResponse(res) # def logbook_entry_suggestions(request): # """ # Generates a html box with suggestions about what to do with QMs # in logbook entry text. # """ # unwiki_QM_pattern=r"(?P(?P[ABC]?)(?P\d*)-?(?P\d\d\d?\d?)-(?P\d\d)(?P[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: # if len(qm['year'])==2: # if int(qm['year'])<50: # qm['year']='20'+qm['year'] # else: # qm['year']='19'+qm['year'] # if lbo.date.year!=int(qm['year']): # try: # 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() # #except: # #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. # print('got 208') # any_suggestions=True # print('got 210') # return render(request,'suggestions.html', # { # 'unwiki_QMs':unwiki_QMs, # 'any_suggestions':any_suggestions # }) print(" - newFile() is next in troggle/core/views_other.py") @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 else: fileform = UploadFileForm() # An unbound form return render(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) print("** Finished importing troggle/core/views_other.py")