Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-django-axes for 
openSUSE:Factory checked in at 2023-12-28 23:01:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-django-axes (Old)
 and      /work/SRC/openSUSE:Factory/.python-django-axes.new.28375 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-django-axes"

Thu Dec 28 23:01:12 2023 rev:6 rq:1135244 version:6.2.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-django-axes/python-django-axes.changes    
2023-12-03 20:49:37.603568816 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-django-axes.new.28375/python-django-axes.changes
 2023-12-28 23:02:51.361496270 +0100
@@ -1,0 +2,9 @@
+Wed Dec 27 09:32:48 UTC 2023 - Dirk Müller <dmuel...@suse.com>
+
+- update to 6.2.0:
+  * Update documentation.
+  * Add new management command ``axes_reset_ip_username``.
+  * Add French translations.
+  * Avoid running data migration on incorrect databases.
+
+-------------------------------------------------------------------

Old:
----
  django-axes-6.1.1.tar.gz

New:
----
  django-axes-6.2.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-django-axes.spec ++++++
--- /var/tmp/diff_new_pack.SWnj4o/_old  2023-12-28 23:02:51.921516737 +0100
+++ /var/tmp/diff_new_pack.SWnj4o/_new  2023-12-28 23:02:51.921516737 +0100
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-django-axes
-Version:        6.1.1
+Version:        6.2.0
 Release:        0
 License:        MIT
 Summary:        Keep track of failed login attempts in Django-powered sites

++++++ django-axes-6.1.1.tar.gz -> django-axes-6.2.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/.github/workflows/codeql.yml 
new/django-axes-6.2.0/.github/workflows/codeql.yml
--- old/django-axes-6.1.1/.github/workflows/codeql.yml  2023-09-01 
09:55:38.000000000 +0200
+++ new/django-axes-6.2.0/.github/workflows/codeql.yml  2023-12-08 
18:59:34.000000000 +0100
@@ -14,7 +14,7 @@
 
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       # Initializes the CodeQL tools for scanning.
       - name: Initialize CodeQL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/.github/workflows/release.yml 
new/django-axes-6.2.0/.github/workflows/release.yml
--- old/django-axes-6.1.1/.github/workflows/release.yml 2023-09-01 
09:55:38.000000000 +0200
+++ new/django-axes-6.2.0/.github/workflows/release.yml 2023-12-08 
18:59:34.000000000 +0100
@@ -14,12 +14,12 @@
     runs-on: ubuntu-latest
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           fetch-depth: 0
 
       - name: Set up Python
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: 3.8
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/.github/workflows/test.yml 
new/django-axes-6.2.0/.github/workflows/test.yml
--- old/django-axes-6.1.1/.github/workflows/test.yml    2023-09-01 
09:55:38.000000000 +0200
+++ new/django-axes-6.2.0/.github/workflows/test.yml    2023-12-08 
18:59:34.000000000 +0100
@@ -40,10 +40,10 @@
 
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v4
+      uses: actions/setup-python@v5
       with:
         python-version: ${{ matrix.python-version }}
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/CHANGES.rst 
new/django-axes-6.2.0/CHANGES.rst
--- old/django-axes-6.1.1/CHANGES.rst   2023-09-01 09:55:38.000000000 +0200
+++ new/django-axes-6.2.0/CHANGES.rst   2023-12-08 18:59:34.000000000 +0100
@@ -3,6 +3,19 @@
 =======
 
 
+6.2.0 (2023-12-08)
+------------------
+
+- Update documentation.
+  [funkybob]
+- Add new management command ``axes_reset_ip_username``.
+  [p-l-]
+- Add French translations.
+  [laulaz]
+- Avoid running data migration on incorrect databases.
+  [christianbundy]
+
+
 6.1.1 (2023-08-01)
 ------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/PKG-INFO 
new/django-axes-6.2.0/PKG-INFO
--- old/django-axes-6.1.1/PKG-INFO      2023-09-01 09:55:55.328319500 +0200
+++ new/django-axes-6.2.0/PKG-INFO      2023-12-08 18:59:48.553557400 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: django-axes
-Version: 6.1.1
+Version: 6.2.0
 Summary: Keep track of failed login attempts in Django-powered sites.
 Home-page: https://github.com/jazzband/django-axes
 Author: Josh VanderLinden, Philip Neustrom, Michael Blume, Alex Clark, Camilo 
Nova, Aleksi Hakli
@@ -35,8 +35,11 @@
 Classifier: Topic :: Security
 Classifier: Topic :: System :: Logging
 Requires-Python: >=3.7
-Provides-Extra: ipware
 License-File: LICENSE
+Requires-Dist: django>=3.2
+Requires-Dist: setuptools
+Provides-Extra: ipware
+Requires-Dist: django-ipware>=3; extra == "ipware"
 
 
 django-axes
@@ -127,6 +130,19 @@
 =======
 
 
+6.2.0 (2023-12-08)
+------------------
+
+- Update documentation.
+  [funkybob]
+- Add new management command ``axes_reset_ip_username``.
+  [p-l-]
+- Add French translations.
+  [laulaz]
+- Avoid running data migration on incorrect databases.
+  [christianbundy]
+
+
 6.1.1 (2023-08-01)
 ------------------
 
Binary files old/django-axes-6.1.1/axes/locale/fr/LC_MESSAGES/django.mo and 
new/django-axes-6.2.0/axes/locale/fr/LC_MESSAGES/django.mo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django-axes-6.1.1/axes/locale/fr/LC_MESSAGES/django.po 
new/django-axes-6.2.0/axes/locale/fr/LC_MESSAGES/django.po
--- old/django-axes-6.1.1/axes/locale/fr/LC_MESSAGES/django.po  1970-01-01 
01:00:00.000000000 +0100
+++ new/django-axes-6.2.0/axes/locale/fr/LC_MESSAGES/django.po  2023-12-08 
18:59:34.000000000 +0100
@@ -0,0 +1,109 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-11-06 05:21-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <l...@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: admin.py:27
+msgid "Form Data"
+msgstr "Données de formulaire"
+
+#: admin.py:28 admin.py:65 admin.py:100
+msgid "Meta Data"
+msgstr "Métadonnées"
+
+#: conf.py:108
+msgid "Account locked: too many login attempts. Please try again later."
+msgstr ""
+"Compte verrouillé: trop de tentatives de connexion. Veuillez réessayer plus 
"
+"tard."
+
+#: conf.py:116
+msgid ""
+"Account locked: too many login attempts. Contact an admin to unlock your "
+"account."
+msgstr ""
+"Compte verrouillé: trop de tentatives de connexion. Contactez un "
+"administrateur pour déverrouiller votre compte."
+
+#: models.py:6
+msgid "User Agent"
+msgstr "User Agent"
+
+#: models.py:8
+msgid "IP Address"
+msgstr "Adresse IP"
+
+#: models.py:10
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: models.py:12
+msgid "HTTP Accept"
+msgstr "HTTP Accept"
+
+#: models.py:14
+msgid "Path"
+msgstr "Chemin"
+
+#: models.py:16
+msgid "Attempt Time"
+msgstr "Date de la tentative"
+
+#: models.py:26
+msgid "Access lock out"
+msgstr "Verrouillage de l'accès"
+
+#: models.py:34
+msgid "access failure"
+msgstr "échec de connexion"
+
+#: models.py:35
+msgid "access failures"
+msgstr "échecs de connexion"
+
+#: models.py:39
+msgid "GET Data"
+msgstr "Données GET"
+
+#: models.py:41
+msgid "POST Data"
+msgstr "Données POST"
+
+#: models.py:43
+msgid "Failed Logins"
+msgstr "Nombre d'échecs"
+
+#: models.py:49
+msgid "access attempt"
+msgstr "tentative de connexion"
+
+#: models.py:50
+msgid "access attempts"
+msgstr "tentatives de connexion"
+
+#: models.py:55
+msgid "Logout Time"
+msgstr "Date de la déconnexion"
+
+#: models.py:61
+msgid "access log"
+msgstr "connexion"
+
+#: models.py:62
+msgid "access logs"
+msgstr "connexions"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django-axes-6.1.1/axes/management/commands/axes_reset_ip_username.py 
new/django-axes-6.2.0/axes/management/commands/axes_reset_ip_username.py
--- old/django-axes-6.1.1/axes/management/commands/axes_reset_ip_username.py    
1970-01-01 01:00:00.000000000 +0100
+++ new/django-axes-6.2.0/axes/management/commands/axes_reset_ip_username.py    
2023-12-08 18:59:34.000000000 +0100
@@ -0,0 +1,19 @@
+from django.core.management.base import BaseCommand
+
+from axes.utils import reset
+
+
+class Command(BaseCommand):
+    help = "Reset all access attempts and lockouts for a given IP address and 
username"
+
+    def add_arguments(self, parser):
+        parser.add_argument("ip", type=str)
+        parser.add_argument("username", type=str)
+
+    def handle(self, *args, **options):
+        count = reset(ip=options["ip"], username=options["username"])
+
+        if count:
+            self.stdout.write(f"{count} attempts removed.")
+        else:
+            self.stdout.write("No attempts found.")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/django-axes-6.1.1/axes/migrations/0007_alter_accessattempt_unique_together.py
 
new/django-axes-6.2.0/axes/migrations/0007_alter_accessattempt_unique_together.py
--- 
old/django-axes-6.1.1/axes/migrations/0007_alter_accessattempt_unique_together.py
   2023-09-01 09:55:38.000000000 +0200
+++ 
new/django-axes-6.2.0/axes/migrations/0007_alter_accessattempt_unique_together.py
   2023-12-08 18:59:34.000000000 +0100
@@ -1,12 +1,16 @@
 # Generated by Django 3.2.7 on 2021-09-13 15:16
 
-from django.db import migrations
+from django.db import migrations, router
 from django.db.models import Count
 
 
 def deduplicate_attempts(apps, schema_editor):
     AccessAttempt = apps.get_model("axes", "AccessAttempt")
     db_alias = schema_editor.connection.alias
+
+    if db_alias != router.db_for_write(AccessAttempt):
+        return
+
     duplicated_attempts = (
         AccessAttempt.objects.using(db_alias)
         .values("username", "user_agent", "ip_address")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/django_axes.egg-info/PKG-INFO 
new/django-axes-6.2.0/django_axes.egg-info/PKG-INFO
--- old/django-axes-6.1.1/django_axes.egg-info/PKG-INFO 2023-09-01 
09:55:55.000000000 +0200
+++ new/django-axes-6.2.0/django_axes.egg-info/PKG-INFO 2023-12-08 
18:59:48.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: django-axes
-Version: 6.1.1
+Version: 6.2.0
 Summary: Keep track of failed login attempts in Django-powered sites.
 Home-page: https://github.com/jazzband/django-axes
 Author: Josh VanderLinden, Philip Neustrom, Michael Blume, Alex Clark, Camilo 
Nova, Aleksi Hakli
@@ -35,8 +35,11 @@
 Classifier: Topic :: Security
 Classifier: Topic :: System :: Logging
 Requires-Python: >=3.7
-Provides-Extra: ipware
 License-File: LICENSE
+Requires-Dist: django>=3.2
+Requires-Dist: setuptools
+Provides-Extra: ipware
+Requires-Dist: django-ipware>=3; extra == "ipware"
 
 
 django-axes
@@ -127,6 +130,19 @@
 =======
 
 
+6.2.0 (2023-12-08)
+------------------
+
+- Update documentation.
+  [funkybob]
+- Add new management command ``axes_reset_ip_username``.
+  [p-l-]
+- Add French translations.
+  [laulaz]
+- Avoid running data migration on incorrect databases.
+  [christianbundy]
+
+
 6.1.1 (2023-08-01)
 ------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/django_axes.egg-info/SOURCES.txt 
new/django-axes-6.2.0/django_axes.egg-info/SOURCES.txt
--- old/django-axes-6.1.1/django_axes.egg-info/SOURCES.txt      2023-09-01 
09:55:55.000000000 +0200
+++ new/django-axes-6.2.0/django_axes.egg-info/SOURCES.txt      2023-12-08 
18:59:48.000000000 +0100
@@ -47,6 +47,8 @@
 axes/locale/ar/LC_MESSAGES/django.po
 axes/locale/de/LC_MESSAGES/django.mo
 axes/locale/de/LC_MESSAGES/django.po
+axes/locale/fr/LC_MESSAGES/django.mo
+axes/locale/fr/LC_MESSAGES/django.po
 axes/locale/id/LC_MESSAGES/django.mo
 axes/locale/id/LC_MESSAGES/django.po
 axes/locale/pl/LC_MESSAGES/django.mo
@@ -61,6 +63,7 @@
 axes/management/commands/axes_reset.py
 axes/management/commands/axes_reset_failure_logs.py
 axes/management/commands/axes_reset_ip.py
+axes/management/commands/axes_reset_ip_username.py
 axes/management/commands/axes_reset_logs.py
 axes/management/commands/axes_reset_username.py
 axes/migrations/0001_initial.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/docs/2_installation.rst 
new/django-axes-6.2.0/docs/2_installation.rst
--- old/django-axes-6.1.1/docs/2_installation.rst       2023-09-01 
09:55:38.000000000 +0200
+++ new/django-axes-6.2.0/docs/2_installation.rst       2023-12-08 
18:59:34.000000000 +0100
@@ -34,10 +34,10 @@
         'django.contrib.auth.backends.ModelBackend',
     ]
 
-    For backwards compatibility, ``AxesBackend`` can be used in place of 
``AxesStandaloneBackend``.
-    The only difference is that ``AxesBackend`` also provides the 
permissions-checking functionality
-    of Django's ``ModelBackend`` behind the scenes. We recommend using 
``AxesStandaloneBackend``
-    if you have any custom logic to override Django's standard permissions 
checks.
+For backwards compatibility, ``AxesBackend`` can be used in place of 
``AxesStandaloneBackend``.
+The only difference is that ``AxesBackend`` also provides the 
permissions-checking functionality
+of Django's ``ModelBackend`` behind the scenes. We recommend using 
``AxesStandaloneBackend``
+if you have any custom logic to override Django's standard permissions checks.
 
 **3.** Add ``axes.middleware.AxesMiddleware`` to your list of ``MIDDLEWARE``::
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/docs/3_usage.rst 
new/django-axes-6.2.0/docs/3_usage.rst
--- old/django-axes-6.1.1/docs/3_usage.rst      2023-09-01 09:55:38.000000000 
+0200
+++ new/django-axes-6.2.0/docs/3_usage.rst      2023-12-08 18:59:34.000000000 
+0100
@@ -80,7 +80,7 @@
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Axes offers a command line interface with
-``axes_reset``, ``axes_reset_ip``, and ``axes_reset_username``
+``axes_reset``, ``axes_reset_ip``, ``axes_reset_username``, and 
``axes_reset_ip_username``
 management commands with the Django ``manage.py`` or ``django-admin`` command 
helpers:
 
 - ``python manage.py axes_reset``
@@ -89,6 +89,8 @@
   will clear lockouts and records for the given IP addresses.
 - ``python manage.py axes_reset_username [username ...]``
   will clear lockouts and records for the given usernames.
+- ``python manage.py axes_reset_ip_username [ip] [username]``
+  will clear lockouts and records for the given IP address and username.
 - ``python manage.py axes_reset_logs (age)``
   will reset (i.e. delete) AccessLog records that are older
   than the given age where the default is 30 days.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/requirements-qa.txt 
new/django-axes-6.2.0/requirements-qa.txt
--- old/django-axes-6.1.1/requirements-qa.txt   2023-09-01 09:55:38.000000000 
+0200
+++ new/django-axes-6.2.0/requirements-qa.txt   2023-12-08 18:59:34.000000000 
+0100
@@ -1,4 +1,4 @@
-black==23.7.0
-mypy==1.5.1
-prospector==1.10.2
+black==23.11.0
+mypy==1.7.1
+prospector==1.10.3
 types-pkg_resources  # Type stub
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/requirements-test.txt 
new/django-axes-6.2.0/requirements-test.txt
--- old/django-axes-6.1.1/requirements-test.txt 2023-09-01 09:55:38.000000000 
+0200
+++ new/django-axes-6.2.0/requirements-test.txt 2023-12-08 18:59:34.000000000 
+0100
@@ -1,7 +1,7 @@
 -e .
 django-ipware>=3
-coverage==7.3.0
-pytest==7.4.0
+coverage==7.3.2
+pytest==7.4.3
 pytest-cov==4.1.0
-pytest-django==4.5.2
+pytest-django==4.7.0
 pytest-subtests==0.11.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/requirements.txt 
new/django-axes-6.2.0/requirements.txt
--- old/django-axes-6.1.1/requirements.txt      2023-09-01 09:55:38.000000000 
+0200
+++ new/django-axes-6.2.0/requirements.txt      2023-12-08 18:59:34.000000000 
+0100
@@ -1,5 +1,5 @@
 -e .
 -r requirements-qa.txt
 -r requirements-test.txt
-sphinx_rtd_theme==1.3.0
-tox==4.11.0
+sphinx_rtd_theme==2.0.0
+tox==4.11.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/django-axes-6.1.1/tests/test_management.py 
new/django-axes-6.2.0/tests/test_management.py
--- old/django-axes-6.1.1/tests/test_management.py      2023-09-01 
09:55:38.000000000 +0200
+++ new/django-axes-6.2.0/tests/test_management.py      2023-12-08 
18:59:34.000000000 +0100
@@ -56,18 +56,22 @@
             username="john.doe", ip_address="10.0.0.2", 
failures_since_start="15"
         )
 
+        AccessAttempt.objects.create(
+            username="richard.doe", ip_address="10.0.0.4", 
failures_since_start="12"
+        )
+
     def test_axes_list_attempts(self):
         out = StringIO()
         call_command("axes_list_attempts", stdout=out)
 
-        expected = "10.0.0.1\tjane.doe\t4\n10.0.0.2\tjohn.doe\t15\n"
+        expected = 
"10.0.0.1\tjane.doe\t4\n10.0.0.2\tjohn.doe\t15\n10.0.0.4\trichard.doe\t12\n"
         self.assertEqual(expected, out.getvalue())
 
     def test_axes_reset(self):
         out = StringIO()
         call_command("axes_reset", stdout=out)
 
-        expected = "2 attempts removed.\n"
+        expected = "3 attempts removed.\n"
         self.assertEqual(expected, out.getvalue())
 
     def test_axes_reset_not_found(self):
@@ -86,6 +90,13 @@
 
         expected = "1 attempts removed.\n"
         self.assertEqual(expected, out.getvalue())
+
+    def test_axes_reset_ip_username(self):
+        out = StringIO()
+        call_command("axes_reset_ip_username", "10.0.0.4", "richard.doe", 
stdout=out)
+
+        expected = "1 attempts removed.\n"
+        self.assertEqual(expected, out.getvalue())
 
     def test_axes_reset_ip_not_found(self):
         out = StringIO()

Reply via email to