OpenDroneMap-WebODM/app/admin.py

173 wiersze
6.7 KiB
Python
Czysty Zwykły widok Historia

from django.conf.urls import url
2016-08-10 20:23:17 +00:00
from django.contrib import admin
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.html import format_html
from guardian.admin import GuardedModelAdmin
2017-07-21 20:48:01 +00:00
from app.models import PluginDatum
2017-07-21 20:48:01 +00:00
from app.models import Preset
from app.models import Plugin
from app.plugins import get_plugin_by_name, enable_plugin, disable_plugin, delete_plugin
from .models import Project, Task, ImageUpload, Setting, Theme
2017-11-06 22:43:47 +00:00
from django import forms
from codemirror2.widgets import CodeMirrorEditor
admin.site.register(Project, GuardedModelAdmin)
class TaskAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
return False
admin.site.register(Task, TaskAdmin)
class ImageUploadAdmin(admin.ModelAdmin):
readonly_fields = ('image',)
admin.site.register(ImageUpload, ImageUploadAdmin)
2017-07-21 20:48:01 +00:00
admin.site.register(Preset, admin.ModelAdmin)
class SettingAdmin(admin.ModelAdmin):
2017-11-06 22:43:47 +00:00
def has_add_permission(self, request):
# if there's already an entry, do not allow adding
count = Setting.objects.all().count()
return count == 0
admin.site.register(Setting, SettingAdmin)
2017-11-06 22:43:47 +00:00
class ThemeModelForm(forms.ModelForm):
css = forms.CharField(help_text="Enter custom CSS",
required=False,
widget=CodeMirrorEditor(options={'mode': 'css', 'lineNumbers': True}))
html_before_header = forms.CharField(help_text="HTML that will be displayed above site header",
required=False,
widget=CodeMirrorEditor(options={'mode': 'xml', 'lineNumbers': True}))
html_after_header = forms.CharField(help_text="HTML that will be displayed after site header",
required=False,
widget=CodeMirrorEditor(options={'mode': 'xml', 'lineNumbers': True}))
html_after_body = forms.CharField(help_text="HTML that will be displayed after the </body> tag",
required=False,
widget=CodeMirrorEditor(options={'mode': 'xml', 'lineNumbers': True}))
2017-11-07 16:54:01 +00:00
html_footer = forms.CharField(help_text="HTML that will be displayed in the footer. You can also use the special tags:"
"<p class='help'>{ORGANIZATION}: show a link to your organization.</p>"
"<p class='help'>{YEAR}: show current year</p>",
2017-11-06 22:43:47 +00:00
required=False,
widget=CodeMirrorEditor(options={'mode': 'xml', 'lineNumbers': True}))
class Meta:
model = Theme
fields = '__all__'
class ThemeAdmin(admin.ModelAdmin):
form = ThemeModelForm
2017-11-07 21:48:27 +00:00
admin.site.register(Theme, ThemeAdmin)
admin.site.register(PluginDatum, admin.ModelAdmin)
class PluginAdmin(admin.ModelAdmin):
list_display = ("name", "description", "version", "author", "enabled", "plugin_actions")
readonly_fields = ("name", )
2020-03-31 20:32:14 +00:00
change_list_template = "admin/change_list_plugin.html"
def has_add_permission(self, request):
return False
def has_delete_permission(self, request, obj=None):
return False
def description(self, obj):
manifest = get_plugin_by_name(obj.name, only_active=False, refresh_cache_if_none=True).get_manifest()
return manifest.get('description', '')
def version(self, obj):
manifest = get_plugin_by_name(obj.name, only_active=False, refresh_cache_if_none=True).get_manifest()
return manifest.get('version', '')
def author(self, obj):
manifest = get_plugin_by_name(obj.name, only_active=False, refresh_cache_if_none=True).get_manifest()
return manifest.get('author', '')
def get_urls(self):
urls = super().get_urls()
custom_urls = [
url(
r'^(?P<plugin_name>.+)/enable/$',
self.admin_site.admin_view(self.plugin_enable),
name='plugin-enable',
),
url(
r'^(?P<plugin_name>.+)/disable/$',
self.admin_site.admin_view(self.plugin_disable),
name='plugin-disable',
),
url(
r'^(?P<plugin_name>.+)/delete/$',
self.admin_site.admin_view(self.plugin_delete),
name='plugin-delete',
),
2020-03-31 20:32:14 +00:00
url(
r'^actions/upload/$',
self.admin_site.admin_view(self.plugin_upload),
name='plugin-upload',
),
]
return custom_urls + urls
def plugin_enable(self, request, plugin_name, *args, **kwargs):
try:
enable_plugin(plugin_name)
except Exception as e:
messages.warning(request, "Cannot enable plugin {}: {}".format(plugin_name, str(e)))
return HttpResponseRedirect(reverse('admin:app_plugin_changelist'))
def plugin_disable(self, request, plugin_name, *args, **kwargs):
try:
disable_plugin(plugin_name)
except Exception as e:
messages.warning(request, "Cannot disable plugin {}: {}".format(plugin_name, str(e)))
return HttpResponseRedirect(reverse('admin:app_plugin_changelist'))
def plugin_delete(self, request, plugin_name, *args, **kwargs):
try:
delete_plugin(plugin_name)
except Exception as e:
messages.warning(request, "Cannot delete plugin {}: {}".format(plugin_name, str(e)))
return HttpResponseRedirect(reverse('admin:app_plugin_changelist'))
2020-03-31 20:32:14 +00:00
def plugin_upload(self, request, *args, **kwargs):
messages.info(request, "YAY")
# TODO
return HttpResponseRedirect(reverse('admin:app_plugin_changelist'))
def plugin_actions(self, obj):
plugin = get_plugin_by_name(obj.name, only_active=False)
return format_html(
'<a class="button" href="{}" {}>Disable</a>&nbsp;'
'<a class="button" href="{}" {}>Enable</a>'
+ ('&nbsp;<a class="button" href="{}" onclick="return confirm(\'Are you sure you want to delete {}?\')"><i class="fa fa-trash"></i></a>' if not plugin.is_persistent() else '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;')
,
reverse('admin:plugin-disable', args=[obj.pk]) if obj.enabled else '#',
'disabled' if not obj.enabled else '',
reverse('admin:plugin-enable', args=[obj.pk]) if not obj.enabled else '#',
'disabled' if obj.enabled else '',
reverse('admin:plugin-delete', args=[obj.pk]),
obj.name
)
plugin_actions.short_description = 'Actions'
plugin_actions.allow_tags = True
admin.site.register(Plugin, PluginAdmin)