Merge branch 'release/0.1.0' into production
* release/0.1.0: define release version, update copyright years fix grammar in docstring actually drop database in delete_mysql_database fix collation name fix broken MySQL quoting fix format strings fix MySQL connection parameters switch to gvacommon.celeryrouters.GvaRouter unify routers, add support for mysql and pgsql tasks add task implementations remove Django stuff, gvamysql is a celery only application remove Django dependencies initial version
This commit is contained in:
commit
7ad9449c93
22 changed files with 145 additions and 526 deletions
|
@ -1,4 +1,4 @@
|
|||
Copyright (c) 2014 Jan Dittberner
|
||||
Copyright (c) 2014, 2015 Jan Dittberner
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
# Included so that Django's startproject comment runs against the docs directory
|
|
@ -1,3 +1,5 @@
|
|||
Changelog
|
||||
=========
|
||||
|
||||
* :release:`0.1.0 <2015-01-04>`
|
||||
* :feature:`-` initial project setup
|
||||
|
|
|
@ -2,11 +2,8 @@
|
|||
Code documentation
|
||||
==================
|
||||
|
||||
.. index:: Django
|
||||
gvamysql is implemented as `Celery`_ app.
|
||||
|
||||
gvamysql is implemented as `Django`_ project and provides some `Celery`_ tasks.
|
||||
|
||||
.. _Django: https://www.djangoproject.com/
|
||||
.. _Celery: http://www.celeryproject.org/
|
||||
|
||||
|
||||
|
@ -23,45 +20,11 @@ The project module :py:mod:`gvamysql`
|
|||
:members:
|
||||
|
||||
|
||||
:py:mod:`gvamysql.urls`
|
||||
-----------------------
|
||||
|
||||
.. automodule:: gvamysql.urls
|
||||
|
||||
|
||||
:py:mod:`gvamysql.wsgi`
|
||||
-----------------------
|
||||
|
||||
.. automodule:: gvamysql.wsgi
|
||||
:members:
|
||||
|
||||
|
||||
:py:mod:`gvamysql.settings`
|
||||
---------------------------
|
||||
|
||||
.. automodule:: gvamysql.settings
|
||||
|
||||
:py:mod:`gvamysql.settings.base`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. automodule:: gvamysql.settings.base
|
||||
:members:
|
||||
|
||||
:py:mod:`gvamysql.settings.local`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. automodule:: gvamysql.settings.local
|
||||
|
||||
:py:mod:`gvamysql.settings.production`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. automodule:: gvamysql.settings.production
|
||||
|
||||
:py:mod:`gvamysql.settings.test`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. automodule:: gvamysql.settings.test
|
||||
|
||||
|
||||
:py:mod:`mysqltasks` app
|
||||
========================
|
||||
|
|
12
docs/conf.py
12
docs/conf.py
|
@ -14,18 +14,12 @@
|
|||
|
||||
import sys
|
||||
import os
|
||||
import django
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
sys.path.insert(0, os.path.abspath(os.path.join('..', 'gvamysql')))
|
||||
|
||||
os.environ['GVAMYSQL_ALLOWED_HOSTS'] = 'localhost'
|
||||
os.environ['GVAMYSQL_SERVER_EMAIL'] = 'root@localhost'
|
||||
|
||||
django.setup()
|
||||
|
||||
# -- General configuration -----------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
|
@ -53,16 +47,16 @@ master_doc = 'index'
|
|||
|
||||
# General information about the project.
|
||||
project = u'gvamysql'
|
||||
copyright = u'2014, Jan Dittberner'
|
||||
copyright = u'2014, 2015 Jan Dittberner'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '0.2.0'
|
||||
version = '0.1'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '0.2.0'
|
||||
release = '0.1.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
|
|
@ -28,8 +28,7 @@ your virtualenv:
|
|||
.. _virtualenv: https://virtualenv.pypa.io/en/latest/
|
||||
|
||||
You will also need to ensure that the virtualenv has the project directory
|
||||
added to the path. Adding the project directory will allow `django-admin.py` to
|
||||
be able to change settings using the `--settings` flag.
|
||||
added to the path.
|
||||
|
||||
.. index:: virtualenvwrapper
|
||||
|
||||
|
|
3
gvamysql/gvacommon/.gitignore
vendored
Normal file
3
gvamysql/gvacommon/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
.*.swp
|
||||
*.pyc
|
||||
.ropeproject/
|
0
gvamysql/gvacommon/__init__.py
Normal file
0
gvamysql/gvacommon/__init__.py
Normal file
15
gvamysql/gvacommon/celeryrouters.py
Normal file
15
gvamysql/gvacommon/celeryrouters.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
|
||||
class GvaRouter(object):
|
||||
|
||||
def route_for_task(self, task, args=None, kwargs=None):
|
||||
for route in ['ldap', 'file', 'mysql', 'pgsql']:
|
||||
if route in task:
|
||||
return {
|
||||
'exchange': route,
|
||||
'exchange_type': 'direct',
|
||||
'queue': route,
|
||||
}
|
||||
return None
|
|
@ -6,18 +6,10 @@ This module defines the Celery_ app for gvamysql.
|
|||
"""
|
||||
from __future__ import absolute_import
|
||||
|
||||
import os
|
||||
|
||||
from celery import Celery
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE',
|
||||
'gvamysql.settings.production')
|
||||
|
||||
|
||||
#: The Celery application
|
||||
app = Celery('gvamysql')
|
||||
|
||||
app.config_from_object('django.conf:settings')
|
||||
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
|
||||
app.config_from_object('gvamysql.settings')
|
||||
app.autodiscover_tasks(['mysqltasks'], force=True)
|
||||
|
|
47
gvamysql/gvamysql/settings.py
Normal file
47
gvamysql/gvamysql/settings.py
Normal file
|
@ -0,0 +1,47 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# pymode:lint_ignore=E501
|
||||
"""
|
||||
Common settings and globals.
|
||||
|
||||
"""
|
||||
|
||||
from os import environ
|
||||
|
||||
|
||||
def get_env_setting(setting):
|
||||
"""
|
||||
Get the environment setting or return exception.
|
||||
|
||||
:param str setting: name of an environment setting
|
||||
:raises ImproperlyConfigured: if the environment setting is not defined
|
||||
:return: environment setting value
|
||||
:rtype: str
|
||||
"""
|
||||
try:
|
||||
return environ[setting]
|
||||
except KeyError:
|
||||
error_msg = "Set the %s env variable" % setting
|
||||
raise AssertionError(error_msg)
|
||||
|
||||
|
||||
########## CELERY CONFIGURATION
|
||||
CELERY_TIMEZONE = 'Europe/Berlin'
|
||||
CELERY_ENABLE_UTC = True
|
||||
CELERY_RESULT_BACKEND = 'amqp'
|
||||
CELERY_RESULT_PERSISTENT = True
|
||||
CELERY_TASK_RESULT_EXPIRES = None
|
||||
CELERY_ROUTES = (
|
||||
'gvacommon.celeryrouters.GvaRouter',
|
||||
)
|
||||
CELERY_ACCEPT_CONTENT = ['json']
|
||||
CELERY_TASK_SERIALIZER = 'json'
|
||||
CELERY_RESULT_SERIALIZER = 'json'
|
||||
BROKER_URL = get_env_setting('GVAMYSQL_BROKER_URL')
|
||||
########## END CELERY CONFIGURATION
|
||||
|
||||
########## GVAMYSQL CONFIGURATION
|
||||
GVAMYSQL_DBADMIN_HOST = get_env_setting('GVAMYSQL_DBADMIN_HOST')
|
||||
GVAMYSQL_DBADMIN_PORT = int(get_env_setting('GVAMYSQL_DBADMIN_PORT'))
|
||||
GVAMYSQL_DBADMIN_USER = get_env_setting('GVAMYSQL_DBADMIN_USER')
|
||||
GVAMYSQL_DBADMIN_PASSWORD = get_env_setting('GVAMYSQL_DBADMIN_PASSWORD')
|
||||
########## END GVAMYSQL CONFIGURATION
|
|
@ -1,3 +0,0 @@
|
|||
"""
|
||||
This module contains settings for various environments.
|
||||
"""
|
|
@ -1,294 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# pymode:lint_ignore=E501
|
||||
"""
|
||||
Common settings and globals.
|
||||
|
||||
"""
|
||||
|
||||
from os.path import abspath, basename, dirname, join, normpath
|
||||
from sys import path
|
||||
from os import environ
|
||||
|
||||
# Normally you should not import ANYTHING from Django directly
|
||||
# into your settings, but ImproperlyConfigured is an exception.
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
|
||||
def get_env_setting(setting):
|
||||
"""
|
||||
Get the environment setting or return exception.
|
||||
|
||||
:param str setting: name of an environment setting
|
||||
:raises ImproperlyConfigured: if the environment setting is not defined
|
||||
:return: environment setting value
|
||||
:rtype: str
|
||||
"""
|
||||
try:
|
||||
return environ[setting]
|
||||
except KeyError:
|
||||
error_msg = "Set the %s env variable" % setting
|
||||
raise ImproperlyConfigured(error_msg)
|
||||
|
||||
|
||||
########## PATH CONFIGURATION
|
||||
# Absolute filesystem path to the Django project directory:
|
||||
DJANGO_ROOT = dirname(dirname(abspath(__file__)))
|
||||
|
||||
# Absolute filesystem path to the top-level project folder:
|
||||
SITE_ROOT = dirname(DJANGO_ROOT)
|
||||
|
||||
# Site name:
|
||||
SITE_NAME = basename(DJANGO_ROOT)
|
||||
|
||||
# Add our project to our pythonpath, this way we don't need to type our project
|
||||
# name in our dotted import paths:
|
||||
path.append(DJANGO_ROOT)
|
||||
########## END PATH CONFIGURATION
|
||||
|
||||
|
||||
########## DEBUG CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug
|
||||
DEBUG = False
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug
|
||||
TEMPLATE_DEBUG = DEBUG
|
||||
########## END DEBUG CONFIGURATION
|
||||
|
||||
|
||||
########## MANAGER CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#admins
|
||||
ADMINS = (
|
||||
(get_env_setting('GVAMYSQL_ADMIN_NAME'), get_env_setting('GVAMYSQL_ADMIN_EMAIL')),
|
||||
)
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#managers
|
||||
MANAGERS = ADMINS
|
||||
########## END MANAGER CONFIGURATION
|
||||
|
||||
|
||||
########## DATABASE CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#databases
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': normpath(join(DJANGO_ROOT, 'default.db')),
|
||||
'USER': '',
|
||||
'PASSWORD': '',
|
||||
'HOST': '',
|
||||
'PORT': '',
|
||||
},
|
||||
}
|
||||
########## END DATABASE CONFIGURATION
|
||||
|
||||
|
||||
########## GENERAL CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#time-zone
|
||||
TIME_ZONE = 'Europe/Berlin'
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#language-code
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#site-id
|
||||
SITE_ID = 1
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-i18n
|
||||
USE_I18N = True
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-l10n
|
||||
USE_L10N = True
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#use-tz
|
||||
USE_TZ = True
|
||||
########## END GENERAL CONFIGURATION
|
||||
|
||||
|
||||
########## MEDIA CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root
|
||||
MEDIA_ROOT = normpath(join(SITE_ROOT, 'media'))
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url
|
||||
MEDIA_URL = '/media/'
|
||||
########## END MEDIA CONFIGURATION
|
||||
|
||||
|
||||
########## STATIC FILE CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root
|
||||
STATIC_ROOT = normpath(join(SITE_ROOT, 'assets'))
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
|
||||
STATICFILES_DIRS = (
|
||||
normpath(join(SITE_ROOT, 'static')),
|
||||
)
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders
|
||||
STATICFILES_FINDERS = (
|
||||
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||
)
|
||||
########## END STATIC FILE CONFIGURATION
|
||||
|
||||
|
||||
########## SECRET CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key
|
||||
# Note: This key should only be used for development and testing.
|
||||
SECRET_KEY = get_env_setting('GVAMYSQL_SECRETKEY')
|
||||
########## END SECRET CONFIGURATION
|
||||
|
||||
|
||||
########## SITE CONFIGURATION
|
||||
# Hosts/domain names that are valid for this site
|
||||
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
|
||||
ALLOWED_HOSTS = []
|
||||
########## END SITE CONFIGURATION
|
||||
|
||||
|
||||
########## FIXTURE CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FIXTURE_DIRS
|
||||
FIXTURE_DIRS = (
|
||||
normpath(join(SITE_ROOT, 'fixtures')),
|
||||
)
|
||||
########## END FIXTURE CONFIGURATION
|
||||
|
||||
|
||||
########## TEMPLATE CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-context-processors
|
||||
TEMPLATE_CONTEXT_PROCESSORS = (
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.core.context_processors.debug',
|
||||
'django.core.context_processors.i18n',
|
||||
'django.core.context_processors.media',
|
||||
'django.core.context_processors.static',
|
||||
'django.core.context_processors.tz',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
'django.core.context_processors.request',
|
||||
)
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-loaders
|
||||
TEMPLATE_LOADERS = (
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader',
|
||||
)
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-dirs
|
||||
TEMPLATE_DIRS = (
|
||||
normpath(join(SITE_ROOT, 'templates')),
|
||||
)
|
||||
########## END TEMPLATE CONFIGURATION
|
||||
|
||||
|
||||
########## MIDDLEWARE CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#middleware-classes
|
||||
MIDDLEWARE_CLASSES = (
|
||||
# Default Django middleware.
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
)
|
||||
########## END MIDDLEWARE CONFIGURATION
|
||||
|
||||
|
||||
########## URL CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf
|
||||
ROOT_URLCONF = '%s.urls' % SITE_NAME
|
||||
########## END URL CONFIGURATION
|
||||
|
||||
|
||||
########## TEST RUNNER CONFIGURATION
|
||||
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
|
||||
########## END TEST RUNNER CONFIGURATION
|
||||
|
||||
|
||||
########## APP CONFIGURATION
|
||||
DJANGO_APPS = (
|
||||
# Default Django apps:
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.sites',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
|
||||
# Useful template tags:
|
||||
# 'django.contrib.humanize',
|
||||
|
||||
# Admin panel and documentation:
|
||||
'django.contrib.admin',
|
||||
# 'django.contrib.admindocs',
|
||||
)
|
||||
|
||||
# Apps specific for this project go here.
|
||||
LOCAL_APPS = (
|
||||
'mysqltasks',
|
||||
)
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
|
||||
INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS
|
||||
########## END APP CONFIGURATION
|
||||
|
||||
|
||||
########## LOGGING CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#logging
|
||||
# A sample logging configuration. The only tangible logging
|
||||
# performed by this configuration is to send an email to
|
||||
# the site admins on every HTTP 500 error when DEBUG=False.
|
||||
# See http://docs.djangoproject.com/en/dev/topics/logging for
|
||||
# more details on how to customize your logging configuration.
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': False,
|
||||
'filters': {
|
||||
'require_debug_false': {
|
||||
'()': 'django.utils.log.RequireDebugFalse'
|
||||
}
|
||||
},
|
||||
'handlers': {
|
||||
'mail_admins': {
|
||||
'level': 'ERROR',
|
||||
'filters': ['require_debug_false'],
|
||||
'class': 'django.utils.log.AdminEmailHandler'
|
||||
}
|
||||
},
|
||||
'loggers': {
|
||||
'django.request': {
|
||||
'handlers': ['mail_admins'],
|
||||
'level': 'ERROR',
|
||||
'propagate': True,
|
||||
},
|
||||
}
|
||||
}
|
||||
########## END LOGGING CONFIGURATION
|
||||
|
||||
|
||||
########## WSGI CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application
|
||||
WSGI_APPLICATION = '%s.wsgi.application' % SITE_NAME
|
||||
########## END WSGI CONFIGURATION
|
||||
|
||||
|
||||
########## GVAMYSQL CONFIGURATION
|
||||
GVAMYSQL_DBADMIN_USER = get_env_setting('GVAMYSQL_DBADMIN_USER')
|
||||
GVAMYSQL_DBADMIN_PASSWORD = get_env_setting('GVAMYSQL_DBADMIN_PASSWORD')
|
||||
########## END GVAMYSQL CONFIGURATION
|
||||
|
||||
|
||||
########## CELERY CONFIGURATION
|
||||
BROKER_URL = get_env_setting('GVAMYSQL_BROKER_URL')
|
||||
CELERY_RESULT_BACKEND = 'amqp'
|
||||
CELERY_RESULT_PERSISTENT = True
|
||||
CELERY_TASK_RESULT_EXPIRES = None
|
||||
CELERY_ROUTES = (
|
||||
'gvacommon.celeryrouters.Router',
|
||||
'gvacommon.celeryrouters.FileRouter',
|
||||
)
|
||||
CELERY_TIMEZONE = 'Europe/Berlin'
|
||||
CELERY_ENABLE_UTC = True
|
||||
CELERY_ACCEPT_CONTENT = ['json']
|
||||
CELERY_TASK_SERIALIZER = 'json'
|
||||
CELERY_RESULT_SERIALIZER = 'json'
|
||||
########## END CELERY CONFIGURATION
|
|
@ -1,51 +0,0 @@
|
|||
# pymode:lint_ignore=W0401,E501
|
||||
"""
|
||||
Development settings and globals based on :py:mod:`gvafile.settings.base`.
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
from .base import *
|
||||
|
||||
|
||||
########## DEBUG CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#debug
|
||||
DEBUG = True
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-debug
|
||||
TEMPLATE_DEBUG = DEBUG
|
||||
########## END DEBUG CONFIGURATION
|
||||
|
||||
|
||||
########## EMAIL CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend
|
||||
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
||||
########## END EMAIL CONFIGURATION
|
||||
|
||||
|
||||
########## CACHE CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#caches
|
||||
CACHES = {
|
||||
'default': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
}
|
||||
}
|
||||
########## END CACHE CONFIGURATION
|
||||
|
||||
|
||||
########## TOOLBAR CONFIGURATION
|
||||
# See: http://django-debug-toolbar.readthedocs.org/en/latest/installation.html#explicit-setup
|
||||
INSTALLED_APPS += (
|
||||
'debug_toolbar',
|
||||
)
|
||||
|
||||
MIDDLEWARE_CLASSES += (
|
||||
'debug_toolbar.middleware.DebugToolbarMiddleware',
|
||||
)
|
||||
|
||||
DEBUG_TOOLBAR_PATCH_SETTINGS = False
|
||||
|
||||
# http://django-debug-toolbar.readthedocs.org/en/latest/installation.html
|
||||
INTERNAL_IPS = ('127.0.0.1',)
|
||||
########## END TOOLBAR CONFIGURATION
|
|
@ -1,50 +0,0 @@
|
|||
# pymode:lint_ignore=W0401,E501
|
||||
"""
|
||||
Production settings and globals based on :py:mod:`gvafile.settings.base`.
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
from .base import *
|
||||
|
||||
########## HOST CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/1.5/releases/1.5/#allowed-hosts-required-in-production
|
||||
ALLOWED_HOSTS = get_env_setting('GVAMYSQL_ALLOWED_HOSTS').split(',')
|
||||
########## END HOST CONFIGURATION
|
||||
|
||||
########## EMAIL CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-backend
|
||||
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-host
|
||||
#EMAIL_HOST = environ.get('EMAIL_HOST', 'smtp.gmail.com')
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-host-password
|
||||
#EMAIL_HOST_PASSWORD = environ.get('EMAIL_HOST_PASSWORD', '')
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-host-user
|
||||
#EMAIL_HOST_USER = environ.get('EMAIL_HOST_USER', 'your_email@example.com')
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-port
|
||||
#EMAIL_PORT = environ.get('EMAIL_PORT', 587)
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-subject-prefix
|
||||
EMAIL_SUBJECT_PREFIX = '[%s] ' % SITE_NAME
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#email-use-tls
|
||||
#EMAIL_USE_TLS = True
|
||||
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#server-email
|
||||
SERVER_EMAIL = get_env_setting('GVAMYSQL_SERVER_EMAIL')
|
||||
########## END EMAIL CONFIGURATION
|
||||
|
||||
########## DATABASE CONFIGURATION
|
||||
#DATABASES = {}
|
||||
########## END DATABASE CONFIGURATION
|
||||
|
||||
|
||||
########## CACHE CONFIGURATION
|
||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#caches
|
||||
#CACHES = {}
|
||||
########## END CACHE CONFIGURATION
|
|
@ -1,20 +0,0 @@
|
|||
# pymode:lint_ignore=W0401
|
||||
"""
|
||||
Test settings based on :py:mod:`gvafile.settings.base`.
|
||||
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
|
||||
from .base import *
|
||||
|
||||
########## IN-MEMORY TEST DATABASE
|
||||
DATABASES = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3",
|
||||
"NAME": ":memory:",
|
||||
"USER": "",
|
||||
"PASSWORD": "",
|
||||
"HOST": "",
|
||||
"PORT": "",
|
||||
},
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
"""
|
||||
This module defines the main URLConf for gvamysql.
|
||||
|
||||
"""
|
||||
|
||||
from django.conf.urls import patterns, include, url
|
||||
from django.conf import settings
|
||||
|
||||
# Uncomment the next two lines to enable the admin:
|
||||
from django.contrib import admin
|
||||
admin.autodiscover()
|
||||
|
||||
urlpatterns = patterns(
|
||||
'',
|
||||
url(r'^admin/', include(admin.site.urls)),
|
||||
)
|
||||
|
||||
# Uncomment the next line to serve media files in dev.
|
||||
# urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
||||
if settings.DEBUG:
|
||||
import debug_toolbar
|
||||
urlpatterns += patterns('',
|
||||
url(r'^__debug__/', include(debug_toolbar.urls)),
|
||||
)
|
|
@ -1,10 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gvafile.settings")
|
||||
|
||||
from django.core.management import execute_from_command_line
|
||||
|
||||
execute_from_command_line(sys.argv)
|
|
@ -1,3 +0,0 @@
|
|||
"""
|
||||
Empty models module required for Django to accept this as an app.
|
||||
"""
|
|
@ -1,18 +1,29 @@
|
|||
"""
|
||||
This module defines Celery_ tasks to manage MySQL users and database.
|
||||
This module defines Celery_ tasks to manage MySQL users and databases.
|
||||
|
||||
"""
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
from celery import shared_task
|
||||
from celery.utils.log import get_task_logger
|
||||
|
||||
from gvamysql import settings
|
||||
from MySQLdb import connect
|
||||
|
||||
|
||||
_LOGGER = get_task_logger(__name__)
|
||||
|
||||
|
||||
def _get_connection():
|
||||
return connect(
|
||||
host=settings.GVAMYSQL_DBADMIN_HOST,
|
||||
port=settings.GVAMYSQL_DBADMIN_PORT,
|
||||
user=settings.GVAMYSQL_DBADMIN_USER,
|
||||
passwd=settings.GVAMYSQL_DBADMIN_PASSWORD,
|
||||
db='mysql',
|
||||
)
|
||||
|
||||
|
||||
@shared_task
|
||||
def create_mysql_user(username, password):
|
||||
"""
|
||||
|
@ -24,6 +35,16 @@ def create_mysql_user(username, password):
|
|||
:rtype: str
|
||||
|
||||
"""
|
||||
conn = _get_connection()
|
||||
curs = conn.cursor()
|
||||
curs.execute(
|
||||
"""
|
||||
CREATE USER %(username)s@'%%' IDENTIFIED BY %(password)s
|
||||
""",
|
||||
{'username': username, 'password': password}
|
||||
)
|
||||
conn.commit()
|
||||
return username
|
||||
|
||||
|
||||
@shared_task
|
||||
|
@ -37,6 +58,15 @@ def set_mysql_userpassword(username, password):
|
|||
:rtype: boolean
|
||||
|
||||
"""
|
||||
conn = _get_connection()
|
||||
curs = conn.cursor()
|
||||
curs.execute(
|
||||
"""
|
||||
SET PASSWORD FOR %(username)s = PASSWORD(%(password)s)
|
||||
""",
|
||||
{'username': username, 'password': password})
|
||||
conn.commit()
|
||||
return True
|
||||
|
||||
|
||||
@shared_task
|
||||
|
@ -49,6 +79,15 @@ def delete_mysql_user(username):
|
|||
:rtype: boolean
|
||||
|
||||
"""
|
||||
conn = _get_connection()
|
||||
curs = conn.cursor()
|
||||
curs.execute(
|
||||
"""
|
||||
DROP USER %(username)s@'%%'
|
||||
""",
|
||||
{'username': username})
|
||||
conn.commit()
|
||||
return True
|
||||
|
||||
|
||||
@shared_task
|
||||
|
@ -62,15 +101,41 @@ def create_mysql_database(dbname, username):
|
|||
:rtype: str
|
||||
|
||||
"""
|
||||
conn = _get_connection()
|
||||
curs = conn.cursor()
|
||||
curs.execute(
|
||||
"""
|
||||
CREATE DATABASE `%(dbname)s` CHARACTER SET utf8 COLLATE utf8_general_ci
|
||||
""" % {'dbname': dbname})
|
||||
curs.execute(
|
||||
"""
|
||||
GRANT ALL PRIVILEGES ON `%(dbname)s`.* TO %%(username)s@'%%%%'
|
||||
""" % {'dbname': dbname}, {'username': username})
|
||||
conn.commit()
|
||||
return dbname
|
||||
|
||||
|
||||
@shared_task
|
||||
def delete_mysql_database(dbname):
|
||||
def delete_mysql_database(dbname, username):
|
||||
"""
|
||||
This task deletes an existing MySQL database.
|
||||
This task deletes an existing MySQL database and revokes privileges of the
|
||||
given user on that database.
|
||||
|
||||
:param str dbname: database name
|
||||
:param str username: the user name of an existing MySQL user
|
||||
:return: True if the database has been deleted, False otherwise
|
||||
:rtype: boolean
|
||||
|
||||
"""
|
||||
conn = _get_connection()
|
||||
curs = conn.cursor()
|
||||
curs.execute(
|
||||
"""
|
||||
REVOKE ALL PRIVILEGES ON `%(dbname)s`.* FROM %%(username)s@'%%%%'
|
||||
""" % {'dbname': dbname}, {'username': username})
|
||||
curs.execute(
|
||||
"""
|
||||
DROP DATABASE `%(dbname)s`
|
||||
""" % {'dbname': dbname})
|
||||
conn.commit()
|
||||
return True
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
Django==1.7.1
|
||||
amqp==1.4.6
|
||||
bpython==0.13.1
|
||||
anyjson==0.3.3
|
||||
argparse==1.2.1
|
||||
billiard==3.3.0.19
|
||||
celery==3.1.17
|
||||
kombu==3.0.24
|
||||
pytz==2014.10
|
||||
wsgiref==0.1.2
|
||||
mysqlclient==1.3.4
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# Local development dependencies go here
|
||||
-r base.txt
|
||||
coverage==3.7.1
|
||||
django-debug-toolbar==1.2.2
|
||||
Sphinx==1.2.3
|
||||
sqlparse==0.1.14
|
||||
releases==0.7.0
|
||||
|
|
Loading…
Reference in a new issue