Skip to content

Commit a3673ee

Browse files
committed
feat: Bundle js files, remove jQuery, and static libs
1 parent 9c9d0d0 commit a3673ee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2021
-1463
lines changed

.pre-commit-config.yaml

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,12 @@ repos:
2020
# - id: django-upgrade
2121
# args: [--target-version, "2.2"]
2222

23-
- repo: https://github.com/PyCQA/flake8
24-
rev: 7.0.0
23+
- repo: https://github.com/astral-sh/ruff-pre-commit
24+
rev: v0.8.3
2525
hooks:
26-
- id: flake8
27-
entry: pflake8
28-
additional_dependencies: [pyproject-flake8]
29-
- repo: https://github.com/asottile/yesqa
30-
rev: v1.5.0
31-
hooks:
32-
- id: yesqa
26+
- id: ruff
27+
args: [--fix]
28+
- id: ruff-format
3329

3430
- repo: https://github.com/pre-commit/pre-commit-hooks
3531
rev: v6.0.0

eslint.config.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
export default [
2+
{
3+
files: ['**/*.js'],
4+
languageOptions: {
5+
ecmaVersion: 2015,
6+
sourceType: 'script',
7+
globals: {
8+
// Browser globals
9+
window: 'readonly',
10+
document: 'readonly',
11+
console: 'readonly',
12+
alert: 'readonly',
13+
// Node.js globals
14+
require: 'readonly',
15+
module: 'readonly',
16+
__dirname: 'readonly',
17+
process: 'readonly',
18+
// Django globals
19+
django: 'readonly',
20+
// Third-party library globals
21+
Dropzone: 'readonly',
22+
Mediator: 'readonly',
23+
Class: 'readonly',
24+
opener: 'readonly',
25+
// Test globals
26+
jasmine: 'readonly',
27+
describe: 'readonly',
28+
it: 'readonly',
29+
expect: 'readonly',
30+
beforeEach: 'readonly',
31+
afterEach: 'readonly'
32+
}
33+
},
34+
rules: {
35+
// Code quality
36+
'eqeqeq': ['error', 'always'],
37+
'curly': ['error', 'all'],
38+
'no-unused-vars': ['error', { 'vars': 'all', 'args': 'after-used' }],
39+
'no-undef': 'error',
40+
'no-bitwise': 'error',
41+
'no-caller': 'error',
42+
43+
// Style
44+
'quotes': ['error', 'single', { 'avoidEscape': true }],
45+
'indent': ['error', 4, { 'SwitchCase': 1 }],
46+
'semi': ['error', 'always'],
47+
'no-trailing-spaces': 'error',
48+
'no-multiple-empty-lines': ['error', { 'max': 2 }],
49+
'max-len': ['error', { 'code': 120, 'ignoreUrls': true, 'ignoreRegExpLiterals': true }],
50+
51+
// Best practices
52+
'strict': ['error', 'global'],
53+
'no-implied-eval': 'error',
54+
'no-new-func': 'error'
55+
}
56+
}
57+
];

filer/fields/file.py

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import warnings
33

44
from django import forms
5-
from django.conf import settings
65
from django.contrib.admin.sites import site
76
from django.contrib.admin.widgets import ForeignKeyRawIdWidget
87
from django.core.exceptions import ObjectDoesNotExist
@@ -27,52 +26,56 @@ class AdminFileWidget(ForeignKeyRawIdWidget):
2726

2827
def render(self, name, value, attrs=None, renderer=None):
2928
obj = self.obj_for_value(value)
30-
css_id = attrs.get('id', 'id_image_x')
29+
css_id = attrs.get("id", "id_image_x")
3130
related_url = None
32-
change_url = ''
31+
change_url = ""
3332
if value:
3433
try:
3534
file_obj = File.objects.get(pk=value)
36-
related_url = file_obj.logical_folder.get_admin_directory_listing_url_path()
35+
related_url = (
36+
file_obj.logical_folder.get_admin_directory_listing_url_path()
37+
)
3738
change_url = file_obj.get_admin_change_url()
3839
except Exception as e:
3940
# catch exception and manage it. We can re-raise it for debugging
4041
# purposes and/or just logging it, provided user configured
4142
# proper logging configuration
4243
if filer_settings.FILER_ENABLE_LOGGING:
43-
logger.error('Error while rendering file widget: %s', e)
44+
logger.error("Error while rendering file widget: %s", e)
4445
if filer_settings.FILER_DEBUG:
4546
raise
4647
if not related_url:
47-
related_url = reverse('admin:filer-directory_listing-last')
48+
related_url = reverse("admin:filer-directory_listing-last")
4849
params = self.url_parameters()
49-
params['_pick'] = 'file'
50+
params["_pick"] = "file"
5051
if params:
51-
lookup_url = '?' + urlencode(sorted(params.items()))
52+
lookup_url = "?" + urlencode(sorted(params.items()))
5253
else:
53-
lookup_url = ''
54-
if 'class' not in attrs:
54+
lookup_url = ""
55+
if "class" not in attrs:
5556
# The JavaScript looks for this hook.
56-
attrs['class'] = 'vForeignKeyRawIdAdminField'
57+
attrs["class"] = "vForeignKeyRawIdAdminField"
5758
# rendering the super for ForeignKeyRawIdWidget on purpose here because
5859
# we only need the input and none of the other stuff that
5960
# ForeignKeyRawIdWidget adds
60-
hidden_input = super(ForeignKeyRawIdWidget, self).render(name, value, attrs) # grandparent super
61+
hidden_input = super(ForeignKeyRawIdWidget, self).render(
62+
name, value, attrs
63+
) # grandparent super
6164
context = {
62-
'hidden_input': hidden_input,
63-
'lookup_url': f'{related_url}{lookup_url}',
64-
'change_url': change_url,
65-
'object': obj,
66-
'lookup_name': name,
67-
'id': css_id,
68-
'admin_icon_delete': ('admin/img/icon-deletelink.svg'),
65+
"hidden_input": hidden_input,
66+
"lookup_url": f"{related_url}{lookup_url}",
67+
"change_url": change_url,
68+
"object": obj,
69+
"lookup_name": name,
70+
"id": css_id,
71+
"admin_icon_delete": ("admin/img/icon-deletelink.svg"),
6972
}
70-
html = render_to_string('admin/filer/widgets/admin_file.html', context)
73+
html = render_to_string("admin/filer/widgets/admin_file.html", context)
7174
return mark_safe(html)
7275

7376
def label_for_value(self, value):
7477
obj = self.obj_for_value(value)
75-
return '&nbsp;<strong>%s</strong>' % truncate_words(obj, 14)
78+
return "&nbsp;<strong>%s</strong>" % truncate_words(obj, 14)
7679

7780
def obj_for_value(self, value):
7881
if value:
@@ -87,20 +90,10 @@ def obj_for_value(self, value):
8790
return obj
8891

8992
class Media:
90-
extra = '' if settings.DEBUG else '.min'
9193
css = {
92-
'all': (
93-
'filer/css/admin_filer.css',
94-
) + ICON_CSS_LIB,
94+
"all": ("filer/css/admin_filer.css",) + ICON_CSS_LIB,
9595
}
96-
js = (
97-
'admin/js/vendor/jquery/jquery%s.js' % extra,
98-
'admin/js/jquery.init.js',
99-
'filer/js/libs/dropzone.min.js',
100-
'filer/js/addons/dropzone.init.js',
101-
'filer/js/addons/popup_handling.js',
102-
'filer/js/addons/widget.js',
103-
)
96+
js = ("filer/js/dist/admin-file-widget.bundle.js",)
10497

10598

10699
class AdminFileFormField(forms.ModelChoiceField):
@@ -112,7 +105,7 @@ def __init__(self, rel, queryset, to_field_name, *args, **kwargs):
112105
self.to_field_name = to_field_name
113106
self.max_value = None
114107
self.min_value = None
115-
kwargs.pop('widget', None)
108+
kwargs.pop("widget", None)
116109
super().__init__(queryset, widget=self.widget(rel, site), *args, **kwargs)
117110

118111
def widget_attrs(self, widget):
@@ -125,18 +118,18 @@ class FilerFileField(models.ForeignKey):
125118
default_model_class = File
126119

127120
def __init__(self, **kwargs):
128-
to = kwargs.pop('to', None)
121+
to = kwargs.pop("to", None)
129122
dfl = get_model_label(self.default_model_class)
130123
if to and get_model_label(to).lower() != dfl.lower():
131124
msg = "In {}: ForeignKey must point to {}; instead passed {}"
132125
warnings.warn(msg.format(self.__class__.__name__, dfl, to), SyntaxWarning)
133-
kwargs['to'] = dfl # hard-code `to` to model `filer.File`
126+
kwargs["to"] = dfl # hard-code `to` to model `filer.File`
134127
super().__init__(**kwargs)
135128

136129
def formfield(self, **kwargs):
137130
defaults = {
138-
'form_class': self.default_form_class,
139-
'rel': self.remote_field,
131+
"form_class": self.default_form_class,
132+
"rel": self.remote_field,
140133
}
141134
defaults.update(kwargs)
142135
return super().formfield(**defaults)

filer/fields/folder.py

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818

1919
class AdminFolderWidget(ForeignKeyRawIdWidget):
2020
choices = None
21-
input_type = 'hidden'
21+
input_type = "hidden"
2222
is_hidden = False
2323

2424
def render(self, name, value, attrs=None, renderer=None):
2525
obj = self.obj_for_value(value)
26-
css_id = attrs.get('id')
26+
css_id = attrs.get("id")
2727
css_id_folder = "%s_folder" % css_id
2828
css_id_description_txt = "%s_description_txt" % css_id
2929
if attrs is None:
@@ -37,38 +37,40 @@ def render(self, name, value, attrs=None, renderer=None):
3737
except Exception:
3838
pass
3939
if not related_url:
40-
related_url = reverse('admin:filer-directory_listing-last')
40+
related_url = reverse("admin:filer-directory_listing-last")
4141
params = self.url_parameters()
42-
params['_pick'] = 'folder'
42+
params["_pick"] = "folder"
4343
if params:
44-
url = '?' + urlencode(sorted(params.items()))
44+
url = "?" + urlencode(sorted(params.items()))
4545
else:
46-
url = ''
47-
if 'class' not in attrs:
46+
url = ""
47+
if "class" not in attrs:
4848
# The JavaScript looks for this hook.
49-
attrs['class'] = 'vForeignKeyRawIdAdminField'
49+
attrs["class"] = "vForeignKeyRawIdAdminField"
5050
super_attrs = attrs.copy()
51-
hidden_input = super(ForeignKeyRawIdWidget, self).render(name, value, super_attrs) # grandparent super
51+
hidden_input = super(ForeignKeyRawIdWidget, self).render(
52+
name, value, super_attrs
53+
) # grandparent super
5254

5355
# TODO: "id_" is hard-coded here. This should instead use the correct
5456
# API to determine the ID dynamically.
5557
context = {
56-
'hidden_input': hidden_input,
57-
'lookup_url': f'{related_url}{url}',
58-
'lookup_name': name,
59-
'span_id': css_id_description_txt,
60-
'object': obj,
61-
'clear_id': '%s_clear' % css_id,
62-
'descid': css_id_description_txt,
63-
'foldid': css_id_folder,
64-
'id': css_id,
58+
"hidden_input": hidden_input,
59+
"lookup_url": f"{related_url}{url}",
60+
"lookup_name": name,
61+
"span_id": css_id_description_txt,
62+
"object": obj,
63+
"clear_id": "%s_clear" % css_id,
64+
"descid": css_id_description_txt,
65+
"foldid": css_id_folder,
66+
"id": css_id,
6567
}
66-
html = render_to_string('admin/filer/widgets/admin_folder.html', context)
68+
html = render_to_string("admin/filer/widgets/admin_folder.html", context)
6769
return mark_safe(html)
6870

6971
def label_for_value(self, value):
7072
obj = self.obj_for_value(value)
71-
return '&nbsp;<strong>%s</strong>' % truncate_words(obj, 14)
73+
return "&nbsp;<strong>%s</strong>" % truncate_words(obj, 14)
7274

7375
def obj_for_value(self, value):
7476
if not value:
@@ -81,8 +83,11 @@ def obj_for_value(self, value):
8183
return obj
8284

8385
class Media:
84-
css = {"all": ('filer/css/admin_filer.css',) + ICON_CSS_LIB}
85-
js = ('filer/js/addons/popup_handling.js',)
86+
css = {"all": ("filer/css/admin_filer.css",) + ICON_CSS_LIB}
87+
js = (
88+
"filer/js/addons/popup_handling.js",
89+
"filer/js/widgets/admin-folder-widget.js",
90+
)
8691

8792

8893
class AdminFolderFormField(forms.ModelChoiceField):
@@ -91,12 +96,12 @@ class AdminFolderFormField(forms.ModelChoiceField):
9196
def __init__(self, rel, queryset, to_field_name, *args, **kwargs):
9297
self.rel = rel
9398
self.queryset = queryset
94-
self.limit_choices_to = kwargs.pop('limit_choices_to', None)
99+
self.limit_choices_to = kwargs.pop("limit_choices_to", None)
95100
self.to_field_name = to_field_name
96101
self.max_value = None
97102
self.min_value = None
98-
kwargs.pop('widget', None)
99-
kwargs.pop('blank', None)
103+
kwargs.pop("widget", None)
104+
kwargs.pop("blank", None)
100105
forms.Field.__init__(self, widget=self.widget(rel, site), *args, **kwargs)
101106

102107
def widget_attrs(self, widget):
@@ -118,13 +123,13 @@ def __init__(self, **kwargs):
118123
self.__class__.__name__, dfl, old_to
119124
)
120125
warnings.warn(msg, SyntaxWarning)
121-
kwargs['to'] = dfl
126+
kwargs["to"] = dfl
122127
super().__init__(**kwargs)
123128

124129
def formfield(self, **kwargs):
125130
defaults = {
126-
'form_class': self.default_form_class,
127-
'rel': self.remote_field,
131+
"form_class": self.default_form_class,
132+
"rel": self.remote_field,
128133
}
129134
defaults.update(kwargs)
130135
return super().formfield(**defaults)

filer/static/filer/css/admin_filer.cms.icons.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

filer/static/filer/css/admin_filer.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

filer/static/filer/css/admin_filer.fa.icons.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)