Skip to content

Amélioration système de ban#1268

Closed
MatthieuHR wants to merge 40 commits intoae-utbm:taistefrom
MatthieuHR:BanPDF
Closed

Amélioration système de ban#1268
MatthieuHR wants to merge 40 commits intoae-utbm:taistefrom
MatthieuHR:BanPDF

Conversation

@MatthieuHR
Copy link
Copy Markdown

Hello !

Petite PR pour un système de partage des bans.

Il nous faut un moyen de partager les bans avec l'orga des soirées et autres. J'ai donc mis en place un système avec un export pdf de la liste de ban en cours pour une certaine date.

Ce système permet de :

  • générer un pdf pour une date
  • avec juste les photos ou avec les noms prénoms et le type
  • Sélectionner la langue d'export (en/fr)

C'est uniquement accessible aux root et ça cache le message de raison.

Voila une query SQL pour ban 50 personnes :

-- Script SQL pour bannir 50 utilisateurs jusqu'au 31 décembre 2025
-- Exécuter avec: sqlite3 db.sqlite3 < ban_50_users.sql

-- Insérer les bans
INSERT OR IGNORE INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 7, datetime('now'), '2025-12-31 23:59:59', 'Spam répété dans les forums');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 8, datetime('now'), '2025-12-31 23:59:59', 'Comportement inapproprié');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 9, datetime('now'), '2025-12-31 23:59:59', 'Utilisation abusive des ressources');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 10, datetime('now'), '2025-12-31 23:59:59', 'Violation des conditions d''utilisation');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 11, datetime('now'), '2025-12-31 23:59:59', 'Harcèlement d''autres utilisateurs');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 12, datetime('now'), '2025-12-31 23:59:59', 'Publication de contenu inapproprié');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 13, datetime('now'), '2025-12-31 23:59:59', 'Tentative de fraude');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 14, datetime('now'), '2025-12-31 23:59:59', 'Création de comptes multiples');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 15, datetime('now'), '2025-12-31 23:59:59', 'Perturbation des activités');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 16, datetime('now'), '2025-12-31 23:59:59', 'Non-respect des avertissements');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 17, datetime('now'), '2025-12-31 23:59:59', 'Insultes et langage offensant');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 18, datetime('now'), '2025-12-31 23:59:59', 'Trolling systématique');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 19, datetime('now'), '2025-12-31 23:59:59', 'Diffusion d''informations confidentielles');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 20, datetime('now'), '2025-12-31 23:59:59', 'Usurpation d''identité');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 21, datetime('now'), '2025-12-31 23:59:59', 'Abus de signalement');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 22, datetime('now'), '2025-12-31 23:59:59', 'Promotion de produits non autorisés');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 23, datetime('now'), '2025-12-31 23:59:59', 'Manipulation des votes');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 24, datetime('now'), '2025-12-31 23:59:59', 'Contournement des restrictions');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 25, datetime('now'), '2025-12-31 23:59:59', 'Diffusion de fausses informations');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 26, datetime('now'), '2025-12-31 23:59:59', 'Menaces envers d''autres membres');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 27, datetime('now'), '2025-12-31 23:59:59', 'Violation de la vie privée');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 28, datetime('now'), '2025-12-31 23:59:59', 'Utilisation de bots non autorisés');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 29, datetime('now'), '2025-12-31 23:59:59', 'Sabotage d''événements');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 30, datetime('now'), '2025-12-31 23:59:59', 'Discrimination et propos haineux');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 31, datetime('now'), '2025-12-31 23:59:59', 'Partage de contenu illégal');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 32, datetime('now'), '2025-12-31 23:59:59', 'Manipulation du système de paiement');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 33, datetime('now'), '2025-12-31 23:59:59', 'Publicité excessive');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 34, datetime('now'), '2025-12-31 23:59:59', 'Création de conflits intentionnels');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 35, datetime('now'), '2025-12-31 23:59:59', 'Falsification de documents');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 36, datetime('now'), '2025-12-31 23:59:59', 'Exploitation de failles de sécurité');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 37, datetime('now'), '2025-12-31 23:59:59', 'Dégradation de l''image de l''association');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 38, datetime('now'), '2025-12-31 23:59:59', 'Non-paiement de services');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 39, datetime('now'), '2025-12-31 23:59:59', 'Revente non autorisée de produits');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 40, datetime('now'), '2025-12-31 23:59:59', 'Participation à des activités illégales');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 41, datetime('now'), '2025-12-31 23:59:59', 'Abus de privilèges');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 42, datetime('now'), '2025-12-31 23:59:59', 'Incitation à la violence');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 43, datetime('now'), '2025-12-31 23:59:59', 'Diffusion de virus ou malwares');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 44, datetime('now'), '2025-12-31 23:59:59', 'Plagiat et vol de contenu');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 45, datetime('now'), '2025-12-31 23:59:59', 'Manipulation d''élections');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 46, datetime('now'), '2025-12-31 23:59:59', 'Intimidation systématique');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 47, datetime('now'), '2025-12-31 23:59:59', 'Divulgation de mots de passe');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 48, datetime('now'), '2025-12-31 23:59:59', 'Détournement de fonds');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 49, datetime('now'), '2025-12-31 23:59:59', 'Organisation de raids');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 50, datetime('now'), '2025-12-31 23:59:59', 'Désinformation massive');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 51, datetime('now'), '2025-12-31 23:59:59', 'Atteinte à la réputation');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 52, datetime('now'), '2025-12-31 23:59:59', 'Chantage et extorsion');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 53, datetime('now'), '2025-12-31 23:59:59', 'Diffamation publique');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 54, datetime('now'), '2025-12-31 23:59:59', 'Détournement d''événements');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 55, datetime('now'), '2025-12-31 23:59:59', 'Comportement antisocial grave');
INSERT INTO core_userban (ban_group_id, user_id, created_at, expires_at, reason) VALUES (12, 56, datetime('now'), '2025-12-31 23:59:59', 'Utilisation frauduleuse de cartes');

ken-soares and others added 7 commits September 19, 2025 21:31
Com, Subscriptions, Posters, Others
HTMX, Alpine, Invoice Calls, Products, Bugfixes, Other
Sith theme, `Selling.date` index, galaxy simplification, OG tags, dependencies update, bugfixes and others
Refactors, better `PageRev` handling, better user invisibilisation and fixes
@MatthieuHR MatthieuHR changed the title Ban pdf Liste de bans vers PDF Dec 14, 2025
Copy link
Copy Markdown
Member

@imperosol imperosol left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pour données de dev, tu peux les rajouter dans core/management/commands/populate_more.py. T'es pas obligé de créer 50 bans non plus, dans la mesure où on en a moins que ça sur le vrai site.

Il faudrait ajouter quelques tests.

Et, le plus important, je sais pas trop comment ça passe niveau RGPD. Faire sortir des données sensibles du système, ça doit être quelque chose de justifié et de très contrôlé (c'est pour ça qu'on ne permet de générer une liste des cotisants). Donc je suis pas sûr que légalement, on a le droit de faire ça.
Dans le cas où on a le droit, il faudrait mettre un message d'avertissement au moment d'exporter le pdf, pour faire savoir de manière explicite à l'utilisateur qu'il manipule des données extrêmement sensibles, en lui donnant une liste des choses qu'il pourra faire et qu'il ne pourra pas faire avec ces données.

Si le but est de prévenir les orgas d'une soirée que quelqu'un n'a pas le droit de rentrer, juste la photo et le nom suffisent, donc je pense pas que ça soit une bonne idée de permettre d'avoir le motif du ban.

Comment thread locale/fr/LC_MESSAGES/django.po
Comment thread rootplace/templates/rootplace/userban.jinja Outdated
Comment thread rootplace/forms.py
Comment on lines +71 to +74
LANGUAGES = [
("fr", _("French")),
("en", _("English")),
]
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je saisis pas trop l'intérêt de générer en français ou en anglais.
Le document contient relativement peu de texte et est dédié aux orgas des soirées, donc des francophones.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le flex certainement

@MatthieuHR
Copy link
Copy Markdown
Author

MatthieuHR commented Dec 14, 2025

D'un point du vue RGPD il faudrait les mettre à jour, mais c'est OK si la liste est détruite derrière, d’où un PDF pour le papier.
Et l'idée du motif c'est juste pour savoir si c'est un ban comptoirs ou normal, il n'y a pas la description d'afficher.
Je m'occupe des changements quand j'ai le temps.

@MatthieuHR
Copy link
Copy Markdown
Author

MatthieuHR commented Dec 15, 2025

Cette Pr vas etre changer vers une amélioration plus global du système de ban

@MatthieuHR MatthieuHR changed the title Liste de bans vers PDF Amélioration système de ban Dec 15, 2025
@MatthieuHR
Copy link
Copy Markdown
Author

Je sais pas comment on check les cotisations en local donc hésitez pas à me le dire ❤️

@imperosol
Copy link
Copy Markdown
Member

Je sais pas comment on check les cotisations en local donc hésitez pas à me le dire ❤️

C'est à dire ?

Comment thread core/enum.py Outdated
Comment thread counter/static/bundled/counter/components/ajax-select-index.ts
Comment thread core/api.py Outdated
Comment thread counter/static/counter/css/counter-click.scss
Comment thread counter/views/click.py
Comment thread counter/views/click.py Outdated
@ae-utbm ae-utbm deleted a comment from MatthieuHR Dec 16, 2025
@ae-utbm ae-utbm deleted a comment from MatthieuHR Dec 16, 2025
@ae-utbm ae-utbm deleted a comment from MatthieuHR Dec 16, 2025
@ae-utbm ae-utbm deleted a comment from MatthieuHR Dec 16, 2025
@imperosol
Copy link
Copy Markdown
Member

Cette Pr vas etre changer vers une amélioration plus global du système de ban

Ouvre plutôt des PRs différentes. Refactor les bans, et ajouter la fonctionnalité de la génération du PDF, c'est deux trucs différents. Comme ça, ça sera plus simple à review, et ça bloquera pas tout s'il y a des choses à modifier.

MatthieuHR and others added 5 commits December 25, 2025 20:55
- Add separate URL and view logic for admin notifications when a banned user attempts a purchase without a barman present
- Update admin notification and ban page rendering to handle cases where barman is absent
- Refactor and extend tests for banned user scenarios, including admin notification URL checks and edge cases
- Clean up imports and minor code comments for clarity
- Update dependencies in lockfile
@MatthieuHR
Copy link
Copy Markdown
Author

Mise a jour du fonctionnement.

Pour les barman :

  • Si une personne est ban une page spécial s'affiche et la page normal du conter reste comme avant

Pour la personne ban :

  • Retour vers le comptoir avec le message de ban

Pour les admin (root) :

  • Notif si la personne essaye d'utiliser le comptoir
  • Notif si la personne à des droits sur le comptoir

Test :

  • pour le comptoir
  • pour les pdf
  • 100% de pass avec une modif sur un test test_click_unauthorized_customer car le fonctionnement à changer

Dite moi si ce behavor est important je peux toujours changer le fonctionnement pour juste retourner une 302 avec le message d'erreur.

Comment thread counter/views/admin.py Outdated
Comment thread counter/views/admin.py Outdated
Comment thread rootplace/tests/test_ban.py Outdated
… admin UI to use them

- Introduce /api/counter/<id>/seller/add and /api/counter/<id>/seller/remove endpoints for bulk seller management with detailed error handling
- Update admin UI for banned users with counter permissions to use new API endpoints via AJAX, providing real-time feedback
- Remove legacy admin_remove_user_from_counter view and related URL
- Refactor admin views and URL patterns for clarity and consistency
- Add comprehensive tests for new API endpoints
- Update translations for new UI messages
…nter click test coverage

- Add test_seller_api.py with parameterized tests for bulk add/remove seller API endpoints, covering edge cases and error codes
- Refactor test_ban.py to use parameterized tests for PDF generation, reducing duplication and increasing coverage
- Enhance test_counter.py to verify ban logic takes precedence over can_buy and improve session authentication checks
- Update ban_user_has_counter_permission.jinja to use consistent double quotes in JS and template tags
- Refactor click.py to prioritize ban checks before can_buy and session validation
@MatthieuHR
Copy link
Copy Markdown
Author

Update :

  • Mise en place des test avec les paramètres
  • Mise en place d'une classe unique pour les vue de notification des bans
  • Ajout d'une api pour gérer les vendeurs sur un comptoir (ajouter/enlever)
  • Ajout du paramètre --ban-x-users pour ban X user pour 15 jours dans populate_more
  • Check du ban avant la redirection si la personne ne peux pas acheter
  • Button de ban automatique en AJAX

@imperosol
Copy link
Copy Markdown
Member

Honnêtement, quelle proportion du code a été générée par IA ?

@MatthieuHR
Copy link
Copy Markdown
Author

Globalement tout ce qui est sur le site à était fait à la main avec une pass d'IA dessus pour corriger/best practices. Les test ont était générer par IA avec description des inputs et outputs attendues puis vérification et adaptation à la main. En gros c'est surtout les test que j'avais fait avant avec a chaque fois une def (J'avais pas le temps de tous les écrire et je connaissais pas la paramétrisation), mais la paramétrisation à était faite à la main avec un matching des test case avec l'aide de l'IA (Je lui donne les nouveaux et les anciens et il doivent êtres identiques, double checking). La partie pdf pour les math, et que l'alignement soit bien. Il y a aussi eu un peu pour le front pour avoir une structure de base.

Copy link
Copy Markdown
Member

@imperosol imperosol left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je laisse une petite partie des commentaires que j'ai envie de laisser, parce que 1700 lignes de code dont le style est pas raccord avec le reste de la base de code (et pas raccord avec lui-même par moments), c'est vraiment la mort à review.

Comment thread core/management/commands/populate_more.py Outdated
Comment thread core/management/commands/populate_more.py Outdated
Comment thread core/management/commands/populate_more.py Outdated
Comment thread core/management/commands/populate_more.py Outdated
<div class="row gap">
<div>
<a href="{{ url("core:user_profile", ban_user.id) }}">
<img src="{{ ban_user.profile_pict.get_download_url() if ban_user.profile_pict else static("core/img/unknown.jpg") }}" alt="{% trans %}Profile photo{% endtrans %}" style="max-width:120px;max-height:120px;border-radius:8px;">
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Evite les styles inline dans le html

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Même pour les photo ? On est sur une page admin et c'est un composant custom qui ne sert qu'une fois

Comment thread counter/api.py Outdated
Comment thread counter/api.py Outdated
Comment thread counter/views/click.py
admin_group_ids = [settings.SITH_GROUP_ROOT_ID]
notif_type = "BANNED_COUNTER_ATTEMPT"
counter = self.get_object()
if barman is not None and hasattr(barman, "id") and barman.id is not None:
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dans ta fonction, barman est type-hint comme User. Si à ce stade tu as besoin de faire autant de null-check, c'est que quelque chose est déjà foireux en amont.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est pendant les test je me suis rendu compte que les notif pouvaient partir sans barman associé, c'est donc pour ce cas précis, en temps normal cela n'arrive pas mais je préfère le couvrir pour éviter une erreur possible dans un scénario X

Comment thread counter/views/click.py Outdated
Comment thread core/static/core/style.scss
@klmp200 klmp200 changed the base branch from master to taiste January 8, 2026 13:13
@klmp200
Copy link
Copy Markdown
Contributor

klmp200 commented Jan 8, 2026

C'était pas la bonne cible de merge, j'ai changé vers taiste :)
Ça va, il n'y a pas beaucoup de conflits.
Tu peux faire ça sur ton pc pour faciliter les choses git rebase --onto origin/taiste origin/master BanPDF

@imperosol
Copy link
Copy Markdown
Member

imperosol commented Feb 18, 2026

rebase ? 👀

@imperosol
Copy link
Copy Markdown
Member

PR morte

@imperosol imperosol closed this Mar 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants