From 7b4b4136bff5a295dfaa2f5e62606d2bed6168c0 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Sun, 16 Oct 2011 01:46:28 +0000 Subject: [PATCH] Importing from webpage--- need to report error and status svn: r18332 --- src/data/templates/gramps-base.html | 6 ++++++ src/gen/lib/place.py | 1 + src/webapp/dbdjango.py | 14 +++++++------- src/webapp/grampsdb/views.py | 20 +++++++++++++++++--- src/webapp/reports.py | 26 ++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/data/templates/gramps-base.html b/src/data/templates/gramps-base.html index 801bdbe8c..b3601ee6c 100644 --- a/src/data/templates/gramps-base.html +++ b/src/data/templates/gramps-base.html @@ -53,6 +53,12 @@ {% endblock %}
+ {% if error %} + {{error}} + {% endif %} + {% if message %} + {{message}} + {% endif %}
{% block content %} {% endblock %} diff --git a/src/gen/lib/place.py b/src/gen/lib/place.py index 7ec88f6f2..964ccb0dc 100644 --- a/src/gen/lib/place.py +++ b/src/gen/lib/place.py @@ -130,6 +130,7 @@ class Place(SourceBase, NoteBase, MediaBase, UrlBase, PrimaryObject): MediaBase.unserialize(self, media_list) SourceBase.unserialize(self, source_list) NoteBase.unserialize(self, note_list) + return self def get_text_data_list(self): """ diff --git a/src/webapp/dbdjango.py b/src/webapp/dbdjango.py index 51f1bf308..76a597cd6 100644 --- a/src/webapp/dbdjango.py +++ b/src/webapp/dbdjango.py @@ -52,12 +52,12 @@ class Cursor(object): return self.__next__() def __next__(self): for item in self.model.all(): - yield (item.handle, self.func(item)) + yield (item.handle, self.func(item.handle)) def __exit__(self, *args, **kwargs): pass def iter(self): for item in self.model.all(): - yield (item.handle, self.func(item)) + yield (item.handle, self.func(item.handle)) yield None class Bookmarks: @@ -678,19 +678,19 @@ class DbDjango(DbWriteBase, DbReadBase): return self.dji.Repository.count() def get_place_cursor(self): - return Cursor(self.dji.Place, self.make_place).iter() + return Cursor(self.dji.Place, self.get_raw_place_data).iter() def get_person_cursor(self): - return Cursor(self.dji.Person, self.make_person).iter() + return Cursor(self.dji.Person, self.get_raw_person_data).iter() def get_family_cursor(self): - return Cursor(self.dji.Family, self.make_family).iter() + return Cursor(self.dji.Family, self.get_raw_family_data).iter() def get_events_cursor(self): - return Cursor(self.dji.Event, self.make_event).iter() + return Cursor(self.dji.Event, self.get_raw_event_data).iter() def get_source_cursor(self): - return Cursor(self.dji.Source, self.make_source).iter() + return Cursor(self.dji.Source, self.get_raw_source_data).iter() def has_person_handle(self, handle): return self.dji.Person.filter(handle=handle).count() == 1 diff --git a/src/webapp/grampsdb/views.py b/src/webapp/grampsdb/views.py index cc768897b..d8c421e9c 100644 --- a/src/webapp/grampsdb/views.py +++ b/src/webapp/grampsdb/views.py @@ -248,8 +248,7 @@ def send_file(request, filename, mimetype): return response def process_action(request, view, handle, action): - from webapp.reports import import_file - from webapp.reports import export_file + from webapp.reports import import_file, export_file, download from cli.plug import run_report db = DbDjango() if view == "report": @@ -280,8 +279,23 @@ def process_action(request, view, handle, action): filename = "/tmp/%s-%s.%s" % (str(profile.user.username), str(handle), args["off"]) export_file(db, filename, lambda n: n) # callback mimetype = 'text/plain' + elif report.report_type == "import": + context = RequestContext(request) + filename = download(args["i"], "/tmp/%s-%s.ged" % (str(profile.user.username), str(handle))) + if filename is not None: + import threading + def background(): + import_file(db, filename, lambda n: n) # callback + threading.Thread(target=background).start() + context["message"] = "Your data is now being imported..." + return redirect("/report/", context) + else: + context["error"] = "No filename was provided or found." + return redirect("/report/", context) else: - pass # FIXME: error + context = RequestContext(request) + context["error"] = "Invalid report type '%s'" % report.report_type + return redirect("/report/", context) return send_file(request, filename, mimetype) # If failure, just fail for now: context = RequestContext(request) diff --git a/src/webapp/reports.py b/src/webapp/reports.py index 99d214b0d..3c1a88b67 100644 --- a/src/webapp/reports.py +++ b/src/webapp/reports.py @@ -46,6 +46,32 @@ def import_file(db, filename, callback): return True return False +def download(url, filename=None): + import urllib2 + import shutil + import urlparse + def getFilename(url,openUrl): + if 'Content-Disposition' in openUrl.info(): + # If the response has Content-Disposition, try to get filename from it + cd = dict(map( + lambda x: x.strip().split('=') if '=' in x else (x.strip(),''), + openUrl.info().split(';'))) + if 'filename' in cd: + fname = cd['filename'].strip("\"'") + if fname: return fname + # if no filename was found above, parse it out of the final URL. + return os.path.basename(urlparse.urlsplit(openUrl.url)[2]) + r = urllib2.urlopen(urllib2.Request(url)) + success = None + try: + filename = filename or "/tmp/%s" % getFilename(url,r) + with open(filename, 'wb') as f: + shutil.copyfileobj(r,f) + success = filename + finally: + r.close() + return success + def export_file(db, filename, callback): """ Export the db to a file (such as a GEDCOM file).