Improve error handling/reporting, make redownloads appear at top of recent list.

This commit is contained in:
Jim Miller 2011-05-30 15:05:00 -05:00
parent 94063d478c
commit a3f75cb3eb
3 changed files with 89 additions and 57 deletions

View file

@ -22,7 +22,7 @@ class DownloadMeta(db.Model):
title = db.StringProperty()
author = db.StringProperty()
format = db.StringProperty()
failure = db.StringProperty()
failure = db.TextProperty()
completed = db.BooleanProperty(default=False)
date = db.DateTimeProperty(auto_now_add=True)
version = db.StringProperty()

50
main.py
View file

@ -25,6 +25,7 @@ import re
import sys
import zlib
import urllib
import datetime
import traceback
import StringIO
@ -133,6 +134,7 @@ class FileServer(webapp.RequestHandler):
self.redirect('/')
return
try:
key = db.Key(fileId)
fanfic = db.get(key)
@ -140,8 +142,6 @@ class FileServer(webapp.RequestHandler):
name = fanfic.name.encode('utf-8')
#name = urllib.quote(name)
logging.info("Serving file: %s" % name)
if name.endswith('.epub'):
@ -176,6 +176,18 @@ class FileServer(webapp.RequestHandler):
for datum in data:
self.response.out.write(dc(datum.blob))
except Exception, e:
fic = DownloadMeta()
fic.failure = unicode(e)
template_values = dict(fic = fic,
#nickname = user.nickname(),
#escaped_url = escaped_url
)
path = os.path.join(os.path.dirname(__file__), 'status.html')
self.response.out.write(template.render(path, template_values))
class FileStatusServer(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
@ -188,14 +200,24 @@ class FileStatusServer(webapp.RequestHandler):
if fileId == None or len(fileId) < 3:
self.redirect('/')
escaped_url=False
try:
key = db.Key(fileId)
fic = db.get(key)
if fic:
logging.info("Status url: %s" % fic.url)
if fic.completed and fic.format=='epub':
escaped_url = urlEscape(self.request.host_url+"/file/"+fic.name+"."+fic.format+"?id="+fileId+"&fake=file."+fic.format)
else:
escaped_url=False
fic = DownloadMeta()
fic.failure = "Download not found"
except Exception, e:
fic = DownloadMeta()
fic.failure = unicode(e)
template_values = dict(fic = fic,
nickname = user.nickname(),
escaped_url = escaped_url
@ -252,6 +274,11 @@ class FanfictionDownloader(UserConfigServer):
format = self.request.get('format')
url = self.request.get('url')
if not url or url.strip() == "":
self.redirect('/')
return
logging.info("Queuing Download: %s" % url)
login = self.request.get('login')
password = self.request.get('password')
@ -265,6 +292,7 @@ class FanfictionDownloader(UserConfigServer):
download = q[0]
download.completed=False
download.failure=None
download.date=datetime.datetime.now()
for c in download.data_chunks:
c.delete()
@ -308,9 +336,9 @@ class FanfictionDownloader(UserConfigServer):
logging.info("enqueued download key: " + str(download.key()))
except (exceptions.FailedToLogin,exceptions.AdultCheckRequired), e:
download.failure = str(e)
download.failure = unicode(e)
download.put()
logging.info(str(e))
logging.info(unicode(e))
is_login= ( isinstance(e, exceptions.FailedToLogin) )
template_values = dict(nickname = user.nickname(),
url = url,
@ -328,13 +356,13 @@ class FanfictionDownloader(UserConfigServer):
self.response.out.write(template.render(path, template_values))
return
except (exceptions.InvalidStoryURL,exceptions.UnknownSite,exceptions.StoryDoesNotExist), e:
logging.warn(str(e))
download.failure = str(e)
logging.warn(unicode(e))
download.failure = unicode(e)
download.put()
except Exception, e:
logging.error("Failure Queuing Download: url:%s" % url)
logging.exception(e)
download.failure = str(e)
download.failure = unicode(e)
download.put()
self.redirect('/status?id='+str(download.key()))
@ -373,6 +401,8 @@ class FanfictionDownloaderTask(UserConfigServer):
download = DownloadMeta()
else:
download = q[0]
download.failure=None
download.date=datetime.datetime.now()
download.completed=False
for c in download.data_chunks:
c.delete()
@ -389,7 +419,7 @@ class FanfictionDownloaderTask(UserConfigServer):
adapter = adapters.getAdapter(config,url)
except Exception, e:
logging.exception(e)
download.failure = str(e)
download.failure = unicode(e)
download.put()
return
@ -405,7 +435,7 @@ class FanfictionDownloaderTask(UserConfigServer):
writer = writers.getWriter(format,config,adapter)
except Exception, e:
logging.exception(e)
download.failure = str(e)
download.failure = unicode(e)
download.put()
return

View file

@ -42,9 +42,11 @@
</div>
<div id='urlbox'>
{% if fic.url %}
<div id='greeting'>
<p><a href='{{ fic.url }}'>{{ fic.url }}</a></p>
</div>
{% endif %}
<div>
{% if fic.completed %}
<p>Your fic has finished processing and you can download it now:</p>