Package omeroweb :: Package feedback :: Module views
[hide private]
[frames] | no frames]

Source Code for Module omeroweb.feedback.views

  1  #!/usr/bin/env python 
  2  # -*- coding: utf-8 -*- 
  3  #  
  4  #  
  5  #  
  6  # Copyright (c) 2008 University of Dundee.  
  7  #  
  8  # This program is free software: you can redistribute it and/or modify 
  9  # it under the terms of the GNU Affero General Public License as 
 10  # published by the Free Software Foundation, either version 3 of the 
 11  # License, or (at your option) any later version. 
 12  #  
 13  # This program is distributed in the hope that it will be useful, 
 14  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 16  # GNU Affero General Public License for more details. 
 17  #  
 18  # You should have received a copy of the GNU Affero General Public License 
 19  # along with this program.  If not, see <http://www.gnu.org/licenses/>. 
 20  #  
 21  # Author: Aleksandra Tarkowska <A(dot)Tarkowska(at)dundee(dot)ac(dot)uk>, 2008. 
 22  #  
 23  # Version: 1.0 
 24  # 
 25   
 26  ''' A view functions is simply a Python function that takes a Web request and  
 27  returns a Web response. This response can be the HTML contents of a Web page,  
 28  or a redirect, or the 404 and 500 error, or an XML document, or an image...  
 29  or anything.''' 
 30   
 31  import sys 
 32  import locale 
 33  import datetime 
 34  import traceback 
 35  import logging 
 36   
 37  from django.conf import settings 
 38  from django.core import template_loader 
 39  from django.http import HttpResponse, HttpResponseRedirect, HttpResponseServerError, HttpResponseNotFound 
 40  from django.shortcuts import render_to_response 
 41  from django.template import RequestContext, Context 
 42  from django.views.defaults import page_not_found, server_error 
 43  from django.views import debug 
 44  from django.core.urlresolvers import reverse 
 45   
 46  from omeroweb.feedback.sendfeedback import SendFeedback 
 47  from omeroweb.feedback.forms import ErrorForm, CommentForm 
 48   
 49  logger = logging.getLogger(__name__) 
 50   
 51  ############################################################################### 
52 -def thanks(request):
53 return render_to_response("thanks.html",None)
54
55 -def send_feedback(request):
56 error = None 57 form = ErrorForm(data=request.REQUEST.copy()) 58 if form.is_valid(): 59 error = request.REQUEST['error'] 60 comment = None 61 if request.REQUEST.get('comment',None) is not None and request.REQUEST['comment'] != "": 62 comment = request.REQUEST['comment'] 63 email = None 64 if request.REQUEST.get('email', None) is not None and request.REQUEST['email'] != "": 65 email = request.REQUEST['email'] 66 try: 67 sf = SendFeedback() 68 sf.give_feedback(error, comment, email) 69 except: 70 logger.error('handler500: Feedback could not be sent') 71 logger.error(traceback.format_exc()) 72 error = "Feedback could not been sent. Please contact administrator." 73 fileObj = open(("%s/error500-%s.html" % (settings.LOGDIR, datetime.datetime.now())),"w") 74 try: 75 try: 76 fileObj.write(request.REQUEST['error']) 77 except: 78 logger.error('handler500: Error could not be saved.') 79 logger.error(traceback.format_exc()) 80 finally: 81 fileObj.close() 82 83 if request.is_ajax(): 84 return HttpResponse("<h1>Thanks for your feedback</h1><p>You may need to refresh your browser to recover from the error</p>"); 85 return HttpResponseRedirect(reverse("fthanks")) 86 87 context = {'form':form, 'error':error} 88 t = template_loader.get_template('500.html') 89 c = RequestContext(request, context) 90 return HttpResponse(t.render(c))
91
92 -def send_comment(request):
93 error = None 94 form = CommentForm() 95 96 if request.method == "POST": 97 form = CommentForm(data=request.REQUEST.copy()) 98 if form.is_valid(): 99 comment = request.REQUEST['comment'] 100 email = None 101 if request.REQUEST['email'] is not None or request.REQUEST['email'] != "": 102 email = request.REQUEST['email'] 103 try: 104 sf = SendFeedback() 105 sf.give_comment(comment, email) 106 except: 107 logger.error('handler500: Feedback could not be sent') 108 logger.error(traceback.format_exc()) 109 error = "Feedback could not been sent. Please contact administrator." 110 else: 111 return HttpResponseRedirect(reverse("fthanks")) 112 113 context = {'form':form, 'error':error} 114 t = template_loader.get_template('comment.html') 115 c = RequestContext(request, context) 116 return HttpResponse(t.render(c))
117
118 -def custom_server_error(request, error500):
119 """ 120 Custom 500 error handler. 121 122 Templates: `500.html` 123 Context: ErrorForm 124 """ 125 form = ErrorForm(initial={'error':error500}) 126 context = {'form':form} 127 t = template_loader.get_template('500.html') 128 c = RequestContext(request, context) 129 return HttpResponse(t.render(c))
130 131 ################################################################################ 132 # handlers 133
134 -def handler500(request):
135 """ 136 Custom error handling. 137 Catches errors that are not handled elsewhere. 138 NB: This only gets used by Django if omero.web.debug False (production use) 139 If debug is True, Django returns it's own debug error page 140 """ 141 logger.error('handler500: Server error') 142 as_string = '\n'.join(traceback.format_exception(*sys.exc_info())) 143 logger.error(as_string) 144 145 try: 146 request_repr = repr(request) 147 except: 148 request_repr = "Request repr() unavailable" 149 150 error500 = "%s\n\n%s" % (as_string, request_repr) 151 152 # If AJAX, return JUST the error message (not within html page) 153 if request.is_ajax(): 154 return HttpResponseServerError(error500) 155 156 return custom_server_error(request, error500)
157
158 -def handler404(request):
159 logger.warning('Not Found: %s' % request.path, 160 extra={ 161 'status_code': 404, 162 'request': request 163 }) 164 if request.is_ajax(): 165 msg = traceback.format_exception(*sys.exc_info())[-1] 166 return HttpResponseNotFound(msg) 167 168 return page_not_found(request, "404.html")
169
170 -def handlerInternalError(request, error):
171 """ 172 This is mostly used in an "object not found" situation, 173 So there is no feedback form - simply display "not found" message. 174 If the call was AJAX, we return the message in a 404 response. 175 Otherwise return an html page, with 404 response. 176 """ 177 logger.warning('Object Not Found: %s' % request.path, 178 extra={ 179 'status_code': 404, 180 'request': request 181 }) 182 183 if request.is_ajax(): 184 return HttpResponseNotFound(error) 185 186 context = {"error":error} 187 t = template_loader.get_template("error.html") 188 c = RequestContext(request, context) 189 return HttpResponseNotFound(t.render(c))
190