Skip to content

Add demo / auto login to WebODM #1694

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 39 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
82e5fc1
Merge branch 'gunicorn' of https://github.com/pierotofy/WebODM
May 23, 2017
d89851a
Merge branch 'master' of https://github.com/OpenDroneMap/WebODM into …
May 29, 2017
5dd4fa8
Demo labels
Jun 7, 2017
65e8330
Merge branch 'master' of https://github.com/OpenDroneMap/WebODM into …
pierotofy Jun 7, 2017
75f97b2
Merge branch 'master' of https://github.com/OpenDroneMap/WebODM into …
pierotofy Jun 7, 2017
e621eab
Merged latest master
pierotofy Jun 15, 2017
184150b
Changed port to 80
pierotofy Jun 15, 2017
1890614
Removed first project creation
pierotofy Jun 16, 2017
270e4c8
Hard-coded no_tasks
pierotofy Jun 16, 2017
498a97d
Merged master
pierotofy Jul 25, 2017
b411b53
Merge remote-tracking branch 'piero/badinterfix' into demo
pierotofy Jul 25, 2017
0c8cc58
Merge branch 'badinterfix' of https://github.com/pierotofy/WebODM int…
pierotofy Jul 25, 2017
6a6463a
Modified views.py
pierotofy Jul 25, 2017
8da848f
Merge remote-tracking branch 'origin/master' into demo
pierotofy Nov 10, 2017
713e8b0
Changed docker-compose.yml
pierotofy Nov 18, 2017
27a10ef
Merged conflict
pierotofy Nov 18, 2017
22bfee4
Merge remote-tracking branch 'piero/share2' into demo
pierotofy Dec 5, 2017
7a268c3
Merge remote-tracking branch 'piero/share2' into demo
pierotofy Dec 5, 2017
e1ff3c4
merged master
pierotofy Jan 26, 2018
5d8a06a
Changes
pierotofy Feb 21, 2018
ece2bf5
Merge remote-tracking branch 'odm/master' into demo
May 4, 2018
33601d8
Ported demo changes to latest master
pierotofy May 4, 2018
279c354
Changes
pierotofy May 4, 2018
affb393
Updated to latest
pierotofy Feb 22, 2019
ef80e68
Merge branch 'master' of https://github.com/OpenDroneMap/WebODM into …
pierotofy Feb 22, 2019
4c15878
Merge branch 'master' of https://github.com/OpenDroneMap/WebODM into …
pierotofy Feb 26, 2019
5e4e68b
Merge branch 'master' of https://github.com/OpenDroneMap/WebODM into …
pierotofy Feb 26, 2019
113cd74
Merge remote-tracking branch 'odm/master' into demo
pierotofy Sep 6, 2019
de07cd6
Added disable files
pierotofy Oct 10, 2019
0190afe
Do not redirect to custom SSL port
pierotofy Oct 10, 2019
8324283
Description in dashboard
pierotofy Oct 10, 2019
f6e9a00
Merge branch 'master' of https://github.com/OpenDroneMap/WebODM into …
pierotofy Dec 31, 2019
6ee91ed
Merge branch 'master' of https://github.com/OpenDroneMap/WebODM into …
pierotofy Feb 12, 2020
4af1ee6
Add run.sh
pierotofy Sep 28, 2020
2b5f6cf
Merge master
Feb 12, 2021
c92ccb6
Merge
pierotofy Nov 10, 2021
ca233ff
Merge master
pierotofy Jul 8, 2022
24da599
Add locale
pierotofy Jul 8, 2022
4ae24fb
Merge master
pierotofy May 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0.4.1
40 changes: 40 additions & 0 deletions app/background.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from threading import Thread

import logging
from django import db
from app.testwatch import testWatch

logger = logging.getLogger('app.logger')

def background(func):
"""
Adds background={True|False} param to any function
so that we can call update_nodes_info(background=True) from the outside
"""
def wrapper(*args,**kwargs):
background = kwargs.get('background', False)
if 'background' in kwargs: del kwargs['background']

if background:
if testWatch.hook_pre(func, *args, **kwargs): return

# Create a function that closes all
# db connections at the end of the thread
# This is necessary to make sure we don't leave
# open connections lying around.
def execute_and_close_db():
ret = None
try:
ret = func(*args, **kwargs)
finally:
db.connections.close_all()
testWatch.hook_post(func, *args, **kwargs)
return ret

t = Thread(target=execute_and_close_db)
t.daemon = True
t.start()
return t
else:
return func(*args, **kwargs)
return wrapper
96 changes: 96 additions & 0 deletions app/scheduler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import logging
import traceback
from multiprocessing.dummy import Pool as ThreadPool
from threading import Lock

from apscheduler.schedulers import SchedulerAlreadyRunningError, SchedulerNotRunningError
from apscheduler.schedulers.background import BackgroundScheduler
from django import db
from django.db.models import Q, Count
from webodm import settings

from app.models import Task, Project
from nodeodm import status_codes
from nodeodm.models import ProcessingNode
from app.background import background

logger = logging.getLogger('app.logger')
scheduler = BackgroundScheduler({
'apscheduler.job_defaults.coalesce': 'true',
'apscheduler.job_defaults.max_instances': '3',
})

@background
def update_nodes_info():
processing_nodes = ProcessingNode.objects.all()
for processing_node in processing_nodes:
processing_node.update_node_info()

tasks_mutex = Lock()

@background
def process_pending_tasks():
tasks = []
try:
tasks_mutex.acquire()

# All tasks that have a processing node assigned
# Or that need one assigned (via auto)
# or tasks that need a status update
# or tasks that have a pending action
# and that are not locked (being processed by another thread)
tasks = Task.objects.filter(Q(processing_node__isnull=True, auto_processing_node=True) |
Q(Q(status=None) | Q(status__in=[status_codes.QUEUED, status_codes.RUNNING]), processing_node__isnull=False) |
Q(pending_action__isnull=False)).exclude(Q(processing_lock=True))
for task in tasks:
task.processing_lock = True
task.save()
finally:
tasks_mutex.release()

def process(task):
try:
task.process()
except Exception as e:
logger.error("Uncaught error! This is potentially bad. Please report it to http://github.com/OpenDroneMap/WebODM/issues: {} {}".format(e, traceback.format_exc()))
if settings.TESTING: raise e
finally:
# Might have been deleted
if task.pk is not None:
task.processing_lock = False
task.save()

db.connections.close_all()

if tasks.count() > 0:
pool = ThreadPool(tasks.count())
pool.map(process, tasks, chunksize=1)
pool.close()
pool.join()


def cleanup_projects():
# Delete all projects that are marked for deletion
# and that have no tasks left
total, count_dict = Project.objects.filter(deleting=True).annotate(
tasks_count=Count('task')
).filter(tasks_count=0).delete()
if total > 0 and 'app.Project' in count_dict:
logger.info("Deleted {} projects".format(count_dict['app.Project']))

def setup():
try:
scheduler.start()
scheduler.add_job(update_nodes_info, 'interval', seconds=30)
scheduler.add_job(process_pending_tasks, 'interval', seconds=5)
scheduler.add_job(cleanup_projects, 'interval', seconds=60)
except SchedulerAlreadyRunningError:
logger.warning("Scheduler already running (this is OK while testing)")

def teardown():
logger.info("Stopping scheduler...")
try:
scheduler.shutdown()
logger.info("Scheduler stopped")
except SchedulerNotRunningError:
logger.warning("Scheduler not running")
6 changes: 6 additions & 0 deletions app/templates/app/dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ <h3>{% trans 'Welcome!' %} ☺</h3>
</p>
{% endif %}

<h3>{% trans 'Welcome! ☺' %}</h3>
<p>
{% blocktrans %} You are currently in a demo. You cannot create new tasks and some features such as volume calculation and contours have been disabled, but you can look around to explore the software. {% endblocktrans %}
</p>


<div id="dashboard-app" data-dashboard></div>

{% endif %}
Expand Down
5 changes: 5 additions & 0 deletions app/templates/app/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{% extends "app/base.html" %}

{% block content %}
{{ hello }}
{% endblock %}
9 changes: 7 additions & 2 deletions app/views/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,22 @@ def index(request):
if settings.SINGLE_USER_MODE and not request.user.is_authenticated:
login(request, User.objects.get(username="admin"), 'django.contrib.auth.backends.ModelBackend')

# Auto login
if not request.user.is_authenticated:
login(request, User.objects.get(username="demouser"), 'django.contrib.auth.backends.ModelBackend')
return redirect('dashboard')

return redirect(settings.LOGIN_REDIRECT_URL if request.user.is_authenticated
else settings.LOGIN_URL)

@login_required
def dashboard(request):
no_processingnodes = ProcessingNode.objects.count() == 0
no_tasks = False

if no_processingnodes and settings.PROCESSING_NODES_ONBOARDING is not None:
return redirect(settings.PROCESSING_NODES_ONBOARDING)

no_tasks = Task.objects.filter(project__owner=request.user).count() == 0

# Create first project automatically
if Project.objects.count() == 0:
Project.objects.create(owner=request.user, name=_("First Project"))
Expand Down
2 changes: 1 addition & 1 deletion locale
Submodule locale updated 62 files
+133 −197 az/LC_MESSAGES/django.po
+436 −513 az/LC_MESSAGES/djangojs.po
+0 −1,733 be/LC_MESSAGES/django.po
+0 −2,475 be/LC_MESSAGES/djangojs.po
+138 −200 cs/LC_MESSAGES/django.po
+660 −817 cs/LC_MESSAGES/djangojs.po
+134 −203 de/LC_MESSAGES/django.po
+705 −860 de/LC_MESSAGES/djangojs.po
+133 −181 django.pot
+417 −485 djangojs.pot
+144 −200 es/LC_MESSAGES/django.po
+712 −843 es/LC_MESSAGES/djangojs.po
+146 −219 fr/LC_MESSAGES/django.po
+514 −613 fr/LC_MESSAGES/djangojs.po
+0 −1,733 hr/LC_MESSAGES/django.po
+0 −2,479 hr/LC_MESSAGES/djangojs.po
+142 −213 hu/LC_MESSAGES/django.po
+684 −842 hu/LC_MESSAGES/djangojs.po
+144 −194 id/LC_MESSAGES/django.po
+537 −640 id/LC_MESSAGES/djangojs.po
+140 −201 it/LC_MESSAGES/django.po
+702 −850 it/LC_MESSAGES/djangojs.po
+134 −201 ja/LC_MESSAGES/django.po
+668 −822 ja/LC_MESSAGES/djangojs.po
+133 −193 kn/LC_MESSAGES/django.po
+416 −486 kn/LC_MESSAGES/djangojs.po
+198 −304 ko/LC_MESSAGES/django.po
+613 −834 ko/LC_MESSAGES/djangojs.po
+133 −185 lt/LC_MESSAGES/django.po
+419 −493 lt/LC_MESSAGES/djangojs.po
+0 −1,731 lv/LC_MESSAGES/django.po
+0 −2,479 lv/LC_MESSAGES/djangojs.po
+134 −201 mn/LC_MESSAGES/django.po
+417 −485 mn/LC_MESSAGES/djangojs.po
+0 −1,760 mnw/LC_MESSAGES/django.po
+0 −2,492 mnw/LC_MESSAGES/djangojs.po
+133 −181 nb_NO/LC_MESSAGES/django.po
+471 −530 nb_NO/LC_MESSAGES/djangojs.po
+0 −1,730 nds/LC_MESSAGES/django.po
+0 −2,475 nds/LC_MESSAGES/djangojs.po
+133 −193 nl/LC_MESSAGES/django.po
+418 −488 nl/LC_MESSAGES/djangojs.po
+134 −201 pl/LC_MESSAGES/django.po
+714 −866 pl/LC_MESSAGES/djangojs.po
+163 −235 pt/LC_MESSAGES/django.po
+727 −876 pt/LC_MESSAGES/djangojs.po
+159 −224 pt_BR/LC_MESSAGES/django.po
+694 −844 pt_BR/LC_MESSAGES/djangojs.po
+0 −1,775 ro/LC_MESSAGES/django.po
+0 −2,489 ro/LC_MESSAGES/djangojs.po
+137 −194 ru/LC_MESSAGES/django.po
+686 −833 ru/LC_MESSAGES/djangojs.po
+134 −201 th/LC_MESSAGES/django.po
+656 −810 th/LC_MESSAGES/djangojs.po
+133 −197 tr/LC_MESSAGES/django.po
+430 −514 tr/LC_MESSAGES/djangojs.po
+52 −83 uk/LC_MESSAGES/django.po
+369 −648 uk/LC_MESSAGES/djangojs.po
+151 −212 zh_Hans/LC_MESSAGES/django.po
+546 −672 zh_Hans/LC_MESSAGES/djangojs.po
+145 −197 zh_Hant/LC_MESSAGES/django.po
+512 −634 zh_Hant/LC_MESSAGES/djangojs.po
2 changes: 1 addition & 1 deletion nginx/nginx-ssl.conf.template
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ http {
server {
server_name $WO_HOST;
listen 8080;
return 301 https://$WO_HOST:$WO_PORT$request_uri;
return 301 https://$WO_HOST$request_uri;
}

server {
Expand Down
2 changes: 1 addition & 1 deletion nodeodm/external/NodeODM
Submodule NodeODM updated 2 files
+1 −1 config.js
+9 −4 libs/S3.js
1 change: 1 addition & 0 deletions run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WO_HOST=demo.webodm.org WO_PORT=443 WO_SSL_INSECURE_PORT_REDIRECT=80 WO_SSL=YES WO_DEBUG=NO docker-compose -f docker-compose.yml -f docker-compose.ssl.yml -f docker-compose.build.yml up -d
4 changes: 2 additions & 2 deletions worker/celery.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
'task': 'worker.tasks.cleanup_tmp_directory',
'schedule': 3600,
'options': {
'expires': 1799,
'expires': 30,
'retry': False
}
},
Expand Down Expand Up @@ -69,4 +69,4 @@ def ready(self):
MockAsyncResult.set = lambda cti, r: MockAsyncResult(cti, r)

if __name__ == '__main__':
app.start()
app.start()