Reformat using black
This commit is contained in:
parent
efee4ad081
commit
a87fb49918
221 changed files with 19127 additions and 7310 deletions
|
@ -6,17 +6,25 @@ from django.utils.safestring import mark_safe
|
|||
|
||||
class CheckboxSelectMultipleWithSelectAll(forms.CheckboxSelectMultiple):
|
||||
def render(self, name, value, attrs=None, renderer=None):
|
||||
if 'id' not in attrs:
|
||||
raise FieldError('id required')
|
||||
if "id" not in attrs:
|
||||
raise FieldError("id required")
|
||||
|
||||
select_all_id = attrs['id'] + '_all'
|
||||
select_all_name = name + '_all'
|
||||
original = super(CheckboxSelectMultipleWithSelectAll, self).render(name, value, attrs, renderer)
|
||||
template = get_template('widgets/select_all.html')
|
||||
return mark_safe(template.render({
|
||||
'original_widget': original,
|
||||
'select_all_id': select_all_id,
|
||||
'select_all_name': select_all_name,
|
||||
'all_selected': all(choice[0] in value for choice in self.choices) if value else False,
|
||||
'empty': not self.choices,
|
||||
}))
|
||||
select_all_id = attrs["id"] + "_all"
|
||||
select_all_name = name + "_all"
|
||||
original = super(CheckboxSelectMultipleWithSelectAll, self).render(
|
||||
name, value, attrs, renderer
|
||||
)
|
||||
template = get_template("widgets/select_all.html")
|
||||
return mark_safe(
|
||||
template.render(
|
||||
{
|
||||
"original_widget": original,
|
||||
"select_all_id": select_all_id,
|
||||
"select_all_name": select_all_name,
|
||||
"all_selected": all(choice[0] in value for choice in self.choices)
|
||||
if value
|
||||
else False,
|
||||
"empty": not self.choices,
|
||||
}
|
||||
)
|
||||
)
|
||||
|
|
|
@ -7,23 +7,27 @@ from lxml import html
|
|||
|
||||
|
||||
class CompressorWidgetMixin(object):
|
||||
__template_css = dedent('''\
|
||||
__template_css = dedent(
|
||||
"""\
|
||||
{% compress css %}
|
||||
{{ media.css }}
|
||||
{% endcompress %}
|
||||
''')
|
||||
"""
|
||||
)
|
||||
|
||||
__template_js = dedent('''\
|
||||
__template_js = dedent(
|
||||
"""\
|
||||
{% compress js %}
|
||||
{{ media.js }}
|
||||
{% endcompress %}
|
||||
''')
|
||||
"""
|
||||
)
|
||||
|
||||
__templates = {
|
||||
(False, False): Template(''),
|
||||
(True, False): Template('{% load compress %}' + __template_css),
|
||||
(False, True): Template('{% load compress %}' + __template_js),
|
||||
(True, True): Template('{% load compress %}' + __template_js + __template_css),
|
||||
(False, False): Template(""),
|
||||
(True, False): Template("{% load compress %}" + __template_css),
|
||||
(False, True): Template("{% load compress %}" + __template_js),
|
||||
(True, True): Template("{% load compress %}" + __template_js + __template_css),
|
||||
}
|
||||
|
||||
compress_css = False
|
||||
|
@ -34,14 +38,19 @@ class CompressorWidgetMixin(object):
|
|||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
if getattr(settings, 'COMPRESS_ENABLED', not settings.DEBUG):
|
||||
if getattr(settings, "COMPRESS_ENABLED", not settings.DEBUG):
|
||||
|
||||
@property
|
||||
def media(self):
|
||||
media = super().media
|
||||
template = self.__templates[self.compress_css, self.compress_js]
|
||||
result = html.fromstring(template.render(Context({'media': media})))
|
||||
result = html.fromstring(template.render(Context({"media": media})))
|
||||
|
||||
return forms.Media(
|
||||
css={'all': [result.find('.//link').get('href')]} if self.compress_css else media._css,
|
||||
js=[result.find('.//script').get('src')] if self.compress_js else media._js,
|
||||
css={"all": [result.find(".//link").get("href")]}
|
||||
if self.compress_css
|
||||
else media._css,
|
||||
js=[result.find(".//script").get("src")]
|
||||
if self.compress_js
|
||||
else media._js,
|
||||
)
|
||||
|
|
|
@ -6,9 +6,14 @@ from django.utils.html import conditional_escape
|
|||
|
||||
from judge.widgets.mixins import CompressorWidgetMixin
|
||||
|
||||
__all__ = ['PagedownWidget', 'AdminPagedownWidget',
|
||||
'MathJaxPagedownWidget', 'MathJaxAdminPagedownWidget',
|
||||
'HeavyPreviewPageDownWidget', 'HeavyPreviewAdminPageDownWidget']
|
||||
__all__ = [
|
||||
"PagedownWidget",
|
||||
"AdminPagedownWidget",
|
||||
"MathJaxPagedownWidget",
|
||||
"MathJaxAdminPagedownWidget",
|
||||
"HeavyPreviewPageDownWidget",
|
||||
"HeavyPreviewAdminPageDownWidget",
|
||||
]
|
||||
|
||||
try:
|
||||
from pagedown.widgets import PagedownWidget as OldPagedownWidget
|
||||
|
@ -20,6 +25,7 @@ except ImportError:
|
|||
HeavyPreviewPageDownWidget = None
|
||||
HeavyPreviewAdminPageDownWidget = None
|
||||
else:
|
||||
|
||||
class PagedownWidget(CompressorWidgetMixin, OldPagedownWidget):
|
||||
# The goal here is to compress all the pagedown JS into one file.
|
||||
# We do not want any further compress down the chain, because
|
||||
|
@ -28,23 +34,25 @@ else:
|
|||
compress_js = True
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs.setdefault('css', ('pagedown_widget.css',))
|
||||
kwargs.setdefault("css", ("pagedown_widget.css",))
|
||||
super(PagedownWidget, self).__init__(*args, **kwargs)
|
||||
|
||||
class AdminPagedownWidget(PagedownWidget, admin_widgets.AdminTextareaWidget):
|
||||
class Media:
|
||||
css = {'all': [
|
||||
'content-description.css',
|
||||
'admin/css/pagedown.css',
|
||||
]}
|
||||
js = ['admin/js/pagedown.js']
|
||||
css = {
|
||||
"all": [
|
||||
"content-description.css",
|
||||
"admin/css/pagedown.css",
|
||||
]
|
||||
}
|
||||
js = ["admin/js/pagedown.js"]
|
||||
|
||||
class MathJaxPagedownWidget(PagedownWidget):
|
||||
class Media:
|
||||
js = [
|
||||
'mathjax_config.js',
|
||||
'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML',
|
||||
'pagedown_math.js',
|
||||
"mathjax_config.js",
|
||||
"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML",
|
||||
"pagedown_math.js",
|
||||
]
|
||||
|
||||
class MathJaxAdminPagedownWidget(AdminPagedownWidget, MathJaxPagedownWidget):
|
||||
|
@ -52,40 +60,46 @@ else:
|
|||
|
||||
class HeavyPreviewPageDownWidget(PagedownWidget):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs.setdefault('template', 'pagedown.html')
|
||||
self.preview_url = kwargs.pop('preview')
|
||||
self.preview_timeout = kwargs.pop('preview_timeout', None)
|
||||
self.hide_preview_button = kwargs.pop('hide_preview_button', False)
|
||||
kwargs.setdefault("template", "pagedown.html")
|
||||
self.preview_url = kwargs.pop("preview")
|
||||
self.preview_timeout = kwargs.pop("preview_timeout", None)
|
||||
self.hide_preview_button = kwargs.pop("hide_preview_button", False)
|
||||
super(HeavyPreviewPageDownWidget, self).__init__(*args, **kwargs)
|
||||
|
||||
def render(self, name, value, attrs=None, renderer=None):
|
||||
if value is None:
|
||||
value = ''
|
||||
final_attrs = self.build_attrs(attrs, {'name': name})
|
||||
if 'class' not in final_attrs:
|
||||
final_attrs['class'] = ''
|
||||
final_attrs['class'] += ' wmd-input'
|
||||
return get_template(self.template).render(self.get_template_context(final_attrs, value))
|
||||
value = ""
|
||||
final_attrs = self.build_attrs(attrs, {"name": name})
|
||||
if "class" not in final_attrs:
|
||||
final_attrs["class"] = ""
|
||||
final_attrs["class"] += " wmd-input"
|
||||
return get_template(self.template).render(
|
||||
self.get_template_context(final_attrs, value)
|
||||
)
|
||||
|
||||
def get_template_context(self, attrs, value):
|
||||
return {
|
||||
'attrs': flatatt(attrs),
|
||||
'body': conditional_escape(force_text(value)),
|
||||
'id': attrs['id'],
|
||||
'show_preview': self.show_preview,
|
||||
'preview_url': self.preview_url,
|
||||
'preview_timeout': self.preview_timeout,
|
||||
'extra_classes': 'dmmd-no-button' if self.hide_preview_button else None,
|
||||
"attrs": flatatt(attrs),
|
||||
"body": conditional_escape(force_text(value)),
|
||||
"id": attrs["id"],
|
||||
"show_preview": self.show_preview,
|
||||
"preview_url": self.preview_url,
|
||||
"preview_timeout": self.preview_timeout,
|
||||
"extra_classes": "dmmd-no-button" if self.hide_preview_button else None,
|
||||
}
|
||||
|
||||
class Media:
|
||||
css = {'all': ['dmmd-preview.css']}
|
||||
js = ['dmmd-preview.js']
|
||||
css = {"all": ["dmmd-preview.css"]}
|
||||
js = ["dmmd-preview.js"]
|
||||
|
||||
class HeavyPreviewAdminPageDownWidget(AdminPagedownWidget, HeavyPreviewPageDownWidget):
|
||||
class HeavyPreviewAdminPageDownWidget(
|
||||
AdminPagedownWidget, HeavyPreviewPageDownWidget
|
||||
):
|
||||
class Media:
|
||||
css = {'all': [
|
||||
'pygment-github.css',
|
||||
'table.css',
|
||||
'ranks.css',
|
||||
]}
|
||||
css = {
|
||||
"all": [
|
||||
"pygment-github.css",
|
||||
"table.css",
|
||||
"ranks.css",
|
||||
]
|
||||
}
|
||||
|
|
|
@ -46,13 +46,23 @@ from django.core import signing
|
|||
from django.forms.models import ModelChoiceIterator
|
||||
from django.urls import reverse_lazy
|
||||
|
||||
DEFAULT_SELECT2_JS = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js'
|
||||
DEFAULT_SELECT2_CSS = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css'
|
||||
DEFAULT_SELECT2_JS = "//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"
|
||||
DEFAULT_SELECT2_CSS = (
|
||||
"//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css"
|
||||
)
|
||||
|
||||
__all__ = ['Select2Widget', 'Select2MultipleWidget', 'Select2TagWidget',
|
||||
'HeavySelect2Widget', 'HeavySelect2MultipleWidget', 'HeavySelect2TagWidget',
|
||||
'AdminSelect2Widget', 'AdminSelect2MultipleWidget', 'AdminHeavySelect2Widget',
|
||||
'AdminHeavySelect2MultipleWidget']
|
||||
__all__ = [
|
||||
"Select2Widget",
|
||||
"Select2MultipleWidget",
|
||||
"Select2TagWidget",
|
||||
"HeavySelect2Widget",
|
||||
"HeavySelect2MultipleWidget",
|
||||
"HeavySelect2TagWidget",
|
||||
"AdminSelect2Widget",
|
||||
"AdminSelect2MultipleWidget",
|
||||
"AdminHeavySelect2Widget",
|
||||
"AdminHeavySelect2MultipleWidget",
|
||||
]
|
||||
|
||||
|
||||
class Select2Mixin(object):
|
||||
|
@ -68,22 +78,22 @@ class Select2Mixin(object):
|
|||
"""Add select2 data attributes."""
|
||||
attrs = super(Select2Mixin, self).build_attrs(base_attrs, extra_attrs)
|
||||
if self.is_required:
|
||||
attrs.setdefault('data-allow-clear', 'false')
|
||||
attrs.setdefault("data-allow-clear", "false")
|
||||
else:
|
||||
attrs.setdefault('data-allow-clear', 'true')
|
||||
attrs.setdefault('data-placeholder', '')
|
||||
attrs.setdefault("data-allow-clear", "true")
|
||||
attrs.setdefault("data-placeholder", "")
|
||||
|
||||
attrs.setdefault('data-minimum-input-length', 0)
|
||||
if 'class' in attrs:
|
||||
attrs['class'] += ' django-select2'
|
||||
attrs.setdefault("data-minimum-input-length", 0)
|
||||
if "class" in attrs:
|
||||
attrs["class"] += " django-select2"
|
||||
else:
|
||||
attrs['class'] = 'django-select2'
|
||||
attrs["class"] = "django-select2"
|
||||
return attrs
|
||||
|
||||
def optgroups(self, name, value, attrs=None):
|
||||
"""Add empty option for clearable selects."""
|
||||
if not self.is_required and not self.allow_multiple_selected:
|
||||
self.choices = list(chain([('', '')], self.choices))
|
||||
self.choices = list(chain([("", "")], self.choices))
|
||||
return super(Select2Mixin, self).optgroups(name, value, attrs=attrs)
|
||||
|
||||
@property
|
||||
|
@ -95,8 +105,8 @@ class Select2Mixin(object):
|
|||
https://docs.djangoproject.com/en/1.8/topics/forms/media/#media-as-a-dynamic-property
|
||||
"""
|
||||
return forms.Media(
|
||||
js=[settings.SELECT2_JS_URL, 'django_select2.js'],
|
||||
css={'screen': [settings.SELECT2_CSS_URL]},
|
||||
js=[settings.SELECT2_JS_URL, "django_select2.js"],
|
||||
css={"screen": [settings.SELECT2_CSS_URL]},
|
||||
)
|
||||
|
||||
|
||||
|
@ -104,8 +114,12 @@ class AdminSelect2Mixin(Select2Mixin):
|
|||
@property
|
||||
def media(self):
|
||||
return forms.Media(
|
||||
js=['admin/js/jquery.init.js', settings.SELECT2_JS_URL, 'django_select2.js'],
|
||||
css={'screen': [settings.SELECT2_CSS_URL]},
|
||||
js=[
|
||||
"admin/js/jquery.init.js",
|
||||
settings.SELECT2_JS_URL,
|
||||
"django_select2.js",
|
||||
],
|
||||
css={"screen": [settings.SELECT2_CSS_URL]},
|
||||
)
|
||||
|
||||
|
||||
|
@ -115,9 +129,9 @@ class Select2TagMixin(object):
|
|||
def build_attrs(self, base_attrs, extra_attrs=None):
|
||||
"""Add select2's tag attributes."""
|
||||
extra_attrs = extra_attrs or {}
|
||||
extra_attrs.setdefault('data-minimum-input-length', 1)
|
||||
extra_attrs.setdefault('data-tags', 'true')
|
||||
extra_attrs.setdefault('data-token-separators', [",", " "])
|
||||
extra_attrs.setdefault("data-minimum-input-length", 1)
|
||||
extra_attrs.setdefault("data-tags", "true")
|
||||
extra_attrs.setdefault("data-token-separators", [",", " "])
|
||||
return super(Select2TagMixin, self).build_attrs(base_attrs, extra_attrs)
|
||||
|
||||
|
||||
|
@ -182,8 +196,8 @@ class HeavySelect2Mixin(Select2Mixin):
|
|||
else:
|
||||
self.attrs = {}
|
||||
|
||||
self.data_view = kwargs.pop('data_view', None)
|
||||
self.data_url = kwargs.pop('data_url', None)
|
||||
self.data_view = kwargs.pop("data_view", None)
|
||||
self.data_url = kwargs.pop("data_url", None)
|
||||
|
||||
if not (self.data_view or self.data_url):
|
||||
raise ValueError('You must ether specify "data_view" or "data_url".')
|
||||
|
@ -201,22 +215,22 @@ class HeavySelect2Mixin(Select2Mixin):
|
|||
# encrypt instance Id
|
||||
self.widget_id = signing.dumps(id(self))
|
||||
|
||||
attrs['data-field_id'] = self.widget_id
|
||||
attrs.setdefault('data-ajax--url', self.get_url())
|
||||
attrs.setdefault('data-ajax--cache', "true")
|
||||
attrs.setdefault('data-ajax--type', "GET")
|
||||
attrs.setdefault('data-minimum-input-length', 2)
|
||||
attrs["data-field_id"] = self.widget_id
|
||||
attrs.setdefault("data-ajax--url", self.get_url())
|
||||
attrs.setdefault("data-ajax--cache", "true")
|
||||
attrs.setdefault("data-ajax--type", "GET")
|
||||
attrs.setdefault("data-minimum-input-length", 2)
|
||||
|
||||
attrs['class'] += ' django-select2-heavy'
|
||||
attrs["class"] += " django-select2-heavy"
|
||||
return attrs
|
||||
|
||||
def format_value(self, value):
|
||||
result = super(HeavySelect2Mixin, self).format_value(value)
|
||||
if isinstance(self.choices, ModelChoiceIterator):
|
||||
chosen = copy(self.choices)
|
||||
chosen.queryset = chosen.queryset.filter(pk__in=[
|
||||
int(i) for i in result if isinstance(i, int) or i.isdigit()
|
||||
])
|
||||
chosen.queryset = chosen.queryset.filter(
|
||||
pk__in=[int(i) for i in result if isinstance(i, int) or i.isdigit()]
|
||||
)
|
||||
self.choices = set(chosen)
|
||||
return result
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue