Updates to webapp: move cache updates to save of models to make it so that they cannot become out of sync with data; moved svg images to png forms to work with all browsers

This commit is contained in:
Doug Blank 2013-12-19 22:55:14 -05:00
parent ab46727c56
commit aa96ebc333
21 changed files with 249 additions and 266 deletions

View File

@ -27,11 +27,6 @@
#
#------------------------------------------------------------------------
import sys
if sys.version_info[0] < 3:
import cPickle as pickle
else:
import pickle
import base64
import time
import re
import gramps
@ -723,49 +718,49 @@ class DbDjango(DbWriteBase, DbReadBase):
def make_repository(self, repository):
if self.use_db_cache and repository.cache:
data = pickle.loads(base64.decodestring(repository.cache))
data = repository.from_cache()
else:
data = self.dji.get_repository(repository)
return Repository.create(data)
def make_citation(self, citation):
if self.use_db_cache and citation.cache:
data = pickle.loads(base64.decodestring(citation.cache))
data = citation.from_cache()
else:
data = self.dji.get_citation(citation)
return Citation.create(data)
def make_source(self, source):
if self.use_db_cache and source.cache:
data = pickle.loads(base64.decodestring(source.cache))
data = source.from_cache()
else:
data = self.dji.get_source(source)
return Source.create(data)
def make_family(self, family):
if self.use_db_cache and family.cache:
data = pickle.loads(base64.decodestring(family.cache))
data = family.from_cache()
else:
data = self.dji.get_family(family)
return Family.create(data)
def make_person(self, person):
if self.use_db_cache and person.cache:
data = pickle.loads(base64.decodestring(person.cache))
data = person.from_cache()
else:
data = self.dji.get_person(person)
return Person.create(data)
def make_event(self, event):
if self.use_db_cache and event.cache:
data = pickle.loads(base64.decodestring(event.cache))
data = event.from_cache()
else:
data = self.dji.get_event(event)
return Event.create(data)
def make_note(self, note):
if self.use_db_cache and note.cache:
data = pickle.loads(base64.decodestring(note.cache))
data = note.from_cache()
else:
data = self.dji.get_note(note)
return Note.create(data)
@ -776,14 +771,14 @@ class DbDjango(DbWriteBase, DbReadBase):
def make_place(self, place):
if self.use_db_cache and place.cache:
data = pickle.loads(base64.decodestring(place.cache))
data = place.from_cache()
else:
data = self.dji.get_place(place)
return Place.create(data)
def make_media(self, media):
if self.use_db_cache and media.cache:
data = pickle.loads(base64.decodestring(media.cache))
data = media.from_cache()
else:
data = self.dji.get_media(media)
return MediaObject.create(data)
@ -1348,3 +1343,17 @@ class DbDjango(DbWriteBase, DbReadBase):
# Next we add the links:
self.dji.update_publics()
def get_from_name_and_handle(self, table_name, handle):
"""
Returns a gen.lib object (or None) given table_name and
handle.
Examples:
>>> self.get_from_name_and_handle("Person", "a7ad62365bc652387008")
>>> self.get_from_name_and_handle("Media", "c3434653675bcd736f23")
"""
if table_name in self._tables:
return self._tables[table_name]["handle_func"](handle)
return None

View File

@ -38,6 +38,13 @@ from gramps.gen.utils.id import create_id, create_uid
from gramps.webapp.grampsdb.profile import Profile
from gramps.gen.constfunc import cuni
import sys
if sys.version_info[0] < 3:
import cPickle as pickle
else:
import pickle
import base64
#---------------------------------------------------------------------------
#
# Support functions
@ -424,6 +431,8 @@ class Tag(models.Model):
name = models.TextField('name')
color = models.CharField(max_length=13, blank=True, null=True) # "#000000000000" # Black
priority = models.IntegerField('priority', blank=True, null=True)
cache = models.TextField(blank=True, null=True)
dji = None
def __unicode__(self):
return cuni(self.name)
@ -434,6 +443,34 @@ class Tag(models.Model):
def get_link(self):
return cuni("<a href='%s'>%s</a>") % (self.get_url(), self.name)
def make_cache(self):
from gramps.webapp.libdjango import DjangoInterface
if self.dji is None:
self.dji = DjangoInterface()
raw = self.dji.get_tag(self)
return base64.encodestring(pickle.dumps(raw))
def from_cache(self):
return pickle.loads(base64.decodestring(self.cache))
def save_cache(self):
cache = self.make_cache()
if cache != self.cache:
self.cache = cache
models.Model.save(self)
def save(self, *args, **kwargs):
save_cache = True
if "save_cache" in kwargs:
save_cache = kwargs["save_cache"]
del kwargs["save_cache"]
if not save_cache:
self.cache = ""
else:
self.cache = self.make_cache()
models.Model.save(self, *args, **kwargs) # save to db
# Just the following have tag lists:
# ---------------------------------
#src/gen/lib/family.py
@ -461,6 +498,7 @@ class PrimaryObject(models.Model):
#attributes = models.ManyToManyField("Attribute", blank=True, null=True)
cache = models.TextField(blank=True, null=True)
tags = models.ManyToManyField('Tag', blank=True, null=True)
dji = None
def __unicode__(self):
return cuni("%s: %s") % (self.__class__.__name__,
@ -473,6 +511,55 @@ class PrimaryObject(models.Model):
def get_tag_list(self):
return tuple([tag.handle for tag in self.tags.all()])
def make_cache(self):
from gramps.webapp.libdjango import DjangoInterface
if self.dji is None:
self.dji = DjangoInterface()
if isinstance(self, Person):
raw = self.dji.get_person(self)
elif isinstance(self, Family):
raw = self.dji.get_family(self)
elif isinstance(self, Place):
raw = self.dji.get_place(self)
elif isinstance(self, Media):
raw = self.dji.get_media(self)
elif isinstance(self, Source):
raw = self.dji.get_source(self)
elif isinstance(self, Citation):
raw = self.dji.get_citation(self)
elif isinstance(self, Repository):
raw = self.dji.get_repository(self)
elif isinstance(self, Note):
raw = self.dji.get_note(self)
elif isinstance(self, Event):
raw = self.dji.get_event(self)
elif isinstance(self, Tag):
raw = self.dji.get_tag(self)
else:
raise Exception("Don't know how to get raw '%s'" % type(item))
return base64.encodestring(pickle.dumps(raw))
def from_cache(self):
return pickle.loads(base64.decodestring(self.cache))
def save_cache(self):
cache = self.make_cache()
if cache != self.cache:
self.cache = cache
models.Model.save(self)
def save(self, *args, **kwargs):
save_cache = True
if "save_cache" in kwargs:
save_cache = kwargs["save_cache"]
del kwargs["save_cache"]
if not save_cache:
self.cache = ""
else:
self.cache = self.make_cache()
models.Model.save(self, *args, **kwargs) # save to db
class MyFamilies(models.Model):
person = models.ForeignKey("Person")
family = models.ForeignKey("Family")

View File

@ -70,7 +70,7 @@ def process_citation(request, context, handle, act, add_to=None): # view, edit,
ref_handle = pickform.data["picklist"]
ref_obj = Citation.objects.get(handle=ref_handle)
dji.add_citation_ref_default(parent_obj, ref_obj)
dji.rebuild_cache(parent_obj) # rebuild cache
parent_obj.save_cache() # rebuild cache
return redirect("/%s/%s%s#tab-citations" % (item, handle, build_search(request)))
else:
context["pickform"] = pickform
@ -98,7 +98,6 @@ def process_citation(request, context, handle, act, add_to=None): # view, edit,
if citationform.is_valid():
update_last_changed(citation, request.user.username)
citation = citationform.save()
dji.rebuild_cache(citation)
act = "view"
else:
act = "edit"
@ -114,15 +113,15 @@ def process_citation(request, context, handle, act, add_to=None): # view, edit,
source = sourceform.save()
citation.source = source
update_last_changed(citation, request.user.username)
citation = citationform.save()
dji.rebuild_cache(source)
dji.rebuild_cache(citation)
citation = citationform.save(save_cache=False)
source.save_cache()
citation.save_cache()
if add_to:
item, handle = add_to
model = dji.get_model(item)
obj = model.objects.get(handle=handle)
dji.add_citation_ref(obj, citation.handle)
dji.rebuild_cache(obj)
obj.save_cache()
return redirect("/%s/%s#tab-citations" % (item, handle))
act = "view"
else:

View File

@ -71,7 +71,6 @@ def delete_event(event):
for person in people:
recheck_birth_death_refs(person)
person.save()
dji.rebuild_cache(person)
def check_event(event):
obj_type = ContentType.objects.get_for_model(Person)
@ -90,7 +89,6 @@ def check_event(event):
continue
recheck_birth_death_refs(person)
person.save()
dji.rebuild_cache(person)
def recheck_birth_death_refs(person):
"""
@ -167,8 +165,8 @@ def process_event(request, context, handle, act, add_to=None): # view, edit, sav
dji.add_event_ref_default(parent_obj, ref_obj)
if item == "person": # then need to recheck birth/death indexes:
recheck_birth_death_refs(parent_obj)
parent_obj.save()
dji.rebuild_cache(parent_obj) # rebuild cache
parent_obj.save(save_cache=False)
parent_obj.save_cache()
return redirect("/%s/%s%s#tab-events" % (item, handle, build_search(request)))
else:
context["pickform"] = pickform
@ -198,7 +196,6 @@ def process_event(request, context, handle, act, add_to=None): # view, edit, sav
# birth/death issues changed:
check_event(event)
event.save()
dji.rebuild_cache(event)
act = "view"
else:
act = "edit"
@ -209,7 +206,6 @@ def process_event(request, context, handle, act, add_to=None): # view, edit, sav
if eventform.is_valid():
update_last_changed(event, request.user.username)
event = eventform.save()
dji.rebuild_cache(event)
if add_to:
item, handle = add_to
model = dji.get_model(item)
@ -217,8 +213,8 @@ def process_event(request, context, handle, act, add_to=None): # view, edit, sav
dji.add_event_ref_default(obj, event)
if item == "person": # then need to recheck birth/death indexes:
recheck_birth_death_refs(obj)
obj.save()
dji.rebuild_cache(obj)
obj.save(save_cache=False)
obj.save_cache()
return redirect("/%s/%s#tab-events" % (item, handle))
act = "view"
else:

View File

@ -87,8 +87,6 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa
pfo.save()
ref_obj.save()
person.save()
dji.rebuild_cache(person) # rebuild child
dji.rebuild_cache(ref_obj) # rebuild cache
return redirect("/%s/%s%s#tab-references" % ("person", handle, build_search(request)))
else:
context["pickform"] = pickform
@ -150,7 +148,6 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa
order=len(familyform.cleaned_data["father"].families.all())+1)
pfo.save()
familyform.save()
dji.rebuild_cache(family)
act = "view"
else:
act = "edit"
@ -173,7 +170,7 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa
pfo = MyFamilies(person=family.father, family=family,
order=len(family.father.families.all())+1)
pfo.save()
dji.rebuild_cache(family)
family.save_cache()
if add_to: # add child or spouse to family
item, handle = add_to
person = Person.objects.get(handle=handle)
@ -186,7 +183,6 @@ def process_family(request, context, handle, act, add_to=None): # view, edit, sa
#elif item == "spouse":
# already added by selecting
person.save()
dji.rebuild_cache(person) # rebuild child
return redirect("/%s/%s%s#tab-references" % ("person", handle, build_search(request)))
act = "view"
else:

View File

@ -88,7 +88,7 @@ def process_media(request, context, handle, act, add_to=None): # view, edit, sav
ref_handle = pickform.data["picklist"]
ref_obj = Media.objects.get(handle=ref_handle)
dji.add_media_ref_default(parent_obj, ref_obj)
dji.rebuild_cache(parent_obj) # rebuild cache
parent_obj.save_cache() # rebuild cache
return redirect("/%s/%s%s#tab-media" % (item, handle, build_search(request)))
else:
context["pickform"] = pickform
@ -167,7 +167,6 @@ def process_media(request, context, handle, act, add_to=None): # view, edit, sav
if mediaform.is_valid():
update_last_changed(media, request.user.username)
media = mediaform.save()
dji.rebuild_cache(media)
act = "view"
else:
act = "edit"
@ -177,16 +176,17 @@ def process_media(request, context, handle, act, add_to=None): # view, edit, sav
mediaform.model = media
if mediaform.is_valid():
update_last_changed(media, request.user.username)
media = mediaform.save()
media = mediaform.save(save_cache=False)
if add_to:
item, handle = add_to
model = dji.get_model(item)
obj = model.objects.get(handle=handle)
dji.add_media_ref_default(obj, media)
dji.rebuild_cache(obj)
obj.save_cache()
media.save_cache()
return redirect("/%s/%s#tab-gallery" % (item, handle))
else:
dji.rebuild_cache(media)
media.save_cache()
act = "view"
else:
act = "add"

View File

@ -80,7 +80,7 @@ def process_note(request, context, handle, act, add_to=None): # view, edit, save
ref_handle = pickform.data["picklist"]
ref_obj = Note.objects.get(handle=ref_handle)
dji.add_note_ref(parent_obj, ref_obj)
dji.rebuild_cache(parent_obj) # rebuild cache
parent_obj.save_cache() # rebuild cache
return redirect("/%s/%s%s#tab-notes" % (item, handle, build_search(request)))
else:
context["pickform"] = pickform
@ -109,7 +109,7 @@ def process_note(request, context, handle, act, add_to=None): # view, edit, save
note.text = notedata[0]
note = noteform.save()
dji.save_note_markup(note, notedata[1])
dji.rebuild_cache(note)
note.save_cache()
notetext = noteform.data["notetext"]
act = "view"
else:
@ -126,13 +126,13 @@ def process_note(request, context, handle, act, add_to=None): # view, edit, save
note.text = notedata[0]
note = noteform.save()
dji.save_note_markup(note, notedata[1])
dji.rebuild_cache(note)
note.save_cache()
if add_to:
item, handle = add_to
model = dji.get_model(item)
obj = model.objects.get(handle=handle)
dji.add_note_ref(obj, note)
dji.rebuild_cache(obj)
obj.save_cache()
return redirect("/%s/%s#tab-notes" % (item, handle))
notetext = noteform.data["notetext"]
act = "view"

View File

@ -167,7 +167,7 @@ def process_surname(request, handle, order, sorder, act="view"):
surname = sf.save(commit=False)
check_primary(surname, surnames)
surname.save()
dji.rebuild_cache(person)
person.save_cache()
return redirect("/person/%s/name/%s/surname/%s%s#tab-surnames" %
(person.handle, name.order, sorder,
build_search(request)))
@ -182,7 +182,7 @@ def process_surname(request, handle, order, sorder, act="view"):
surname = sf.save(commit=False)
check_primary(surname, name.surname_set.all().exclude(order=surname.order))
surname.save()
dji.rebuild_cache(person)
person.save_cache()
return redirect("/person/%s/name/%s/surname/%s%s#tab-surnames" %
(person.handle, name.order, sorder,
build_search(request)))
@ -281,7 +281,7 @@ def process_name(request, handle, order, act="view"):
surname.prefix = sf.cleaned_data["prefix"] if sf.cleaned_data["prefix"] != " prefix " else ""
surname.primary = True # FIXME: why is this False? Remove from form?
surname.save()
dji.rebuild_cache(person)
person.save_cache()
return redirect("/person/%s/name/%s%s#tab-surnames" % (person.handle, name.order,
build_search(request)))
else:
@ -317,7 +317,7 @@ def process_name(request, handle, order, act="view"):
surname.prefix = sf.cleaned_data["prefix"] if sf.cleaned_data["prefix"] != " prefix " else ""
surname.primary = True # FIXME: why is this False? Remove from form?
surname.save()
dji.rebuild_cache(person)
person.save_cache()
return redirect("/person/%s/name/%s%s#tab-surnames" % (person.handle, name.order,
build_search(request)))
else:
@ -373,8 +373,8 @@ def process_person(request, context, handle, act, add_to=None): # view, edit, sa
pfo = MyParentFamilies(person=person, family=obj,
order=len(person.parent_families.all())+1)
pfo.save()
dji.rebuild_cache(person) # rebuild child
dji.rebuild_cache(obj) # rebuild family
person.save_cache() # rebuild child
obj.save_cache() # rebuild family
return redirect("/%s/%s%s" % (item, handle, build_search(request)))
else:
context["pickform"] = pickform
@ -447,10 +447,10 @@ def process_person(request, context, handle, act, add_to=None): # view, edit, sa
pfo = MyParentFamilies(person=person, family=obj,
order=len(person.parent_families.all())+1)
pfo.save()
dji.rebuild_cache(person) # rebuild child
dji.rebuild_cache(obj) # rebuild family
person.save_cache() # rebuild child
obj.save_cache() # rebuild family
return redirect("/%s/%s%s" % (item, handle, build_search(request)))
dji.rebuild_cache(person)
person.save_cache()
return redirect("/person/%s%s" % (person.handle, build_search(request)))
else:
# need to edit again

View File

@ -64,7 +64,6 @@ def process_place(request, context, handle, act, add_to=None): # view, edit, sav
if placeform.is_valid():
update_last_changed(place, request.user.username)
place = placeform.save()
dji.rebuild_cache(place)
act = "view"
else:
act = "edit"
@ -75,13 +74,12 @@ def process_place(request, context, handle, act, add_to=None): # view, edit, sav
if placeform.is_valid():
update_last_changed(place, request.user.username)
place = placeform.save()
dji.rebuild_cache(place)
if add_to:
item, handle = add_to
model = dji.get_model(item)
obj = model.objects.get(handle=handle)
dji.add_place_ref(obj, place.handle)
dji.rebuild_cache(obj)
obj.save_cache()
return redirect("/%s/%s#tab-places" % (item, handle))
act = "view"
else:

View File

@ -70,7 +70,7 @@ def process_repository(request, context, handle, act, add_to=None): # view, edit
ref_handle = pickform.data["picklist"]
ref_obj = Repository.objects.get(handle=ref_handle)
dji.add_repository_ref_default(parent_obj, ref_obj)
dji.rebuild_cache(parent_obj) # rebuild cache
parent_obj.save_cache() # rebuild cache
return redirect("/%s/%s%s#tab-repositories" % (item, handle, build_search(request)))
else:
context["pickform"] = pickform
@ -92,7 +92,6 @@ def process_repository(request, context, handle, act, add_to=None): # view, edit
if repositoryform.is_valid():
update_last_changed(repository, request.user.username)
repository = repositoryform.save()
dji.rebuild_cache(repository)
act = "view"
else:
act = "edit"
@ -103,13 +102,12 @@ def process_repository(request, context, handle, act, add_to=None): # view, edit
if repositoryform.is_valid():
update_last_changed(repository, request.user.username)
repository = repositoryform.save()
dji.rebuild_cache(repository)
if add_to:
item, handle = add_to
model = dji.get_model(item)
obj = model.objects.get(handle=handle)
dji.add_repository_ref_default(obj, repository)
dji.rebuild_cache(obj)
obj.save_cache()
return redirect("/%s/%s#tab-repositories" % (item, handle))
act = "view"
else:

View File

@ -70,7 +70,7 @@ def process_source(request, context, handle, act, add_to=None): # view, edit, sa
ref_handle = pickform.data["picklist"]
ref_obj = Source.objects.get(handle=ref_handle)
dji.add_source_ref_default(parent_obj, ref_obj)
dji.rebuild_cache(parent_obj) # rebuild cache
parent_obj.save_cache() # rebuild cache
return redirect("/%s/%s%s#tab-sources" % (item, handle, build_search(request)))
else:
context["pickform"] = pickform

View File

@ -79,7 +79,7 @@ def process_tag(request, context, handle, act, add_to=None): # view, edit, save
model = dji.get_model(item)
obj = model.objects.get(handle=handle)
dji.add_tag_ref_default(obj, tag)
dji.rebuild_cache(obj)
obj.save_cache()
return redirect("/%s/%s#tab-tags" % (item, handle))
act = "view"
else:

View File

@ -274,8 +274,8 @@ def process_report_run(request, handle):
# just give it, perhaps in a new tab
from django.http import HttpResponse
response = HttpResponse(mimetype="text/html")
content = "".join(open(filename).readlines())
response._set_content(content)
for line in open(filename):
response.write(line)
return response
else:
return send_file(request, filename, mimetype)
@ -1474,9 +1474,15 @@ def process_json_request(request):
"""
Process an Ajax/Json query request.
"""
import gramps.gen.lib
from gramps.gen.proxy import PrivateProxyDb, LivingProxyDb
db = DbDjango()
if not request.user.is_authenticated():
response_data = {"results": [], "total": 0}
return HttpResponse(simplejson.dumps(response_data), mimetype="application/json")
db = PrivateProxyDb(db)
db = LivingProxyDb(db,
LivingProxyDb.MODE_INCLUDE_LAST_NAME_ONLY,
None, # current year
1) # years after death
field = request.GET.get("field", None)
query = request.GET.get("q", "")
page = int(request.GET.get("p", "1"))
@ -1485,40 +1491,30 @@ def process_json_request(request):
q, order, terms = build_person_query(request, query)
q &= Q(person__gender_type__name="Female")
matches = Name.objects.filter(q).order_by(*order)
response_data = {"results": [], "total": len(matches)}
for match in matches[(page - 1) * size:page * size]:
response_data["results"].append(
{"id": match.person.handle,
"name": match.get_selection_string(),
})
class_type = gramps.gen.lib.Person
handle_expr = "match.person.handle"
elif field == "father":
q, order, terms = build_person_query(request, query)
q &= Q(person__gender_type__name="Male")
matches = Name.objects.filter(q).order_by(*order)
response_data = {"results": [], "total": len(matches)}
for match in matches[(page - 1) * size:page * size]:
response_data["results"].append(
{"id": match.person.handle,
"name": match.get_selection_string(),
})
class_type = gramps.gen.lib.Person
handle_expr = "match.person.handle"
elif field == "person":
q, order, terms = build_person_query(request, query)
matches = Name.objects.filter(q).order_by(*order)
response_data = {"results": [], "total": len(matches)}
for match in matches[(page - 1) * size:page * size]:
response_data["results"].append(
{"id": match.person.handle,
"name": match.get_selection_string(),
})
class_type = gramps.gen.lib.Person
handle_expr = "match.person.handle"
elif field == "place":
q, order, terms = build_place_query(request, query)
matches = Place.objects.filter(q).order_by(*order)
response_data = {"results": [], "total": len(matches)}
for match in matches[(page - 1) * size:page * size]:
response_data["results"].append(
{"id": match.handle,
"name": match.get_selection_string(),
})
class_type = gramps.gen.lib.Place
handle_expr = "match.handle"
else:
raise Exception("""Invalid field: '%s'; Example: /json/?field=mother&q=Smith&p=1&size=10""" % field)
## ------------
response_data = {"results": [], "total": len(matches)}
for match in matches[(page - 1) * size:page * size]:
obj = db.get_from_name_and_handle(class_type.__name__, eval(handle_expr))
if obj:
response_data["results"].append(obj.to_struct())
return HttpResponse(simplejson.dumps(response_data), mimetype="application/json")

View File

@ -151,7 +151,7 @@ for table, entries in [("grampsdb.config",
(("name", '"Gramps package (portable XML) Import"'),
('gramps_id', '"R0019"'),
("handle", '"im_gpkg"'),
("options", '"iff=gramps\\ni=http://sourceforge.net/p/gramps/source/ci/master/tree/example/gramps/example.gramps"'),
("options", '"iff=gramps\\ni=http://sourceforge.net/p/gramps/source/ci/master/tree/example/gramps/example.gramps?format=raw"'),
("report_type", '"import"')),
])]:
entry_count = 0

View File

@ -64,6 +64,13 @@ from gramps.gen.utils.file import fix_encoding
# OR
# gperson = dbdjango.DbDjango().get_person_from_handle(handle)
def check_diff(item, raw):
encoded = base64.encodestring(pickle.dumps(raw))
if item.cache != encoded:
print("Different:", item.__class__.__name__, item.gramps_id)
print("raw :", raw)
print("cache:", item.from_cache())
#-------------------------------------------------------------------------
#
# Import functions
@ -922,7 +929,7 @@ class DjangoInterface(object):
last_changed=todate(changed),
confidence=confidence,
page=page)
citation.save()
citation.save(save_cache=False)
def add_citation_detail(self, citation_data):
(handle, gid, date, page, confidence, source_handle, note_list,
@ -941,12 +948,12 @@ class DjangoInterface(object):
return
citation.source = source
self.add_date(citation, date)
citation.cache = self.encode_raw(citation_data)
citation.save()
citation.save(save_cache=False)
self.add_note_list(citation, note_list)
self.add_media_ref_list(citation, media_list)
self.add_citation_attribute_list(citation, attribute_list)
self.add_tag_list(citation, tag_list)
citation.save_cache()
def add_child_ref_default(self, obj, child, frel=1, mrel=1, private=False):
object_type = ContentType.objects.get_for_model(obj) # obj is family
@ -1210,8 +1217,10 @@ class DjangoInterface(object):
str(parent_family_handle)), file=sys.stderr)
return
#person.parent_families.add(family)
pfo = models.MyParentFamilies(person=person, family=family,
order=len(models.MyParentFamilies.objects.filter(person=person)) + 1)
pfo = models.MyParentFamilies(
person=person,
family=family,
order=len(models.MyParentFamilies.objects.filter(person=person)) + 1)
pfo.save()
person.save()
@ -1309,8 +1318,7 @@ class DjangoInterface(object):
last_changed=todate(change),
private=private,
gender_type=models.get_type(models.GenderType, gender))
#person.cache = base64.encodestring(cPickle.dumps(data))
person.save()
person.save(save_cache=False)
def add_person_detail(self, data):
# Unpack from the BSDDB:
@ -1378,19 +1386,9 @@ class DjangoInterface(object):
if events:
person.death = events[0].ref_object
person.death_ref_index = lookup_role_index(models.EventType.DEATH, all_events)
person.cache = self.encode_raw(data)
person.save()
return person
def add_note_detail(self, data):
# Unpack from the BSDDB:
(handle, gid, styled_text, format, note_type,
change, tag_list, private) = data
note = models.Note.objects.get(handle=handle)
note.cache = self.encode_raw(data)
note.save()
self.add_tag_list(note, tag_list)
def save_note_markup(self, note, markup_list):
# delete any prexisting markup:
models.Markup.objects.filter(note=note).delete()
@ -1419,10 +1417,18 @@ class DjangoInterface(object):
preformatted=format,
text=text,
note_type=models.get_type(models.NoteType, note_type))
#n.cache = base64.encodestring(cPickle.dumps(data))
n.save()
n.save(save_cache=False)
self.save_note_markup(n, markup_list)
def add_note_detail(self, data):
# Unpack from the BSDDB:
(handle, gid, styled_text, format, note_type,
change, tag_list, private) = data
note = models.Note.objects.get(handle=handle)
note.save(save_cache=False)
self.add_tag_list(note, tag_list)
note.save_cache()
def add_family(self, data):
# Unpack from the BSDDB:
(handle, gid, father_handle, mother_handle,
@ -1434,8 +1440,7 @@ class DjangoInterface(object):
family_rel_type = models.get_type(models.FamilyRelType, the_type),
last_changed=todate(change),
private=private)
#family.cache = base64.encodestring(cPickle.dumps(data))
family.save()
family.save(save_cache=False)
def add_family_detail(self, data):
# Unpack from the BSDDB:
@ -1465,8 +1470,7 @@ class DjangoInterface(object):
print(("ERROR: Mother does not exist: '%s'" %
str(mother_handle)), file=sys.stderr)
family.mother = None
family.cache = self.encode_raw(data)
family.save()
family.save(save_cache=False)
self.add_child_ref_list(family, child_ref_list)
self.add_note_list(family, note_list)
self.add_attribute_list(family, attribute_list)
@ -1475,6 +1479,7 @@ class DjangoInterface(object):
self.add_event_ref_list(family, event_ref_list)
self.add_lds_list("family", family, lds_seal_list)
self.add_tag_list(family, tag_list)
family.save_cache()
def add_source(self, data):
(handle, gid, title,
@ -1489,8 +1494,7 @@ class DjangoInterface(object):
source = models.Source(handle=handle, gramps_id=gid, title=title,
author=author, pubinfo=pubinfo, abbrev=abbrev,
last_changed=todate(change), private=private)
#source.cache = base64.encodestring(cPickle.dumps(data))
source.save()
source.save(save_cache=False)
def add_source_detail(self, data):
(handle, gid, title,
@ -1508,13 +1512,13 @@ class DjangoInterface(object):
print(("ERROR: Source does not exist: '%s'" %
str(handle)), file=sys.stderr)
return
source.cache = self.encode_raw(data)
source.save()
source.save(save_cache=False)
self.add_note_list(source, note_list)
self.add_media_ref_list(source, media_list)
self.add_source_attribute_list(source, attribute_list)
self.add_repository_ref_list(source, reporef_list)
self.add_tag_list(source, tag_list)
source.save_cache()
def add_repository(self, data):
(handle, gid, the_type, name, note_list,
@ -1526,8 +1530,7 @@ class DjangoInterface(object):
private=private,
repository_type=models.get_type(models.RepositoryType, the_type),
name=name)
#repository.cache = base64.encodestring(cPickle.dumps(data))
repository.save()
repository.save(save_cache=False)
def add_repository_detail(self, data):
(handle, gid, the_type, name, note_list,
@ -1538,12 +1541,12 @@ class DjangoInterface(object):
print(("ERROR: Repository does not exist: '%s'" %
str(handle)), file=sys.stderr)
return
repository.cache = self.encode_raw(data)
repository.save()
repository.save(save_cache=False)
self.add_note_list(repository, note_list)
self.add_url_list("repository", repository, url_list)
self.add_address_list("repository", repository, address_list)
self.add_tag_list(repository, tag_list)
repository.save_cache()
def add_location(self, field, obj, location_data, order):
# location now has 8 items
@ -1607,7 +1610,10 @@ class DjangoInterface(object):
code=code,
last_changed=todate(change),
private=private)
place.save()
try:
place.save(save_cache=False)
except:
print("FIXME: error in saving place")
def add_place_detail(self, data):
(handle, gid, title, long, lat,
@ -1629,8 +1635,7 @@ class DjangoInterface(object):
print(("ERROR: Place does not exist: '%s'" %
str(handle)), file=sys.stderr)
return
place.cache = self.encode_raw(data)
place.save()
place.save(save_cache=False)
self.add_url_list("place", place, url_list)
self.add_media_ref_list(place, media_list)
self.add_citation_list(place, citation_list)
@ -1641,16 +1646,7 @@ class DjangoInterface(object):
for loc_data in alt_location_list:
self.add_location("place", place, loc_data, count)
count + 1
def add_tag_detail(self, data):
(handle,
name,
color,
priority,
change) = data
tag = models.Tag.objects.get(handle=handle)
tag.cache = self.encode_raw(data)
tag.save()
place.save_cache()
def add_tag(self, data):
(handle,
@ -1664,8 +1660,17 @@ class DjangoInterface(object):
color=color,
priority=priority,
last_changed=todate(change))
tag.save()
tag.save(save_cache=False)
def add_tag_detail(self, data):
(handle,
name,
color,
priority,
change) = data
tag = models.Tag.objects.get(handle=handle)
tag.save()
def add_media(self, data):
(handle, gid, path, mime, desc,
checksum,
@ -1680,9 +1685,8 @@ class DjangoInterface(object):
path=path, mime=mime, checksum=checksum,
desc=desc, last_changed=todate(change),
private=private)
#media.cache = base64.encodestring(cPickle.dumps(data))
self.add_date(media, date)
media.save()
media.save(save_cache=False)
def add_media_detail(self, data):
(handle, gid, path, mime, desc,
@ -1700,12 +1704,12 @@ class DjangoInterface(object):
print(("ERROR: Media does not exist: '%s'" %
str(handle)), file=sys.stderr)
return
media.cache = self.encode_raw(data)
media.save()
media.save(save_cache=False)
self.add_note_list(media, note_list)
self.add_citation_list(media, citation_list)
self.add_attribute_list(media, attribute_list)
self.add_tag_list(media, tag_list)
media.save_cache()
def add_event(self, data):
(handle, gid, the_type, date, description, place_handle,
@ -1717,9 +1721,8 @@ class DjangoInterface(object):
private=private,
description=description,
last_changed=todate(change))
#event.cache = base64.encodestring(cPickle.dumps(data))
self.add_date(event, date)
event.save()
event.save(save_cache=False)
def add_event_detail(self, data):
(handle, gid, the_type, date, description, place_handle,
@ -1738,13 +1741,13 @@ class DjangoInterface(object):
print(("ERROR: Place does not exist: '%s'" %
str(place_handle)), file=sys.stderr)
event.place = place
event.cache = self.encode_raw(data)
event.save()
event.save(save_cache=False)
self.add_note_list(event, note_list)
self.add_attribute_list(event, attribute_list)
self.add_media_ref_list(event, media_list)
self.add_citation_list(event, citation_list)
self.add_tag_list(event, tag_list)
event.save_cache()
def get_raw(self, item):
"""
@ -1772,101 +1775,6 @@ class DjangoInterface(object):
raise Exception("Don't know how to get raw '%s'" % type(item))
return raw
def reset_cache(self, item):
"""
Resets the cache version of an object, but doesn't save it to the database.
"""
item.cache = self.get_cache(item)
def encode_raw(self, raw):
return base64.encodestring(pickle.dumps(raw))
def get_cache(self, item):
"""
Gets the cache version of an object.
"""
raw = self.get_raw(item)
return base64.encodestring(pickle.dumps(raw))
def rebuild_cache(self, item):
"""
Resets the cache version of an object, and saves it to the database.
"""
self.update_public(item, save=False)
self.reset_cache(item)
item.save()
@transaction.commit_on_success
def rebuild_caches(self, callback=None):
"""
Call this to rebuild the caches for all primary models.
"""
if not isinstance(callback, collections.Callable):
callback = lambda percent: None # dummy
callback(0)
count = 0.0
total = (self.Note.all().count() +
self.Person.all().count() +
self.Event.all().count() +
self.Family.all().count() +
self.Repository.all().count() +
self.Place.all().count() +
self.Media.all().count() +
self.Source.all().count() +
self.Citation.all().count() +
self.Tag.all().count())
for item in self.Note.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Person.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Family.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Source.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Event.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Repository.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Place.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Media.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Citation.all():
self.rebuild_cache(item)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Tag.all():
self.rebuild_cache(item)
count += 1
callback(100)
def check_caches(self, callback=None):
"""
Call this to check the caches for all primary models.
@ -1889,71 +1797,62 @@ class DjangoInterface(object):
for item in self.Note.all():
raw = self.get_note(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Person.all():
raw = self.get_person(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Family.all():
raw = self.get_family(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Source.all():
raw = self.get_source(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Event.all():
raw = self.get_event(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Repository.all():
raw = self.get_repository(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Place.all():
raw = self.get_place(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Media.all():
raw = self.get_media(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
encoded = base64.encodestring(pickle.dumps(raw))
count += 1
callback(100 * (count/total if total else 0))
for item in self.Citation.all():
raw = self.get_citation(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100 * (count/total if total else 0))
for item in self.Tag.all():
raw = self.get_tag(item)
if item.cache == base64.encodestring(pickle.dumps(raw)):
print("Different!", item)
check_diff(item, raw)
count += 1
callback(100)
@ -2066,11 +1965,20 @@ class DjangoInterface(object):
if obj.public != public:
obj.public = public
if save:
print("Updating public:", obj.__class__.__name__, obj.gramps_id)
obj.save()
#log = self.Log()
#log.referenced_by = obj
#log.object_id = obj.id
#log.object_type = obj_type
#log.log_type = "update public status"
#log.reason = reason
#log.order = 0
#log.save()
def update_publics(self, callback=None):
"""
Call this to check the caches for all primary models.
Call this to update probably_alive for all primary models.
"""
if not isinstance(callback, collections.Callable):
callback = lambda percent: None # dummy

View File

@ -92,10 +92,6 @@ def import_file(db, filename, user):
db.prepare_import()
retval = import_function(db, filename, user)
db.commit_import()
# FIXME: need to call probably_alive
for person in Person.objects.all():
person.probably_alive = not bool(person.death)
person.save()
return retval
return False

View File

@ -364,13 +364,13 @@ def make_image_button2(button, text, url, kwargs="", last=""):
elif button == "?": # edit
filename = "/images/text-editor.png"
elif button == "add child to existing family":
filename = "/images/scalable/gramps-parents-open.svg"
filename = "/images/gramps-parents-open.png"
elif button == "add child to new family":
filename = "/images/scalable/gramps-parents-add.svg"
filename = "/images/gramps-parents-add.png"
elif button == "add spouse to existing family":
filename = "/images/scalable/add-parent-existing-family.svg"
filename = "/images/add-parent-existing-family.png"
elif button == "add spouse to new family":
filename = "/images/scalable/gramps-parents.svg"
filename = "/images/gramps-parents.png"
return cuni("""<img height="22" width="22" alt="%s" title="%s" src="%s" onmouseover="buttonOver(this)" onmouseout="buttonOut(this)" onclick="document.location.href='%s%s%s'" style="background-color: lightgray; border: 1px solid lightgray; border-radius:5px; margin: 0px 1px; padding: 1px;" />""") % (text, text, filename, url, kwargs, last)
def event_table(obj, user, act, url, args):

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
images/gramps-parents.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB