2019-03-19 19:19:23 +00:00
from django . conf . urls import url
2016-08-10 20:23:17 +00:00
from django . contrib import admin
2019-07-09 22:08:28 +00:00
from django . contrib import messages
2019-03-19 19:19:23 +00:00
from django . http import HttpResponseRedirect
from django . urls import reverse
from django . utils . html import format_html
2016-10-04 20:36:08 +00:00
from guardian . admin import GuardedModelAdmin
2017-07-21 20:48:01 +00:00
2018-07-30 16:44:16 +00:00
from app . models import PluginDatum
2017-07-21 20:48:01 +00:00
from app . models import Preset
2019-03-19 19:19:23 +00:00
from app . models import Plugin
2020-03-31 18:02:19 +00:00
from app . plugins import get_plugin_by_name , enable_plugin , disable_plugin , delete_plugin
2017-11-06 18:45:14 +00:00
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
2016-10-04 20:36:08 +00:00
2016-10-12 22:18:37 +00:00
admin . site . register ( Project , GuardedModelAdmin )
2017-07-10 17:32:36 +00:00
class TaskAdmin ( admin . ModelAdmin ) :
def has_add_permission ( self , request ) :
return False
admin . site . register ( Task , TaskAdmin )
2016-10-13 20:28:32 +00:00
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 )
2017-11-06 18:45:14 +00:00
class SettingAdmin ( admin . ModelAdmin ) :
2017-11-06 22:43:47 +00:00
2017-11-06 18:45:14 +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
2018-07-30 16:44:16 +00:00
admin . site . register ( Theme , ThemeAdmin )
2019-03-19 19:19:23 +00:00
admin . site . register ( PluginDatum , admin . ModelAdmin )
2018-07-30 16:44:16 +00:00
2019-03-19 19:19:23 +00:00
class PluginAdmin ( admin . ModelAdmin ) :
list_display = ( " name " , " description " , " version " , " author " , " enabled " , " plugin_actions " )
readonly_fields = ( " name " , )
def has_add_permission ( self , request ) :
return False
def has_delete_permission ( self , request , obj = None ) :
return False
def description ( self , obj ) :
2019-03-29 17:12:43 +00:00
manifest = get_plugin_by_name ( obj . name , only_active = False , refresh_cache_if_none = True ) . get_manifest ( )
2019-03-19 19:19:23 +00:00
return manifest . get ( ' description ' , ' ' )
def version ( self , obj ) :
2019-03-29 17:12:43 +00:00
manifest = get_plugin_by_name ( obj . name , only_active = False , refresh_cache_if_none = True ) . get_manifest ( )
2019-03-19 19:19:23 +00:00
return manifest . get ( ' version ' , ' ' )
def author ( self , obj ) :
2019-03-29 17:12:43 +00:00
manifest = get_plugin_by_name ( obj . name , only_active = False , refresh_cache_if_none = True ) . get_manifest ( )
2019-03-19 19:19:23 +00:00
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 ' ,
) ,
2020-03-31 18:02:19 +00:00
url (
r ' ^(?P<plugin_name>.+)/delete/$ ' ,
self . admin_site . admin_view ( self . plugin_delete ) ,
name = ' plugin-delete ' ,
) ,
2019-03-19 19:19:23 +00:00
]
return custom_urls + urls
def plugin_enable ( self , request , plugin_name , * args , * * kwargs ) :
2019-07-09 22:08:28 +00:00
try :
enable_plugin ( plugin_name )
except Exception as e :
messages . warning ( request , " Cannot enable plugin {} : {} " . format ( plugin_name , str ( e ) ) )
2019-03-19 19:19:23 +00:00
return HttpResponseRedirect ( reverse ( ' admin:app_plugin_changelist ' ) )
def plugin_disable ( self , request , plugin_name , * args , * * kwargs ) :
2019-07-09 22:08:28 +00:00
try :
disable_plugin ( plugin_name )
except Exception as e :
messages . warning ( request , " Cannot disable plugin {} : {} " . format ( plugin_name , str ( e ) ) )
2019-03-19 19:19:23 +00:00
return HttpResponseRedirect ( reverse ( ' admin:app_plugin_changelist ' ) )
2020-03-31 18:02:19 +00:00
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 ' ) )
2019-03-19 19:19:23 +00:00
def plugin_actions ( self , obj ) :
2020-03-31 18:02:19 +00:00
plugin = get_plugin_by_name ( obj . name , only_active = False )
2019-03-19 19:19:23 +00:00
return format_html (
' <a class= " button " href= " {} " {} >Disable</a> '
2020-03-31 18:02:19 +00:00
' <a class= " button " href= " {} " {} >Enable</a> '
+ ( ' <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 ' ' )
,
2019-03-19 19:19:23 +00:00
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 ' ' ,
2020-03-31 18:02:19 +00:00
# TODO
reverse ( ' admin:plugin-delete ' , args = [ obj . pk ] ) ,
obj . name
2019-03-19 19:19:23 +00:00
)
plugin_actions . short_description = ' Actions '
plugin_actions . allow_tags = True
admin . site . register ( Plugin , PluginAdmin )