Database backends: bsddb, django, and dictionary
This commit is contained in:
parent
73886e9232
commit
ca88f37bb6
@ -225,7 +225,7 @@ class CLIDbManager(object):
|
||||
"""
|
||||
print(_('Import finished...'))
|
||||
|
||||
def create_new_db_cli(self, title=None, create_db=True):
|
||||
def create_new_db_cli(self, title=None, create_db=True, dbid=None):
|
||||
"""
|
||||
Create a new database.
|
||||
"""
|
||||
@ -244,8 +244,9 @@ class CLIDbManager(object):
|
||||
|
||||
if create_db:
|
||||
# write the version number into metadata
|
||||
|
||||
newdb = self.dbstate.make_database("bsddb")
|
||||
if dbid is None:
|
||||
dbid = "bsddb"
|
||||
newdb = self.dbstate.make_database(dbid)
|
||||
newdb.write_version(new_path)
|
||||
|
||||
(tval, last) = time_val(new_path)
|
||||
@ -254,11 +255,11 @@ class CLIDbManager(object):
|
||||
last, tval, False, ""))
|
||||
return new_path, title
|
||||
|
||||
def _create_new_db(self, title=None):
|
||||
def _create_new_db(self, title=None, dbid=None):
|
||||
"""
|
||||
Create a new database, do extra stuff needed
|
||||
"""
|
||||
return self.create_new_db_cli(title)
|
||||
return self.create_new_db_cli(title, dbid=dbid)
|
||||
|
||||
def import_new_db(self, filename, user):
|
||||
"""
|
||||
|
@ -72,7 +72,7 @@ from gramps.gen.const import GRAMPS_LOCALE as glocale
|
||||
_ = glocale.translation.gettext
|
||||
from gramps.gen.const import URL_WIKISTRING
|
||||
from .user import User
|
||||
from .dialog import ErrorDialog, QuestionDialog, QuestionDialog2
|
||||
from .dialog import ErrorDialog, QuestionDialog, QuestionDialog2, ICON
|
||||
from .pluginmanager import GuiPluginManager
|
||||
from gramps.cli.clidbman import CLIDbManager, NAME_FILE, time_val
|
||||
from .ddtargets import DdTargets
|
||||
@ -80,7 +80,6 @@ from gramps.gen.recentfiles import rename_filename, remove_filename
|
||||
from .glade import Glade
|
||||
from gramps.gen.db.exceptions import DbException
|
||||
|
||||
|
||||
_RETURN = Gdk.keyval_from_name("Return")
|
||||
_KP_ENTER = Gdk.keyval_from_name("KP_Enter")
|
||||
|
||||
@ -104,6 +103,25 @@ STOCK_COL = 6
|
||||
|
||||
RCS_BUTTON = { True : _('_Extract'), False : _('_Archive') }
|
||||
|
||||
class DatabaseDialog(Gtk.MessageDialog):
|
||||
def __init__(self, parent=None):
|
||||
Gtk.MessageDialog.__init__(self,
|
||||
parent,
|
||||
flags=Gtk.DialogFlags.MODAL,
|
||||
type=Gtk.MessageType.QUESTION,
|
||||
)
|
||||
self.set_icon(ICON)
|
||||
self.set_title('')
|
||||
|
||||
self.set_markup('<span size="larger" weight="bold">%s</span>' %
|
||||
_('Database Backend'))
|
||||
self.format_secondary_text(
|
||||
_("Please select a database backend type"))
|
||||
|
||||
self.add_button("BSDDB Database (standard)", 1)
|
||||
self.add_button("Dictionary (in-memory)", 2)
|
||||
self.add_button("Django Database", 3)
|
||||
|
||||
class DbManager(CLIDbManager):
|
||||
"""
|
||||
Database Manager. Opens a database manager window that allows users to
|
||||
@ -765,19 +783,27 @@ class DbManager(CLIDbManager):
|
||||
message.
|
||||
"""
|
||||
self.new.set_sensitive(False)
|
||||
# popup window and ask for dbid types, if more than one
|
||||
## FIXME: autoload from plugins
|
||||
dbid = "bsddb"
|
||||
d = DatabaseDialog(self.top)
|
||||
database = d.run()
|
||||
d.destroy()
|
||||
if database >= 0:
|
||||
dbid = {1:"bsddb",2:"dictionarydb",3:"djangodb"}[database]
|
||||
try:
|
||||
self._create_new_db()
|
||||
self._create_new_db(dbid=dbid)
|
||||
except (OSError, IOError) as msg:
|
||||
DbManager.ERROR(_("Could not create Family Tree"),
|
||||
str(msg))
|
||||
self.new.set_sensitive(True)
|
||||
|
||||
def _create_new_db(self, title=None, create_db=True):
|
||||
def _create_new_db(self, title=None, create_db=True, dbid=None):
|
||||
"""
|
||||
Create a new database, append to model
|
||||
"""
|
||||
new_path, title = self.create_new_db_cli(conv_to_unicode(title, 'utf8'),
|
||||
create_db)
|
||||
create_db, dbid)
|
||||
path_name = os.path.join(new_path, NAME_FILE)
|
||||
(tval, last) = time_val(new_path)
|
||||
node = self.model.append(None, [title, new_path, path_name,
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps Modules
|
||||
# Python Modules
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
import pickle
|
||||
@ -29,7 +29,15 @@ import base64
|
||||
import time
|
||||
import re
|
||||
import os
|
||||
import logging
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps Modules
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
from gramps.gen.db import DbReadBase, DbWriteBase, DbTxn, KEY_TO_NAME_MAP
|
||||
from gramps.gen.db.dbconst import *
|
||||
from gramps.gen.utils.callback import Callback
|
||||
from gramps.gen.updatecallback import UpdateCallback
|
||||
from gramps.gen.db import (PERSON_KEY,
|
||||
@ -56,6 +64,8 @@ from gramps.gen.lib.repo import Repository
|
||||
from gramps.gen.lib.note import Note
|
||||
from gramps.gen.lib.tag import Tag
|
||||
|
||||
_LOG = logging.getLogger(DBLOGNAME)
|
||||
|
||||
class Environment(object):
|
||||
"""
|
||||
Implements the Environment API.
|
||||
@ -1612,3 +1622,11 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
|
||||
def undo(self, update_history=True):
|
||||
pass
|
||||
|
||||
def write_version(self, directory):
|
||||
"""Write files for a newly created DB."""
|
||||
versionpath = os.path.join(directory, str(DBBACKEND))
|
||||
_LOG.debug("Write database backend file to 'dictionarydb'")
|
||||
with open(versionpath, "w") as version_file:
|
||||
version_file.write("dictionarydb")
|
||||
|
||||
|
@ -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 = {}
|
BIN
gramps/plugins/database/django_support/defaults/sqlite.db
Normal file
BIN
gramps/plugins/database/django_support/defaults/sqlite.db
Normal file
Binary file not shown.
@ -30,6 +30,9 @@ import re
|
||||
import base64
|
||||
import pickle
|
||||
import os
|
||||
import logging
|
||||
import shutil
|
||||
from django.db import transaction
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
@ -53,13 +56,13 @@ from gramps.gen.db import (PERSON_KEY,
|
||||
REPOSITORY_KEY,
|
||||
NOTE_KEY)
|
||||
from gramps.gen.utils.id import create_id
|
||||
from django.db import transaction
|
||||
from gramps.gen.db.dbconst import *
|
||||
|
||||
## add this directory to sys path, so we can find django_support later:
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
_LOG = logging.getLogger(DBLOGNAME)
|
||||
|
||||
class Environment(object):
|
||||
"""
|
||||
Implements the Environment API.
|
||||
@ -2041,3 +2044,17 @@ class DbDjango(DbWriteBase, DbReadBase, UpdateCallback, Callback):
|
||||
|
||||
def restore(self):
|
||||
pass
|
||||
|
||||
def write_version(self, directory):
|
||||
"""Write files for a newly created DB."""
|
||||
versionpath = os.path.join(directory, str(DBBACKEND))
|
||||
_LOG.debug("Write database backend file to 'djangodb'")
|
||||
with open(versionpath, "w") as version_file:
|
||||
version_file.write("djangodb")
|
||||
# Write default_settings, sqlite.db
|
||||
defaults = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
"django_support", "defaults")
|
||||
_LOG.debug("Copy defaults from: " + defaults)
|
||||
for filename in os.listdir(defaults):
|
||||
fullpath = os.path.abspath(os.path.join(defaults, filename))
|
||||
shutil.copy2(fullpath, directory)
|
||||
|
Loading…
Reference in New Issue
Block a user