Открыть боковую панель
peteroshkvarkov
Project-38
Коммиты
1c660aa6
Коммит
1c660aa6
создал
Сен 05, 2023
по автору
Еганов Владислав Альбертович
Просмотр файлов
Добавил возможность удалять обложки
владелец
a41b5b1a
Изменения
4
Скрыть пробелы
Построчно
Рядом
portal/announcements/urls.py
Просмотр файла @
1c660aa6
...
...
@@ -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'
),
]
\ Нет новой строки в конце файла
portal/announcements/views.py
Просмотр файла @
1c660aa6
...
...
@@ -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
})
portal/templates/dec/ed.html
Просмотр файла @
1c660aa6
...
...
@@ -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 %}
\ Нет новой строки в конце файла
portal/templates/dec/red.html
Просмотр файла @
1c660aa6
...
...
@@ -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.
Сначала завершите редактирование этого сообщения!
Отмена
Пожалуйста,
зарегистрируйтесь
или
войдите
чтобы прокомментировать