OpenDroneMap-WebODM/app/boot.py

169 wiersze
9.4 KiB
Python
Czysty Zwykły widok Historia

import os
import sys
import kombu
from django.contrib.auth.models import Permission
from django.contrib.auth.models import User, Group
2018-03-19 18:21:01 +00:00
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.core.files import File
from django.db.utils import ProgrammingError
2017-02-08 19:53:55 +00:00
from guardian.shortcuts import assign_perm
from worker import tasks as worker_tasks
2017-07-25 17:54:41 +00:00
from app.models import Preset
from app.models import Theme
from app.plugins import init_plugins
2017-02-08 19:53:55 +00:00
from nodeodm.models import ProcessingNode
2022-11-21 00:42:46 +00:00
# noinspection PyUnresolvedReferencesapp/boot.py#L20
from webodm.settings import MEDIA_ROOT
from . import signals
import logging
from .models import Task, Setting
2017-02-08 20:23:21 +00:00
from webodm import settings
from webodm.wsgi import booted
2017-02-08 19:53:55 +00:00
def boot():
# booted is a shared memory variable to keep track of boot status
# as multiple gunicorn workers could trigger the boot sequence twice
if (not settings.DEBUG and booted.value) or settings.MIGRATING: return
booted.value = True
logger = logging.getLogger('app.logger')
2018-02-09 18:46:45 +00:00
logger.info("Booting WebODM {}".format(settings.VERSION))
if settings.DEBUG:
logger.warning("Debug mode is ON (for development this is OK)")
# Silence django's "Warning: Session data corrupted" messages
session_logger = logging.getLogger("django.security.SuspiciousSession")
session_logger.disabled = True
# Make sure our app/media/tmp folder exists
if not os.path.exists(settings.MEDIA_TMP):
2018-05-13 17:30:44 +00:00
os.makedirs(settings.MEDIA_TMP)
# Check default group
try:
default_group, created = Group.objects.get_or_create(name='Default')
if created:
logger.info("Created default group")
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
# Add default permissions (view_project, change_project, delete_project, etc.)
2017-07-21 20:48:01 +00:00
for permission in ('_project', '_task', '_preset'):
default_group.permissions.add(
2017-02-08 20:23:21 +00:00
*list(Permission.objects.filter(codename__endswith=permission))
)
# Add permission to view processing nodes
default_group.permissions.add(Permission.objects.get(codename="view_processingnode"))
2017-02-08 20:23:21 +00:00
2018-03-19 18:21:01 +00:00
add_default_presets()
2017-07-25 17:54:41 +00:00
# Add settings
default_theme, created = Theme.objects.get_or_create(name='Default')
if created:
logger.info("Created default theme")
2020-03-20 17:00:09 +00:00
if settings.DEFAULT_THEME_CSS:
default_theme.css = settings.DEFAULT_THEME_CSS
default_theme.save()
if Setting.objects.all().count() == 0:
s = Setting.objects.create(
2020-03-20 15:32:12 +00:00
app_name=settings.APP_NAME,
theme=default_theme)
2020-03-20 15:32:12 +00:00
s.app_logo.save(os.path.basename(settings.APP_DEFAULT_LOGO), File(open(settings.APP_DEFAULT_LOGO, 'rb')))
logger.info("Created settings")
2021-05-27 13:55:27 +00:00
init_plugins()
if not settings.TESTING:
try:
worker_tasks.update_nodes_info.delay()
except kombu.exceptions.OperationalError as e:
logger.error("Cannot connect to celery broker at {}. Make sure that your redis-server is running at that address: {}".format(settings.CELERY_BROKER_URL, str(e)))
except ProgrammingError:
2018-03-19 18:21:01 +00:00
logger.warning("Could not touch the database. If running a migration, this is expected.")
def add_default_presets():
try:
2022-06-23 15:59:13 +00:00
Preset.objects.update_or_create(name='Multispectral', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
2022-11-22 21:05:14 +00:00
{'name': 'radiometric-calibration', 'value': 'camera'}]})
Preset.objects.update_or_create(name='Volume Analysis', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'dsm', 'value': True},
{'name': 'dem-resolution', 'value': '2'},
{'name': 'pc-quality', 'value': 'high'},
2022-11-22 21:05:14 +00:00
{'name': 'use-3dmesh', 'value': True}]})
2019-01-15 19:07:35 +00:00
Preset.objects.update_or_create(name='3D Model', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'mesh-octree-depth', 'value': "12"},
2019-01-15 19:07:35 +00:00
{'name': 'use-3dmesh', 'value': True},
2021-02-05 19:49:13 +00:00
{'name': 'pc-quality', 'value': 'high'},
2019-12-02 17:57:16 +00:00
{'name': 'mesh-size', 'value': '300000'}]})
2019-01-15 19:07:35 +00:00
Preset.objects.update_or_create(name='Buildings', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'mesh-size', 'value': '300000'},
{'name': 'pc-geometric', 'value': True},
2022-11-22 18:52:57 +00:00
{'name': 'feature-quality', 'value': 'high'},
2021-02-05 19:49:13 +00:00
{'name': 'pc-quality', 'value': 'high'}]})
2022-11-22 18:52:57 +00:00
Preset.objects.update_or_create(name='Buildings Ultra Quality', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'mesh-size', 'value': '300000'},
{'name': 'pc-geometric', 'value': True},
{'name': 'feature-quality', 'value': 'ultra'},
2022-11-22 21:05:14 +00:00
{'name': 'pc-quality', 'value': 'ultra'}]})
2019-01-15 19:07:35 +00:00
Preset.objects.update_or_create(name='Point of Interest', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'mesh-size', 'value': '300000'},
2019-01-15 19:07:35 +00:00
{'name': 'use-3dmesh', 'value': True}]})
Preset.objects.update_or_create(name='Forest', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'min-num-features', 'value': '18000'},
{'name': 'use-3dmesh', 'value': True},
2021-02-05 19:49:13 +00:00
{'name': 'feature-quality', 'value': 'ultra'}]})
2018-03-19 18:21:01 +00:00
Preset.objects.update_or_create(name='DSM + DTM', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'dsm', 'value': True},
{'name': 'dtm', 'value': True}]})
2022-04-22 17:26:36 +00:00
Preset.objects.update_or_create(name='Field', system=True,
defaults={'options': [{'name': 'sfm-algorithm', 'value': 'planar'},
{'name': 'fast-orthophoto', 'value': True},
{'name': 'matcher-neighbors', 'value': 4}]})
2018-03-19 18:21:01 +00:00
Preset.objects.update_or_create(name='Fast Orthophoto', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'fast-orthophoto', 'value': True}]})
Preset.objects.update_or_create(name='High Resolution', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'dsm', 'value': True},
2021-02-05 19:49:13 +00:00
{'name': 'pc-quality', 'value': 'high'},
2019-01-15 19:07:35 +00:00
{'name': 'dem-resolution', 'value': "2.0"},
2022-11-22 21:05:14 +00:00
{'name': 'orthophoto-resolution', 'value': "2.0"}]})
2018-03-19 18:21:01 +00:00
Preset.objects.update_or_create(name='Default', system=True,
defaults={'options': [{'name': 'auto-boundary', 'value': True},
{'name': 'dsm', 'value': True}]})
2019-01-15 19:07:35 +00:00
2018-03-19 18:21:01 +00:00
except MultipleObjectsReturned:
# Mostly to handle a legacy code problem where
# multiple system presets with the same name were
# created if we changed the options
Preset.objects.filter(system=True).delete()
add_default_presets()