From 92d282f4bace91ac3a9924540dc214d5ce4df228 Mon Sep 17 00:00:00 2001 From: Sli Date: Tue, 25 Feb 2025 11:35:55 +0100 Subject: [PATCH] Add possibility to de-moderate news through api and calendar widget --- com/api.py | 12 +++++ .../com/components/ics-calendar-index.ts | 48 +++++++++++++------ core/static/core/style.scss | 14 ++++++ locale/fr/LC_MESSAGES/djangojs.po | 19 ++++++-- 4 files changed, 74 insertions(+), 19 deletions(-) diff --git a/com/api.py b/com/api.py index c624e093..a8cedc6f 100644 --- a/com/api.py +++ b/com/api.py @@ -65,6 +65,18 @@ class NewsController(ControllerBase): news.moderator = self.context.request.user news.save() + @route.patch( + "/{int:news_id}/remove", + permissions=[HasPerm("com.moderate_news")], + url_name="remove_news", + ) + def remove_news(self, news_id: int): + news = self.get_object_or_exception(News, id=news_id) + if news.is_moderated: + news.is_moderated = False + news.moderator = self.context.request.user + news.save() + @route.delete( "/{int:news_id}", permissions=[HasPerm("com.delete_news")], diff --git a/com/static/bundled/com/components/ics-calendar-index.ts b/com/static/bundled/com/components/ics-calendar-index.ts index 5e6818bf..742a679d 100644 --- a/com/static/bundled/com/components/ics-calendar-index.ts +++ b/com/static/bundled/com/components/ics-calendar-index.ts @@ -13,6 +13,7 @@ import { calendarCalendarUnmoderated, newsDeleteNews, newsModerateNews, + newsRemoveNews, } from "#openapi"; @registerComponent("ics-calendar") @@ -86,7 +87,7 @@ export class IcsCalendar extends inheritHtmlElement("div") { this.calendar.refetchEvents(); } - async moderate(id: number) { + async moderateNews(id: number) { await newsModerateNews({ path: { // biome-ignore lint/style/useNamingConvention: python API @@ -96,7 +97,17 @@ export class IcsCalendar extends inheritHtmlElement("div") { await this.refreshEvents(); } - async delete(id: number) { + async removeNews(id: number) { + await newsRemoveNews({ + path: { + // biome-ignore lint/style/useNamingConvention: python API + news_id: id, + }, + }); + await this.refreshEvents(); + } + + async deleteNews(id: number) { await newsDeleteNews({ path: { // biome-ignore lint/style/useNamingConvention: python API @@ -195,24 +206,33 @@ export class IcsCalendar extends inheritHtmlElement("div") { } const newsId = this.getNewsId(event); const div = document.createElement("div"); - if ( - this.canModerate && - event.source.internalEventSource.ui.classNames.indexOf("unmoderated") >= 0 - ) { - const button = document.createElement("button"); - button.innerHTML = `${gettext("Moderate")}`; - button.setAttribute("class", "btn btn-green"); - button.onclick = () => { - this.moderate(newsId); - }; - div.appendChild(button); + if (this.canModerate) { + if ( + event.source.internalEventSource.ui.classNames.indexOf("unmoderated") >= 0 + ) { + const button = document.createElement("button"); + button.innerHTML = `${gettext("Moderate")}`; + button.setAttribute("class", "btn btn-green"); + button.onclick = () => { + this.moderateNews(newsId); + }; + div.appendChild(button); + } else { + const button = document.createElement("button"); + button.innerHTML = `${gettext("Remove")}`; + button.setAttribute("class", "btn btn-orange"); + button.onclick = () => { + this.removeNews(newsId); + }; + div.appendChild(button); + } } if (this.canDelete) { const button = document.createElement("button"); button.innerHTML = `${gettext("Delete")}`; button.setAttribute("class", "btn btn-red"); button.onclick = () => { - this.delete(newsId); + this.deleteNews(newsId); }; div.appendChild(button); } diff --git a/core/static/core/style.scss b/core/static/core/style.scss index 22c8a583..6b037995 100644 --- a/core/static/core/style.scss +++ b/core/static/core/style.scss @@ -272,6 +272,20 @@ body { } } + &.btn-orange { + background-color: #fcbf81; + color: black; + + &:not(:disabled):hover { + background-color: darken(#fcbf81, 15%); + } + + &:disabled { + background-color: lighten(#fcbf81, 15%); + color: grey; + } + } + &:not(.btn-no-text) { i { margin-right: 4px; diff --git a/locale/fr/LC_MESSAGES/djangojs.po b/locale/fr/LC_MESSAGES/djangojs.po index 6d6a483d..2f99ae24 100644 --- a/locale/fr/LC_MESSAGES/djangojs.po +++ b/locale/fr/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-25 11:05+0100\n" +"POT-Creation-Date: 2025-02-25 14:38+0100\n" "PO-Revision-Date: 2024-09-17 11:54+0200\n" "Last-Translator: Sli \n" "Language-Team: AE info \n" @@ -21,6 +21,19 @@ msgstr "" msgid "More info" msgstr "Plus d'informations" +#: com/static/bundled/com/components/ics-calendar-index.ts +msgid "Moderate" +msgstr "Modérer" + +#: com/static/bundled/com/components/ics-calendar-index.ts +#: core/static/bundled/core/components/ajax-select-base.ts +msgid "Remove" +msgstr "Retirer" + +#: com/static/bundled/com/components/ics-calendar-index.ts +msgid "Delete" +msgstr "Supprimer" + #: com/static/bundled/com/components/moderation-alert-index.ts #, javascript-format msgid "" @@ -32,10 +45,6 @@ msgstr "" "modérez ou supprimez cet événement, il sera également modéré (ou supprimé) " "pour les semaines suivantes." -#: core/static/bundled/core/components/ajax-select-base.ts -msgid "Remove" -msgstr "Retirer" - #: core/static/bundled/core/components/ajax-select-base.ts msgid "You need to type %(number)s more characters" msgstr "Vous devez taper %(number)s caractères de plus"