Skip to content

Commit 3e6e587

Browse files
authored
ci: Switch flake8 and isort for ruff (#329)
* ci: Switch flake8 and isort for ruff * ci: Add stacklevel to test check on mock assertion.
1 parent 0d006ce commit 3e6e587

Some content is hidden

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

54 files changed

+358
-332
lines changed

.github/workflows/lint.yml

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,19 @@ concurrency:
77
cancel-in-progress: true
88

99
jobs:
10-
flake8:
11-
name: flake8
10+
ruff:
11+
name: ruff
1212
runs-on: ubuntu-latest
1313
steps:
1414
- name: Checkout
1515
uses: actions/checkout@v3
1616
- name: Set up Python
17-
uses: actions/setup-python@v3
17+
uses: actions/setup-python@v4
1818
with:
19-
python-version: 3.8
20-
- name: Install flake8
21-
run: pip install --upgrade flake8
22-
- name: Run flake8
23-
uses: liskin/gh-problem-matcher-wrap@v1
24-
with:
25-
linters: flake8
26-
run: flake8
27-
28-
isort:
29-
runs-on: ubuntu-latest
30-
steps:
31-
- name: Checkout
32-
uses: actions/checkout@v3
33-
- name: Set up Python
34-
uses: actions/setup-python@v3
35-
with:
36-
python-version: 3.8
37-
- run: python -m pip install isort
38-
- name: isort
39-
uses: liskin/gh-problem-matcher-wrap@v1
40-
with:
41-
linters: isort
42-
run: isort --check --diff ./
19+
python-version: "3.11"
20+
cache: 'pip'
21+
- run: |
22+
python -m pip install --upgrade pip
23+
pip install ruff
24+
- name: Run Ruff
25+
run: ruff djangocms_versioning

.pre-commit-config.yaml

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,8 @@ repos:
1414
- id: check-merge-conflict
1515
- id: mixed-line-ending
1616

17-
- repo: https://github.com/PyCQA/flake8
18-
rev: 4.0.1
17+
- repo: https://github.com/charliermarsh/ruff-pre-commit
18+
rev: "v0.0.264"
1919
hooks:
20-
- id: flake8
21-
additional_dependencies:
22-
- flake8-broken-line
23-
- flake8-bugbear
24-
- flake8-builtins
25-
- flake8-eradicate
26-
- flake8-tidy-imports
27-
- pep8-naming
28-
29-
- repo: https://github.com/pycqa/isort
30-
rev: 5.10.1
31-
hooks:
32-
- id: isort
20+
- id: ruff
21+
args: [--fix, --exit-non-zero-on-fix]

djangocms_versioning/admin.py

Lines changed: 44 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
from collections import OrderedDict
33
from urllib.parse import urlparse
44

5+
from cms.models import PageContent
6+
from cms.utils import get_language_from_request
7+
from cms.utils.conf import get_cms_setting
8+
from cms.utils.urlutils import add_url_parameters, static_with_version
59
from django.contrib import admin, messages
610
from django.contrib.admin.options import IncorrectLookupParameters
711
from django.contrib.admin.utils import unquote
@@ -19,11 +23,6 @@
1923
from django.utils.html import format_html, format_html_join
2024
from django.utils.translation import gettext_lazy as _
2125

22-
from cms.models import PageContent
23-
from cms.utils import get_language_from_request
24-
from cms.utils.conf import get_cms_setting
25-
from cms.utils.urlutils import add_url_parameters, static_with_version
26-
2726
from . import versionables
2827
from .conf import USERNAME_FIELD
2928
from .constants import DRAFT, INDICATOR_DESCRIPTIONS, PUBLISHED
@@ -173,16 +172,16 @@ def indicator(obj):
173172
"description": INDICATOR_DESCRIPTIONS.get(status, _("Empty")),
174173
"menu_template": "admin/cms/page/tree/indicator_menu.html",
175174
"menu": json.dumps(render_to_string("admin/cms/page/tree/indicator_menu.html",
176-
dict(indicator_menu_items=menu))) if menu else None,
175+
{"indicator_menu_items": menu})) if menu else None,
177176
}
178177
)
179178
indicator.short_description = self.indicator_column_label
180179
return indicator
181180

182181
def state_indicator(self, obj):
183182
raise ValueError(
184-
"ModelAdmin.display_list contains \"state_indicator\" as a placeholder for status indicators. "
185-
"Status indicators, however, are not loaded. If you implement \"get_list_display\" make "
183+
'ModelAdmin.display_list contains "state_indicator" as a placeholder for status indicators. '
184+
'Status indicators, however, are not loaded. If you implement "get_list_display" make '
186185
"sure it calls super().get_list_display."
187186
) # pragma: no cover
188187

@@ -392,8 +391,8 @@ def extend_list_display(self, request, modifier_dict, list_display):
392391
list_display[list_display.index(field)] = self._get_field_modifier(request, modifier_dict, field)
393392
list_display = tuple(list_display)
394393
return list_display
395-
except ValueError:
396-
raise ImproperlyConfigured("The target field does not exist in this context")
394+
except ValueError as err:
395+
raise ImproperlyConfigured("The target field does not exist in this context") from err
397396
return tuple(list_display)
398397

399398
def get_list_display(self, request):
@@ -777,19 +776,19 @@ def archive_view(self, request, object_id):
777776
return redirect(version_list_url(version.content))
778777

779778
if request.method != "POST":
780-
context = dict(
781-
object_name=version.content,
782-
version_number=version.number,
783-
object_id=object_id,
784-
archive_url=reverse(
779+
context = {
780+
"object_name": version.content,
781+
"version_number": version.number,
782+
"object_id": object_id,
783+
"archive_url": reverse(
785784
"admin:{app}_{model}_archive".format(
786785
app=self.model._meta.app_label,
787786
model=self.model._meta.model_name,
788787
),
789788
args=(version.content.pk,),
790789
),
791-
back_url=self.back_link(request, version),
792-
)
790+
"back_url": self.back_link(request, version),
791+
}
793792
return render(
794793
request, "djangocms_versioning/admin/archive_confirmation.html", context
795794
)
@@ -857,19 +856,19 @@ def unpublish_view(self, request, object_id):
857856
return redirect(version_list_url(version.content))
858857

859858
if request.method != "POST":
860-
context = dict(
861-
object_name=version.content,
862-
version_number=version.number,
863-
object_id=object_id,
864-
unpublish_url=reverse(
859+
context = {
860+
"object_name": version.content,
861+
"version_number": version.number,
862+
"object_id": object_id,
863+
"unpublish_url": reverse(
865864
"admin:{app}_{model}_unpublish".format(
866865
app=self.model._meta.app_label,
867866
model=self.model._meta.model_name,
868867
),
869868
args=(version.content.pk,),
870869
),
871-
back_url=self.back_link(request, version),
872-
)
870+
"back_url": self.back_link(request, version),
871+
}
873872
extra_context = OrderedDict(
874873
[
875874
(key, func(request, version))
@@ -970,20 +969,20 @@ def revert_view(self, request, object_id):
970969
draft_version = drafts.first()
971970

972971
if request.method != "POST":
973-
context = dict(
974-
object_name=version.content,
975-
version_number=version.number,
976-
draft_version=draft_version,
977-
object_id=object_id,
978-
revert_url=reverse(
972+
context = {
973+
"object_name": version.content,
974+
"version_number": version.number,
975+
"draft_version": draft_version,
976+
"object_id": object_id,
977+
"revert_url": reverse(
979978
"admin:{app}_{model}_revert".format(
980979
app=self.model._meta.app_label,
981980
model=self.model._meta.model_name,
982981
),
983982
args=(version.content.pk,),
984983
),
985-
back_url=self.back_link(request, version),
986-
)
984+
"back_url": self.back_link(request, version),
985+
}
987986
return render(
988987
request, "djangocms_versioning/admin/revert_confirmation.html", context
989988
)
@@ -1012,20 +1011,20 @@ def discard_view(self, request, object_id):
10121011
return redirect(version_list_url(version.content))
10131012

10141013
if request.method != "POST":
1015-
context = dict(
1016-
object_name=version.content,
1017-
version_number=version.number,
1018-
draft_version=version,
1019-
object_id=object_id,
1020-
revert_url=reverse(
1014+
context = {
1015+
"object_name": version.content,
1016+
"version_number": version.number,
1017+
"draft_version": version,
1018+
"object_id": object_id,
1019+
"revert_url": reverse(
10211020
"admin:{app}_{model}_revert".format(
10221021
app=self.model._meta.app_label,
10231022
model=self.model._meta.model_name,
10241023
),
10251024
args=(version.content.pk,),
10261025
),
1027-
back_url=self.back_link(request, version),
1028-
)
1026+
"back_url": self.back_link(request, version),
1027+
}
10291028
return render(
10301029
request, "djangocms_versioning/admin/discard_confirmation.html", context
10311030
)
@@ -1034,9 +1033,9 @@ def discard_view(self, request, object_id):
10341033
if request.POST.get("discard"):
10351034
ModelClass = version.content.__class__
10361035
deleted = version.delete()
1037-
if deleted[1]['last']:
1038-
version_url = get_admin_url(ModelClass, 'changelist')
1039-
self.message_user(request, _('The last version has been deleted'))
1036+
if deleted[1]["last"]:
1037+
version_url = get_admin_url(ModelClass, "changelist")
1038+
self.message_user(request, _("The last version has been deleted"))
10401039

10411040
return redirect(version_url)
10421041

@@ -1116,7 +1115,7 @@ def changelist_view(self, request, extra_context=None):
11161115
# redirect to grouper form when there's no GET parameters
11171116
opts = self.model._meta
11181117
return redirect(
1119-
reverse("admin:{}_{}_grouper".format(opts.app_label, opts.model_name))
1118+
reverse(f"admin:{opts.app_label}_{opts.model_name}_grouper")
11201119
)
11211120
extra_context = extra_context or {}
11221121
versionable = versionables.for_content(self.model._source_model)
@@ -1134,7 +1133,7 @@ def changelist_view(self, request, extra_context=None):
11341133

11351134
if grouper:
11361135
# CAVEAT: as the breadcrumb trails expect a value for latest content in the template
1137-
extra_context["latest_content"] = ({'pk': None})
1136+
extra_context["latest_content"] = ({"pk": None})
11381137

11391138
extra_context.update(
11401139
grouper=grouper,

djangocms_versioning/apps.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class VersioningConfig(AppConfig):
77
name = "djangocms_versioning"
88
verbose_name = _("django CMS Versioning")
9-
default_auto_field = 'django.db.models.AutoField'
9+
default_auto_field = "django.db.models.AutoField"
1010

1111
def ready(self):
1212
from cms.models import contentmodels, fields
@@ -24,7 +24,7 @@ def ready(self):
2424

2525
# Remove uniqueness constraint from PageContent model to allow for different versions
2626
pagecontent_unique_together = tuple(
27-
set(contentmodels.PageContent._meta.unique_together) - set((("language", "page"),))
27+
set(contentmodels.PageContent._meta.unique_together) - {("language", "page")}
2828
)
2929
contentmodels.PageContent._meta.unique_together = pagecontent_unique_together
3030

djangocms_versioning/cms_config.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
import collections
22

3+
from cms.app_base import CMSAppConfig, CMSAppExtension
4+
from cms.models import PageContent, Placeholder
5+
from cms.utils import get_language_from_request
6+
from cms.utils.i18n import get_language_list, get_language_tuple
7+
from cms.utils.plugins import copy_plugins_to_placeholder
8+
from cms.utils.urlutils import admin_reverse
39
from django.conf import settings
410
from django.contrib.admin.utils import flatten_fieldsets
511
from django.core.exceptions import (
612
ImproperlyConfigured,
713
ObjectDoesNotExist,
814
PermissionDenied,
915
)
10-
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
16+
from django.http import (
17+
HttpResponse,
18+
HttpResponseBadRequest,
19+
HttpResponseForbidden,
20+
)
1121
from django.utils.encoding import force_str
1222
from django.utils.functional import cached_property
1323
from django.utils.translation import gettext_lazy as _
1424

15-
from cms.app_base import CMSAppConfig, CMSAppExtension
16-
from cms.models import PageContent, Placeholder
17-
from cms.utils import get_language_from_request
18-
from cms.utils.i18n import get_language_list, get_language_tuple
19-
from cms.utils.plugins import copy_plugins_to_placeholder
20-
from cms.utils.urlutils import admin_reverse
21-
2225
from . import indicators, versionables
2326
from .admin import VersioningAdminMixin
2427
from .constants import INDICATOR_DESCRIPTIONS
@@ -87,7 +90,7 @@ def handle_versioning_setting(self, cms_config):
8790
registered_so_far = [v.content_model for v in self.versionables]
8891
if versionable.content_model in registered_so_far:
8992
raise ImproperlyConfigured(
90-
"{!r} has already been registered".format(versionable.content_model)
93+
f"{versionable.content_model!r} has already been registered"
9194
)
9295
# Checks passed. Add versionable to our master list
9396
self.versionables.append(versionable)
@@ -237,8 +240,8 @@ def label_from_instance(obj, language):
237240
"""
238241
title = obj.get_title(language) or _("No available title")
239242
path = obj.get_path(language)
240-
path = "/{}/".format(path) if path else _("Unpublished")
241-
return "{title} ({path})".format(title=title, path=path)
243+
path = f"/{path}/" if path else _("Unpublished")
244+
return f"{title} ({path})"
242245

243246

244247
def on_page_content_publish(version):
@@ -279,7 +282,7 @@ def get_readonly_fields(self, request, obj=None):
279282
version = Version.objects.get_for_content(obj)
280283
if not version.check_modify.as_bool(request.user):
281284
form = self.get_form_class(request)
282-
if getattr(form, "fieldsets"):
285+
if form.fieldsets:
283286
fields = flatten_fieldsets(form.fieldsets)
284287
fields = list(fields)
285288
for f_name in ["slug", "overwrite_url"]:
@@ -304,8 +307,8 @@ def get_queryset(self, request):
304307
# TODO: Improve the grouping filters to use anything defined in the
305308
# apps versioning config extra_grouping_fields
306309
grouping_filters = {}
307-
if 'language' in versionable.extra_grouping_fields:
308-
grouping_filters['language'] = get_language_from_request(request)
310+
if "language" in versionable.extra_grouping_fields:
311+
grouping_filters["language"] = get_language_from_request(request)
309312

310313
return queryset.filter(pk__in=versionable.distinct_groupers(**grouping_filters))
311314
return queryset
@@ -318,7 +321,7 @@ def get_queryset(self, request):
318321
# - where it should live going forwards (cms vs versioning)
319322
# - A better way of making the feature extensible / modifiable for versioning
320323
def copy_language(self, request, object_id):
321-
target_language = request.POST.get('target_language')
324+
target_language = request.POST.get("target_language")
322325

323326
# CAVEAT: Avoiding self.get_object because it sets the page cache,
324327
# We don't want a draft showing to a regular site visitor!
@@ -349,7 +352,7 @@ def copy_language(self, request, object_id):
349352
plugins = placeholder.get_plugins_list(source_page_content.language)
350353

351354
if not target.has_add_plugins_permission(request.user, plugins):
352-
return HttpResponseForbidden(force_str(_('You do not have permission to copy these plugins.')))
355+
return HttpResponseForbidden(force_str(_("You do not have permission to copy these plugins.")))
353356
copy_plugins_to_placeholder(plugins, target, language=target_language)
354357
return HttpResponse("ok")
355358

0 commit comments

Comments
 (0)