mirror of
https://github.com/wger-project/wger.git
synced 2026-02-18 00:17:51 +01:00
Simplify create-settings tasks and others
Create settings now uses the current path per default, which simplifies the initial project setup
This commit is contained in:
18
README.rst
18
README.rst
@@ -24,8 +24,8 @@ parameters.
|
||||
Docker
|
||||
------
|
||||
|
||||
Useful to just try it out. Check the documentation on how to use the wger/devel
|
||||
docker image or the docker-compose file for development::
|
||||
Useful to just try it out. Check the REAMES in wger/extras/docker on how to use
|
||||
the wger/devel docker image or the docker-compose file for development::
|
||||
|
||||
docker run -ti --name wger.apache --publish 8000:80 wger/apache
|
||||
|
||||
@@ -62,8 +62,8 @@ Then install the python packages from pypi in the virtualenv::
|
||||
$ cd wger
|
||||
$ pip install -r requirements.txt
|
||||
$ python setup.py develop
|
||||
$ wger create-settings --settings-path $(pwd)/settings.py --database-path $(pwd)/database.sqlite
|
||||
$ wger bootstrap --settings-path $(pwd)/settings.py --no-start-server
|
||||
$ wger create-settings
|
||||
$ wger bootstrap
|
||||
$ python manage.py runserver
|
||||
|
||||
3) Log in as: **admin**, password **admin**
|
||||
@@ -109,10 +109,12 @@ You can get a list of all available commands by calling ``wger`` without any
|
||||
arguments::
|
||||
|
||||
Available tasks:
|
||||
|
||||
bootstrap Performs all steps necessary to bootstrap the application
|
||||
config-location Returns the default location for the settings file and the data folder
|
||||
create-or-reset-admin Creates an admin user or resets the password for an existing one
|
||||
bootstrap Performs all steps necessary to bootstrap the
|
||||
application
|
||||
config-location Returns the default location for the settings file
|
||||
and the data folder
|
||||
create-or-reset-admin Creates an admin user or resets the password for an
|
||||
existing one
|
||||
create-settings Creates a local settings file
|
||||
load-fixtures Loads all fixtures
|
||||
migrate-db Run all database migrations
|
||||
|
||||
@@ -21,7 +21,6 @@ Get the code
|
||||
|
||||
$ git clone https://github.com/wger-project/wger.git src
|
||||
$ cd src
|
||||
$ WGER_PATH=$(pwd)
|
||||
|
||||
Install Requirements
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -38,12 +37,8 @@ This will download the required JS and CSS libraries and create a SQlite
|
||||
database and populate it with data on the first run::
|
||||
|
||||
|
||||
$ wger create-settings \
|
||||
--settings-path $WGER_PATH/settings.py \
|
||||
--database-path $WGER_PATH/database.sqlite
|
||||
$ wger bootstrap \
|
||||
--settings-path $WGER_PATH/settings.py \
|
||||
--no-start-server
|
||||
$ wger create-settings
|
||||
$ wger bootstrap
|
||||
|
||||
You can of course also use other databases such as postgres or mariaDB. Create
|
||||
a database and user and edit the DATABASES settings before calling bootstrap.
|
||||
|
||||
@@ -116,9 +116,7 @@ Get the application::
|
||||
npm install -g yarn sass
|
||||
python setup.py develop
|
||||
pip install psycopg2 # Only if using postgres
|
||||
wger create-settings \
|
||||
--settings-path /home/wger/src/settings.py \
|
||||
--database-path /home/wger/db/database.sqlite
|
||||
wger create-settings --database-path /home/wger/db/database.sqlite
|
||||
|
||||
If you are using postgres, you need to edit the settings file and set the
|
||||
correct values for the database (use ``django.db.backends.postgresql_psycopg2``
|
||||
@@ -128,7 +126,7 @@ for the engine). Also set ``MEDIA_ROOT`` to ``/home/wger/media`` and
|
||||
Run the installation script, this will download some CSS and JS libraries and
|
||||
load all initial data::
|
||||
|
||||
wger bootstrap --settings-path /home/wger/src/settings.py --no-start-server
|
||||
wger bootstrap
|
||||
|
||||
|
||||
Collect all static resources::
|
||||
|
||||
@@ -85,12 +85,8 @@ RUN . /home/wger/venv/bin/activate \
|
||||
&& pip install wheel \
|
||||
&& pip install --no-cache /wheels/* \
|
||||
&& python setup.py develop \
|
||||
&& wger create-settings \
|
||||
--settings-path /home/wger/src/settings.py \
|
||||
--database-path /home/wger/db/database.sqlite \
|
||||
&& wger bootstrap \
|
||||
--settings-path /home/wger/src/settings.py \
|
||||
--no-start-server
|
||||
&& wger create-settings --database-path /home/wger/db/database.sqlite \
|
||||
&& wger bootstrap
|
||||
|
||||
|
||||
# Change permissions of some files and folders so the apache process
|
||||
|
||||
@@ -66,12 +66,8 @@ RUN . /home/wger/venv/bin/activate \
|
||||
&& pip install --upgrade pip \
|
||||
&& pip install --no-cache /wheels/* \
|
||||
&& python setup.py develop \
|
||||
&& wger create-settings \
|
||||
--settings-path /home/wger/src/settings.py \
|
||||
--database-path /home/wger/db/database.sqlite \
|
||||
&& wger bootstrap \
|
||||
--settings-path /home/wger/src/settings.py \
|
||||
--no-start-server
|
||||
&& wger create-settings --database-path /home/wger/db/database.sqlite \
|
||||
&& wger bootstrap
|
||||
|
||||
# Download the exercise images
|
||||
RUN mkdir ~/media \
|
||||
|
||||
@@ -17,9 +17,7 @@ if [[ "$DJANGO_DB_PORT" == "5432" ]]; then
|
||||
fi
|
||||
|
||||
# Bootstrap the application
|
||||
wger bootstrap \
|
||||
--settings-path /home/wger/src/settings.py \
|
||||
--no-start-server
|
||||
wger bootstrap
|
||||
|
||||
if [[ "$WGER_DOWNLOAD_IMGS" == "TRUE" ]];
|
||||
then
|
||||
|
||||
@@ -8,7 +8,7 @@ from django.core.management import execute_from_command_line
|
||||
|
||||
# wger
|
||||
from wger.tasks import (
|
||||
get_user_config_path,
|
||||
get_path,
|
||||
setup_django_environment
|
||||
)
|
||||
|
||||
@@ -17,7 +17,7 @@ if __name__ == "__main__":
|
||||
|
||||
# If user passed the settings flag ignore the default wger settings
|
||||
if not any('--settings' in s for s in sys.argv):
|
||||
setup_django_environment(get_user_config_path('wger', 'settings.py'))
|
||||
setup_django_environment(get_path('settings.py'))
|
||||
|
||||
# Alternative to above
|
||||
# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
|
||||
|
||||
@@ -18,7 +18,7 @@ MANAGERS = ADMINS
|
||||
DATABASES = {{
|
||||
'default': {{
|
||||
'ENGINE': 'django.db.backends.{dbengine}',
|
||||
'NAME': {dbname},
|
||||
'NAME': '{dbname}',
|
||||
'USER': '{dbuser}',
|
||||
'PASSWORD': '{dbpassword}',
|
||||
'HOST': '{dbhost}',
|
||||
@@ -44,7 +44,7 @@ SITE_URL = '{siteurl}'
|
||||
|
||||
# Path to uploaded files
|
||||
# Absolute filesystem path to the directory that will hold user-uploaded files.
|
||||
MEDIA_ROOT = {media_folder_path}
|
||||
MEDIA_ROOT = '{media_folder_path}'
|
||||
MEDIA_URL = '/media/'
|
||||
|
||||
# Allow all hosts to access the application. Change if used in production.
|
||||
|
||||
162
wger/tasks.py
162
wger/tasks.py
@@ -15,14 +15,11 @@
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
|
||||
# Standard Library
|
||||
import ctypes
|
||||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
import socket
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
import webbrowser
|
||||
|
||||
# Django
|
||||
import django
|
||||
@@ -41,8 +38,7 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
@task(help={'address': 'Address to bind to. Default: localhost',
|
||||
'port': 'Port to use. Default: 8000',
|
||||
'browser': 'Whether to open the application in a browser window. Default: false',
|
||||
'settings-path': 'Path to settings file (absolute path recommended). Leave empty for '
|
||||
'settings-path': 'Path to settings file (absolute path). Leave empty for '
|
||||
'default',
|
||||
'extra-args': 'Additional arguments to pass to the builtin server. Pass as string: '
|
||||
'"--arg1 --arg2=value". Default: none'})
|
||||
@@ -51,8 +47,6 @@ def start(context, address='localhost', port=8000, browser=False, settings_path=
|
||||
"""
|
||||
Start the application using django's built in webserver
|
||||
"""
|
||||
if browser:
|
||||
start_browser("http://{0}:{1}".format(address, port))
|
||||
|
||||
# Find the path to the settings and setup the django environment
|
||||
setup_django_environment(settings_path)
|
||||
@@ -65,37 +59,22 @@ def start(context, address='localhost', port=8000, browser=False, settings_path=
|
||||
execute_from_command_line(argv)
|
||||
|
||||
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path recommended). Leave empty for '
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path). Leave empty for '
|
||||
'default',
|
||||
'database-path': 'Path to sqlite database (absolute path recommended). Leave empty '
|
||||
'for default',
|
||||
'address': 'Address to use. Default: localhost',
|
||||
'port': 'Port to use. Default: 8000',
|
||||
'browser': 'Whether to open the application in a browser window. Default: false',
|
||||
'start-server': 'Whether to start the development server. Default: true'})
|
||||
'database-path': 'Path to sqlite database (absolute path). Leave empty '
|
||||
'for default'})
|
||||
def bootstrap(context,
|
||||
settings_path=None,
|
||||
database_path=None,
|
||||
address='localhost',
|
||||
port=8000,
|
||||
browser=False,
|
||||
start_server=True):
|
||||
database_path=None):
|
||||
"""
|
||||
Performs all steps necessary to bootstrap the application
|
||||
"""
|
||||
|
||||
# Find url to wger
|
||||
address, port = detect_listen_opts(address, port)
|
||||
if port == 80:
|
||||
url = "http://{0}".format(address)
|
||||
else:
|
||||
url = "http://{0}:{1}".format(address, port)
|
||||
|
||||
# Create settings if necessary
|
||||
if settings_path is None:
|
||||
settings_path = get_user_config_path('wger', 'settings.py')
|
||||
settings_path = get_path('settings.py')
|
||||
if not os.path.exists(settings_path):
|
||||
create_settings(context, settings_path=settings_path, database_path=database_path, url=url)
|
||||
create_settings(context, settings_path=settings_path, database_path=database_path)
|
||||
|
||||
# Find the path to the settings and setup the django environment
|
||||
setup_django_environment(settings_path)
|
||||
@@ -111,39 +90,36 @@ def bootstrap(context,
|
||||
context.run("yarn install")
|
||||
context.run("sass core/static/scss/main.scss:core/static/yarn/bootstrap-compiled.css")
|
||||
|
||||
# Start the webserver
|
||||
if start_server:
|
||||
print('*** Bootstraping complete, starting application')
|
||||
start(context, address=address, port=port, browser=browser, settings_path=settings_path)
|
||||
|
||||
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path recommended). Leave empty for '
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path). Leave empty for '
|
||||
'default',
|
||||
'database-path': 'Path to sqlite database (absolute path recommended). Leave empty '
|
||||
'database-path': 'Path to sqlite database (absolute path). Leave empty '
|
||||
'for default',
|
||||
'database-type': 'Database type to use. Supported: sqlite3, postgresql. Default: '
|
||||
'sqlite3',
|
||||
'key-length': 'Lenght of the generated secret key. Default: 50'})
|
||||
def create_settings(context, settings_path=None, database_path=None, url=None,
|
||||
database_type='sqlite3', key_length=50):
|
||||
'key-length': 'Length of the generated secret key. Default: 50'})
|
||||
def create_settings(context,
|
||||
settings_path=None,
|
||||
database_path=None,
|
||||
database_type='sqlite3',
|
||||
key_length=50):
|
||||
"""
|
||||
Creates a local settings file
|
||||
"""
|
||||
if settings_path is None:
|
||||
settings_path = get_user_config_path('wger', 'settings.py')
|
||||
settings_path = get_path('settings.py')
|
||||
|
||||
settings_module = os.path.dirname(settings_path)
|
||||
print("*** Creating settings file at {0}".format(settings_module))
|
||||
|
||||
if database_path is None:
|
||||
database_path = get_user_data_path('wger', 'database.sqlite')
|
||||
dbpath_value = repr(database_path)
|
||||
database_path = get_path('database.sqlite').as_posix()
|
||||
dbpath_value = database_path
|
||||
|
||||
media_folder_path = repr(get_user_data_path('wger', 'media'))
|
||||
media_folder_path = get_path('media').as_posix()
|
||||
|
||||
# Use localhost with default django port if no URL given
|
||||
if url is None:
|
||||
url = 'http://localhost:8000'
|
||||
url = 'http://localhost:8000'
|
||||
|
||||
# Fill in the config file template
|
||||
settings_template = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'settings.tpl')
|
||||
@@ -153,7 +129,7 @@ def create_settings(context, settings_path=None, database_path=None, url=None,
|
||||
# The environment variable is set by travis during testing
|
||||
if database_type == 'postgresql':
|
||||
dbengine = 'postgresql_psycopg2'
|
||||
dbname = "'test_wger'"
|
||||
dbname = 'test_wger'
|
||||
dbuser = 'postgres'
|
||||
dbpassword = ''
|
||||
dbhost = '127.0.0.1'
|
||||
@@ -191,7 +167,7 @@ def create_settings(context, settings_path=None, database_path=None, url=None,
|
||||
settings_file.write(settings_content)
|
||||
|
||||
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path recommended). Leave empty for '
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path). Leave empty for '
|
||||
'default'})
|
||||
def create_or_reset_admin(context, settings_path=None):
|
||||
"""
|
||||
@@ -217,7 +193,7 @@ def create_or_reset_admin(context, settings_path=None):
|
||||
call_command("loaddata", path + "users.json")
|
||||
|
||||
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path recommended). Leave empty for '
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path). Leave empty for '
|
||||
'default'})
|
||||
def migrate_db(context, settings_path=None):
|
||||
"""
|
||||
@@ -230,7 +206,7 @@ def migrate_db(context, settings_path=None):
|
||||
call_command("migrate")
|
||||
|
||||
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path recommended). Leave empty for '
|
||||
@task(help={'settings-path': 'Path to settings file (absolute path). Leave empty for '
|
||||
'default'})
|
||||
def load_fixtures(context, settings_path=None):
|
||||
"""
|
||||
@@ -290,9 +266,9 @@ def config_location(context):
|
||||
Returns the default location for the settings file and the data folder
|
||||
"""
|
||||
print('Default locations:')
|
||||
print('* settings: {0}'.format(get_user_config_path('wger', 'settings.py')))
|
||||
print('* media folder: {0}'.format(get_user_data_path('wger', 'media')))
|
||||
print('* database path: {0}'.format(get_user_data_path('wger', 'database.sqlite')))
|
||||
print('* settings: {0}'.format(get_path('settings.py')))
|
||||
print('* media folder: {0}'.format(get_path('media')))
|
||||
print('* database path: {0}'.format(get_path('database.sqlite')))
|
||||
|
||||
|
||||
#
|
||||
@@ -304,67 +280,11 @@ def config_location(context):
|
||||
# packaged has a different sys path than the local one)
|
||||
#
|
||||
|
||||
|
||||
def get_user_data_path(*args):
|
||||
if sys.platform == "win32":
|
||||
return win32_get_app_data_path(*args)
|
||||
|
||||
data_home = os.environ.get(
|
||||
'XDG_DATA_HOME', os.path.join(
|
||||
os.path.expanduser('~'), '.local', 'share'))
|
||||
|
||||
return os.path.join(data_home, *args)
|
||||
|
||||
|
||||
def get_user_config_path(*args):
|
||||
if sys.platform == "win32":
|
||||
return win32_get_app_data_path(*args)
|
||||
|
||||
config_home = os.environ.get(
|
||||
'XDG_CONFIG_HOME', os.path.join(os.path.expanduser('~'), '.config'))
|
||||
|
||||
return os.path.join(config_home, *args)
|
||||
|
||||
|
||||
def win32_get_app_data_path(*args):
|
||||
shell32 = ctypes.WinDLL("shell32.dll")
|
||||
SHGetFolderPath = shell32.SHGetFolderPathW
|
||||
SHGetFolderPath.argtypes = (
|
||||
ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_uint32,
|
||||
ctypes.c_wchar_p)
|
||||
SHGetFolderPath.restype = ctypes.c_uint32
|
||||
|
||||
CSIDL_LOCAL_APPDATA = 0x001c
|
||||
MAX_PATH = 260
|
||||
|
||||
buf = ctypes.create_unicode_buffer(MAX_PATH)
|
||||
res = SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, 0, buf)
|
||||
if res != 0:
|
||||
raise Exception("Could not deterime APPDATA path")
|
||||
|
||||
return os.path.join(buf.value, *args)
|
||||
|
||||
|
||||
def detect_listen_opts(address, port):
|
||||
if address is None:
|
||||
try:
|
||||
address = socket.gethostbyname(socket.gethostname())
|
||||
except socket.error:
|
||||
address = "127.0.0.1"
|
||||
|
||||
if port is None:
|
||||
# test if we can use port 80
|
||||
s = socket.socket()
|
||||
port = 80
|
||||
try:
|
||||
s.bind((address, port))
|
||||
s.listen(-1)
|
||||
except socket.error:
|
||||
port = 8000
|
||||
finally:
|
||||
s.close()
|
||||
|
||||
return address, port
|
||||
def get_path(file="settings.py") -> pathlib.Path:
|
||||
"""
|
||||
Return the path of the given file relatively to the wger source folder
|
||||
"""
|
||||
return pathlib.Path(__file__).parent.absolute() / file
|
||||
|
||||
|
||||
def setup_django_environment(settings_path):
|
||||
@@ -374,7 +294,7 @@ def setup_django_environment(settings_path):
|
||||
|
||||
# Use default settings if the user didn't specify something else
|
||||
if settings_path is None:
|
||||
settings_path = get_user_config_path('wger', 'settings.py')
|
||||
settings_path = get_path('settings.py').as_posix()
|
||||
print('*** No settings given, using {0}'.format(settings_path))
|
||||
|
||||
# Find out file path and fine name of settings and setup django
|
||||
@@ -411,17 +331,3 @@ def database_exists():
|
||||
sys.exit(0)
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
def start_browser(url):
|
||||
"""
|
||||
Start the web browser with the given URL
|
||||
"""
|
||||
browser = webbrowser.get()
|
||||
|
||||
def function():
|
||||
time.sleep(1)
|
||||
browser.open(url)
|
||||
|
||||
thread = threading.Thread(target=function)
|
||||
thread.start()
|
||||
|
||||
Reference in New Issue
Block a user