2017-11-06 18:45:14 +00:00
|
|
|
import os
|
|
|
|
|
2016-10-25 20:04:24 +00:00
|
|
|
from django.contrib.auth.models import Permission
|
|
|
|
from django.contrib.auth.models import User, Group
|
2017-02-08 19:53:55 +00:00
|
|
|
from django.core.exceptions import ObjectDoesNotExist
|
2017-11-06 18:45:14 +00:00
|
|
|
from django.core.files import File
|
2016-10-25 20:04:24 +00:00
|
|
|
from django.db.utils import ProgrammingError
|
2017-02-08 19:53:55 +00:00
|
|
|
from guardian.shortcuts import assign_perm
|
|
|
|
|
2017-07-25 17:54:41 +00:00
|
|
|
from app.models import Preset
|
2017-11-06 18:45:14 +00:00
|
|
|
from app.models import Theme
|
2018-01-30 16:48:16 +00:00
|
|
|
from app.plugins import register_plugins
|
2017-02-08 19:53:55 +00:00
|
|
|
from nodeodm.models import ProcessingNode
|
2017-05-21 18:18:56 +00:00
|
|
|
# noinspection PyUnresolvedReferences
|
2017-11-06 18:45:14 +00:00
|
|
|
from webodm.settings import MEDIA_ROOT
|
2017-05-21 18:18:56 +00:00
|
|
|
from . import scheduler, signals
|
2017-05-19 20:15:26 +00:00
|
|
|
import logging
|
2017-11-06 18:45:14 +00:00
|
|
|
from .models import Task, Setting
|
2017-02-08 20:23:21 +00:00
|
|
|
from webodm import settings
|
2017-05-19 20:15:26 +00:00
|
|
|
from webodm.wsgi import booted
|
2017-02-08 19:53:55 +00:00
|
|
|
|
2016-10-07 23:07:47 +00:00
|
|
|
|
2016-10-25 20:04:24 +00:00
|
|
|
def boot():
|
2017-05-19 20:15:26 +00:00
|
|
|
# booted is a shared memory variable to keep track of boot status
|
|
|
|
# as multiple workers could trigger the boot sequence twice
|
2017-05-21 18:18:56 +00:00
|
|
|
if not settings.DEBUG and booted.value: return
|
2017-05-19 20:15:26 +00:00
|
|
|
|
|
|
|
booted.value = True
|
2016-10-07 23:07:47 +00:00
|
|
|
logger = logging.getLogger('app.logger')
|
2017-05-19 20:15:26 +00:00
|
|
|
|
2018-02-09 18:46:45 +00:00
|
|
|
logger.info("Booting WebODM {}".format(settings.VERSION))
|
|
|
|
|
2017-05-19 20:15:26 +00:00
|
|
|
if settings.DEBUG:
|
2017-05-21 18:18:56 +00:00
|
|
|
logger.warning("Debug mode is ON (for development this is OK)")
|
2016-10-07 23:07:47 +00:00
|
|
|
|
|
|
|
# Check default group
|
2016-10-08 01:00:34 +00:00
|
|
|
try:
|
|
|
|
default_group, created = Group.objects.get_or_create(name='Default')
|
|
|
|
if created:
|
|
|
|
logger.info("Created default group")
|
2016-10-07 23:07:47 +00:00
|
|
|
|
2017-02-08 19:53:55 +00:00
|
|
|
# Assign viewprocessing node object permission to default processing node (if present)
|
|
|
|
# Otherwise non-root users will not be able to process
|
|
|
|
try:
|
|
|
|
pnode = ProcessingNode.objects.get(hostname="node-odm-1")
|
|
|
|
assign_perm('view_processingnode', default_group, pnode)
|
|
|
|
logger.info("Added view_processingnode permissions to default group")
|
|
|
|
except ObjectDoesNotExist:
|
|
|
|
pass
|
|
|
|
|
2017-02-08 20:23:21 +00:00
|
|
|
|
2016-10-12 22:18:37 +00:00
|
|
|
# Add default permissions (view_project, change_project, delete_project, etc.)
|
2017-07-21 20:48:01 +00:00
|
|
|
for permission in ('_project', '_task', '_preset'):
|
2016-10-08 01:00:34 +00:00
|
|
|
default_group.permissions.add(
|
2017-02-08 20:23:21 +00:00
|
|
|
*list(Permission.objects.filter(codename__endswith=permission))
|
|
|
|
)
|
2016-11-17 23:51:07 +00:00
|
|
|
|
|
|
|
# Add permission to view processing nodes
|
|
|
|
default_group.permissions.add(Permission.objects.get(codename="view_processingnode"))
|
2017-02-08 20:23:21 +00:00
|
|
|
|
2017-07-25 17:54:41 +00:00
|
|
|
# Add default presets
|
|
|
|
Preset.objects.get_or_create(name='DSM + DTM', system=True,
|
|
|
|
options=[{'name': 'dsm', 'value': True}, {'name': 'dtm', 'value': True}])
|
2018-02-09 18:46:45 +00:00
|
|
|
Preset.objects.get_or_create(name='Fast Orthophoto', system=True,
|
|
|
|
options=[{'name': 'fast-orthophoto', 'value': True}])
|
2017-07-25 17:54:41 +00:00
|
|
|
Preset.objects.get_or_create(name='High Quality', system=True,
|
|
|
|
options=[{'name': 'dsm', 'value': True},
|
|
|
|
{'name': 'mesh-octree-depth', 'value': "12"},
|
|
|
|
{'name': 'dem-resolution', 'value': "0.04"},
|
2018-02-09 18:46:45 +00:00
|
|
|
{'name': 'orthophoto-resolution', 'value': "40"},
|
2017-07-25 17:54:41 +00:00
|
|
|
])
|
|
|
|
Preset.objects.get_or_create(name='Default', system=True, options=[{'name': 'dsm', 'value': True}])
|
|
|
|
|
2017-11-06 18:45:14 +00:00
|
|
|
# Add settings
|
|
|
|
default_theme, created = Theme.objects.get_or_create(name='Default')
|
|
|
|
if created:
|
|
|
|
logger.info("Created default theme")
|
|
|
|
|
|
|
|
if Setting.objects.all().count() == 0:
|
2017-11-09 20:45:29 +00:00
|
|
|
default_logo = os.path.join('app', 'static', 'app', 'img', 'logo512.png')
|
|
|
|
|
2017-11-06 18:45:14 +00:00
|
|
|
s = Setting.objects.create(
|
|
|
|
app_name='WebODM',
|
|
|
|
theme=default_theme)
|
|
|
|
s.app_logo.save(os.path.basename(default_logo), File(open(default_logo, 'rb')))
|
|
|
|
|
|
|
|
logger.info("Created settings")
|
|
|
|
|
2016-10-25 22:08:15 +00:00
|
|
|
# Unlock any Task that might have been locked
|
|
|
|
Task.objects.filter(processing_lock=True).update(processing_lock=False)
|
2017-02-08 19:53:55 +00:00
|
|
|
|
2018-01-30 16:48:16 +00:00
|
|
|
register_plugins()
|
|
|
|
|
2016-10-25 22:08:15 +00:00
|
|
|
if not settings.TESTING:
|
|
|
|
# Setup and start scheduler
|
|
|
|
scheduler.setup()
|
|
|
|
|
|
|
|
scheduler.update_nodes_info(background=True)
|
2016-10-25 20:04:24 +00:00
|
|
|
|
2016-10-25 22:08:15 +00:00
|
|
|
except ProgrammingError:
|
2016-12-13 14:52:15 +00:00
|
|
|
logger.warning("Could not touch the database. If running a migration, this is expected.")
|