diff --git a/.github/workflows/lint-and-test.yml b/.github/workflows/lint-and-test.yml
index 20b221aa..436698be 100644
--- a/.github/workflows/lint-and-test.yml
+++ b/.github/workflows/lint-and-test.yml
@@ -28,6 +28,10 @@ jobs:
pip install flake8
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 . --count --max-line-length=120 --show-source --statistics
+ - name: Check isort
+ run: |
+ pip install isort
+ isort --check --profile=django .
- name: Set secret key
run: ./sbin/patchman-set-secret-key
- name: Test with django
diff --git a/arch/admin.py b/arch/admin.py
index 624a3720..5224711c 100644
--- a/arch/admin.py
+++ b/arch/admin.py
@@ -16,7 +16,8 @@
# along with Patchman. If not, see
from django.contrib import admin
-from arch.models import PackageArchitecture, MachineArchitecture
+
+from arch.models import MachineArchitecture, PackageArchitecture
admin.site.register(PackageArchitecture)
admin.site.register(MachineArchitecture)
diff --git a/arch/serializers.py b/arch/serializers.py
index 5319e796..a5765128 100644
--- a/arch/serializers.py
+++ b/arch/serializers.py
@@ -16,7 +16,7 @@
from rest_framework import serializers
-from arch.models import PackageArchitecture, MachineArchitecture
+from arch.models import MachineArchitecture, PackageArchitecture
class PackageArchitectureSerializer(serializers.HyperlinkedModelSerializer):
diff --git a/arch/utils.py b/arch/utils.py
index 04d0b350..3db6ac70 100644
--- a/arch/utils.py
+++ b/arch/utils.py
@@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from arch.models import PackageArchitecture, MachineArchitecture
+from arch.models import MachineArchitecture, PackageArchitecture
from util.logging import info_message
diff --git a/arch/views.py b/arch/views.py
index 56a2a150..21f6b7c7 100644
--- a/arch/views.py
+++ b/arch/views.py
@@ -16,9 +16,10 @@
from rest_framework import viewsets
-from arch.models import PackageArchitecture, MachineArchitecture
-from arch.serializers import PackageArchitectureSerializer, \
- MachineArchitectureSerializer
+from arch.models import MachineArchitecture, PackageArchitecture
+from arch.serializers import (
+ MachineArchitectureSerializer, PackageArchitectureSerializer,
+)
class PackageArchitectureViewSet(viewsets.ModelViewSet):
diff --git a/domains/admin.py b/domains/admin.py
index 2ef883e3..5cb0fee3 100644
--- a/domains/admin.py
+++ b/domains/admin.py
@@ -16,6 +16,7 @@
# along with Patchman. If not, see
from django.contrib import admin
+
from domains.models import Domain
admin.site.register(Domain)
diff --git a/errata/admin.py b/errata/admin.py
index 88190ff6..ac4b8a50 100644
--- a/errata/admin.py
+++ b/errata/admin.py
@@ -15,6 +15,7 @@
# along with Patchman. If not, see
from django.contrib import admin
+
from errata.models import Erratum
diff --git a/errata/models.py b/errata/models.py
index cfc9bd0d..8c21bcfa 100644
--- a/errata/models.py
+++ b/errata/models.py
@@ -16,17 +16,16 @@
import json
-from django.db import models
+from django.db import IntegrityError, models
from django.urls import reverse
-from django.db import IntegrityError
+from errata.managers import ErratumManager
from packages.models import Package, PackageUpdate
from packages.utils import find_evr, get_matching_packages
-from errata.managers import ErratumManager
from security.models import CVE, Reference
from security.utils import get_or_create_cve, get_or_create_reference
-from util.logging import error_message
from util import get_url
+from util.logging import error_message
class Erratum(models.Model):
diff --git a/errata/sources/distros/alma.py b/errata/sources/distros/alma.py
index e0f2d4ae..0091b8bf 100644
--- a/errata/sources/distros/alma.py
+++ b/errata/sources/distros/alma.py
@@ -22,8 +22,8 @@
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
from packages.utils import get_or_create_package, parse_package_string
-from util import get_url, fetch_content, get_setting_of_type
from patchman.signals import pbar_start, pbar_update
+from util import fetch_content, get_setting_of_type, get_url
def update_alma_errata(concurrent_processing=True):
diff --git a/errata/sources/distros/arch.py b/errata/sources/distros/arch.py
index 87c6c47a..e22de403 100644
--- a/errata/sources/distros/arch.py
+++ b/errata/sources/distros/arch.py
@@ -20,11 +20,13 @@
from django.db import connections
from operatingsystems.utils import get_or_create_osrelease
-from util.logging import error_message
-from patchman.signals import pbar_start, pbar_update
from packages.models import Package
-from packages.utils import find_evr, get_matching_packages, get_or_create_package
-from util import get_url, fetch_content
+from packages.utils import (
+ find_evr, get_matching_packages, get_or_create_package,
+)
+from patchman.signals import pbar_start, pbar_update
+from util import fetch_content, get_url
+from util.logging import error_message
def update_arch_errata(concurrent_processing=False):
diff --git a/errata/sources/distros/centos.py b/errata/sources/distros/centos.py
index d2722a6b..8f4aa4a1 100644
--- a/errata/sources/distros/centos.py
+++ b/errata/sources/distros/centos.py
@@ -15,14 +15,15 @@
# along with Patchman. If not, see
import re
+
from defusedxml import ElementTree
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
-from packages.utils import parse_package_string, get_or_create_package
-from util.logging import error_message
+from packages.utils import get_or_create_package, parse_package_string
from patchman.signals import pbar_start, pbar_update
-from util import bunzip2, get_url, fetch_content, get_sha1, get_setting_of_type
+from util import bunzip2, fetch_content, get_setting_of_type, get_sha1, get_url
+from util.logging import error_message
def update_centos_errata():
diff --git a/errata/sources/distros/debian.py b/errata/sources/distros/debian.py
index ece3754d..8025b1bf 100644
--- a/errata/sources/distros/debian.py
+++ b/errata/sources/distros/debian.py
@@ -18,18 +18,18 @@
import csv
import re
from datetime import datetime
-from debian.deb822 import Dsc
from io import StringIO
+from debian.deb822 import Dsc
from django.db import connections
from operatingsystems.models import OSRelease
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
-from packages.utils import get_or_create_package, find_evr
-from util.logging import error_message, warning_message
+from packages.utils import find_evr, get_or_create_package
from patchman.signals import pbar_start, pbar_update
-from util import get_url, fetch_content, get_setting_of_type, extract
+from util import extract, fetch_content, get_setting_of_type, get_url
+from util.logging import error_message, warning_message
DSCs = {}
diff --git a/errata/sources/distros/rocky.py b/errata/sources/distros/rocky.py
index 16d4d12c..2d805985 100644
--- a/errata/sources/distros/rocky.py
+++ b/errata/sources/distros/rocky.py
@@ -14,19 +14,21 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-import json
import concurrent.futures
-from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_exponential
+import json
from django.db import connections
from django.db.utils import OperationalError
+from tenacity import (
+ retry, retry_if_exception_type, stop_after_attempt, wait_exponential,
+)
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
-from packages.utils import parse_package_string, get_or_create_package
+from packages.utils import get_or_create_package, parse_package_string
from patchman.signals import pbar_start, pbar_update
-from util import get_url, fetch_content
-from util.logging import info_message, error_message
+from util import fetch_content, get_url
+from util.logging import error_message, info_message
def update_rocky_errata(concurrent_processing=True):
diff --git a/errata/sources/distros/ubuntu.py b/errata/sources/distros/ubuntu.py
index 6fafb40a..5616331f 100644
--- a/errata/sources/distros/ubuntu.py
+++ b/errata/sources/distros/ubuntu.py
@@ -16,8 +16,8 @@
import concurrent.futures
import csv
-import os
import json
+import os
from io import StringIO
from urllib.parse import urlparse
@@ -26,10 +26,15 @@
from operatingsystems.models import OSRelease, OSVariant
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
-from packages.utils import get_or_create_package, parse_package_string, find_evr, get_matching_packages
-from util import get_url, fetch_content, get_sha256, bunzip2, get_setting_of_type
-from util.logging import error_message
+from packages.utils import (
+ find_evr, get_matching_packages, get_or_create_package,
+ parse_package_string,
+)
from patchman.signals import pbar_start, pbar_update
+from util import (
+ bunzip2, fetch_content, get_setting_of_type, get_sha256, get_url,
+)
+from util.logging import error_message
def update_ubuntu_errata(concurrent_processing=False):
diff --git a/errata/sources/repos/yum.py b/errata/sources/repos/yum.py
index f361d10e..8b6732c4 100644
--- a/errata/sources/repos/yum.py
+++ b/errata/sources/repos/yum.py
@@ -16,17 +16,17 @@
import concurrent.futures
from io import BytesIO
-from defusedxml import ElementTree
+from defusedxml import ElementTree
from django.db import connections
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
from packages.utils import get_or_create_package
-from util.logging import error_message
from patchman.signals import pbar_start, pbar_update
from security.models import Reference
from util import extract, get_url
+from util.logging import error_message
def extract_updateinfo(data, url, concurrent_processing=True):
diff --git a/errata/tasks.py b/errata/tasks.py
index d9aaf3d4..8ded3a79 100644
--- a/errata/tasks.py
+++ b/errata/tasks.py
@@ -15,19 +15,18 @@
# along with Patchman. If not, see
from celery import shared_task
-
from django.core.cache import cache
-from errata.sources.distros.arch import update_arch_errata
from errata.sources.distros.alma import update_alma_errata
-from errata.sources.distros.debian import update_debian_errata
+from errata.sources.distros.arch import update_arch_errata
from errata.sources.distros.centos import update_centos_errata
+from errata.sources.distros.debian import update_debian_errata
from errata.sources.distros.rocky import update_rocky_errata
from errata.sources.distros.ubuntu import update_ubuntu_errata
-from util.logging import error_message, warning_message
from repos.models import Repository
from security.tasks import update_cves, update_cwes
from util import get_setting_of_type
+from util.logging import error_message, warning_message
@shared_task
diff --git a/errata/utils.py b/errata/utils.py
index a8d8d424..e0a5e01b 100644
--- a/errata/utils.py
+++ b/errata/utils.py
@@ -18,11 +18,11 @@
from django.db import connections
-from util import tz_aware_datetime
from errata.models import Erratum
from packages.models import PackageUpdate
-from util.logging import warning_message
from patchman.signals import pbar_start, pbar_update
+from util import tz_aware_datetime
+from util.logging import warning_message
def get_or_create_erratum(name, e_type, issue_date, synopsis):
diff --git a/errata/views.py b/errata/views.py
index 42d12f71..8e1c0b2f 100644
--- a/errata/views.py
+++ b/errata/views.py
@@ -14,16 +14,15 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.shortcuts import get_object_or_404, render
from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
-
+from django.shortcuts import get_object_or_404, render
from rest_framework import viewsets
-from operatingsystems.models import OSRelease
from errata.models import Erratum
from errata.serializers import ErratumSerializer
+from operatingsystems.models import OSRelease
from util.filterspecs import Filter, FilterBar
diff --git a/etc/patchman/local_settings.py b/etc/patchman/local_settings.py
index f7b98cf8..40dd2efd 100644
--- a/etc/patchman/local_settings.py
+++ b/etc/patchman/local_settings.py
@@ -66,8 +66,10 @@
}
}
-from datetime import timedelta # noqa
+from datetime import timedelta # noqa
+
from celery.schedules import crontab # noqa
+
CELERY_BEAT_SCHEDULE = {
'process_all_unprocessed_reports': {
'task': 'reports.tasks.process_reports',
diff --git a/hooks/yum/patchman.py b/hooks/yum/patchman.py
index 343144eb..52f9cc8b 100644
--- a/hooks/yum/patchman.py
+++ b/hooks/yum/patchman.py
@@ -15,6 +15,7 @@
# along with Patchman. If not, see
import os
+
from yum.plugins import TYPE_CORE
requires_api_version = '2.1'
diff --git a/hooks/zypper/patchman.py b/hooks/zypper/patchman.py
index 14781565..d9d478f3 100755
--- a/hooks/zypper/patchman.py
+++ b/hooks/zypper/patchman.py
@@ -18,8 +18,9 @@
#
# zypp system plugin for patchman
-import os
import logging
+import os
+
from zypp_plugin import Plugin
diff --git a/hosts/admin.py b/hosts/admin.py
index 8a42e8cc..43bf31da 100644
--- a/hosts/admin.py
+++ b/hosts/admin.py
@@ -16,6 +16,7 @@
# along with Patchman. If not, see
from django.contrib import admin
+
from hosts.models import Host, HostRepo
diff --git a/hosts/migrations/0001_initial.py b/hosts/migrations/0001_initial.py
index 43366684..0037e094 100644
--- a/hosts/migrations/0001_initial.py
+++ b/hosts/migrations/0001_initial.py
@@ -1,8 +1,9 @@
# Generated by Django 3.2.19 on 2023-12-11 22:15
-from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
+from django.db import migrations, models
+
try:
import tagging.fields
has_tagging = True
diff --git a/hosts/migrations/0002_initial.py b/hosts/migrations/0002_initial.py
index cc59a70e..6c453c49 100644
--- a/hosts/migrations/0002_initial.py
+++ b/hosts/migrations/0002_initial.py
@@ -1,7 +1,7 @@
# Generated by Django 3.2.19 on 2023-12-11 22:15
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/hosts/migrations/0004_remove_host_tags_host_tags.py b/hosts/migrations/0004_remove_host_tags_host_tags.py
index 84e7affe..bf03a84e 100644
--- a/hosts/migrations/0004_remove_host_tags_host_tags.py
+++ b/hosts/migrations/0004_remove_host_tags_host_tags.py
@@ -1,8 +1,9 @@
# Generated by Django 4.2.18 on 2025-02-04 23:37
+import taggit.managers
from django.apps import apps
from django.db import migrations
-import taggit.managers
+
try:
import tagging # noqa
except ImportError:
diff --git a/hosts/migrations/0006_migrate_to_tz_aware.py b/hosts/migrations/0006_migrate_to_tz_aware.py
index e36bbf1f..c14ea50b 100644
--- a/hosts/migrations/0006_migrate_to_tz_aware.py
+++ b/hosts/migrations/0006_migrate_to_tz_aware.py
@@ -1,6 +1,7 @@
from django.db import migrations
from django.utils import timezone
+
def make_datetimes_tz_aware(apps, schema_editor):
Host = apps.get_model('hosts', 'Host')
for host in Host.objects.all():
diff --git a/hosts/migrations/0007_alter_host_tags.py b/hosts/migrations/0007_alter_host_tags.py
index 3858b847..3910a06f 100644
--- a/hosts/migrations/0007_alter_host_tags.py
+++ b/hosts/migrations/0007_alter_host_tags.py
@@ -1,7 +1,7 @@
# Generated by Django 4.2.19 on 2025-02-28 19:53
-from django.db import migrations
import taggit.managers
+from django.db import migrations
class Migration(migrations.Migration):
diff --git a/hosts/models.py b/hosts/models.py
index 650544dc..8ea5e3d5 100644
--- a/hosts/models.py
+++ b/hosts/models.py
@@ -24,6 +24,7 @@
from version_utils.rpm import labelCompare
except ImportError:
from rpm import labelCompare
+
from taggit.managers import TaggableManager
from arch.models import MachineArchitecture
@@ -34,9 +35,9 @@
from operatingsystems.models import OSVariant
from packages.models import Package, PackageUpdate
from packages.utils import get_or_create_package_update
-from util.logging import info_message
from repos.models import Repository
from repos.utils import find_best_repo
+from util.logging import info_message
class Host(models.Model):
diff --git a/hosts/tasks.py b/hosts/tasks.py
index 1643901d..226652f6 100755
--- a/hosts/tasks.py
+++ b/hosts/tasks.py
@@ -15,7 +15,6 @@
# along with Patchman. If not, see
from celery import shared_task
-
from django.db.models import Count
from hosts.models import Host
diff --git a/hosts/templatetags/report_alert.py b/hosts/templatetags/report_alert.py
index a28c5058..48d8f966 100644
--- a/hosts/templatetags/report_alert.py
+++ b/hosts/templatetags/report_alert.py
@@ -17,9 +17,9 @@
from datetime import timedelta
from django.template import Library
-from django.utils.html import format_html
from django.templatetags.static import static
from django.utils import timezone
+from django.utils.html import format_html
from util import get_setting_of_type
diff --git a/hosts/utils.py b/hosts/utils.py
index d6e663cf..44441f9b 100644
--- a/hosts/utils.py
+++ b/hosts/utils.py
@@ -15,9 +15,9 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from socket import gethostbyaddr, gaierror, herror
+from socket import gaierror, gethostbyaddr, herror
-from django.db import transaction, IntegrityError
+from django.db import IntegrityError, transaction
from taggit.models import Tag
from util.logging import error_message, info_message
diff --git a/hosts/views.py b/hosts/views.py
index 0fc83ffa..8f20ab19 100644
--- a/hosts/views.py
+++ b/hosts/views.py
@@ -15,24 +15,23 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.shortcuts import get_object_or_404, render, redirect
+from django.contrib import messages
from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
-from django.urls import reverse
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
-from django.contrib import messages
-
-from taggit.models import Tag
+from django.shortcuts import get_object_or_404, redirect, render
+from django.urls import reverse
from rest_framework import viewsets
+from taggit.models import Tag
-from util.filterspecs import Filter, FilterBar
-from hosts.models import Host, HostRepo
-from domains.models import Domain
from arch.models import MachineArchitecture
-from operatingsystems.models import OSVariant, OSRelease
-from reports.models import Report
+from domains.models import Domain
from hosts.forms import EditHostForm
-from hosts.serializers import HostSerializer, HostRepoSerializer
+from hosts.models import Host, HostRepo
+from hosts.serializers import HostRepoSerializer, HostSerializer
+from operatingsystems.models import OSRelease, OSVariant
+from reports.models import Report
+from util.filterspecs import Filter, FilterBar
@login_required
diff --git a/modules/admin.py b/modules/admin.py
index 33b94d20..9cf21e6c 100644
--- a/modules/admin.py
+++ b/modules/admin.py
@@ -15,6 +15,7 @@
# along with Patchman. If not, see
from django.contrib import admin
+
from modules.models import Module
admin.site.register(Module)
diff --git a/modules/migrations/0001_initial.py b/modules/migrations/0001_initial.py
index 12a8e278..9c27d425 100644
--- a/modules/migrations/0001_initial.py
+++ b/modules/migrations/0001_initial.py
@@ -1,7 +1,7 @@
# Generated by Django 3.2.19 on 2023-12-11 22:17
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/modules/utils.py b/modules/utils.py
index 05c57c80..0d669478 100644
--- a/modules/utils.py
+++ b/modules/utils.py
@@ -15,10 +15,10 @@
# along with Patchman. If not, see
from django.db import IntegrityError
-from util.logging import error_message, info_message
-from modules.models import Module
from arch.models import PackageArchitecture
+from modules.models import Module
+from util.logging import error_message, info_message
def get_or_create_module(name, stream, version, context, arch, repo):
diff --git a/modules/views.py b/modules/views.py
index b897a709..2d017220 100644
--- a/modules/views.py
+++ b/modules/views.py
@@ -14,12 +14,11 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.shortcuts import get_object_or_404, render
from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
-
-from rest_framework import viewsets, permissions
+from django.shortcuts import get_object_or_404, render
+from rest_framework import permissions, viewsets
from modules.models import Module
from modules.serializers import ModuleSerializer
diff --git a/operatingsystems/admin.py b/operatingsystems/admin.py
index 15f5e200..4884b5eb 100644
--- a/operatingsystems/admin.py
+++ b/operatingsystems/admin.py
@@ -16,7 +16,8 @@
# along with Patchman. If not, see
from django.contrib import admin
-from operatingsystems.models import OSVariant, OSRelease
+
+from operatingsystems.models import OSRelease, OSVariant
class OSReleaseAdmin(admin.ModelAdmin):
diff --git a/operatingsystems/forms.py b/operatingsystems/forms.py
index 548a7d88..fa319182 100644
--- a/operatingsystems/forms.py
+++ b/operatingsystems/forms.py
@@ -15,10 +15,10 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.forms import ModelForm, ModelMultipleChoiceField
from django.contrib.admin.widgets import FilteredSelectMultiple
+from django.forms import ModelForm, ModelMultipleChoiceField
-from operatingsystems.models import OSVariant, OSRelease
+from operatingsystems.models import OSRelease, OSVariant
from repos.models import Repository
diff --git a/operatingsystems/migrations/0002_initial.py b/operatingsystems/migrations/0002_initial.py
index 517a3f9a..04cbb411 100644
--- a/operatingsystems/migrations/0002_initial.py
+++ b/operatingsystems/migrations/0002_initial.py
@@ -1,7 +1,7 @@
# Generated by Django 3.2.19 on 2023-12-11 22:15
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/operatingsystems/migrations/0003_os_arch.py b/operatingsystems/migrations/0003_os_arch.py
index 2778ca3f..4d0e0f93 100644
--- a/operatingsystems/migrations/0003_os_arch.py
+++ b/operatingsystems/migrations/0003_os_arch.py
@@ -1,7 +1,7 @@
# Generated by Django 3.2.25 on 2025-02-07 13:02
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/operatingsystems/serializers.py b/operatingsystems/serializers.py
index 8418c720..be178909 100644
--- a/operatingsystems/serializers.py
+++ b/operatingsystems/serializers.py
@@ -16,7 +16,7 @@
from rest_framework import serializers
-from operatingsystems.models import OSVariant, OSRelease
+from operatingsystems.models import OSRelease, OSVariant
class OSVariantSerializer(serializers.HyperlinkedModelSerializer):
diff --git a/operatingsystems/views.py b/operatingsystems/views.py
index 2b696f92..6009f119 100644
--- a/operatingsystems/views.py
+++ b/operatingsystems/views.py
@@ -15,19 +15,22 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.shortcuts import get_object_or_404, render, redirect
+from django.contrib import messages
from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
-from django.contrib import messages
+from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
-
from rest_framework import viewsets
from hosts.models import Host
-from operatingsystems.models import OSVariant, OSRelease
-from operatingsystems.forms import AddOSVariantToOSReleaseForm, AddReposToOSReleaseForm, CreateOSReleaseForm
-from operatingsystems.serializers import OSVariantSerializer, OSReleaseSerializer
+from operatingsystems.forms import (
+ AddOSVariantToOSReleaseForm, AddReposToOSReleaseForm, CreateOSReleaseForm,
+)
+from operatingsystems.models import OSRelease, OSVariant
+from operatingsystems.serializers import (
+ OSReleaseSerializer, OSVariantSerializer,
+)
@login_required
diff --git a/packages/admin.py b/packages/admin.py
index 979ba779..bc4b1aaa 100644
--- a/packages/admin.py
+++ b/packages/admin.py
@@ -16,6 +16,7 @@
# along with Patchman. If not, see
from django.contrib import admin
+
from packages.models import Package, PackageName, PackageUpdate
diff --git a/packages/migrations/0001_initial.py b/packages/migrations/0001_initial.py
index 07e7bcb0..bfea3e1a 100644
--- a/packages/migrations/0001_initial.py
+++ b/packages/migrations/0001_initial.py
@@ -1,7 +1,7 @@
# Generated by Django 3.2.19 on 2023-12-11 22:15
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/packages/migrations/0002_auto_20250207_1319.py b/packages/migrations/0002_auto_20250207_1319.py
index 1563d139..4c744203 100644
--- a/packages/migrations/0002_auto_20250207_1319.py
+++ b/packages/migrations/0002_auto_20250207_1319.py
@@ -1,7 +1,7 @@
# Generated by Django 3.2.25 on 2025-02-07 13:19
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/packages/serializers.py b/packages/serializers.py
index 902cb3e0..b6e3fb83 100644
--- a/packages/serializers.py
+++ b/packages/serializers.py
@@ -16,7 +16,7 @@
from rest_framework import serializers
-from packages.models import PackageName, Package, PackageUpdate
+from packages.models import Package, PackageName, PackageUpdate
class PackageNameSerializer(serializers.HyperlinkedModelSerializer):
diff --git a/packages/utils.py b/packages/utils.py
index f00f6710..87395ff6 100644
--- a/packages/utils.py
+++ b/packages/utils.py
@@ -21,7 +21,9 @@
from django.db import IntegrityError, transaction
from arch.models import PackageArchitecture
-from packages.models import PackageName, Package, PackageUpdate, PackageCategory, PackageString
+from packages.models import (
+ Package, PackageCategory, PackageName, PackageString, PackageUpdate,
+)
from util.logging import error_message, info_message, warning_message
diff --git a/packages/views.py b/packages/views.py
index c55a6c72..413faee0 100644
--- a/packages/views.py
+++ b/packages/views.py
@@ -15,17 +15,18 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.shortcuts import get_object_or_404, render
from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
-
+from django.shortcuts import get_object_or_404, render
from rest_framework import viewsets
-from util.filterspecs import Filter, FilterBar
-from packages.models import PackageName, Package, PackageUpdate
from arch.models import PackageArchitecture
-from packages.serializers import PackageNameSerializer, PackageSerializer, PackageUpdateSerializer
+from packages.models import Package, PackageName, PackageUpdate
+from packages.serializers import (
+ PackageNameSerializer, PackageSerializer, PackageUpdateSerializer,
+)
+from util.filterspecs import Filter, FilterBar
@login_required
diff --git a/patchman/__init__.py b/patchman/__init__.py
index af122cc6..321dd7e5 100644
--- a/patchman/__init__.py
+++ b/patchman/__init__.py
@@ -14,10 +14,9 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from .receivers import * # noqa
-
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
+from .receivers import * # noqa
__all__ = ('celery_app',)
diff --git a/patchman/celery.py b/patchman/celery.py
index 3c58edc5..c47f994d 100644
--- a/patchman/celery.py
+++ b/patchman/celery.py
@@ -15,10 +15,11 @@
# along with Patchman. If not, see
import os
+
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'patchman.settings') # noqa
-from django.conf import settings # noqa
+from django.conf import settings # noqa
app = Celery('patchman')
app.config_from_object('django.conf:settings', namespace='CELERY')
diff --git a/patchman/receivers.py b/patchman/receivers.py
index 8d8893ca..19312ed5 100644
--- a/patchman/receivers.py
+++ b/patchman/receivers.py
@@ -15,16 +15,16 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from colorama import init, Fore, Style
-from tqdm import tqdm
-
+from colorama import Fore, Style, init
+from django.conf import settings
from django.dispatch import receiver
+from tqdm import tqdm
-from util import create_pbar, update_pbar, get_verbosity
-from patchman.signals import pbar_start, pbar_update, \
- info_message_s, warning_message_s, error_message_s, debug_message_s
-
-from django.conf import settings
+from patchman.signals import (
+ debug_message_s, error_message_s, info_message_s, pbar_start, pbar_update,
+ warning_message_s,
+)
+from util import create_pbar, get_verbosity, update_pbar
init(autoreset=True)
diff --git a/patchman/urls.py b/patchman/urls.py
index ee786566..2ae64f56 100644
--- a/patchman/urls.py
+++ b/patchman/urls.py
@@ -15,12 +15,11 @@
# You should have received a copy of the GNU General Public License
# along with If not, see
-from django.conf.urls import include, handler404, handler500 # noqa
from django.conf import settings
+from django.conf.urls import handler404, handler500, include # noqa
from django.contrib import admin
from django.urls import path
from django.views import static
-
from rest_framework import routers
from arch import views as arch_views
diff --git a/patchman/wsgi.py b/patchman/wsgi.py
index 9a9b4b7f..16f02d5a 100644
--- a/patchman/wsgi.py
+++ b/patchman/wsgi.py
@@ -19,7 +19,6 @@
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'patchman.settings') # noqa
-from django.conf import settings # noqa
-
+from django.conf import settings # noqa
application = get_wsgi_application()
diff --git a/reports/admin.py b/reports/admin.py
index a37ec4d0..66e0bf5b 100644
--- a/reports/admin.py
+++ b/reports/admin.py
@@ -16,6 +16,7 @@
# along with Patchman. If not, see
from django.contrib import admin
+
from reports.models import Report
diff --git a/reports/migrations/0004_migrate_to_tz_aware.py b/reports/migrations/0004_migrate_to_tz_aware.py
index 98176510..20510dcd 100644
--- a/reports/migrations/0004_migrate_to_tz_aware.py
+++ b/reports/migrations/0004_migrate_to_tz_aware.py
@@ -1,6 +1,7 @@
from django.db import migrations
from django.utils import timezone
+
def make_datetimes_tz_aware(apps, schema_editor):
Report = apps.get_model('reports', 'Report')
for report in Report.objects.all():
diff --git a/reports/models.py b/reports/models.py
index d529804b..f1e0f6f3 100644
--- a/reports/models.py
+++ b/reports/models.py
@@ -104,7 +104,7 @@ def process(self, find_updates=True, verbose=False):
info_message(text=f'Report {self.id} has already been processed')
return
- from reports.utils import get_arch, get_os, get_domain
+ from reports.utils import get_arch, get_domain, get_os
arch = get_arch(self.arch)
osvariant = get_os(self.os, arch)
domain = get_domain(self.domain)
@@ -113,7 +113,9 @@ def process(self, find_updates=True, verbose=False):
if verbose:
info_message(text=f'Processing report {self.id} - {self.host}')
- from reports.utils import process_packages, process_repos, process_updates, process_modules
+ from reports.utils import (
+ process_modules, process_packages, process_repos, process_updates,
+ )
process_repos(report=self, host=host)
process_modules(report=self, host=host)
process_packages(report=self, host=host)
diff --git a/reports/tasks.py b/reports/tasks.py
index d2a47e8f..07fb3004 100755
--- a/reports/tasks.py
+++ b/reports/tasks.py
@@ -16,7 +16,6 @@
# along with Patchman. If not, see
from celery import shared_task
-
from django.core.cache import cache
from django.db.utils import OperationalError
diff --git a/reports/utils.py b/reports/utils.py
index 76b6e09c..8b12f046 100644
--- a/reports/utils.py
+++ b/reports/utils.py
@@ -23,13 +23,18 @@
from domains.models import Domain
from hosts.models import HostRepo
from modules.utils import get_or_create_module
-from operatingsystems.utils import get_or_create_osrelease, get_or_create_osvariant
+from operatingsystems.utils import (
+ get_or_create_osrelease, get_or_create_osvariant,
+)
from packages.models import Package, PackageCategory
-from packages.utils import find_evr, get_or_create_package, get_or_create_package_update, parse_package_string
-from util.logging import info_message
+from packages.utils import (
+ find_evr, get_or_create_package, get_or_create_package_update,
+ parse_package_string,
+)
from patchman.signals import pbar_start, pbar_update
-from repos.models import Repository, Mirror, MirrorPackage
+from repos.models import Mirror, MirrorPackage, Repository
from repos.utils import get_or_create_repo
+from util.logging import info_message
def process_repos(report, host):
diff --git a/reports/views.py b/reports/views.py
index ccef1bb2..f247deb2 100644
--- a/reports/views.py
+++ b/reports/views.py
@@ -15,20 +15,21 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_exponential
-
-from django.http import HttpResponse, Http404
-from django.views.decorators.csrf import csrf_exempt
-from django.shortcuts import get_object_or_404, render, redirect
+from django.contrib import messages
from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
-from django.urls import reverse
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
-from django.contrib import messages
from django.db.utils import OperationalError
+from django.http import Http404, HttpResponse
+from django.shortcuts import get_object_or_404, redirect, render
+from django.urls import reverse
+from django.views.decorators.csrf import csrf_exempt
+from tenacity import (
+ retry, retry_if_exception_type, stop_after_attempt, wait_exponential,
+)
-from util.filterspecs import Filter, FilterBar
from reports.models import Report
+from util.filterspecs import Filter, FilterBar
@retry(
diff --git a/repos/admin.py b/repos/admin.py
index bea87567..a516ff8a 100644
--- a/repos/admin.py
+++ b/repos/admin.py
@@ -16,7 +16,8 @@
# along with Patchman. If not, see
from django.contrib import admin
-from repos.models import Repository, Mirror, MirrorPackage
+
+from repos.models import Mirror, MirrorPackage, Repository
class MirrorAdmin(admin.ModelAdmin):
diff --git a/repos/forms.py b/repos/forms.py
index 0800a5c3..9cb66897 100644
--- a/repos/forms.py
+++ b/repos/forms.py
@@ -15,10 +15,13 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.forms import ModelForm, ModelMultipleChoiceField, TextInput, Form, ModelChoiceField, ValidationError
from django.contrib.admin.widgets import FilteredSelectMultiple
+from django.forms import (
+ Form, ModelChoiceField, ModelForm, ModelMultipleChoiceField, TextInput,
+ ValidationError,
+)
-from repos.models import Repository, Mirror
+from repos.models import Mirror, Repository
class EditRepoForm(ModelForm):
diff --git a/repos/migrations/0001_initial.py b/repos/migrations/0001_initial.py
index a99f6878..1ae96a98 100644
--- a/repos/migrations/0001_initial.py
+++ b/repos/migrations/0001_initial.py
@@ -1,7 +1,7 @@
# Generated by Django 3.2.19 on 2023-12-11 22:15
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/repos/migrations/0003_migrate_to_tz_aware.py b/repos/migrations/0003_migrate_to_tz_aware.py
index dddd78ba..38e30488 100644
--- a/repos/migrations/0003_migrate_to_tz_aware.py
+++ b/repos/migrations/0003_migrate_to_tz_aware.py
@@ -1,6 +1,7 @@
from django.db import migrations
from django.utils import timezone
+
def make_datetimes_tz_aware(apps, schema_editor):
Mirror = apps.get_model('repos', 'Mirror')
for mirror in Mirror.objects.all():
diff --git a/repos/models.py b/repos/models.py
index a1db2a93..9b9082af 100644
--- a/repos/models.py
+++ b/repos/models.py
@@ -20,13 +20,12 @@
from arch.models import MachineArchitecture
from packages.models import Package
-from util import get_setting_of_type
-
-from repos.repo_types.deb import refresh_deb_repo
-from repos.repo_types.rpm import refresh_rpm_repo, refresh_repo_errata
from repos.repo_types.arch import refresh_arch_repo
+from repos.repo_types.deb import refresh_deb_repo
from repos.repo_types.gentoo import refresh_gentoo_repo
-from util.logging import info_message, warning_message, error_message
+from repos.repo_types.rpm import refresh_repo_errata, refresh_rpm_repo
+from util import get_setting_of_type
+from util.logging import error_message, info_message, warning_message
class Repository(models.Model):
diff --git a/repos/repo_types/arch.py b/repos/repo_types/arch.py
index 09719428..390b321d 100644
--- a/repos/repo_types/arch.py
+++ b/repos/repo_types/arch.py
@@ -18,10 +18,13 @@
from io import BytesIO
from packages.models import PackageString
-from util.logging import info_message, warning_message
from patchman.signals import pbar_start, pbar_update
-from repos.utils import get_max_mirrors, fetch_mirror_data, find_mirror_url, update_mirror_packages
-from util import get_datetime_now, get_checksum, Checksum
+from repos.utils import (
+ fetch_mirror_data, find_mirror_url, get_max_mirrors,
+ update_mirror_packages,
+)
+from util import Checksum, get_checksum, get_datetime_now
+from util.logging import info_message, warning_message
def refresh_arch_repo(repo):
diff --git a/repos/repo_types/deb.py b/repos/repo_types/deb.py
index c6c26d78..33d1f2c4 100644
--- a/repos/repo_types/deb.py
+++ b/repos/repo_types/deb.py
@@ -15,14 +15,17 @@
# along with Patchman. If not, see
import re
+
from debian.deb822 import Packages
from debian.debian_support import Version
from packages.models import PackageString
-from util.logging import error_message, info_message, warning_message
from patchman.signals import pbar_start, pbar_update
-from repos.utils import fetch_mirror_data, update_mirror_packages, find_mirror_url
-from util import get_datetime_now, get_checksum, Checksum, extract
+from repos.utils import (
+ fetch_mirror_data, find_mirror_url, update_mirror_packages,
+)
+from util import Checksum, extract, get_checksum, get_datetime_now
+from util.logging import error_message, info_message, warning_message
def extract_deb_packages(data, url):
diff --git a/repos/repo_types/gentoo.py b/repos/repo_types/gentoo.py
index e440f0d5..a0584618 100644
--- a/repos/repo_types/gentoo.py
+++ b/repos/repo_types/gentoo.py
@@ -14,22 +14,28 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-import git
import os
import shutil
import tarfile
import tempfile
-from defusedxml import ElementTree
from fnmatch import fnmatch
from io import BytesIO
from pathlib import Path
+import git
+from defusedxml import ElementTree
+
from packages.models import PackageString
from packages.utils import find_evr
-from util.logging import info_message, warning_message, error_message
from patchman.signals import pbar_start, pbar_update
-from repos.utils import add_mirrors_from_urls, mirror_checksum_is_valid, update_mirror_packages
-from util import extract, get_url, get_datetime_now, get_checksum, Checksum, fetch_content, response_is_valid
+from repos.utils import (
+ add_mirrors_from_urls, mirror_checksum_is_valid, update_mirror_packages,
+)
+from util import (
+ Checksum, extract, fetch_content, get_checksum, get_datetime_now, get_url,
+ response_is_valid,
+)
+from util.logging import error_message, info_message, warning_message
def refresh_gentoo_main_repo(repo):
diff --git a/repos/repo_types/rpm.py b/repos/repo_types/rpm.py
index 51661809..5ffbb708 100644
--- a/repos/repo_types/rpm.py
+++ b/repos/repo_types/rpm.py
@@ -16,11 +16,14 @@
from django.db.models import Q
-from util.logging import info_message, warning_message
from repos.repo_types.yast import refresh_yast_repo
from repos.repo_types.yum import refresh_yum_repo
-from repos.utils import check_for_metalinks, check_for_mirrorlists, find_mirror_url, get_max_mirrors, fetch_mirror_data
+from repos.utils import (
+ check_for_metalinks, check_for_mirrorlists, fetch_mirror_data,
+ find_mirror_url, get_max_mirrors,
+)
from util import get_datetime_now
+from util.logging import info_message, warning_message
def refresh_repo_errata(repo):
diff --git a/repos/repo_types/yast.py b/repos/repo_types/yast.py
index bf594040..e37b9934 100644
--- a/repos/repo_types/yast.py
+++ b/repos/repo_types/yast.py
@@ -17,10 +17,10 @@
import re
from packages.models import PackageString
-from util.logging import info_message
from patchman.signals import pbar_start, pbar_update
from repos.utils import fetch_mirror_data, update_mirror_packages
from util import extract
+from util.logging import info_message
def refresh_yast_repo(mirror, data):
diff --git a/repos/repo_types/yum.py b/repos/repo_types/yum.py
index bc0fbc4b..1e96db39 100644
--- a/repos/repo_types/yum.py
+++ b/repos/repo_types/yum.py
@@ -15,17 +15,18 @@
# along with Patchman. If not, see
from celery import shared_task
-
from django.core.cache import cache
from repos.models import Repository
diff --git a/repos/utils.py b/repos/utils.py
index c11c41ad..29e9cdb3 100644
--- a/repos/utils.py
+++ b/repos/utils.py
@@ -17,17 +17,24 @@
import re
from io import BytesIO
-from defusedxml import ElementTree
-from tenacity import RetryError
+from defusedxml import ElementTree
from django.db import IntegrityError
from django.db.models import Q
+from tenacity import RetryError
from packages.models import Package
-from packages.utils import convert_package_to_packagestring, convert_packagestring_to_package
-from util import get_url, fetch_content, response_is_valid, extract, get_checksum, Checksum, get_setting_of_type
-from util.logging import info_message, warning_message, error_message, debug_message
+from packages.utils import (
+ convert_package_to_packagestring, convert_packagestring_to_package,
+)
from patchman.signals import pbar_start, pbar_update
+from util import (
+ Checksum, extract, fetch_content, get_checksum, get_setting_of_type,
+ get_url, response_is_valid,
+)
+from util.logging import (
+ debug_message, error_message, info_message, warning_message,
+)
def get_or_create_repo(r_name, r_arch, r_type, r_id=None):
@@ -176,6 +183,7 @@ def add_mirrors_from_urls(repo, mirror_urls):
warning_message(text=text)
break
from repos.models import Mirror
+
# FIXME: maybe we should store the mirrorlist url with full path to repomd.xml?
# that is what metalink urls return now
m, c = Mirror.objects.get_or_create(repo=repo, url=mirror_url.rstrip('/').replace('repodata/repomd.xml', ''))
diff --git a/repos/views.py b/repos/views.py
index 199c834e..1f0c2bfa 100644
--- a/repos/views.py
+++ b/repos/views.py
@@ -15,24 +15,27 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.shortcuts import get_object_or_404, render, redirect
-from django.http import HttpResponse
-from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
-from django.urls import reverse
-from django.db.models import Q
from django.contrib import messages
+from django.contrib.auth.decorators import login_required
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db import IntegrityError
-
+from django.db.models import Q
+from django.http import HttpResponse
+from django.shortcuts import get_object_or_404, redirect, render
+from django.urls import reverse
from rest_framework import viewsets
-from util.filterspecs import Filter, FilterBar
+from arch.models import MachineArchitecture
from hosts.models import HostRepo
-from repos.models import Repository, Mirror, MirrorPackage
from operatingsystems.models import OSRelease
-from arch.models import MachineArchitecture
-from repos.forms import EditRepoForm, LinkRepoForm, CreateRepoForm, EditMirrorForm
-from repos.serializers import RepositorySerializer, MirrorSerializer, MirrorPackageSerializer
+from repos.forms import (
+ CreateRepoForm, EditMirrorForm, EditRepoForm, LinkRepoForm,
+)
+from repos.models import Mirror, MirrorPackage, Repository
+from repos.serializers import (
+ MirrorPackageSerializer, MirrorSerializer, RepositorySerializer,
+)
+from util.filterspecs import Filter, FilterBar
@login_required
diff --git a/sbin/patchman b/sbin/patchman
index 47d89b06..c415abec 100755
--- a/sbin/patchman
+++ b/sbin/patchman
@@ -17,32 +17,37 @@
# along with Patchman. If not, see
+import argparse
import os
import sys
-import argparse
+from django import setup as django_setup
from django.core.exceptions import MultipleObjectsReturned
from django.db.models import Count
-from django import setup as django_setup
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'patchman.settings')
from django.conf import settings # noqa
+
django_setup()
from arch.utils import clean_architectures
-from errata.utils import mark_errata_security_updates, enrich_errata, \
- scan_package_updates_for_affected_packages
from errata.tasks import update_errata
+from errata.utils import (
+ enrich_errata, mark_errata_security_updates,
+ scan_package_updates_for_affected_packages,
+)
from hosts.models import Host
from hosts.utils import clean_tags
from modules.utils import clean_modules
-from packages.utils import clean_packages, clean_packageupdates, clean_packagenames
-from repos.models import Repository
-from repos.utils import clean_repos
+from packages.utils import (
+ clean_packagenames, clean_packages, clean_packageupdates,
+)
from reports.models import Report
from reports.tasks import clean_reports_with_no_hosts
+from repos.models import Repository
+from repos.utils import clean_repos
from security.utils import update_cves, update_cwes
-from util import set_verbosity, get_datetime_now
+from util import get_datetime_now, set_verbosity
from util.logging import info_message
diff --git a/security/admin.py b/security/admin.py
index 196a9468..aedeaea9 100644
--- a/security/admin.py
+++ b/security/admin.py
@@ -15,8 +15,8 @@
# along with Patchman. If not, see
from django.contrib import admin
-from security.models import CWE, CVSS, CVE, Reference
+from security.models import CVE, CVSS, CWE, Reference
admin.site.register(CWE)
admin.site.register(CVSS)
diff --git a/security/models.py b/security/models.py
index 7f674a0b..0f848260 100644
--- a/security/models.py
+++ b/security/models.py
@@ -16,14 +16,14 @@
import json
import re
-from cvss import CVSS2, CVSS3, CVSS4
from time import sleep
+from cvss import CVSS2, CVSS3, CVSS4
from django.db import models
from django.urls import reverse
from security.managers import CVEManager
-from util import get_url, fetch_content, tz_aware_datetime, error_message
+from util import error_message, fetch_content, get_url, tz_aware_datetime
class Reference(models.Model):
diff --git a/security/tasks.py b/security/tasks.py
index ce60df83..7bff4149 100644
--- a/security/tasks.py
+++ b/security/tasks.py
@@ -15,7 +15,6 @@
# along with Patchman. If not, see
from celery import shared_task
-
from django.core.cache import cache
from security.models import CVE, CWE
diff --git a/security/views.py b/security/views.py
index 58a686b5..c9e606a6 100644
--- a/security/views.py
+++ b/security/views.py
@@ -14,17 +14,18 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.shortcuts import get_object_or_404, render
from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
+from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
-
+from django.shortcuts import get_object_or_404, render
from rest_framework import viewsets
-from packages.models import Package
from operatingsystems.models import OSRelease
+from packages.models import Package
from security.models import CVE, CWE, Reference
-from security.serializers import CVESerializer, CWESerializer, ReferenceSerializer
+from security.serializers import (
+ CVESerializer, CWESerializer, ReferenceSerializer,
+)
from util.filterspecs import Filter, FilterBar
diff --git a/setup.py b/setup.py
index 6ec6d974..8e18eaf9 100755
--- a/setup.py
+++ b/setup.py
@@ -17,7 +17,8 @@
# along with Patchman. If not, see
import os
-from setuptools import setup, find_packages
+
+from setuptools import find_packages, setup
with open('VERSION.txt', 'r', encoding='utf_8') as v:
version = v.readline().strip()
diff --git a/util/__init__.py b/util/__init__.py
index c3dfd6bd..c6c9aa0d 100644
--- a/util/__init__.py
+++ b/util/__init__.py
@@ -15,30 +15,35 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-import requests
import bz2
-import magic
-import zlib
import lzma
import os
+import zlib
+
+import magic
+import requests
+
try:
# python 3.14+ - can also remove the dependency at that stage
from compression import zstd
except ImportError:
import zstandard as zstd
+
from datetime import datetime, timezone
from enum import Enum
from hashlib import md5, sha1, sha256, sha512
-from requests.exceptions import HTTPError, Timeout, ConnectionError
-from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_exponential
from time import time
-from tqdm import tqdm
-from django.utils.timezone import make_aware
-from django.utils.dateparse import parse_datetime
from django.conf import settings
+from django.utils.dateparse import parse_datetime
+from django.utils.timezone import make_aware
+from requests.exceptions import ConnectionError, HTTPError, Timeout
+from tenacity import (
+ retry, retry_if_exception_type, stop_after_attempt, wait_exponential,
+)
+from tqdm import tqdm
-from util.logging import error_message, info_message, debug_message
+from util.logging import debug_message, error_message, info_message
pbar = None
verbose = None
diff --git a/util/filterspecs.py b/util/filterspecs.py
index 722b45df..eac0f747 100644
--- a/util/filterspecs.py
+++ b/util/filterspecs.py
@@ -15,10 +15,11 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
-from django.utils.safestring import mark_safe
-from django.db.models.query import QuerySet
from operator import itemgetter
+from django.db.models.query import QuerySet
+from django.utils.safestring import mark_safe
+
def get_query_string(qs):
new_qs = [f'{k}={v}' for k, v in list(qs.items())]
diff --git a/util/logging.py b/util/logging.py
index dd79d296..cb00ccce 100644
--- a/util/logging.py
+++ b/util/logging.py
@@ -14,12 +14,12 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see
+
from datetime import datetime
-from patchman.signals import info_message_s
-from patchman.signals import warning_message_s
-from patchman.signals import error_message_s
-from patchman.signals import debug_message_s
+from patchman.signals import (
+ debug_message_s, error_message_s, info_message_s, warning_message_s,
+)
def info_message(text):
diff --git a/util/tasks.py b/util/tasks.py
index f650e3e2..bd76bac6 100644
--- a/util/tasks.py
+++ b/util/tasks.py
@@ -18,7 +18,9 @@
from arch.utils import clean_architectures
from modules.utils import clean_modules
-from packages.utils import clean_packages, clean_packageupdates, clean_packagenames
+from packages.utils import (
+ clean_packagenames, clean_packages, clean_packageupdates,
+)
from repos.utils import clean_repos, remove_mirror_trailing_slashes
diff --git a/util/templatetags/common.py b/util/templatetags/common.py
index 2aea1e5e..674e1721 100644
--- a/util/templatetags/common.py
+++ b/util/templatetags/common.py
@@ -15,16 +15,15 @@
# along with Patchman. If not, see
import re
-
-from humanize import naturaltime
from datetime import datetime, timedelta
from urllib.parse import urlencode
+from django.core.paginator import Paginator
from django.template import Library
from django.template.loader import get_template
-from django.utils.html import format_html
from django.templatetags.static import static
-from django.core.paginator import Paginator
+from django.utils.html import format_html
+from humanize import naturaltime
from util import get_setting_of_type
diff --git a/util/views.py b/util/views.py
index b66db6b0..fd003bca 100644
--- a/util/views.py
+++ b/util/views.py
@@ -17,16 +17,16 @@
from datetime import datetime, timedelta
-from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.contrib.sites.models import Site
from django.db.models import F
+from django.shortcuts import render
from hosts.models import Host
-from operatingsystems.models import OSVariant, OSRelease
-from repos.models import Repository, Mirror
+from operatingsystems.models import OSRelease, OSVariant
from packages.models import Package
from reports.models import Report
+from repos.models import Mirror, Repository
from util import get_setting_of_type