{% 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).