Skip to content

Commit 3f30eb9

Browse files
committed
Merge branch 'master' into master
2 parents c766ab1 + 0c98c56 commit 3f30eb9

File tree

15 files changed

+270
-26
lines changed

15 files changed

+270
-26
lines changed

.github/workflows/build.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
max-parallel: 4
1111
matrix:
1212
python-version: [3.5, 3.6, 3.7, 3.8, 3.9, '3.10']
13-
django-version: [2.2, 2.2.8, 3.0, 3.1, 3.2]
13+
django-version: [2.2, 2.2.8, 3.0, 3.1, 3.2, 4.0]
1414
exclude:
1515
- python-version: 3.5
1616
django-version: 2.2.8
@@ -20,6 +20,12 @@ jobs:
2020
django-version: 3.1
2121
- python-version: 3.5
2222
django-version: 3.2
23+
- python-version: 3.5
24+
django-version: 4.0
25+
- python-version: 3.6
26+
django-version: 4.0
27+
- python-version: 3.7
28+
django-version: 4.0
2329
- python-version: 3.8
2430
django-version: 2.2
2531
- python-version: 3.10

.travis.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ env:
1515
- DJANGO="django>=3.0,<3.1"
1616
- DJANGO="django>=3.1,<3.2"
1717
- DJANGO="django>=3.2,<3.3"
18+
- DJANGO="django>=4.0,<5.0"
1819

1920
install:
2021
- pip install ${DJANGO}
@@ -40,3 +41,9 @@ matrix:
4041
env: DJANGO="django>=2.1,<2.2"
4142
- python: "3.8"
4243
env: DJANGO="django>=2.2,<2.2.8"
44+
- python: "3.5"
45+
env: DJANGO="django>=4.0,<5.0"
46+
- python: "3.6"
47+
env: DJANGO="django>=4.0,<5.0"
48+
- python: "3.7"
49+
env: DJANGO="django>=4.0,<5.0"

easyaudit/admin_helpers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
except: # Django < 2.0
99
from django.core.urlresolvers import reverse
1010

11-
from django.http import HttpResponseRedirect, HttpResponse
11+
from django.urls import re_path
12+
from django.http import HttpResponseRedirect
1213
from django.utils.translation import gettext_lazy as _
1314
from django.contrib import messages
14-
from django.conf.urls import url
1515
from django.utils.safestring import mark_safe
1616
from django.utils.html import escape
1717
from . import settings
@@ -76,7 +76,7 @@ def get_urls(self):
7676
info = self.model._meta.app_label, self.model._meta.model_name
7777
urls = super(EasyAuditModelAdmin, self).get_urls()
7878
my_urls = [
79-
url(r'^purge/$', self.admin_site.admin_view(self.purge), {}, name="%s_%s_purge" % info),
79+
re_path(r'^purge/$', self.admin_site.admin_view(self.purge), {}, name="%s_%s_purge" % info),
8080
]
8181
return my_urls + urls
8282

easyaudit/apps.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
class EasyAuditConfig(AppConfig):
44
name = 'easyaudit'
55
verbose_name = 'Easy Audit Application'
6+
default_auto_field = 'django.db.models.AutoField'
67

78
def ready(self):
89
from easyaudit.signals import auth_signals, model_signals, request_signals
2.87 KB
Binary file not shown.
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
# SOME DESCRIPTIVE TITLE.
2+
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3+
# This file is distributed under the same license as the PACKAGE package.
4+
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5+
#
6+
msgid ""
7+
msgstr ""
8+
"Project-Id-Version: \n"
9+
"Report-Msgid-Bugs-To: \n"
10+
"POT-Creation-Date: 2020-09-28 18:11+0600\n"
11+
"PO-Revision-Date: 2022-03-09 20:43+0100\n"
12+
"Last-Translator: Thierry BOULOGNE <[email protected]>\n"
13+
"Language-Team: FR\n"
14+
"Language: ru\n"
15+
"MIME-Version: 1.0\n"
16+
"Content-Type: text/plain; charset=UTF-8\n"
17+
"Content-Transfer-Encoding: 8bit\n"
18+
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19+
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
20+
"%100>=11 && n%100<=14)? 2 : 3);\n"
21+
"X-Generator: Poedit 3.0.1\n"
22+
23+
#: admin_helpers.py:122
24+
#, python-format
25+
msgid "Successfully removed %d rows"
26+
msgstr "%d lignes supprimées avec succès"
27+
28+
#: admin_helpers.py:124
29+
msgid "ERROR"
30+
msgstr "Erreur"
31+
32+
#: admin_helpers.py:126
33+
msgid "Action cancelled by user"
34+
msgstr "Action annulée par l'utilisateur"
35+
36+
#: admin_helpers.py:130
37+
#, python-format
38+
msgid "Purge all %s ... are you sure?"
39+
msgstr "Nettoyer tous les %s ... Certain ?"
40+
41+
#: models.py:15
42+
msgid "Create"
43+
msgstr "Сréer"
44+
45+
#: models.py:16
46+
msgid "Update"
47+
msgstr "Modifier"
48+
49+
#: models.py:17
50+
msgid "Delete"
51+
msgstr "Supprimer"
52+
53+
#: models.py:18
54+
msgid "Many-to-Many Change"
55+
msgstr "Changement plusieur-à-plusieur"
56+
57+
#: models.py:19
58+
msgid "Reverse Many-to-Many Change"
59+
msgstr "Annuler le changement plusieur-à-plusieur"
60+
61+
#: models.py:22 models.py:60
62+
msgid "Event type"
63+
msgstr "Type évènement"
64+
65+
#: models.py:23
66+
msgid "Object ID"
67+
msgstr "ID de l'object"
68+
69+
#: models.py:24
70+
msgid "Content type"
71+
msgstr "Type Contenu"
72+
73+
#: models.py:25
74+
msgid "Object representation"
75+
msgstr "Représentation de l'object"
76+
77+
#: models.py:26
78+
msgid "Object JSON representation"
79+
msgstr "Représentation de l'objet JSON"
80+
81+
#: models.py:27
82+
msgid "Changed fields"
83+
msgstr "Champs modifiés"
84+
85+
#: models.py:30 models.py:64 models.py:80
86+
msgid "User"
87+
msgstr "Utilisateur"
88+
89+
#: models.py:32
90+
msgid "String version of the user pk"
91+
msgstr "Version chaine du pk utilisateur"
92+
93+
#: models.py:32
94+
msgid "User PK as string"
95+
msgstr "PK utilisateur en tant que chaine"
96+
97+
#: models.py:33 models.py:66 models.py:82
98+
msgid "Date time"
99+
msgstr "Horodatage"
100+
101+
#: models.py:45
102+
msgid "CRUD event"
103+
msgstr "Evènement CRUD"
104+
105+
#: models.py:46
106+
msgid "CRUD events"
107+
msgstr "Evènements CRUD"
108+
109+
#: models.py:56
110+
msgid "Login"
111+
msgstr "Connexion"
112+
113+
#: models.py:57
114+
msgid "Logout"
115+
msgstr "Déconnexion"
116+
117+
#: models.py:58
118+
msgid "Failed login"
119+
msgstr "Connexion échouée"
120+
121+
#: models.py:61
122+
msgid "Username"
123+
msgstr "Nom d'utilisateur"
124+
125+
#: models.py:65 models.py:81
126+
msgid "Remote IP"
127+
msgstr "IP distante"
128+
129+
#: models.py:69
130+
msgid "login event"
131+
msgstr "Evènement de connexion"
132+
133+
#: models.py:70
134+
msgid "login events"
135+
msgstr "Evènements de connexion"
136+
137+
#: models.py:75
138+
msgid "URL"
139+
msgstr "URL"
140+
141+
#: models.py:76
142+
msgid "Method"
143+
msgstr "Méthode"
144+
145+
#: models.py:77
146+
msgid "Query string"
147+
msgstr "Requêtes"
148+
149+
#: models.py:85
150+
msgid "request event"
151+
msgstr "Evènement Requête"
152+
153+
#: models.py:86
154+
msgid "request events"
155+
msgstr "Evènements Requête"
156+
157+
#: templates/admin/easyaudit/change_list.html:10
158+
#, python-format
159+
msgid "Purge %(name)s"
160+
msgstr "Vider %(name)s"
161+
162+
#: templates/admin/easyaudit/purge_confirmation.html:7
163+
msgid "Home"
164+
msgstr "Accueil"
165+
166+
#: templates/admin/easyaudit/purge_confirmation.html:10
167+
msgid "Purge"
168+
msgstr "Vider"
169+
170+
#: templates/admin/easyaudit/purge_confirmation.html:19
171+
msgid "Please confirm deletion"
172+
msgstr "Merci de confirmer la suppression"
173+
174+
#: templates/admin/easyaudit/purge_confirmation.html:20
175+
msgid ""
176+
"This operation is destructive, cannot be undone and may require some "
177+
"minutes."
178+
msgstr "Cette opération est irrémédiable et demandera quelques minutes."
179+
180+
#: templates/admin/easyaudit/purge_confirmation.html:21
181+
msgid "Are you sure you want to permanently remove all objects ?"
182+
msgstr "Voulez-vous supprimer définitivement tous les objects"
183+
184+
#: templates/admin/easyaudit/purge_confirmation.html:25
185+
msgid "Yes, I\'m sure"
186+
msgstr "Oui j'en suis sûre"
187+
188+
#: templates/admin/easyaudit/purge_confirmation.html:26
189+
msgid "Cancel"
190+
msgstr "Annuler"
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.2.11 on 2022-01-10 16:04
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('easyaudit', '0015_auto_20201019_1217'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='crudevent',
15+
name='event_type',
16+
field=models.SmallIntegerField(choices=[(1, 'Create'), (2, 'Update'), (3, 'Delete'), (4, 'Many-to-Many Change'), (5, 'Reverse Many-to-Many Change'), (6, 'Many-to-Many Add'), (7, 'Reverse Many-to-Many Add'), (8, 'Many-to-Many Remove'), (9, 'Reverse Many-to-Many Remove'), (10, 'Many-to-Many Clear'), (11, 'Reverse Many-to-Many Clear')], verbose_name='Event type'),
17+
),
18+
]

easyaudit/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ class CRUDEvent(models.Model):
1414
M2M_ADD_REV = 7
1515
M2M_REMOVE = 8
1616
M2M_REMOVE_REV = 9
17+
M2M_CLEAR = 10
18+
M2M_CLEAR_REV = 11
1719

1820
TYPES = (
1921
(CREATE, _('Create')),
@@ -25,6 +27,8 @@ class CRUDEvent(models.Model):
2527
(M2M_ADD_REV, _('Reverse Many-to-Many Add')),
2628
(M2M_REMOVE, _('Many-to-Many Remove')),
2729
(M2M_REMOVE_REV, _('Reverse Many-to-Many Remove')),
30+
(M2M_CLEAR, _('Many-to-Many Clear')),
31+
(M2M_CLEAR_REV, _('Reverse Many-to-Many Clear')),
2832
)
2933

3034
event_type = models.SmallIntegerField(choices=TYPES, verbose_name=_('Event type'))

easyaudit/signals/model_signals.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from django.db import transaction
1111
from django.db.models import signals
1212
from django.utils import timezone
13-
from django.utils.encoding import force_text
13+
from django.utils.encoding import force_str
1414
from django.utils.module_loading import import_string
1515

1616
from easyaudit.middleware.easyaudit import get_current_request, \
@@ -225,6 +225,8 @@ def m2m_changed(sender, instance, action, reverse, model, pk_set, using, **kwarg
225225
event_type = CRUDEvent.M2M_ADD_REV
226226
elif action == 'post_remove':
227227
event_type = CRUDEvent.M2M_REMOVE_REV
228+
elif action == 'post_clear':
229+
event_type = CRUDEvent.M2M_CLEAR_REV
228230
else:
229231
event_type = CRUDEvent.M2M_CHANGE_REV # just in case
230232

@@ -236,7 +238,7 @@ def m2m_changed(sender, instance, action, reverse, model, pk_set, using, **kwarg
236238
related_instances = getattr(instance, m2m_rev_field).all()
237239
related_ids = [r.pk for r in related_instances]
238240

239-
tmp_repr[0]['m2m_rev_model'] = force_text(model._meta)
241+
tmp_repr[0]['m2m_rev_model'] = force_str(model._meta)
240242
tmp_repr[0]['m2m_rev_pks'] = related_ids
241243
tmp_repr[0]['m2m_rev_action'] = action
242244
object_json_repr = json.dumps(tmp_repr)
@@ -245,6 +247,8 @@ def m2m_changed(sender, instance, action, reverse, model, pk_set, using, **kwarg
245247
event_type = CRUDEvent.M2M_ADD
246248
elif action == 'post_remove':
247249
event_type = CRUDEvent.M2M_REMOVE
250+
elif action == 'post_clear':
251+
event_type = CRUDEvent.M2M_CLEAR
248252
else:
249253
event_type = CRUDEvent.M2M_CHANGE # just in case
250254

@@ -262,7 +266,10 @@ def m2m_changed(sender, instance, action, reverse, model, pk_set, using, **kwarg
262266

263267
def crud_flow():
264268
try:
265-
changed_fields = json.dumps({get_m2m_field_name(model, instance): list(pk_set)}, cls=DjangoJSONEncoder)
269+
if action == "post_clear":
270+
changed_fields = []
271+
else:
272+
changed_fields = json.dumps({get_m2m_field_name(model, instance): list(pk_set)}, cls=DjangoJSONEncoder)
266273
with transaction.atomic(using=DATABASE_ALIAS):
267274
crud_event = audit_logger.crud({
268275
'event_type': event_type,

easyaudit/signals/request_signals.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def request_started_handler(sender, **kwargs):
4141
if environ:
4242
path = environ["PATH_INFO"]
4343
cookie_string = environ.get('HTTP_COOKIE')
44-
remote_ip = environ[REMOTE_ADDR_HEADER]
44+
remote_ip = environ.get(REMOTE_ADDR_HEADER, None)
4545
method = environ['REQUEST_METHOD']
4646
query_string = environ["QUERY_STRING"]
4747

0 commit comments

Comments
 (0)