kopia lustrzana https://github.com/OpenDroneMap/WebODM
Dev tools mockup
rodzic
15e2d64c41
commit
46b0b08ecc
|
@ -41,6 +41,7 @@ RUN npm install --quiet -g webpack@4.16.5 && npm install --quiet -g webpack-cli
|
||||||
RUN echo "UTC" > /etc/timezone
|
RUN echo "UTC" > /etc/timezone
|
||||||
RUN python manage.py collectstatic --noinput
|
RUN python manage.py collectstatic --noinput
|
||||||
RUN bash app/scripts/plugin_cleanup.sh && echo "from app.plugins import build_plugins;build_plugins()" | python manage.py shell
|
RUN bash app/scripts/plugin_cleanup.sh && echo "from app.plugins import build_plugins;build_plugins()" | python manage.py shell
|
||||||
|
RUN bash translate.sh build
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
RUN apt-get remove -y g++ python3-dev libpq-dev && apt-get autoremove -y
|
RUN apt-get remove -y g++ python3-dev libpq-dev && apt-get autoremove -y
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
{% extends "app/logged_in_base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h2>{% trans 'Developer Tools' %}</h2>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="text-center">
|
||||||
|
// TODO
|
||||||
|
// https://hosted.weblate.org/download/webodm/?format=zip
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
|
@ -103,6 +103,13 @@
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% is_dev_mode as dev_mode %}
|
||||||
|
{% if dev_mode and user.is_superuser %}
|
||||||
|
<li>
|
||||||
|
<a href="/dev-tools/"><i class="fa fa-bug fa-fw"></i> {% trans 'Developer Tools' %}</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
<li id="about-menu">
|
<li id="about-menu">
|
||||||
<a href="/about/"><i class="fa fa-info-circle fa-fw"></i> {% trans 'About' %}</a>
|
<a href="/about/"><i class="fa fa-info-circle fa-fw"></i> {% trans 'About' %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -11,6 +11,10 @@ logger = logging.getLogger('app.logger')
|
||||||
def is_single_user_mode():
|
def is_single_user_mode():
|
||||||
return settings.SINGLE_USER_MODE
|
return settings.SINGLE_USER_MODE
|
||||||
|
|
||||||
|
@register.simple_tag
|
||||||
|
def is_dev_mode():
|
||||||
|
return settings.DEV
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True)
|
@register.simple_tag(takes_context=True)
|
||||||
def settings_image_url(context, image):
|
def settings_image_url(context, image):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -5,6 +5,7 @@ from rest_framework import status
|
||||||
from app.models import Project, Task
|
from app.models import Project, Task
|
||||||
from app.models import Setting
|
from app.models import Setting
|
||||||
from app.models import Theme
|
from app.models import Theme
|
||||||
|
from webodm import settings
|
||||||
from .classes import BootTestCase
|
from .classes import BootTestCase
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
|
||||||
|
@ -167,10 +168,22 @@ class TestApp(BootTestCase):
|
||||||
res = c.get(url)
|
res = c.get(url)
|
||||||
self.assertEqual(res.status_code, status.HTTP_200_OK)
|
self.assertEqual(res.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
|
# Cannot access dev tools (not in dev mode)
|
||||||
|
settings.DEV = False
|
||||||
|
self.assertEqual(c.get('/dev-tools/').status_code, status.HTTP_404_NOT_FOUND)
|
||||||
|
settings.DEV = True
|
||||||
|
|
||||||
|
# Can access in dev mode
|
||||||
|
self.assertEqual(c.get('/dev-tools/').status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
# Cannot access admin views as normal user
|
# Cannot access admin views as normal user
|
||||||
c.logout()
|
c.logout()
|
||||||
c.login(username='testuser', password='test1234')
|
c.login(username='testuser', password='test1234')
|
||||||
|
|
||||||
|
# Can never access dev tools as user, even in dev mode
|
||||||
|
self.assertRedirects(c.get('/dev-tools/', follow=True), '/login/?next=/dev-tools/')
|
||||||
|
settings.DEV = False
|
||||||
|
|
||||||
for url in admin_menu_items:
|
for url in admin_menu_items:
|
||||||
res = c.get(url, follow=True)
|
res = c.get(url, follow=True)
|
||||||
self.assertRedirects(res, '/admin/login/?next={}'.format(url))
|
self.assertRedirects(res, '/admin/login/?next={}'.format(url))
|
||||||
|
|
|
@ -40,6 +40,8 @@ urlpatterns = [
|
||||||
url(r'^plugins/(?P<plugin_name>[^/.]+)/(.*)$', app_view_handler),
|
url(r'^plugins/(?P<plugin_name>[^/.]+)/(.*)$', app_view_handler),
|
||||||
|
|
||||||
url(r'^about/$', app_views.about, name='about'),
|
url(r'^about/$', app_views.about, name='about'),
|
||||||
|
url(r'^dev-tools/$', app_views.dev_tools, name='dev_tools'),
|
||||||
|
|
||||||
# TODO: add caching: https://docs.djangoproject.com/en/3.1/topics/i18n/translation/#note-on-performance
|
# TODO: add caching: https://docs.djangoproject.com/en/3.1/topics/i18n/translation/#note-on-performance
|
||||||
url(r'^jsi18n/', JavaScriptCatalog.as_view(packages=['app']), name='javascript-catalog'),
|
url(r'^jsi18n/', JavaScriptCatalog.as_view(packages=['app']), name='javascript-catalog'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -6,6 +6,7 @@ from django.contrib.auth.models import User
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.shortcuts import render, redirect, get_object_or_404
|
from django.shortcuts import render, redirect, get_object_or_404
|
||||||
from guardian.shortcuts import get_objects_for_user
|
from guardian.shortcuts import get_objects_for_user
|
||||||
|
from django.contrib.auth.decorators import user_passes_test
|
||||||
|
|
||||||
from nodeodm.models import ProcessingNode
|
from nodeodm.models import ProcessingNode
|
||||||
from app.models import Project, Task
|
from app.models import Project, Task
|
||||||
|
@ -110,11 +111,20 @@ def processing_node(request, processing_node_id):
|
||||||
|
|
||||||
return render(request, 'app/processing_node.html',
|
return render(request, 'app/processing_node.html',
|
||||||
{
|
{
|
||||||
'title': 'Processing Node',
|
'title': _('Processing Node'),
|
||||||
'processing_node': pn,
|
'processing_node': pn,
|
||||||
'available_options_json': pn.get_available_options_json(pretty=True)
|
'available_options_json': pn.get_available_options_json(pretty=True)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@user_passes_test(lambda u: u.is_superuser)
|
||||||
|
def dev_tools(request):
|
||||||
|
if not settings.DEV:
|
||||||
|
raise Http404()
|
||||||
|
|
||||||
|
return render(request, 'app/dev_tools.html', {
|
||||||
|
'title': _('Developer Tools')
|
||||||
|
})
|
||||||
|
|
||||||
class FirstUserForm(forms.ModelForm):
|
class FirstUserForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
|
|
Ładowanie…
Reference in New Issue