|
24 | 24 | registered_models = {}
|
25 | 25 |
|
26 | 26 |
|
| 27 | +def default_get_user(request, **kwargs): |
| 28 | + try: |
| 29 | + return request.user |
| 30 | + except AttributeError: |
| 31 | + return None |
| 32 | + |
| 33 | + |
27 | 34 | class HistoricalRecords(object):
|
28 | 35 | thread = threading.local()
|
29 | 36 |
|
30 | 37 | def __init__(self, verbose_name=None, bases=(models.Model,),
|
31 | 38 | user_related_name='+', table_name=None, inherit=False,
|
32 |
| - excluded_fields=None, |
33 |
| - history_id_field=None, |
34 |
| - history_change_reason_field=None): |
| 39 | + excluded_fields=None, history_id_field=None, |
| 40 | + history_change_reason_field=None, |
| 41 | + user_model=None, get_user=default_get_user): |
35 | 42 | self.user_set_verbose_name = verbose_name
|
36 | 43 | self.user_related_name = user_related_name
|
37 | 44 | self.table_name = table_name
|
38 | 45 | self.inherit = inherit
|
39 | 46 | self.history_id_field = history_id_field
|
40 | 47 | self.history_change_reason_field = history_change_reason_field
|
| 48 | + self.user_model = user_model |
| 49 | + self.get_user = get_user |
41 | 50 | if excluded_fields is None:
|
42 | 51 | excluded_fields = []
|
43 | 52 | self.excluded_fields = excluded_fields
|
@@ -74,15 +83,11 @@ def save_without_historical_record(self, *args, **kwargs):
|
74 | 83 |
|
75 | 84 | def finalize(self, sender, **kwargs):
|
76 | 85 | inherited = False
|
77 |
| - try: |
78 |
| - hint_class = self.cls |
79 |
| - except AttributeError: # called via `register` |
80 |
| - pass |
81 |
| - else: |
82 |
| - if hint_class is not sender: # set in concrete |
83 |
| - inherited = (self.inherit and issubclass(sender, hint_class)) |
84 |
| - if not inherited: |
85 |
| - return # set in abstract |
| 86 | + if self.cls is not sender: # set in concrete |
| 87 | + inherited = (self.inherit and issubclass(sender, self.cls)) |
| 88 | + if not inherited: |
| 89 | + return # set in abstract |
| 90 | + |
86 | 91 | if hasattr(sender._meta, 'simple_history_manager_attribute'):
|
87 | 92 | raise exceptions.MultipleRegistrationsError(
|
88 | 93 | '{}.{} registered multiple times for history tracking.'.format(
|
@@ -207,7 +212,9 @@ def copy_fields(self, model):
|
207 | 212 | def get_extra_fields(self, model, fields):
|
208 | 213 | """Return dict of extra fields added to the historical record model"""
|
209 | 214 |
|
210 |
| - user_model = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') |
| 215 | + user_model = self.user_model or getattr( |
| 216 | + settings, 'AUTH_USER_MODEL', 'auth.User' |
| 217 | + ) |
211 | 218 |
|
212 | 219 | def revert_url(self):
|
213 | 220 | """URL for this change in the default admin site."""
|
@@ -349,12 +356,14 @@ def get_history_user(self, instance):
|
349 | 356 | try:
|
350 | 357 | return instance._history_user
|
351 | 358 | except AttributeError:
|
| 359 | + request = None |
352 | 360 | try:
|
353 | 361 | if self.thread.request.user.is_authenticated:
|
354 |
| - return self.thread.request.user |
355 |
| - return None |
| 362 | + request = self.thread.request |
356 | 363 | except AttributeError:
|
357 |
| - return None |
| 364 | + pass |
| 365 | + |
| 366 | + return self.get_user(instance=instance, request=request) |
358 | 367 |
|
359 | 368 |
|
360 | 369 | def transform_field(field):
|
|
0 commit comments