diff --git a/axes/migrations/0008_accessfailurelog.py b/axes/migrations/0008_accessfailurelog.py new file mode 100644 index 0000000..c7956f4 --- /dev/null +++ b/axes/migrations/0008_accessfailurelog.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.12 on 2022-03-15 03:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('axes', '0007_alter_accessattempt_unique_together'), + ] + + operations = [ + migrations.CreateModel( + name='AccessFailureLog', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('user_agent', models.CharField(db_index=True, max_length=255, verbose_name='User Agent')), + ('ip_address', models.GenericIPAddressField(db_index=True, null=True, verbose_name='IP Address')), + ('username', models.CharField(db_index=True, max_length=255, null=True, verbose_name='Username')), + ('http_accept', models.CharField(max_length=1025, verbose_name='HTTP Accept')), + ('path_info', models.CharField(max_length=255, verbose_name='Path')), + ('attempt_time', models.DateTimeField(auto_now_add=True, verbose_name='Attempt Time')), + ('locked_out', models.BooleanField(blank=True, default=False, verbose_name='Access lock out')), + ], + options={ + 'verbose_name': 'access failure', + 'verbose_name_plural': 'access failures', + }, + ), + ] diff --git a/axes/models.py b/axes/models.py index 14f13a2..58e5dbd 100644 --- a/axes/models.py +++ b/axes/models.py @@ -21,6 +21,18 @@ class AccessBase(models.Model): ordering = ["-attempt_time"] +class AccessFailureLog(AccessBase): + locked_out = models.BooleanField(_("Access lock out"), null=False, blank=True, default=False) + + def __str__(self): + locked_out_str = ' locked out' if self.locked_out else '' + return f"Failed access: user {self.username}{locked_out_str} on {self.attempt_time} from {self.ip_address}" + + class Meta: + verbose_name = _("access failure") + verbose_name_plural = _("access failures") + + class AccessAttempt(AccessBase): get_data = models.TextField(_("GET Data"))