コード例 #1
0
ファイル: base.py プロジェクト: iMerica/dj-models
 def get_new_connection(self, conn_params):
     conn = super().get_new_connection(conn_params)
     # Enabling extension loading on the SQLite connection.
     try:
         conn.enable_load_extension(True)
     except AttributeError:
         raise ImproperlyConfigured(
             'SpatiaLite requires SQLite to be configured to allow '
             'extension loading.')
     # Load the SpatiaLite library extension on the connection.
     for path in self.lib_spatialite_paths:
         try:
             conn.load_extension(path)
         except Exception:
             if getattr(settings, 'SPATIALITE_LIBRARY_PATH', None):
                 raise ImproperlyConfigured(
                     'Unable to load the SpatiaLite library extension '
                     'as specified in your SPATIALITE_LIBRARY_PATH setting.'
                 )
             continue
         else:
             break
     else:
         raise ImproperlyConfigured(
             'Unable to load the SpatiaLite library extension. '
             'Library names tried: %s' %
             ', '.join(self.lib_spatialite_paths))
     return conn
コード例 #2
0
 def get_connection_params(self):
     settings_dict = self.settings_dict
     # None may be used to connect to the default 'postgres' db
     if settings_dict['NAME'] == '':
         raise ImproperlyConfigured(
             "settings.DATABASES is improperly configured. "
             "Please supply the NAME value.")
     if len(settings_dict['NAME'] or '') > self.ops.max_name_length():
         raise ImproperlyConfigured(
             "The database name '%s' (%d characters) is longer than "
             "PostgreSQL's limit of %d characters. Supply a shorter NAME "
             "in settings.DATABASES." % (
                 settings_dict['NAME'],
                 len(settings_dict['NAME']),
                 self.ops.max_name_length(),
             ))
     conn_params = {
         'database': settings_dict['NAME'] or 'postgres',
         **settings_dict['OPTIONS'],
     }
     conn_params.pop('isolation_level', None)
     if settings_dict['USER']:
         conn_params['user'] = settings_dict['USER']
     if settings_dict['PASSWORD']:
         conn_params['password'] = settings_dict['PASSWORD']
     if settings_dict['HOST']:
         conn_params['host'] = settings_dict['HOST']
     if settings_dict['PORT']:
         conn_params['port'] = settings_dict['PORT']
     return conn_params
コード例 #3
0
    def fixture_dirs(self):
        """
        Return a list of fixture directories.

        The list contains the 'fixtures' subdirectory of each installed
        application, if it exists, the directories in FIXTURE_DIRS, and the
        current directory.
        """
        dirs = []
        fixture_dirs = settings.FIXTURE_DIRS
        if len(fixture_dirs) != len(set(fixture_dirs)):
            raise ImproperlyConfigured(
                "settings.FIXTURE_DIRS contains duplicates.")
        for app_config in apps.get_app_configs():
            app_label = app_config.label
            app_dir = os.path.join(app_config.path, 'fixtures')
            if app_dir in fixture_dirs:
                raise ImproperlyConfigured(
                    "'%s' is a default fixture directory for the '%s' app "
                    "and cannot be listed in settings.FIXTURE_DIRS." %
                    (app_dir, app_label))

            if self.app_label and app_label != self.app_label:
                continue
            if os.path.isdir(app_dir):
                dirs.append(app_dir)
        dirs.extend(list(fixture_dirs))
        dirs.append('')
        dirs = [os.path.abspath(os.path.realpath(d)) for d in dirs]
        return dirs
コード例 #4
0
 def _path_from_module(self, module):
     """Attempt to determine app's filesystem path from its module."""
     # See #21874 for extended discussion of the behavior of this method in
     # various cases.
     # Convert paths to list because Python's _NamespacePath doesn't support
     # indexing.
     paths = list(getattr(module, '__path__', []))
     if len(paths) != 1:
         filename = getattr(module, '__file__', None)
         if filename is not None:
             paths = [os.path.dirname(filename)]
         else:
             # For unknown reasons, sometimes the list returned by __path__
             # contains duplicates that must be removed (#25246).
             paths = list(set(paths))
     if len(paths) > 1:
         raise ImproperlyConfigured(
             "The app module %r has multiple filesystem locations (%r); "
             "you must configure this app with an AppConfig subclass "
             "with a 'path' class attribute." % (module, paths))
     elif not paths:
         raise ImproperlyConfigured(
             "The app module %r has no filesystem location, "
             "you must configure this app with an AppConfig subclass "
             "with a 'path' class attribute." % (module, ))
     return paths[0]
コード例 #5
0
ファイル: base.py プロジェクト: iMerica/dj-models
 def check_settings(self):
     if self.settings_dict['TIME_ZONE'] is not None:
         if not settings.USE_TZ:
             raise ImproperlyConfigured(
                 "Connection '%s' cannot set TIME_ZONE because USE_TZ is "
                 "False." % self.alias)
         elif self.features.supports_timezones:
             raise ImproperlyConfigured(
                 "Connection '%s' cannot set TIME_ZONE because its engine "
                 "handles time zones conversions natively." % self.alias)
コード例 #6
0
ファイル: operations.py プロジェクト: iMerica/dj-models
 def spatial_version(self):
     """Determine the version of the SpatiaLite library."""
     try:
         version = self.spatialite_version_tuple()[1:]
     except Exception as exc:
         raise ImproperlyConfigured(
             'Cannot determine the SpatiaLite version for the "%s" database. '
             'Was the SpatiaLite initialization SQL loaded on this database?'
             % (self.connection.settings_dict['NAME'], )) from exc
     if version < (4, 1, 0):
         raise ImproperlyConfigured(
             'GeoDjango only supports SpatiaLite versions 4.1.0 and above.')
     return version
コード例 #7
0
ファイル: __init__.py プロジェクト: iMerica/dj-models
    def __init__(self, settings_module):
        # update this dict from global settings (but only for ALL_CAPS settings)
        for setting in dir(global_settings):
            if setting.isupper():
                setattr(self, setting, getattr(global_settings, setting))

        # store the settings module in case someone later cares
        self.SETTINGS_MODULE = settings_module

        mod = importlib.import_module(self.SETTINGS_MODULE)

        tuple_settings = (
            "INSTALLED_APPS",
            "TEMPLATE_DIRS",
            "LOCALE_PATHS",
        )
        self._explicit_settings = set()
        for setting in dir(mod):
            if setting.isupper():
                setting_value = getattr(mod, setting)

                if (setting in tuple_settings
                        and not isinstance(setting_value, (list, tuple))):
                    raise ImproperlyConfigured(
                        "The %s setting must be a list or a tuple. " % setting)
                setattr(self, setting, setting_value)
                self._explicit_settings.add(setting)

        if not self.SECRET_KEY:
            raise ImproperlyConfigured(
                "The SECRET_KEY setting must not be empty.")

        if self.is_overridden('DEFAULT_CONTENT_TYPE'):
            warnings.warn('The DEFAULT_CONTENT_TYPE setting is deprecated.',
                          RemovedInDjango30Warning)

        if hasattr(time, 'tzset') and self.TIME_ZONE:
            # When we can, attempt to validate the timezone. If we can't find
            # this file, no check happens and it's harmless.
            zoneinfo_root = Path('/usr/share/zoneinfo')
            zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split('/'))
            if zoneinfo_root.exists() and not zone_info_file.exists():
                raise ValueError("Incorrect timezone setting: %s" %
                                 self.TIME_ZONE)
            # Move the time zone info into os.environ. See ticket #2315 for why
            # we don't do this unconditionally (breaks Windows).
            os.environ['TZ'] = self.TIME_ZONE
            time.tzset()
コード例 #8
0
ファイル: utils.py プロジェクト: iMerica/dj-models
def load_backend(backend_name):
    """
    Return a database backend's "base" module given a fully qualified database
    backend name, or raise an error if it doesn't exist.
    """
    # This backend was renamed in Django 1.9.
    if backend_name == 'djmodels.db.backends.postgresql_psycopg2':
        backend_name = 'djmodels.db.backends.postgresql'

    try:
        return import_module('%s.base' % backend_name)
    except ImportError as e_user:
        # The database backend wasn't found. Display a helpful error message
        # listing all built-in database backends.
        backend_dir = str(Path(__file__).parent / 'backends')
        builtin_backends = [
            name for _, name, ispkg in pkgutil.iter_modules([backend_dir])
            if ispkg and name not in {'base', 'dummy', 'postgresql_psycopg2'}
        ]
        if backend_name not in ['djmodels.db.backends.%s' % b for b in builtin_backends]:
            backend_reprs = map(repr, sorted(builtin_backends))
            raise ImproperlyConfigured(
                "%r isn't an available database backend.\n"
                "Try using 'djmodels.db.backends.XXX', where XXX is one of:\n"
                "    %s" % (backend_name, ", ".join(backend_reprs))
            ) from e_user
        else:
            # If there's some other error, this must be an error in Django
            raise
コード例 #9
0
    def spatial_version(self):
        """Determine the version of the PostGIS library."""
        # Trying to get the PostGIS version because the function
        # signatures will depend on the version used.  The cost
        # here is a database query to determine the version, which
        # can be mitigated by setting `POSTGIS_VERSION` with a 3-tuple
        # comprising user-supplied values for the major, minor, and
        # subminor revision of PostGIS.
        if hasattr(settings, 'POSTGIS_VERSION'):
            version = settings.POSTGIS_VERSION
        else:
            # Run a basic query to check the status of the connection so we're
            # sure we only raise the error below if the problem comes from
            # PostGIS and not from PostgreSQL itself (see #24862).
            self._get_postgis_func('version')

            try:
                vtup = self.postgis_version_tuple()
            except ProgrammingError:
                raise ImproperlyConfigured(
                    'Cannot determine PostGIS version for database "%s" '
                    'using command "SELECT postgis_lib_version()". '
                    'GeoDjango requires at least PostGIS version 2.1. '
                    'Was the database created from a spatial database '
                    'template?' % self.connection.settings_dict['NAME']
                )
            version = vtup[1:]
        return version
コード例 #10
0
 def get_connection_params(self):
     settings_dict = self.settings_dict
     if not settings_dict['NAME']:
         raise ImproperlyConfigured(
             "settings.DATABASES is improperly configured. "
             "Please supply the NAME value.")
     kwargs = {
         'database': settings_dict['NAME'],
         'detect_types': Database.PARSE_DECLTYPES | Database.PARSE_COLNAMES,
         **settings_dict['OPTIONS'],
     }
     # Always allow the underlying SQLite connection to be shareable
     # between multiple threads. The safe-guarding will be handled at a
     # higher level by the `BaseDatabaseWrapper.allow_thread_sharing`
     # property. This is necessary as the shareability is disabled by
     # default in pysqlite and it cannot be changed once a connection is
     # opened.
     if 'check_same_thread' in kwargs and kwargs['check_same_thread']:
         warnings.warn(
             'The `check_same_thread` option was provided and set to '
             'True. It will be overridden with False. Use the '
             '`DatabaseWrapper.allow_thread_sharing` property instead '
             'for controlling thread shareability.', RuntimeWarning)
     kwargs.update({'check_same_thread': False, 'uri': True})
     return kwargs
コード例 #11
0
ファイル: base.py プロジェクト: iMerica/dj-models
 def get_connection_params(self):
     kwargs = {
         'conv': django_conversions,
         'charset': 'utf8',
     }
     settings_dict = self.settings_dict
     if settings_dict['USER']:
         kwargs['user'] = settings_dict['USER']
     if settings_dict['NAME']:
         kwargs['db'] = settings_dict['NAME']
     if settings_dict['PASSWORD']:
         kwargs['passwd'] = settings_dict['PASSWORD']
     if settings_dict['HOST'].startswith('/'):
         kwargs['unix_socket'] = settings_dict['HOST']
     elif settings_dict['HOST']:
         kwargs['host'] = settings_dict['HOST']
     if settings_dict['PORT']:
         kwargs['port'] = int(settings_dict['PORT'])
     # We need the number of potentially affected rows after an
     # "UPDATE", not the number of changed rows.
     kwargs['client_flag'] = CLIENT.FOUND_ROWS
     # Validate the transaction isolation level, if specified.
     options = settings_dict['OPTIONS'].copy()
     isolation_level = options.pop('isolation_level', 'read committed')
     if isolation_level:
         isolation_level = isolation_level.lower()
         if isolation_level not in self.isolation_levels:
             raise ImproperlyConfigured(
                 "Invalid transaction isolation level '%s' specified.\n"
                 "Use one of %s, or None." % (isolation_level, ', '.join(
                     "'%s'" % s for s in sorted(self.isolation_levels))))
     self.isolation_level = isolation_level
     kwargs.update(options)
     return kwargs
コード例 #12
0
ファイル: views.py プロジェクト: iMerica/dj-models
 def item_link(self, item):
     try:
         return item.get_absolute_url()
     except AttributeError:
         raise ImproperlyConfigured(
             'Give your %s class a get_absolute_url() method, or define an '
             'item_link() method in your Feed class.' %
             item.__class__.__name__)
コード例 #13
0
ファイル: sitemaps.py プロジェクト: iMerica/dj-models
 def items(self):
     if not django_apps.is_installed('djmodels.contrib.sites'):
         raise ImproperlyConfigured(
             "FlatPageSitemap requires djmodels.contrib.sites, which isn't installed."
         )
     Site = django_apps.get_model('sites.Site')
     current_site = Site.objects.get_current()
     return current_site.flatpage_set.filter(registration_required=False)
コード例 #14
0
ファイル: utils.py プロジェクト: iMerica/dj-models
def dependency_ordered(test_databases, dependencies):
    """
    Reorder test_databases into an order that honors the dependencies
    described in TEST[DEPENDENCIES].
    """
    ordered_test_databases = []
    resolved_databases = set()

    # Maps db signature to dependencies of all its aliases
    dependencies_map = {}

    # Check that no database depends on its own alias
    for sig, (_, aliases) in test_databases:
        all_deps = set()
        for alias in aliases:
            all_deps.update(dependencies.get(alias, []))
        if not all_deps.isdisjoint(aliases):
            raise ImproperlyConfigured(
                "Circular dependency: databases %r depend on each other, "
                "but are aliases." % aliases)
        dependencies_map[sig] = all_deps

    while test_databases:
        changed = False
        deferred = []

        # Try to find a DB that has all its dependencies met
        for signature, (db_name, aliases) in test_databases:
            if dependencies_map[signature].issubset(resolved_databases):
                resolved_databases.update(aliases)
                ordered_test_databases.append((signature, (db_name, aliases)))
                changed = True
            else:
                deferred.append((signature, (db_name, aliases)))

        if not changed:
            raise ImproperlyConfigured(
                "Circular dependency in TEST[DEPENDENCIES]")
        test_databases = deferred
    return ordered_test_databases
コード例 #15
0
ファイル: base.py プロジェクト: iMerica/dj-models
def _setup_environment(environ):
    # Cygwin requires some special voodoo to set the environment variables
    # properly so that Oracle will see them.
    if platform.system().upper().startswith('CYGWIN'):
        try:
            import ctypes
        except ImportError as e:
            raise ImproperlyConfigured("Error loading ctypes: %s; "
                                       "the Oracle backend requires ctypes to "
                                       "operate correctly under Cygwin." % e)
        kernel32 = ctypes.CDLL('kernel32')
        for name, value in environ:
            kernel32.SetEnvironmentVariableA(name, value)
    else:
        os.environ.update(environ)
コード例 #16
0
ファイル: utils.py プロジェクト: iMerica/dj-models
    def databases(self):
        if self._databases is None:
            self._databases = settings.DATABASES
        if self._databases == {}:
            self._databases = {
                DEFAULT_DB_ALIAS: {
                    'ENGINE': 'djmodels.db.backends.dummy',
                },
            }
        if self._databases[DEFAULT_DB_ALIAS] == {}:
            self._databases[DEFAULT_DB_ALIAS]['ENGINE'] = 'djmodels.db.backends.dummy'

        if DEFAULT_DB_ALIAS not in self._databases:
            raise ImproperlyConfigured("You must define a '%s' database" % DEFAULT_DB_ALIAS)
        return self._databases
コード例 #17
0
ファイル: __init__.py プロジェクト: iMerica/dj-models
    def _setup(self, name=None):
        """
        Load the settings module pointed to by the environment variable. This
        is used the first time settings are needed, if the user hasn't
        configured settings manually.
        """
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
        if not settings_module:
            desc = ("setting %s" % name) if name else "settings"
            raise ImproperlyConfigured(
                "Requested %s, but settings are not configured. "
                "You must either define the environment variable %s "
                "or call settings.configure() before accessing settings." %
                (desc, ENVIRONMENT_VARIABLE))

        self._wrapped = Settings(settings_module)
コード例 #18
0
    def prepare_sql_script(self, sql):
        """
        Take an SQL script that may contain multiple lines and return a list
        of statements to feed to successive cursor.execute() calls.

        Since few databases are able to process raw SQL scripts in a single
        cursor.execute() call and PEP 249 doesn't talk about this use case,
        the default implementation is conservative.
        """
        try:
            import sqlparse
        except ImportError:
            raise ImproperlyConfigured(
                "The sqlparse package is required if you don't split your SQL "
                "statements manually."
            )
        else:
            return [sqlparse.format(statement, strip_comments=True)
                    for statement in sqlparse.split(sql) if statement]
コード例 #19
0
ファイル: static.py プロジェクト: iMerica/dj-models
def static(prefix, view=serve, **kwargs):
    """
    Return a URL pattern for serving files in debug mode.

    from djmodels.conf import settings
    from djmodels.conf.urls.static import static

    urlpatterns = [
        # ... the rest of your URLconf goes here ...
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    """
    if not prefix:
        raise ImproperlyConfigured("Empty static prefix not permitted")
    elif not settings.DEBUG or urlsplit(prefix).netloc:
        # No-op if not in debug mode or a non-local prefix.
        return []
    return [
        re_path(r'^%s(?P<path>.*)$' % re.escape(prefix.lstrip('/')),
                view,
                kwargs=kwargs),
    ]
コード例 #20
0
ファイル: options.py プロジェクト: iMerica/dj-models
    def _prepare(self, model):
        if self.order_with_respect_to:
            # The app registry will not be ready at this point, so we cannot
            # use get_field().
            query = self.order_with_respect_to
            try:
                self.order_with_respect_to = next(
                    f for f in self._get_fields(reverse=False)
                    if f.name == query or f.attname == query
                )
            except StopIteration:
                raise FieldDoesNotExist("%s has no field named '%s'" % (self.object_name, query))

            self.ordering = ('_order',)
            if not any(isinstance(field, OrderWrt) for field in model._meta.local_fields):
                model.add_to_class('_order', OrderWrt())
        else:
            self.order_with_respect_to = None

        if self.pk is None:
            if self.parents:
                # Promote the first parent link in lieu of adding yet another
                # field.
                field = next(iter(self.parents.values()))
                # Look for a local field with the same name as the
                # first parent link. If a local field has already been
                # created, use it instead of promoting the parent
                already_created = [fld for fld in self.local_fields if fld.name == field.name]
                if already_created:
                    field = already_created[0]
                field.primary_key = True
                self.setup_pk(field)
                if not field.remote_field.parent_link:
                    raise ImproperlyConfigured(
                        'Add parent_link=True to %s.' % field,
                    )
            else:
                auto = AutoField(verbose_name='ID', primary_key=True, auto_created=True)
                model.add_to_class('id', auto)
コード例 #21
0
 def _check_connection(self, connection):
     # Make sure raster fields are used only on backends with raster support.
     if not connection.features.gis_enabled or not connection.features.supports_raster:
         raise ImproperlyConfigured(
             'Raster fields require backends with raster support.')
コード例 #22
0
ファイル: base.py プロジェクト: iMerica/dj-models
def complain(*args, **kwargs):
    raise ImproperlyConfigured("settings.DATABASES is improperly configured. "
                               "Please supply the ENGINE value. Check "
                               "settings documentation for more details.")
コード例 #23
0
ファイル: registry.py プロジェクト: iMerica/dj-models
    def populate(self, installed_apps=None):
        """
        Load application configurations and models.

        Import each application module and then each model module.

        It is thread-safe and idempotent, but not reentrant.
        """
        if self.ready:
            return

        # populate() might be called by two threads in parallel on servers
        # that create threads before initializing the WSGI callable.
        with self._lock:
            if self.ready:
                return

            # An RLock prevents other threads from entering this section. The
            # compare and set operation below is atomic.
            if self.loading:
                # Prevent reentrant calls to avoid running AppConfig.ready()
                # methods twice.
                raise RuntimeError("populate() isn't reentrant")
            self.loading = True

            # Phase 1: initialize app configs and import app modules.
            for entry in installed_apps:
                if isinstance(entry, AppConfig):
                    app_config = entry
                else:
                    app_config = AppConfig.create(entry)
                if app_config.label in self.app_configs:
                    raise ImproperlyConfigured(
                        "Application labels aren't unique, "
                        "duplicates: %s" % app_config.label)

                self.app_configs[app_config.label] = app_config
                app_config.apps = self

            # Check for duplicate app names.
            counts = Counter(app_config.name
                             for app_config in self.app_configs.values())
            duplicates = [
                name for name, count in counts.most_common() if count > 1
            ]
            if duplicates:
                raise ImproperlyConfigured("Application names aren't unique, "
                                           "duplicates: %s" %
                                           ", ".join(duplicates))

            self.apps_ready = True

            # Phase 2: import models modules.
            for app_config in self.app_configs.values():
                app_config.import_models()

            self.clear_cache()

            self.models_ready = True

            # Phase 3: run ready() methods of app configs.
            for app_config in self.get_app_configs():
                app_config.ready()

            self.ready = True
コード例 #24
0
    def create(cls, entry):
        """
        Factory that creates an app config from an entry in INSTALLED_APPS.
        """
        try:
            # If import_module succeeds, entry is a path to an app module,
            # which may specify an app config class with default_app_config.
            # Otherwise, entry is a path to an app config class or an error.
            module = import_module(entry)

        except ImportError:
            # Track that importing as an app module failed. If importing as an
            # app config class fails too, we'll trigger the ImportError again.
            module = None

            mod_path, _, cls_name = entry.rpartition('.')

            # Raise the original exception when entry cannot be a path to an
            # app config class.
            if not mod_path:
                raise

        else:
            try:
                # If this works, the app module specifies an app config class.
                entry = module.default_app_config
            except AttributeError:
                # Otherwise, it simply uses the default app config class.
                return cls(entry, module)
            else:
                mod_path, _, cls_name = entry.rpartition('.')

        # If we're reaching this point, we must attempt to load the app config
        # class located at <mod_path>.<cls_name>
        mod = import_module(mod_path)
        try:
            cls = getattr(mod, cls_name)
        except AttributeError:
            if module is None:
                # If importing as an app module failed, that error probably
                # contains the most informative traceback. Trigger it again.
                import_module(entry)
            else:
                raise

        # Check for obvious errors. (This check prevents duck typing, but
        # it could be removed if it became a problem in practice.)
        if not issubclass(cls, AppConfig):
            raise ImproperlyConfigured("'%s' isn't a subclass of AppConfig." %
                                       entry)

        # Obtain app name here rather than in AppClass.__init__ to keep
        # all error checking for entries in INSTALLED_APPS in one place.
        try:
            app_name = cls.name
        except AttributeError:
            raise ImproperlyConfigured("'%s' must supply a name attribute." %
                                       entry)

        # Ensure app_name points to a valid module.
        try:
            app_module = import_module(app_name)
        except ImportError:
            raise ImproperlyConfigured(
                "Cannot import '%s'. Check that '%s.%s.name' is correct." % (
                    app_name,
                    mod_path,
                    cls_name,
                ))

        # Entry is a path to an app config class.
        return cls(app_name, app_module)
コード例 #25
0
ファイル: base.py プロジェクト: iMerica/dj-models
    else:
        os.environ.update(environ)


_setup_environment([
    # Oracle takes client-side character set encoding from the environment.
    ('NLS_LANG', '.AL32UTF8'),
    # This prevents unicode from getting mangled by getting encoded into the
    # potentially non-unicode database character set.
    ('ORA_NCHAR_LITERAL_REPLACE', 'TRUE'),
])

try:
    import cx_Oracle as Database
except ImportError as e:
    raise ImproperlyConfigured("Error loading cx_Oracle module: %s" % e)

# Some of these import cx_Oracle, so import them after checking if it's installed.
from .client import DatabaseClient  # NOQA isort:skip
from .creation import DatabaseCreation  # NOQA isort:skip
from .features import DatabaseFeatures  # NOQA isort:skip
from .introspection import DatabaseIntrospection  # NOQA isort:skip
from .operations import DatabaseOperations  # NOQA isort:skip
from .schema import DatabaseSchemaEditor  # NOQA isort:skip
from .utils import Oracle_datetime  # NOQA isort:skip
from .validation import DatabaseValidation  # NOQA isort:skip


class _UninitializedOperatorsDescriptor:
    def __get__(self, instance, cls=None):
        # If connection.operators is looked up before a connection has been
コード例 #26
0
ファイル: base.py プロジェクト: iMerica/dj-models
MySQL database backend for Django.

Requires mysqlclient: https://pypi.org/project/mysqlclient/
"""
import re

from djmodels.core.exceptions import ImproperlyConfigured
from djmodels.db import utils
from djmodels.db.backends import utils as backend_utils
from djmodels.db.backends.base.base import BaseDatabaseWrapper
from djmodels.utils.functional import cached_property

try:
    import MySQLdb as Database
except ImportError as err:
    raise ImproperlyConfigured('Error loading MySQLdb module.\n'
                               'Did you install mysqlclient?') from err

from MySQLdb.constants import CLIENT, FIELD_TYPE  # isort:skip
from MySQLdb.converters import conversions  # isort:skip

# Some of these import MySQLdb, so import them after checking if it's installed.
from .client import DatabaseClient  # isort:skip
from .creation import DatabaseCreation  # isort:skip
from .features import DatabaseFeatures  # isort:skip
from .introspection import DatabaseIntrospection  # isort:skip
from .operations import DatabaseOperations  # isort:skip
from .schema import DatabaseSchemaEditor  # isort:skip
from .validation import DatabaseValidation  # isort:skip

version = Database.version_info
if version < (1, 3, 7):
コード例 #27
0
    from djmodels.conf import settings
    lib_path = settings.GDAL_LIBRARY_PATH
except (AttributeError, EnvironmentError,
        ImportError, ImproperlyConfigured):
    lib_path = None

if lib_path:
    lib_names = None
elif os.name == 'nt':
    # Windows NT shared libraries
    lib_names = ['gdal203', 'gdal202', 'gdal201', 'gdal20', 'gdal111']
elif os.name == 'posix':
    # *NIX library names.
    lib_names = ['gdal', 'GDAL', 'gdal2.3.0', 'gdal2.2.0', 'gdal2.1.0', 'gdal2.0.0', 'gdal1.11.0']
else:
    raise ImproperlyConfigured('GDAL is unsupported on OS "%s".' % os.name)

# Using the ctypes `find_library` utility  to find the
# path to the GDAL library from the list of library names.
if lib_names:
    for lib_name in lib_names:
        lib_path = find_library(lib_name)
        if lib_path is not None:
            break

if lib_path is None:
    raise ImproperlyConfigured(
        'Could not find the GDAL library (tried "%s"). Is GDAL installed? '
        'If it is, try setting GDAL_LIBRARY_PATH in your settings.'
        % '", "'.join(lib_names)
    )
コード例 #28
0
from djmodels.conf import settings
from djmodels.core.exceptions import ImproperlyConfigured
from djmodels.db import connections
from djmodels.db.backends.base.base import BaseDatabaseWrapper
from djmodels.db.utils import DatabaseError as WrappedDatabaseError
from djmodels.utils.functional import cached_property
from djmodels.utils.safestring import SafeText
from djmodels.utils.version import get_version_tuple

try:
    import psycopg2 as Database
    import psycopg2.extensions
    import psycopg2.extras
except ImportError as e:
    raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)


def psycopg2_version():
    version = psycopg2.__version__.split(' ', 1)[0]
    return get_version_tuple(version)


PSYCOPG2_VERSION = psycopg2_version()

if PSYCOPG2_VERSION < (2, 5, 4):
    raise ImproperlyConfigured(
        "psycopg2_version 2.5.4 or newer is required; you have %s" %
        psycopg2.__version__)

# Some of these import psycopg2, so import them after checking if it's installed.