diff --git a/gramps/cli/clidbman.py b/gramps/cli/clidbman.py index 7c77876f1..eb7a59ffa 100644 --- a/gramps/cli/clidbman.py +++ b/gramps/cli/clidbman.py @@ -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): """ diff --git a/gramps/gui/dbman.py b/gramps/gui/dbman.py index 60f28bb6f..d32e86ebb 100644 --- a/gramps/gui/dbman.py +++ b/gramps/gui/dbman.py @@ -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('%s' % + _('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) - try: - self._create_new_db() - except (OSError, IOError) as msg: - DbManager.ERROR(_("Could not create Family Tree"), - str(msg)) + # 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(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, diff --git a/gramps/plugins/database/dictionarydb.py b/gramps/plugins/database/dictionarydb.py index 647f6b0ee..936d8f534 100644 --- a/gramps/plugins/database/dictionarydb.py +++ b/gramps/plugins/database/dictionarydb.py @@ -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") + diff --git a/gramps/plugins/database/django_support/defaults/default_settings.py b/gramps/plugins/database/django_support/defaults/default_settings.py new file mode 100644 index 000000000..fae3ffd06 --- /dev/null +++ b/gramps/plugins/database/django_support/defaults/default_settings.py @@ -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 = {} diff --git a/gramps/plugins/database/django_support/defaults/sqlite.db b/gramps/plugins/database/django_support/defaults/sqlite.db new file mode 100644 index 000000000..a9ac911f0 Binary files /dev/null and b/gramps/plugins/database/django_support/defaults/sqlite.db differ diff --git a/gramps/plugins/database/djangodb.py b/gramps/plugins/database/djangodb.py index 56f40f5ac..e380c9601 100644 --- a/gramps/plugins/database/djangodb.py +++ b/gramps/plugins/database/djangodb.py @@ -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)