Webapp: added databases directory; changed semantics of save_cache;

working signals, for the most part
This commit is contained in:
Doug Blank 2015-05-11 12:36:35 -04:00
parent 03b78a0884
commit 89e20b90b7
9 changed files with 480 additions and 39 deletions

View File

View File

@ -0,0 +1,34 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2012 Douglas S. Blank <doug.blank@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
from django.conf import settings
from . import default_settings
try:
settings.configure(default_settings)
except RuntimeError:
# already configured; ignore
pass
from gramps.webapp.dbdjango import DbDjango
database = DbDjango()
# For Django 1.6:
import django
django.setup()

View File

@ -0,0 +1,150 @@
import os
from gramps.gen.const import DATA_DIR
WEB_DIR = os.path.dirname(os.path.realpath(__file__))
DEBUG = True
TEMPLATE_DEBUG = DEBUG
INTERNAL_IPS = ('127.0.0.1',)
ADMINS = (
('admin', 'your_email@domain.com'),
)
MANAGERS = ADMINS
DATABASE_ROUTERS = []
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(WEB_DIR, 'sqlite.db'),
}
}
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = os.path.join(WEB_DIR, 'sqlite.db')
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
TIME_ZONE = 'America/New_York'
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
USE_I18N = True
MEDIA_ROOT = ''
MEDIA_URL = ''
ADMIN_MEDIA_PREFIX = '/gramps-media/'
SECRET_KEY = 'zd@%vslj5sqhx94_8)0hsx*rk9tj3^ly$x+^*tq4bggr&uh$ac'
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader', # 1.4
'django.template.loaders.app_directories.Loader', # 1.4
#'django.template.loaders.filesystem.load_template_source',
#'django.template.loaders.app_directories.load_template_source',
)
MIDDLEWARE_CLASSES = (
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# 'debug_toolbar.middleware.DebugToolbarMiddleware',
)
ROOT_URLCONF = 'gramps.webapp.urls'
STATIC_URL = '/static/' # 1.4
TEMPLATE_DIRS = (
# Use absolute paths, not relative paths.
os.path.join(DATA_DIR, "templates"),
)
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth", # 1.4
"django.contrib.messages.context_processors.messages", # 1.4
# "django.core.context_processors.auth",
# "django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"gramps.webapp.grampsdb.views.context_processor",
"gramps.webapp.context.messages",
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.staticfiles',
'django.contrib.messages', # 1.4
'django.contrib.sites',
'django.contrib.admin',
'gramps.webapp.grampsdb',
# 'django_extensions',
# 'debug_toolbar',
)
DEBUG_TOOLBAR_PANELS = (
'debug_toolbar.panels.version.VersionDebugPanel',
'debug_toolbar.panels.timer.TimerDebugPanel',
'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
'debug_toolbar.panels.headers.HeaderDebugPanel',
'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
'debug_toolbar.panels.template.TemplateDebugPanel',
'debug_toolbar.panels.sql.SQLDebugPanel',
'debug_toolbar.panels.signals.SignalDebugPanel',
'debug_toolbar.panels.logger.LoggingPanel',
)
def custom_show_toolbar(request):
return True # Always show toolbar, for example purposes only.
DEBUG_TOOLBAR_CONFIG = {
'INTERCEPT_REDIRECTS': False,
# 'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar,
# 'EXTRA_SIGNALS': ['myproject.signals.MySignal'],
'HIDE_DJANGO_SQL': False,
}
AUTH_PROFILE_MODULE = "grampsdb.Profile"
# Had to add these to use settings.configure():
DATABASE_OPTIONS = ''
URL_VALIDATOR_USER_AGENT = ''
DEFAULT_INDEX_TABLESPACE = ''
DEFAULT_TABLESPACE = ''
CACHE_BACKEND = 'locmem://'
TRANSACTIONS_MANAGED = False
LOCALE_PATHS = tuple()
# Changes for Django 1.3:
USE_L10N = True
FORMAT_MODULE_PATH = ""
## End Changes for Django 1.3
# Changes for Django 1.4:
USE_TZ = False
## End Changes for Django 1.4
# Changes for Django 1.5:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
DEFAULT_CHARSET = "utf-8"
## End Changes for Django 1.5
## Changes for Django 1.5.4:
LOGGING_CONFIG = None
AUTH_USER_MODEL = 'auth.User'
## End Changes for Django 1.5.4
LOGIN_URL = "/login/"
LOGOUT_URL = "/logout"
LOGIN_REDIRECT_URL = "/"
## Changes for Django 1.6:
LOGGING = None
## Changes for Django 1.7.1:
ABSOLUTE_URL_OVERRIDES = {}

Binary file not shown.

View File

@ -0,0 +1,34 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2012 Douglas S. Blank <doug.blank@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
from django.conf import settings
from . import default_settings
try:
settings.configure(default_settings)
except RuntimeError:
# already configured; ignore
pass
from gramps.webapp.dbdjango import DbDjango
database = DbDjango()
# For Django 1.6:
import django
django.setup()

View File

@ -0,0 +1,150 @@
import os
from gramps.gen.const import DATA_DIR
WEB_DIR = os.path.dirname(os.path.realpath(__file__))
DEBUG = True
TEMPLATE_DEBUG = DEBUG
INTERNAL_IPS = ('127.0.0.1',)
ADMINS = (
('admin', 'your_email@domain.com'),
)
MANAGERS = ADMINS
DATABASE_ROUTERS = []
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(WEB_DIR, 'sqlite.db'),
}
}
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = os.path.join(WEB_DIR, 'sqlite.db')
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
TIME_ZONE = 'America/New_York'
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
USE_I18N = True
MEDIA_ROOT = ''
MEDIA_URL = ''
ADMIN_MEDIA_PREFIX = '/gramps-media/'
SECRET_KEY = 'zd@%vslj5sqhx94_8)0hsx*rk9tj3^ly$x+^*tq4bggr&uh$ac'
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader', # 1.4
'django.template.loaders.app_directories.Loader', # 1.4
#'django.template.loaders.filesystem.load_template_source',
#'django.template.loaders.app_directories.load_template_source',
)
MIDDLEWARE_CLASSES = (
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# 'debug_toolbar.middleware.DebugToolbarMiddleware',
)
ROOT_URLCONF = 'gramps.webapp.urls'
STATIC_URL = '/static/' # 1.4
TEMPLATE_DIRS = (
# Use absolute paths, not relative paths.
os.path.join(DATA_DIR, "templates"),
)
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth", # 1.4
"django.contrib.messages.context_processors.messages", # 1.4
# "django.core.context_processors.auth",
# "django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"gramps.webapp.grampsdb.views.context_processor",
"gramps.webapp.context.messages",
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.staticfiles',
'django.contrib.messages', # 1.4
'django.contrib.sites',
'django.contrib.admin',
'gramps.webapp.grampsdb',
# 'django_extensions',
# 'debug_toolbar',
)
DEBUG_TOOLBAR_PANELS = (
'debug_toolbar.panels.version.VersionDebugPanel',
'debug_toolbar.panels.timer.TimerDebugPanel',
'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
'debug_toolbar.panels.headers.HeaderDebugPanel',
'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
'debug_toolbar.panels.template.TemplateDebugPanel',
'debug_toolbar.panels.sql.SQLDebugPanel',
'debug_toolbar.panels.signals.SignalDebugPanel',
'debug_toolbar.panels.logger.LoggingPanel',
)
def custom_show_toolbar(request):
return True # Always show toolbar, for example purposes only.
DEBUG_TOOLBAR_CONFIG = {
'INTERCEPT_REDIRECTS': False,
# 'SHOW_TOOLBAR_CALLBACK': custom_show_toolbar,
# 'EXTRA_SIGNALS': ['myproject.signals.MySignal'],
'HIDE_DJANGO_SQL': False,
}
AUTH_PROFILE_MODULE = "grampsdb.Profile"
# Had to add these to use settings.configure():
DATABASE_OPTIONS = ''
URL_VALIDATOR_USER_AGENT = ''
DEFAULT_INDEX_TABLESPACE = ''
DEFAULT_TABLESPACE = ''
CACHE_BACKEND = 'locmem://'
TRANSACTIONS_MANAGED = False
LOCALE_PATHS = tuple()
# Changes for Django 1.3:
USE_L10N = True
FORMAT_MODULE_PATH = ""
## End Changes for Django 1.3
# Changes for Django 1.4:
USE_TZ = False
## End Changes for Django 1.4
# Changes for Django 1.5:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
DEFAULT_CHARSET = "utf-8"
## End Changes for Django 1.5
## Changes for Django 1.5.4:
LOGGING_CONFIG = None
AUTH_USER_MODEL = 'auth.User'
## End Changes for Django 1.5.4
LOGIN_URL = "/login/"
LOGOUT_URL = "/logout"
LOGIN_REDIRECT_URL = "/"
## Changes for Django 1.6:
LOGGING = None
## Changes for Django 1.7.1:
ABSOLUTE_URL_OVERRIDES = {}

Binary file not shown.

View File

@ -21,12 +21,20 @@
#------------------------------------------------------------------------
#
# Gramps Modules
# Python Modules
#
#------------------------------------------------------------------------
import sys
import time
import re
import base64
import pickle
#------------------------------------------------------------------------
#
# Gramps Modules
#
#------------------------------------------------------------------------
import gramps
from gramps.gen.lib import (Person, Family, Event, Place, Repository,
Citation, Source, Note, MediaObject, Tag,
@ -424,6 +432,16 @@ class DbDjango(DbWriteBase, DbReadBase):
def request_rebuild(self):
# caches are ok, but let's compute public's
self.dji.update_publics()
self.emit('person-rebuild')
self.emit('family-rebuild')
self.emit('place-rebuild')
self.emit('source-rebuild')
self.emit('citation-rebuild')
self.emit('media-rebuild')
self.emit('event-rebuild')
self.emit('repository-rebuild')
self.emit('note-rebuild')
self.emit('tag-rebuild')
def get_undodb(self):
return None
@ -1318,7 +1336,7 @@ class DbDjango(DbWriteBase, DbReadBase):
if not person.gramps_id and set_gid:
person.gramps_id = self.find_next_person_gramps_id()
self.commit_person(person, trans)
self.signal("person-add", [person.handle])
self.emit("person-add", [person.handle])
return person.handle
def add_family(self, family, trans, set_gid=True):
@ -1327,7 +1345,7 @@ class DbDjango(DbWriteBase, DbReadBase):
if not family.gramps_id and set_gid:
family.gramps_id = self.find_next_family_gramps_id()
self.commit_family(family, trans)
self.signal("family-add", [family.handle])
self.emit("family-add", [family.handle])
return family.handle
def add_citation(self, citation, trans, set_gid=True):
@ -1336,7 +1354,7 @@ class DbDjango(DbWriteBase, DbReadBase):
if not citation.gramps_id and set_gid:
citation.gramps_id = self.find_next_citation_gramps_id()
self.commit_citation(citation, trans)
self.signal("citation-add", [citation.handle])
self.emit("citation-add", [citation.handle])
return citation.handle
def add_source(self, source, trans, set_gid=True):
@ -1345,7 +1363,7 @@ class DbDjango(DbWriteBase, DbReadBase):
if not source.gramps_id and set_gid:
source.gramps_id = self.find_next_source_gramps_id()
self.commit_source(source, trans)
self.signal("source-add", [source.handle])
self.emit("source-add", [source.handle])
return source.handle
def add_repository(self, repository, trans, set_gid=True):
@ -1354,7 +1372,7 @@ class DbDjango(DbWriteBase, DbReadBase):
if not repository.gramps_id and set_gid:
repository.gramps_id = self.find_next_repository_gramps_id()
self.commit_repository(repository, trans)
self.signal("repository-add", [repository.handle])
self.emit("repository-add", [repository.handle])
return repository.handle
def add_note(self, note, trans, set_gid=True):
@ -1363,7 +1381,7 @@ class DbDjango(DbWriteBase, DbReadBase):
if not note.gramps_id and set_gid:
note.gramps_id = self.find_next_note_gramps_id()
self.commit_note(note, trans)
self.signal("note-add", [note.handle])
self.emit("note-add", [note.handle])
return note.handle
def add_place(self, place, trans, set_gid=True):
@ -1407,63 +1425,117 @@ class DbDjango(DbWriteBase, DbReadBase):
self.import_cache[person.handle] = person
else:
print("WARNING: haven't written logic to update")
self.signal("person-update", [person.handle])
raw = person.serialize()
dj_person = self.dji.Person.filter(handle=person.handle)[0]
dj_person.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_person.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("person-update", [person.handle])
def commit_family(self, family, trans, change_time=None):
if self.use_import_cache:
self.import_cache[family.handle] = family
else:
print("WARNING: haven't written logic to update")
self.signal("family-update", [family.handle])
raw = family.serialize()
dj_obj = self.dji.Family.filter(handle=family.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("family-update", [family.handle])
def commit_citation(self, citation, trans, change_time=None):
if self.use_import_cache:
self.import_cache[citation.handle] = citation
else:
print("WARNING: haven't written logic to update")
self.signal("citation-update", [citation.handle])
raw = citation.serialize()
dj_obj = self.dji.Citation.filter(handle=citation.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("citation-update", [citation.handle])
def commit_source(self, source, trans, change_time=None):
if self.use_import_cache:
self.import_cache[source.handle] = source
else:
print("WARNING: haven't written logic to update")
self.signal("source-update", [source.handle])
raw = source.serialize()
dj_obj = self.dji.Source.filter(handle=source.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("source-update", [source.handle])
def commit_repository(self, repository, trans, change_time=None):
if self.use_import_cache:
self.import_cache[repository.handle] = repository
else:
print("WARNING: haven't written logic to update")
self.signal("repository-update", [repository.handle])
raw = repository.serialize()
dj_obj = self.dji.Repository.filter(handle=repository.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("repository-update", [repository.handle])
def commit_note(self, note, trans, change_time=None):
if self.use_import_cache:
self.import_cache[note.handle] = note
else:
print("WARNING: haven't written logic to update")
self.signal("note-update", [note.handle])
raw = note.serialize()
dj_obj = self.dji.Note.filter(handle=note.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("note-update", [note.handle])
def commit_place(self, place, trans, change_time=None):
if self.use_import_cache:
self.import_cache[place.handle] = place
else:
print("WARNING: haven't written logic to update")
self.signal("place-update", [place.handle])
raw = place.serialize()
dj_obj = self.dji.Place.filter(handle=place.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("place-update", [place.handle])
def commit_event(self, event, trans, change_time=None):
if self.use_import_cache:
self.import_cache[event.handle] = event
else:
print("WARNING: haven't written logic to update")
self.signal("event-update", [event.handle])
raw = event.serialize()
dj_obj = self.dji.Event.filter(handle=event.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("event-update", [event.handle])
def commit_tag(self, tag, trans, change_time=None):
if self.use_import_cache:
self.import_cache[tag.handle] = tag
else:
print("WARNING: haven't written logic to update")
self.signal("tag-update", [tag.handle])
raw = tag.serialize()
dj_obj = self.dji.Tag.filter(handle=tag.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("tag-update", [tag.handle])
def commit_media_object(self, obj, transaction, change_time=None):
"""
@ -1474,7 +1546,13 @@ class DbDjango(DbWriteBase, DbReadBase):
self.import_cache[obj.handle] = obj
else:
print("WARNING: haven't written logic to update")
self.signal("media-update", [obj.handle])
raw = obj.serialize()
dj_obj = self.dji.Media.filter(handle=obj.handle)[0]
dj_obj.cache = str(base64.encodebytes(pickle.dumps(raw)), "utf-8")
dj_obj.save(save_cache=False) # don't generate the cache from Django objects
# FIXME: propagate changes to rest of Django object from cache
# How? Maybe delete and re-add?
self.emit("media-update", [obj.handle])
def get_gramps_ids(self, obj_key):
key2table = {
@ -1603,10 +1681,6 @@ class DbDjango(DbWriteBase, DbReadBase):
return False
def connect(self, signal, callback):
## citation-add
## citation-delete
## citation-rebuild
## citation-update
#print("Adding signal: ", signal)
if signal in self._signals:
self._signals[signal].append(callback)
@ -1618,12 +1692,15 @@ class DbDjango(DbWriteBase, DbReadBase):
if signal in self._signals:
del self._signals[signal]
def signal(self, sig, items):
def emit(self, sig, items=None):
#print("Firing signal: ", sig, items)
if self._signals_enabled:
if sig in self._signals:
for callback in self._signals[sig]:
callback(items)
if items:
callback(items)
else:
callback()
else:
print("WARNING: no such signal: ", sig)
@ -1808,43 +1885,43 @@ class DbDjango(DbWriteBase, DbReadBase):
# Removals:
def remove_person(self, handle, txn):
self.dji.Person.filter(handle=handle)[0].delete()
self.signal("person-delete", [handle])
self.emit("person-delete", [handle])
def remove_source(self, handle, transaction):
self.dji.Source.filter(handle=handle)[0].delete()
self.signal("source-delete", [handle])
self.emit("source-delete", [handle])
def remove_citation(self, handle, transaction):
self.dji.Citation.filter(handle=handle)[0].delete()
self.signal("citation-delete", [handle])
self.emit("citation-delete", [handle])
def remove_event(self, handle, transaction):
self.dji.Event.filter(handle=handle)[0].delete()
self.signal("event-delete", [handle])
self.emit("event-delete", [handle])
def remove_object(self, handle, transaction):
self.dji.Media.filter(handle=handle)[0].delete()
self.signal("media-delete", [handle])
self.emit("media-delete", [handle])
def remove_place(self, handle, transaction):
self.dji.Place.filter(handle=handle)[0].delete()
self.signal("place-delete", [handle])
self.emit("place-delete", [handle])
def remove_family(self, handle, transaction):
self.dji.Family.filter(handle=handle)[0].delete()
self.signal("family-delete", [handle])
self.emit("family-delete", [handle])
def remove_repository(self, handle, transaction):
self.dji.Repository.filter(handle=handle)[0].delete()
self.signal("repository-delete", [handle])
self.emit("repository-delete", [handle])
def remove_note(self, handle, transaction):
self.dji.Note.filter(handle=handle)[0].delete()
self.signal("note-delete", [handle])
self.emit("note-delete", [handle])
def remove_tag(self, handle, transaction):
self.dji.Tag.filter(handle=handle)[0].delete()
self.signal("tag-delete", [handle])
self.emit("tag-delete", [handle])
def remove_from_surname_list(self, person):
## FIXME

View File

@ -455,9 +455,7 @@ class Tag(models.Model):
if "save_cache" in kwargs:
save_cache = kwargs["save_cache"]
del kwargs["save_cache"]
if not save_cache:
self.cache = ""
else:
if save_cache:
self.cache = self.make_cache()
models.Model.save(self, *args, **kwargs) # save to db
@ -545,9 +543,7 @@ class PrimaryObject(models.Model):
if "save_cache" in kwargs:
save_cache = kwargs["save_cache"]
del kwargs["save_cache"]
if not save_cache:
self.cache = ""
else:
if save_cache:
self.cache = self.make_cache()
models.Model.save(self, *args, **kwargs) # save to db