fix: использование абсолютных URL для вложений в заявлениях

- Добавлен templatetag absolute_url для преобразования относительных путей
- Обновлены все шаблоны заявлений: request_list_full, request_detail, request_process
- Теперь все ссылки на вложения используют {% absolute_url %} для полных URL
- Добавлен use_url=True для attachment_url в сериализаторе API
- Исправлена проблема с локальными URL вместо доменных
This commit is contained in:
admin i 2025-12-05 14:25:55 +03:00
parent 1b329936bb
commit 9e0e5fa01a
5 changed files with 31 additions and 4 deletions

View File

@ -74,7 +74,7 @@ class RequestReadSerializer(serializers.ModelSerializer):
is_final = serializers.BooleanField(read_only=True)
# URL для вложенного файла (аналогично file_url в DocumentReadSerializer)
attachment_url = serializers.FileField(source="attachment", read_only=True)
attachment_url = serializers.FileField(source="attachment", read_only=True, use_url=True)
# Новые поля для получателей
departments = serializers.PrimaryKeyRelatedField(

View File

@ -4,6 +4,33 @@ from datetime import datetime
register = template.Library()
@register.simple_tag(takes_context=True)
def absolute_url(context, relative_url):
"""
Преобразует относительный URL в абсолютный с доменом.
Args:
context: контекст шаблона (автоматически передаётся)
relative_url: относительный путь (например, /media/file.pdf)
Returns:
Полный URL с доменом (например, https://domain.com/media/file.pdf)
"""
if not relative_url:
return ""
# Если уже абсолютный URL - возвращаем как есть
if relative_url.startswith(('http://', 'https://')):
return relative_url
request = context.get('request')
if request:
return request.build_absolute_uri(relative_url)
# Fallback - возвращаем относительный URL
return relative_url
@register.filter
def in_list(value, csv):
items = [s.strip() for s in str(csv).split(",") if s.strip()]

View File

@ -80,7 +80,7 @@
{% if request_obj.attachment %}
<a class="btn btn-ghost d-inline-flex align-items-center gap-1"
href="{{ request_obj.attachment.url }}" target="_blank" rel="noopener">
href="{% absolute_url request_obj.attachment.url %}" target="_blank" rel="noopener">
<i class="bi-paperclip"></i><span>Вложение</span>
</a>
{% endif %}

View File

@ -204,7 +204,7 @@
<span class="txt-close">Скрыть</span>
</button>
{% if obj.attachment %}
<a href="{{ obj.attachment }}" class="btn btn-ghost btn-sm d-inline-flex align-items-center gap-1" target="_blank">
<a href="{% absolute_url obj.attachment.url %}" class="btn btn-ghost btn-sm d-inline-flex align-items-center gap-1" target="_blank">
<i class="bi-paperclip"></i><span>Вложение</span>
</a>
{% endif %}

View File

@ -86,7 +86,7 @@
{# Вложение сотрудника (если есть) #}
{% if request_obj.attachment %}
<a class="btn btn-ghost d-inline-flex align-items-center gap-1"
href="{{ request_obj.attachment.url }}" target="_blank"
href="{% absolute_url request_obj.attachment.url %}" target="_blank"
rel="noopener noreferrer" download>
<i class="bi-paperclip"></i><span>Вложение сотрудника</span>
</a>