|
| 1 | +import operator |
| 2 | +import re |
| 3 | +from functools import reduce |
| 4 | + |
| 5 | +import django |
1 | 6 | from django.contrib import admin, messages
|
2 | 7 | from django.contrib.admin import helpers
|
3 | 8 | from django.core.checks import Error
|
4 | 9 | from django.core.exceptions import ImproperlyConfigured, ValidationError
|
5 | 10 | from django.db.models import Q
|
6 |
| -from django.forms.formsets import INITIAL_FORM_COUNT, MAX_NUM_FORM_COUNT, TOTAL_FORM_COUNT, ManagementForm |
| 11 | +from django.forms.formsets import (INITIAL_FORM_COUNT, MAX_NUM_FORM_COUNT, |
| 12 | + TOTAL_FORM_COUNT, ManagementForm,) |
7 | 13 | from django.forms.models import BaseModelFormSet
|
8 | 14 | from django.http import HttpResponse, HttpResponseRedirect
|
9 | 15 | from django.utils.encoding import force_str
|
10 | 16 | from django.utils.safestring import mark_safe
|
11 | 17 | from django.utils.translation import ngettext
|
12 | 18 |
|
13 |
| -import operator |
14 |
| -import re |
15 |
| -from functools import reduce |
16 |
| - |
17 | 19 | from concurrency import core, forms
|
18 | 20 | from concurrency.api import get_revision_of_object
|
| 21 | +from concurrency.compat import concurrency_param_name |
19 | 22 | from concurrency.config import CONCURRENCY_LIST_EDITABLE_POLICY_ABORT_ALL, conf
|
20 | 23 | from concurrency.exceptions import RecordModifiedError
|
21 | 24 | from concurrency.forms import ConcurrentForm, VersionWidget
|
@@ -132,12 +135,27 @@ def __init__(self, *args, **kwargs):
|
132 | 135 | self._versions = kwargs.pop('versions', [])
|
133 | 136 | super().__init__(*args, **kwargs)
|
134 | 137 |
|
135 |
| - def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row): |
136 |
| - ret = super()._html_output(normal_row, error_row, row_ender, help_text_html, errors_on_separate_row) |
| 138 | + def _get_concurrency_fields(self): |
137 | 139 | v = []
|
138 | 140 | for pk, version in self._versions:
|
139 |
| - v.append('<input type="hidden" name="_concurrency_version_{0}" value="{1}">'.format(pk, version)) |
140 |
| - return mark_safe("{0}{1}".format(ret, "".join(v))) |
| 141 | + v.append(f'<input type="hidden" name="{concurrency_param_name}_{pk}" value="{version}">') |
| 142 | + return mark_safe("".join(v)) |
| 143 | + |
| 144 | + def render(self, template_name=None, context=None, renderer=None): |
| 145 | + out = super().render(template_name, context, renderer) |
| 146 | + return out + self._get_concurrency_fields() |
| 147 | + |
| 148 | + def __str__(self): |
| 149 | + if django.VERSION[:2] >= (4, 0): |
| 150 | + return self.render() |
| 151 | + else: |
| 152 | + return super().__str__() |
| 153 | + |
| 154 | + __html__ = __str__ |
| 155 | + |
| 156 | + def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row): |
| 157 | + ret = super()._html_output(normal_row, error_row, row_ender, help_text_html, errors_on_separate_row) |
| 158 | + return mark_safe("{0}{1}".format(ret, self._get_concurrency_fields())) |
141 | 159 |
|
142 | 160 |
|
143 | 161 | class ConcurrentBaseModelFormSet(BaseModelFormSet):
|
@@ -183,7 +201,7 @@ def _get_conflicts(self, request):
|
183 | 201 | def save_model(self, request, obj, form, change):
|
184 | 202 | try:
|
185 | 203 | if change:
|
186 |
| - version = request.POST.get('_concurrency_version_{0.pk}'.format(obj), None) |
| 204 | + version = request.POST.get(f'{concurrency_param_name}_{obj.pk}', None) |
187 | 205 | if version:
|
188 | 206 | core._set_version(obj, version)
|
189 | 207 | super().save_model(request, obj, form, change)
|
|
0 commit comments