import os import tempfile import zipfile import shutil from django.conf.urls import url 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 from app.models import PluginDatum from app.models import Preset from app.models import Plugin from app.plugins import get_plugin_by_name, enable_plugin, disable_plugin, delete_plugin, valid_plugin, \ get_plugins_persistent_path, clear_plugins_cache, init_plugins from .models import Project, Task, ImageUpload, Setting, Theme from django import forms from codemirror2.widgets import CodeMirrorEditor from webodm import settings from django.core.files.uploadedfile import InMemoryUploadedFile 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) admin.site.register(Preset, admin.ModelAdmin) class SettingAdmin(admin.ModelAdmin): 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) 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})) html_footer = forms.CharField(help_text="HTML that will be displayed in the footer. You can also use the special tags:" "
{ORGANIZATION}: show a link to your organization.
" "{YEAR}: show current year
", required=False, widget=CodeMirrorEditor(options={'mode': 'xml', 'lineNumbers': True})) class Meta: model = Theme fields = '__all__' class ThemeAdmin(admin.ModelAdmin): form = ThemeModelForm 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", ) 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