Plusieurs mises à jour
This commit is contained in:
parent
adc00f2d54
commit
950c92c48f
@ -11,6 +11,7 @@ from .finish_review import FinishReview
|
|||||||
from .hello import Hello
|
from .hello import Hello
|
||||||
from .help import Help
|
from .help import Help
|
||||||
from .individual_subject import IndividualSubject
|
from .individual_subject import IndividualSubject
|
||||||
|
from .input_participant import InputParticipant
|
||||||
from .input_review import InputReview
|
from .input_review import InputReview
|
||||||
from .license import License
|
from .license import License
|
||||||
from .listen_alexandrie import ListenAlexandrie
|
from .listen_alexandrie import ListenAlexandrie
|
||||||
@ -28,6 +29,7 @@ hooks = (
|
|||||||
CancelPreviousInput(),
|
CancelPreviousInput(),
|
||||||
Chrono(),
|
Chrono(),
|
||||||
CollectiveSubject(),
|
CollectiveSubject(),
|
||||||
|
InputParticipant(),
|
||||||
Comment(),
|
Comment(),
|
||||||
Current(),
|
Current(),
|
||||||
FinishReview(),
|
FinishReview(),
|
||||||
|
@ -67,14 +67,14 @@ class FinishReview:
|
|||||||
text=report,
|
text=report,
|
||||||
expiration=bot.settings.PASTEBIN_EXPIRATION,
|
expiration=bot.settings.PASTEBIN_EXPIRATION,
|
||||||
)
|
)
|
||||||
pastebin_url = result.full_url
|
pastebin_url = result["full_url"]
|
||||||
|
|
||||||
# On sauve le texte dans un fichier
|
# On sauve le texte dans un fichier
|
||||||
review_path = os.path.join(
|
review_file = (
|
||||||
bot.settings.REVIEW_DIRECTORY,
|
|
||||||
f"{bot.review.start_time.strftime('%Y%m%d')}"
|
f"{bot.review.start_time.strftime('%Y%m%d')}"
|
||||||
"-log-irc-revue-hebdomadaire.txt",
|
"-log-irc-revue-hebdomadaire.txt"
|
||||||
)
|
)
|
||||||
|
review_path = os.path.join(bot.settings.REVIEW_DIRECTORY, f"{review_file}")
|
||||||
with open(review_path, "w") as file_handle:
|
with open(review_path, "w") as file_handle:
|
||||||
file_handle.write(report)
|
file_handle.write(report)
|
||||||
|
|
||||||
@ -84,12 +84,15 @@ class FinishReview:
|
|||||||
f"{stats.year_review(bot.review.year)}e de l'année {bot.review.year}.",
|
f"{stats.year_review(bot.review.year)}e de l'année {bot.review.year}.",
|
||||||
)
|
)
|
||||||
bot.send(channel, f"% Compte-rendu de la revue : {pastebin_url}")
|
bot.send(channel, f"% Compte-rendu de la revue : {pastebin_url}")
|
||||||
bot.send(channel, "% Durée de la revue : {temps_ecoule} minutes")
|
bot.send(channel, f"% Durée de la revue : {bot.review.duration} minutes")
|
||||||
bot.send(channel, "% Nombre de personnes participantes : {combien}")
|
bot.send(
|
||||||
|
channel,
|
||||||
|
f"% Nombre de personnes participantes : {bot.review.user_count}",
|
||||||
|
)
|
||||||
bot.send(
|
bot.send(
|
||||||
channel,
|
channel,
|
||||||
"% La participation moyenne aux revues est de "
|
"% La participation moyenne aux revues est de "
|
||||||
f"{stats.avg_users} personnes",
|
f"{stats.avg_users:.1f} personnes",
|
||||||
)
|
)
|
||||||
bot.send(
|
bot.send(
|
||||||
channel,
|
channel,
|
||||||
@ -100,7 +103,7 @@ class FinishReview:
|
|||||||
channel,
|
channel,
|
||||||
f"% {bot.review.owner}, ne pas oublier d'ajouter le compte-rendu "
|
f"% {bot.review.owner}, ne pas oublier d'ajouter le compte-rendu "
|
||||||
"de la revue sur https://agir.april.org/issues/135 en utilisant "
|
"de la revue sur https://agir.april.org/issues/135 en utilisant "
|
||||||
"comme nom de fichier {nom_fichier}",
|
f"comme nom de fichier {review_file}",
|
||||||
)
|
)
|
||||||
bot.send(channel, "% Fin de la revue hebdomadaire")
|
bot.send(channel, "% Fin de la revue hebdomadaire")
|
||||||
bot.send(bot.review.owner, "Revue finie.")
|
bot.send(bot.review.owner, "Revue finie.")
|
||||||
|
13
hooks/input_participant.py
Normal file
13
hooks/input_participant.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import logger
|
||||||
|
|
||||||
|
|
||||||
|
class InputParticipant:
|
||||||
|
def process(self, bot, channel, sender, message):
|
||||||
|
"""
|
||||||
|
Si le commentaire est ras, l'utilisateur est compté comme participant,
|
||||||
|
mais le message n'est pas considéré comme pris en compte.
|
||||||
|
"""
|
||||||
|
if message == "%ras" or message == "% ras":
|
||||||
|
logger.info("participant comment during review.")
|
||||||
|
|
||||||
|
bot.review.add_participant(sender)
|
@ -91,12 +91,20 @@ class Review:
|
|||||||
self.participants.append(sender)
|
self.participants.append(sender)
|
||||||
self.current_topic.add_message(sender, message)
|
self.current_topic.add_message(sender, message)
|
||||||
|
|
||||||
|
def add_participant(self, sender):
|
||||||
|
if self.current_topic:
|
||||||
|
if sender not in self.participants:
|
||||||
|
self.participants.append(sender)
|
||||||
|
self.current_topic.add_participant(sender)
|
||||||
|
|
||||||
def start(self, owner):
|
def start(self, owner):
|
||||||
self.started = True
|
self.started = True
|
||||||
|
self.ended = False
|
||||||
self.owner = owner
|
self.owner = owner
|
||||||
self.start_time = datetime.today()
|
self.start_time = datetime.today()
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
self.started = False
|
||||||
self.ended = True
|
self.ended = True
|
||||||
self.end_time = datetime.today()
|
self.end_time = datetime.today()
|
||||||
|
|
||||||
@ -214,7 +222,7 @@ class Review:
|
|||||||
)
|
)
|
||||||
|
|
||||||
percentage = (
|
percentage = (
|
||||||
stats.users_board.datas[self.user_count] / stats.users_board.sum * 100
|
stats.users_board[self.user_count] / stats.users_board.sum * 100
|
||||||
)
|
)
|
||||||
content += fill(
|
content += fill(
|
||||||
"Statistiques sur la participation à la revue "
|
"Statistiques sur la participation à la revue "
|
||||||
@ -231,7 +239,7 @@ class Review:
|
|||||||
content += "\n"
|
content += "\n"
|
||||||
|
|
||||||
percentage = (
|
percentage = (
|
||||||
stats.users_board.datas[self.user_count] / stats.users_board.sum * 100
|
stats.users_board[self.user_count] / stats.users_board.sum * 100
|
||||||
)
|
)
|
||||||
content += fill(
|
content += fill(
|
||||||
"Statistiques sur la durée de la revue "
|
"Statistiques sur la durée de la revue "
|
||||||
|
@ -169,7 +169,7 @@ class ReviewStats:
|
|||||||
self.durations_board = DurationBoard(self.datas)
|
self.durations_board = DurationBoard(self.datas)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
with open(self.filepath, "wt") as file_handle:
|
with open(self.filepath, "w") as file_handle:
|
||||||
for data in self.datas:
|
for data in self.datas:
|
||||||
file_handle.write(
|
file_handle.write(
|
||||||
f"{data.date.strftime('%Y%m%d-%Hh%M')}\t"
|
f"{data.date.strftime('%Y%m%d-%Hh%M')}\t"
|
||||||
|
@ -36,6 +36,10 @@ class Topic:
|
|||||||
if sender not in self.participants:
|
if sender not in self.participants:
|
||||||
self.participants.append(sender)
|
self.participants.append(sender)
|
||||||
|
|
||||||
|
def add_participant(self, sender):
|
||||||
|
if sender not in self.participants:
|
||||||
|
self.participants.append(sender)
|
||||||
|
|
||||||
def cancel_previous(self, author):
|
def cancel_previous(self, author):
|
||||||
messages = [message for message in self.messages if message.author == author]
|
messages = [message for message in self.messages if message.author == author]
|
||||||
if len(messages) == 0:
|
if len(messages) == 0:
|
||||||
|
@ -13,7 +13,7 @@ LOGDATE = os.environ.get("LOGDATE", "%Y-%m-%d %H:%M:%S")
|
|||||||
# IRC configuration
|
# IRC configuration
|
||||||
IRC_SERVER = os.environ.get("IRC_SERVER", "irc.libera.chat")
|
IRC_SERVER = os.environ.get("IRC_SERVER", "irc.libera.chat")
|
||||||
IRC_PORT = int(os.environ.get("IRC_PORT", 6667))
|
IRC_PORT = int(os.environ.get("IRC_PORT", 6667))
|
||||||
IRC_CHANNEL = os.environ.get("IRC_CHANNEL", " #april")
|
IRC_CHANNEL = os.environ.get("IRC_CHANNEL", " #april-test")
|
||||||
IRC_NICK = os.environ.get("IRC_NICK", "Testbot")
|
IRC_NICK = os.environ.get("IRC_NICK", "Testbot")
|
||||||
IRC_PASSWORD = os.environ.get("IRC_PASSWORD", " ")
|
IRC_PASSWORD = os.environ.get("IRC_PASSWORD", " ")
|
||||||
IRC_DELAY = float(os.environ.get("IRC_DELAY", 0.5)) # Délai entre plusieurs messages
|
IRC_DELAY = float(os.environ.get("IRC_DELAY", 0.5)) # Délai entre plusieurs messages
|
||||||
@ -29,7 +29,7 @@ REVIEW_STATS = os.environ.get("REVIEW_STATS", os.path.join(REVIEW_DIRECTORY, "re
|
|||||||
# Pastebin
|
# Pastebin
|
||||||
PASTEBIN_URL = "https://paste.chapril.org/"
|
PASTEBIN_URL = "https://paste.chapril.org/"
|
||||||
# Values : 5min, 10min, 1hour, 1day, 1week, 1month, 1year, never
|
# Values : 5min, 10min, 1hour, 1day, 1week, 1month, 1year, never
|
||||||
PASTEBIN_EXPIRATION = "5min"
|
PASTEBIN_EXPIRATION = "1week"
|
||||||
|
|
||||||
# Cron
|
# Cron
|
||||||
CRON_REVIEW_REMINDERS = [(11, 45)]
|
CRON_REVIEW_REMINDERS = [(11, 45)]
|
||||||
|
57
tests/datas/20240402-log-irc-revue-hebdomadaire.txt
Normal file
57
tests/datas/20240402-log-irc-revue-hebdomadaire.txt
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
================================================================================
|
||||||
|
Revue de la semaine en cours
|
||||||
|
|
||||||
|
mardi 02 avril 2024
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
--------------------------- Personnes participantes ----------------------------
|
||||||
|
* Ccccc Ccccc (ccccc)
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
----------------------------- Ccccc Ccccc (ccccc) ------------------------------
|
||||||
|
|
||||||
|
=== 1/ Actions passées ou en cours ===
|
||||||
|
|
||||||
|
* (09:59:32) lonugem: c'est cool quand « Libre à vous ! » comme ressource
|
||||||
|
argumentaire :)
|
||||||
|
https://pouet.april.org/@jonathangalou@mastodon.zaclys.com/112190112236507216 <-
|
||||||
|
<3
|
||||||
|
|
||||||
|
Log IRC brut
|
||||||
|
|
||||||
|
* Hebdobot : % Début de la réunion hebdomadaire
|
||||||
|
* Hebdobot : % rappel : toute ligne commençant par % sera considérée comme un
|
||||||
|
commentaire et non prise en compte dans la synthèse
|
||||||
|
* Hebdobot : % pour connaître le point courant, taper !courant
|
||||||
|
* lllll : #1
|
||||||
|
* Hebdobot : Sujet individuel : 1
|
||||||
|
* Hebdobot : % si rien à signaler vous pouvez écrire % ras
|
||||||
|
* Hebdobot : % quand vous avez fini vous le dites par % fini
|
||||||
|
* lllll : %erreur :)
|
||||||
|
* lllll : # 1/ Actions passées ou en cours
|
||||||
|
* Hebdobot : % durée du point 1 : 0:00
|
||||||
|
* Hebdobot : % , on va passer à la suite : 1/ Actions passées ou en cours
|
||||||
|
* Hebdobot : Sujet individuel : 1/ Actions passées ou en cours
|
||||||
|
* Hebdobot : % si rien à signaler vous pouvez écrire % ras
|
||||||
|
* Hebdobot : % quand vous avez fini vous le dites par % fini
|
||||||
|
* ccccc : (09:59:32) lonugem: c'est cool quand « Libre à vous ! » comme
|
||||||
|
ressource argumentaire :)
|
||||||
|
https://pouet.april.org/@jonathangalou@mastodon.zaclys.com/112190112236507216 <-
|
||||||
|
<3
|
||||||
|
* lllll : # 2/ Actions à venir
|
||||||
|
* Hebdobot : % durée du point 1/ Actions passées ou en cours : 0:00
|
||||||
|
* Hebdobot : % ccccc, on va passer à la suite : 2/ Actions à venir
|
||||||
|
* Hebdobot : Sujet individuel : 2/ Actions à venir
|
||||||
|
* Hebdobot : % si rien à signaler vous pouvez écrire % ras
|
||||||
|
* Hebdobot : % quand vous avez fini vous le dites par % fini
|
||||||
|
* lllll : !fin
|
||||||
|
* Hebdobot : % durée du point 2/ Actions à venir : 0:00
|
||||||
|
|
||||||
|
Statistiques
|
||||||
|
|
||||||
|
C'était la 314e revue hebdomadaire de l'April, la 1e de l'année 2024.
|
||||||
|
Horaire de début de la revue : 09h59
|
6
tests/datas/irc_2.txt
Normal file
6
tests/datas/irc_2.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
lllll : #1
|
||||||
|
lllll : %erreur :)
|
||||||
|
lllll : # 1/ Actions passées ou en cours
|
||||||
|
ccccc : (09:59:32) lonugem: c'est cool quand « Libre à vous ! » comme ressource argumentaire :) https://pouet.april.org/@jonathangalou@mastodon.zaclys.com/112190112236507216 <- <3
|
||||||
|
lllll : # 2/ Actions à venir
|
||||||
|
lllll : !fin
|
@ -29,3 +29,26 @@ def test_complete_review(bot):
|
|||||||
with open("tests/reviews/20231201-log-irc-revue-hebdomadaire.txt") as file_handle:
|
with open("tests/reviews/20231201-log-irc-revue-hebdomadaire.txt") as file_handle:
|
||||||
content_tested = file_handle.read()
|
content_tested = file_handle.read()
|
||||||
assert content_ok in content_tested
|
assert content_ok in content_tested
|
||||||
|
|
||||||
|
|
||||||
|
def test_other_review(bot):
|
||||||
|
with open("tests/datas/irc_2.txt") as file_handle:
|
||||||
|
content = file_handle.read().splitlines()
|
||||||
|
messages = []
|
||||||
|
for line in content:
|
||||||
|
data = line.split(":")
|
||||||
|
author = data[0].strip()
|
||||||
|
text = ":".join(data[1:]).strip()
|
||||||
|
messages.append((author, text))
|
||||||
|
|
||||||
|
bot.test_public_message(bot.channel, "lllll", "!start")
|
||||||
|
bot.review.start_time = datetime(2024, 4, 2, 9, 59, 0)
|
||||||
|
for message in messages:
|
||||||
|
bot.test_public_message(bot.channel, message[0], message[1])
|
||||||
|
|
||||||
|
# compare contents
|
||||||
|
with open("tests/datas/20240402-log-irc-revue-hebdomadaire.txt") as file_handle:
|
||||||
|
content_ok = file_handle.read()
|
||||||
|
with open("tests/reviews/20240402-log-irc-revue-hebdomadaire.txt") as file_handle:
|
||||||
|
content_tested = file_handle.read()
|
||||||
|
assert content_ok in content_tested
|
||||||
|
@ -424,6 +424,16 @@ def test_missing_no_one_is_missing(bot):
|
|||||||
assert bot.answers[0].message == "% Tout le monde s'est exprimé sur le sujet courant \\o/"
|
assert bot.answers[0].message == "% Tout le monde s'est exprimé sur le sujet courant \\o/"
|
||||||
|
|
||||||
|
|
||||||
|
def test_missing_no_one_is_missing_through_ras(bot):
|
||||||
|
bot.test_public_message(bot.channel, OWNER, "!start")
|
||||||
|
bot.test_public_message(bot.channel, OWNER, "## collective topic")
|
||||||
|
bot.test_public_message(bot.channel, SENDER, "%ras")
|
||||||
|
bot.test_public_message(bot.channel, OWNER, "This is owner message")
|
||||||
|
bot.test_public_message(bot.channel, OWNER, "!manquantes")
|
||||||
|
assert len(bot.answers) == 1
|
||||||
|
assert bot.answers[0].message == "% Tout le monde s'est exprimé sur le sujet courant \\o/"
|
||||||
|
|
||||||
|
|
||||||
def test_missing_one_is_missing(bot):
|
def test_missing_one_is_missing(bot):
|
||||||
bot.test_public_message(bot.channel, OWNER, "!start")
|
bot.test_public_message(bot.channel, OWNER, "!start")
|
||||||
bot.test_public_message(bot.channel, OWNER, "## collective topic")
|
bot.test_public_message(bot.channel, OWNER, "## collective topic")
|
||||||
@ -484,7 +494,7 @@ def test_finish_review_already_finished(bot):
|
|||||||
bot.test_public_message(bot.channel, OWNER, "!fin")
|
bot.test_public_message(bot.channel, OWNER, "!fin")
|
||||||
bot.test_public_message(bot.channel, OWNER, "!fin")
|
bot.test_public_message(bot.channel, OWNER, "!fin")
|
||||||
assert len(bot.answers) == 1
|
assert len(bot.answers) == 1
|
||||||
assert bot.answers[0].message == "La revue est déjà finie."
|
assert bot.answers[0].message.endswith(", pas de revue en cours.")
|
||||||
|
|
||||||
|
|
||||||
def test_finish_review_not_owner(bot):
|
def test_finish_review_not_owner(bot):
|
||||||
|
Loading…
Reference in New Issue
Block a user