Коммит 1c660aa6 создал по автору Еганов Владислав Альбертович's avatar Еганов Владислав Альбертович
Просмотр файлов

Добавил возможность удалять обложки

владелец a41b5b1a
......@@ -11,4 +11,5 @@ urlpatterns = [
path('<int:id>', views.announcement, name='announcement'),
path('delete/<int:id>', views.delete_announcement, name='delete'),
path('upload_image/', views.upload_image, name='upload_image'),
path('delete_cover/', views.delete_cover, name='delete_cover'),
]
\ Нет новой строки в конце файла
......@@ -11,7 +11,7 @@ from django.conf import settings
from pathlib import Path
from django.http import JsonResponse
import os
from django.core.files.storage import FileSystemStorage
def index(request):
......@@ -245,3 +245,22 @@ def upload_image(request):
return JsonResponse({'success': True, 'image_url': image_url})
return JsonResponse({'success': False})
@allowed_users(allowed_roles=['Учитель', 'Администратор'])
def delete_cover(request):
if request.method == 'POST':
cover_url = request.POST.get('cover_url')
fs = FileSystemStorage(location=settings.MEDIA_ROOT)
file_path = fs.path(str(settings.BASE_DIR).replace('\\', '/') + cover_url)
try:
fs.delete(file_path)
return JsonResponse({'success': True})
except FileNotFoundError:
return JsonResponse({'success': False, 'message': 'File not found.'})
except Exception as e:
return JsonResponse({'success': False, 'message': str(e)})
return JsonResponse({'success': False})
......@@ -58,11 +58,11 @@
{{ form.image_url }}
<ul class="covers-list">
{% for cover in covers %}
<li class="covers-item" style="background-image: url('{{cover}}');">
<div class="covers-selected">
<svg class="covers-selected-svg" style="enable-background:new 0 0 24 24;" version="1.1" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ffffff"> <g/><g><path d="M18.3,6.3L9.1,16.4l-2.3-3c-0.3-0.4-1-0.5-1.4-0.2c-0.4,0.3-0.5,1-0.2,1.4l3,4C8.4,18.8,8.7,19,9,19c0,0,0,0,0,0 c0.3,0,0.5-0.1,0.7-0.3l10-11c0.4-0.4,0.3-1-0.1-1.4C19.3,5.9,18.6,5.9,18.3,6.3z"/></g> </svg>
</div>
<button type="button" class="delete-cover-btn" data-url="{{ cover }}">Убить</button>
</li>
{% endfor %}
</ul>
......@@ -105,17 +105,6 @@
</div>
</div>
<div class="url-cover">
<div>
<h3 class="url-title">Вставьте ссылку на вашу обложку</h3>
<span class="url-span">Учтите, что ссылка на вашу обложку может перестать быть активной со временем!</span>
</div>
<input class="url-input" type="text" placeholder="Ваша ссылка...">
<div class="url-btns">
<button class="btn exit" type="button" onclick="url_exit()">Отмена</button>
<button class="btn save" onclick="url_save()">Сохранить</button>
</div>
</div>
<div class="back-form"></div>
<script src="{% static 'js/announcement/red.js' %}"></script>
......@@ -146,7 +135,7 @@
let imageUrl = response.image_url;
// Создаем новый <li> элемент для новой обложки
let newCoverItem = $('<li class="covers-item"><div class="covers-selected"><svg class="covers-selected-svg" style="enable-background:new 0 0 24 24;" version="1.1" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ffffff"> <g/><g><path d="M18.3,6.3L9.1,16.4l-2.3-3c-0.3-0.4-1-0.5-1.4-0.2c-0.4,0.3-0.5,1-0.2,1.4l3,4C8.4,18.8,8.7,19,9,19c0,0,0,0,0,0 c0.3,0,0.5-0.1,0.7-0.3l10-11c0.4-0.4,0.3-1-0.1-1.4C19.3,5.9,18.6,5.9,18.3,6.3z"/></g> </svg></div></li>').css('background-image', `url('${imageUrl}')`);
let newCoverItem = $('<li class="covers-item"><div class="covers-selected"><svg class="covers-selected-svg" style="enable-background:new 0 0 24 24;" version="1.1" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ffffff"> <g/><g><path d="M18.3,6.3L9.1,16.4l-2.3-3c-0.3-0.4-1-0.5-1.4-0.2c-0.4,0.3-0.5,1-0.2,1.4l3,4C8.4,18.8,8.7,19,9,19c0,0,0,0,0,0 c0.3,0,0.5-0.1,0.7-0.3l10-11c0.4-0.4,0.3-1-0.1-1.4C19.3,5.9,18.6,5.9,18.3,6.3z"/></g> </svg></div><button type="button" class="delete-cover-btn" data-url="{{ cover }}">Убить</button></li>').css('background-image', `url('${imageUrl}')`);
$('.covers-list').append(newCoverItem);
$('#id_image_url').val(imageUrl);
......@@ -158,4 +147,49 @@
});
});
</script>
<script>
$('.covers-list').on('click', '.delete-cover-btn', function() {
let coverUrl = $(this).data('url');
if (!coverUrl) {
// Если CoverUrl не найден пробуем получить его из атрибута стиля
let backgroundImage = $(this).closest('.covers-item').css('background-image');
if (backgroundImage) {
// Получаем url из функции url() с помощью регулярок
let match = /url\(['"]?(.*?)['"]?\)/.exec(backgroundImage);
if (match && match[1]) {
// Извлекаем относительный путь из абсолютного с помощью регулярок
coverUrl = match[1].replace(/^.*?\/media(\/covers\/.*)$/, '/media$1');
}
}
}
if (!coverUrl) {
// Если CoverUrl все еще не найден то бросаем исключение
console.error('Cover URL not found.');
return;
}
// CSRF Токен чтобы ничего не сломалось
let csrfToken = $('input[name=csrfmiddlewaretoken]').val();
$.ajax({
url: '/announcements/delete_cover/', // Далее параметры ajax
method: 'POST',
data: { cover_url: coverUrl },
headers: {
'X-CSRFToken': csrfToken
},
success: function(response) {
if (response.success) {
// Убираем удаленную обложку из DOM
$(this).closest('.covers-item').remove();
} else {
console.error('Cover deletion failed.');
}
}.bind(this)
});
});
</script>
{% endblock content %}
\ Нет новой строки в конце файла
......@@ -53,6 +53,7 @@
<div class="covers-selected">
<svg class="covers-selected-svg" style="enable-background:new 0 0 24 24;" version="1.1" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ffffff"> <g/><g><path d="M18.3,6.3L9.1,16.4l-2.3-3c-0.3-0.4-1-0.5-1.4-0.2c-0.4,0.3-0.5,1-0.2,1.4l3,4C8.4,18.8,8.7,19,9,19c0,0,0,0,0,0 c0.3,0,0.5-0.1,0.7-0.3l10-11c0.4-0.4,0.3-1-0.1-1.4C19.3,5.9,18.6,5.9,18.3,6.3z"/></g> </svg>
</div>
<button type="button" class="delete-cover-btn" data-url="{{ cover }}">Убить</button>
</li>
{% endfor %}
</ul>
......@@ -89,17 +90,6 @@
</div>
</div>
<div class="url-cover">
<div>
<h3 class="url-title">Вставьте ссылку на вашу обложку</h3>
<span class="url-span">Учтите, что ссылка на вашу обложку может перестать быть активной со временем!</span>
</div>
<input class="url-input" type="text" placeholder="Ваша ссылка...">
<div class="url-btns">
<button class="btn exit" type="button" onclick="url_exit()">Отмена</button>
<button class="btn save" onclick="url_save()">Сохранить</button>
</div>
</div>
<div class="back-form"></div>
<script src="{% static 'js/announcement/red.js' %}"></script>
......@@ -130,7 +120,7 @@
let imageUrl = response.image_url;
// Создаем новый <li> элемент для новой обложки
let newCoverItem = $('<li class="covers-item"><div class="covers-selected"><svg class="covers-selected-svg" style="enable-background:new 0 0 24 24;" version="1.1" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ffffff"> <g/><g><path d="M18.3,6.3L9.1,16.4l-2.3-3c-0.3-0.4-1-0.5-1.4-0.2c-0.4,0.3-0.5,1-0.2,1.4l3,4C8.4,18.8,8.7,19,9,19c0,0,0,0,0,0 c0.3,0,0.5-0.1,0.7-0.3l10-11c0.4-0.4,0.3-1-0.1-1.4C19.3,5.9,18.6,5.9,18.3,6.3z"/></g> </svg></div></li>').css('background-image', `url('${imageUrl}')`);
let newCoverItem = $('<li class="covers-item"><div class="covers-selected"><svg class="covers-selected-svg" style="enable-background:new 0 0 24 24;" version="1.1" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ffffff"> <g/><g><path d="M18.3,6.3L9.1,16.4l-2.3-3c-0.3-0.4-1-0.5-1.4-0.2c-0.4,0.3-0.5,1-0.2,1.4l3,4C8.4,18.8,8.7,19,9,19c0,0,0,0,0,0 c0.3,0,0.5-0.1,0.7-0.3l10-11c0.4-0.4,0.3-1-0.1-1.4C19.3,5.9,18.6,5.9,18.3,6.3z"/></g> </svg></div><button type="button" class="delete-cover-btn" data-url="{{ cover }}">Убить</button></li>').css('background-image', `url('${imageUrl}')`);
$('.covers-list').append(newCoverItem);
$('#id_image_url').val(imageUrl);
......@@ -142,5 +132,49 @@
});
});
</script>
<script>
$('.covers-list').on('click', '.delete-cover-btn', function() {
let coverUrl = $(this).data('url');
if (!coverUrl) {
// Если CoverUrl не найден пробуем получить его из атрибута стиля
let backgroundImage = $(this).closest('.covers-item').css('background-image');
if (backgroundImage) {
// Получаем url из функции url() с помощью регулярок
let match = /url\(['"]?(.*?)['"]?\)/.exec(backgroundImage);
if (match && match[1]) {
// Извлекаем относительный путь из абсолютного с помощью регулярок
coverUrl = match[1].replace(/^.*?\/media(\/covers\/.*)$/, '/media$1');
}
}
}
if (!coverUrl) {
// Если CoverUrl все еще не найден то бросаем исключение
console.error('Cover URL not found.');
return;
}
// CSRF Токен чтобы ничего не сломалось
let csrfToken = $('input[name=csrfmiddlewaretoken]').val();
$.ajax({
url: '/announcements/delete_cover/', // Далее параметры ajax
method: 'POST',
data: { cover_url: coverUrl },
headers: {
'X-CSRFToken': csrfToken
},
success: function(response) {
if (response.success) {
// Убираем удаленную обложку из DOM
$(this).closest('.covers-item').remove();
} else {
console.error('Cover deletion failed.');
}
}.bind(this)
});
});
</script>
{% endblock content %}
\ Нет новой строки в конце файла
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать