diff --git a/beat/web/backend/admin.py b/beat/web/backend/admin.py index fcfdcf9ecbcec123033643257b6fde19c591a0b8..d7dc6f54ab436f93967ee2209f973c1c15ad78ef 100755 --- a/beat/web/backend/admin.py +++ b/beat/web/backend/admin.py @@ -192,7 +192,7 @@ class JobSplitInline(admin.TabularInline): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -210,7 +210,7 @@ class Job(admin.ModelAdmin): def splits(self, obj): return obj.splits.count() - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False diff --git a/beat/web/databases/admin.py b/beat/web/databases/admin.py index 5af35497aba64ae2ba0339ee12bbd030c10b212a..3e0558df256b2aea524b1238247ed53555af5906 100755 --- a/beat/web/databases/admin.py +++ b/beat/web/databases/admin.py @@ -229,7 +229,7 @@ class DatabaseSetTemplateOutputInline(admin.TabularInline): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -245,7 +245,7 @@ class DatabaseSetTemplate(admin.ModelAdmin): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -265,7 +265,7 @@ class DatabaseSetOutputInline(admin.TabularInline): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -286,7 +286,7 @@ class DatabaseSet(admin.ModelAdmin): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False diff --git a/beat/web/experiments/admin.py b/beat/web/experiments/admin.py index 6d453ef13bb732e0df20ff89e8a53f6699cc8c30..f770987794517d6c2285ed95b1dc555315b93e4b 100755 --- a/beat/web/experiments/admin.py +++ b/beat/web/experiments/admin.py @@ -133,7 +133,7 @@ class BlockInline(admin.TabularInline): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -268,7 +268,7 @@ class BlockInputInline(admin.TabularInline): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -291,7 +291,7 @@ class CachedFileInline(admin.TabularInline): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -328,7 +328,7 @@ class BlockDependentsInline(admin.TabularInline): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -365,7 +365,7 @@ class BlockDependenciesInline(admin.TabularInline): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -457,7 +457,7 @@ class Block(admin.ModelAdmin): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False form = BlockModelForm @@ -505,7 +505,7 @@ class Result(admin.ModelAdmin): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False @@ -640,7 +640,7 @@ class CachedFile(admin.ModelAdmin): def has_delete_permission(self, request, obj=None): return False - def has_add_permission(self, request): + def has_add_permission(self, request, obj=None): return False diff --git a/beat/web/ui/widgets.py b/beat/web/ui/widgets.py index addae6dac799768aef31290fbec25e9d37f29536..79d05e5b851f840c58ecdab71a9b0a4e917582fd 100644 --- a/beat/web/ui/widgets.py +++ b/beat/web/ui/widgets.py @@ -29,10 +29,10 @@ # https://github.com/lambdalisue/django-codemirror-widget # (originally BSD-Licensed) -from itertools import chain -import re import hashlib import json +import re +from itertools import chain from django import forms from django.conf import settings @@ -41,31 +41,36 @@ from django.utils.safestring import mark_safe from .. import __version__ # set default settings -CODEMIRROR_PATH = getattr(settings, 'CODEMIRROR_PATH', 'codemirror') -if CODEMIRROR_PATH.endswith('/'): +CODEMIRROR_PATH = getattr(settings, "CODEMIRROR_PATH", "codemirror") +if CODEMIRROR_PATH.endswith("/"): CODEMIRROR_PATH = CODEMIRROR_PATH[:-1] -CODEMIRROR_MODE = getattr(settings, 'CODEMIRROR_MODE', 'javascript') -CODEMIRROR_THEME = getattr(settings, 'CODEMIRROR_THEME', 'default') -CODEMIRROR_SIZE = getattr(settings, 'CODEMIRROR_SIZE', None) +CODEMIRROR_MODE = getattr(settings, "CODEMIRROR_MODE", "javascript") +CODEMIRROR_THEME = getattr(settings, "CODEMIRROR_THEME", "default") +CODEMIRROR_SIZE = getattr(settings, "CODEMIRROR_SIZE", None) + +THEME_CSS_FILENAME_RE = re.compile(r"[\w-]+") -THEME_CSS_FILENAME_RE = re.compile(r'[\w-]+') def uniq(seq, idfun=None): """Order preserving, fast de-duplication for lists""" if idfun is None: - def idfun(x): return x + + def idfun(x): + return x seen = {} result = [] for item in seq: marker = idfun(item) - if marker in seen: continue + if marker in seen: + continue seen[marker] = 1 result.append(item) return result + def isstring(obj): try: return isinstance(obj, basestring) @@ -111,7 +116,7 @@ class CodeMirrorJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, CodeMirrorJavascript): # If a Javascript object is encountered, replace it with a placeholder. - stash_id = self.stash_prefix + hashlib.md5(obj.js).hexdigest() + stash_id = self.stash_prefix + hashlib.md5(obj.js).hexdigest() # nosec self.stash[stash_id] = obj.js return stash_id return super(CodeMirrorJSONEncoder, self).default(obj) @@ -135,7 +140,7 @@ class FingerPrintedMedia(forms.Media): for the latest version of the application """ abs_path = super(FingerPrintedMedia, self).absolute_path(path) - abs_path += '?v={}'.format(__version__) + abs_path += "?v={}".format(__version__) return abs_path @@ -150,14 +155,17 @@ class CodeMirrorTextarea(forms.Textarea): mode_name = self.mode_name js = [ "%s/lib/codemirror.js" % (CODEMIRROR_PATH,), - "%s/addon/fold/foldcode.js" % (CODEMIRROR_PATH,), - "%s/addon/fold/foldgutter.js" % (CODEMIRROR_PATH,), + "%s/addon/fold/foldcode.js" % (CODEMIRROR_PATH,), + "%s/addon/fold/foldgutter.js" % (CODEMIRROR_PATH,), ] if not self.custom_mode: js.append("%s/mode/%s/%s.js" % (CODEMIRROR_PATH, mode_name, mode_name)) - js += ["%s/mode/%s/%s.js" % (CODEMIRROR_PATH, dependency, dependency) for dependency in self.dependencies] + js += [ + "%s/mode/%s/%s.js" % (CODEMIRROR_PATH, dependency, dependency) + for dependency in self.dependencies + ] js += ["%s/addon/%s.js" % (CODEMIRROR_PATH, addon) for addon in self.addon_js] if self.keymap: @@ -170,24 +178,38 @@ class CodeMirrorTextarea(forms.Textarea): js += ["ui/js/codemirror-defaults.js"] css = ( - "%s/lib/codemirror.css" % CODEMIRROR_PATH, - ) + \ - tuple("%s/theme/%s.css" % (CODEMIRROR_PATH, theme_css_filename) - for theme_css_filename in self.theme_css) + \ - tuple("%s/addon/%s.css" % (CODEMIRROR_PATH, css_file) - for css_file in self.addon_css) + \ - ( - "ui/css/codemirror-overrides.css", + ("%s/lib/codemirror.css" % CODEMIRROR_PATH,) + + tuple( + "%s/theme/%s.css" % (CODEMIRROR_PATH, theme_css_filename) + for theme_css_filename in self.theme_css + ) + + tuple( + "%s/addon/%s.css" % (CODEMIRROR_PATH, css_file) + for css_file in self.addon_css + ) + + ( + "ui/css/codemirror-overrides.css", "%s/addon/fold/foldgutter.css" % CODEMIRROR_PATH, + ) ) - return FingerPrintedMedia(css={'all': css}, js=js) - + return FingerPrintedMedia(css={"all": css}, js=js) def __init__( - self, attrs=None, mode=None, theme=None, config=None, size=None, - dependencies=(), addon_js=(), addon_css=(), - custom_mode=None, custom_js=(), keymap=None, **kwargs): + self, + attrs=None, + mode=None, + theme=None, + config=None, + size=None, + dependencies=(), + addon_js=(), + addon_css=(), + custom_mode=None, + custom_js=(), + keymap=None, + **kwargs + ): u"""Constructor of CodeMirrorTextarea Attribute: @@ -264,8 +286,8 @@ class CodeMirrorTextarea(forms.Textarea): self.mode = mode or custom_mode or CODEMIRROR_MODE if isstring(self.mode): - self.mode = { 'name': self.mode } - self.mode_name = self.mode['name'] + self.mode = {"name": self.mode} + self.mode_name = self.mode["name"] self.size = size or CODEMIRROR_SIZE self.custom_mode = custom_mode self.dependencies = dependencies @@ -274,47 +296,44 @@ class CodeMirrorTextarea(forms.Textarea): self.custom_js = custom_js self.keymap = keymap - self.addon_js = uniq(list(addon_js) + [ - "mode/overlay", - "search/search", - "search/searchcursor", - "dialog/dialog", - ]) + self.addon_js = uniq( + list(addon_js) + + ["mode/overlay", "search/search", "search/searchcursor", "dialog/dialog"] + ) self.addon_css = uniq(list(addon_css) + ["dialog/dialog"]) self.theme = theme or CODEMIRROR_THEME theme_css_filename = THEME_CSS_FILENAME_RE.search(self.theme).group(0) - if theme_css_filename == 'default': + if theme_css_filename == "default": self.theme_css = [] else: self.theme_css = [theme_css_filename] self.config = config or {} - def render(self, name, value, attrs=None): + def render(self, name, value, attrs=None, renderer=None): """Render CodeMirrorTextarea""" if self.size is not None: - suffix = ' %s_editor.setSize%s;' % (name, tuple(self.size)) + suffix = " %s_editor.setSize%s;" % (name, tuple(self.size)) else: - suffix = '' + suffix = "" - self.config.setdefault('foldGutter', True) - option_json = CodeMirrorJSONEncoder().encode(dict(chain( - self.config.items(), - [('mode', self.mode), ('theme', self.theme)]))) + self.config.setdefault("foldGutter", True) + option_json = CodeMirrorJSONEncoder().encode( + dict( + chain(self.config.items(), [("mode", self.mode), ("theme", self.theme)]) + ) + ) output = [ - super(CodeMirrorTextarea, self).render(name, value, attrs), - '<script type="text/javascript">var %(name)s_editor = CodeMirror.fromTextArea(document.getElementById("id_%(name)s"), %(options)s);%(suffix)s</script>' % \ - dict( - name=name, - options=option_json, - suffix=suffix, - ), + super().render(name, value, attrs, renderer), + '<script type="text/javascript">var %(name)s_editor = CodeMirror.fromTextArea(document.getElementById("id_%(name)s"), %(options)s);%(suffix)s</script>' + % dict(name=name, options=option_json, suffix=suffix,), ] - return mark_safe('\n'.join(output)) + return mark_safe("\n".join(output)) # nosec + class CodeMirrorFileWidget(CodeMirrorTextarea): """Allows editing a file instead of a plain content""" @@ -322,11 +341,13 @@ class CodeMirrorFileWidget(CodeMirrorTextarea): def __init__(self, *args, **kwargs): super(CodeMirrorFileWidget, self).__init__(*args, **kwargs) - def render(self, name, value, attrs=None): + def render(self, name, value, attrs=None, renderer=None): if isinstance(value, str): contents = value - elif hasattr(value, 'read'): + elif hasattr(value, "read"): contents = value.read() + if type(contents) == bytes: + contents = contents.decode("utf-8") else: - contents = '' - return mark_safe(super(CodeMirrorFileWidget, self).render(name, contents, attrs)) + contents = "" + return mark_safe(super().render(name, contents, attrs, renderer)) # nosec