diff --git a/backend/app/crud.py b/backend/app/crud.py index 57d3c04439f71427113109accc186d84b9205319..3736f8043f9802fb4569c52526237137853cfc2b 100644 --- a/backend/app/crud.py +++ b/backend/app/crud.py @@ -179,6 +179,18 @@ def get_messages(db: Session, session_id: int, skip: int = 0): ) +def get_all_messages(db: Session, skip: int = 0): + return db.query(models.Message).offset(skip).all() + + +def get_all_metadata(db: Session, skip: int = 0): + return db.query(models.MessageMetadata).offset(skip).all() + + +def get_all_feedbacks(db: Session, skip: int = 0): + return db.query(models.MessageFeedback).offset(skip).all() + + def create_message( db: Session, message: schemas.MessageCreate, diff --git a/backend/app/main.py b/backend/app/main.py index 0071d39163de31d7e7f0510b724e1efd01df255e..82769b0190262702ca903c0fb5a5b18943eb860a 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -543,6 +543,79 @@ def download_session( ) +@sessionsRouter.get("/download/messages") +def download_sessions_messages( + db: Session = Depends(get_db), + current_user: schemas.User = Depends(get_jwt_user), +): + if not check_user_level(current_user, models.UserType.ADMIN): + raise HTTPException( + status_code=401, + detail="You do not have permission to download messages", + ) + + data = crud.get_all_messages(db) + output = StringIO() + writer = csv.writer(output) + writer.writerow(models.Message.__table__.columns.keys()) + for row in data: + writer.writerow(row.raw()) + output.seek(0) + return StreamingResponse( + output, + media_type="text/csv", + headers={"Content-Disposition": f"attachment; filename=messages.csv"}, + ) + + +@sessionsRouter.get("/download/metadata") +def download_sessions_metadata( + db: Session = Depends(get_db), + current_user: schemas.User = Depends(get_jwt_user), +): + if not check_user_level(current_user, models.UserType.ADMIN): + raise HTTPException( + status_code=401, + detail="You do not have permission to download metadata", + ) + data = crud.get_all_metadata(db) + output = StringIO() + writer = csv.writer(output) + writer.writerow(models.MessageMetadata.__table__.columns.keys()) + for row in data: + writer.writerow(row.raw()) + output.seek(0) + return StreamingResponse( + output, + media_type="text/csv", + headers={"Content-Disposition": f"attachment; filename=metadata.csv"}, + ) + + +@sessionsRouter.get("/download/feedbacks") +def download_sessions_feedbacks( + db: Session = Depends(get_db), + current_user: schemas.User = Depends(get_jwt_user), +): + if not check_user_level(current_user, models.UserType.ADMIN): + raise HTTPException( + status_code=401, + detail="You do not have permission to download feedbacks", + ) + data = crud.get_all_feedbacks(db) + output = StringIO() + writer = csv.writer(output) + writer.writerow(models.MessageFeedback.__table__.columns.keys()) + for row in data: + writer.writerow(row.raw()) + output.seek(0) + return StreamingResponse( + output, + media_type="text/csv", + headers={"Content-Disposition": f"attachment; filename=feedbacks.csv"}, + ) + + @sessionsRouter.post( "/{session_id}/users/{user_id}", status_code=status.HTTP_201_CREATED ) diff --git a/backend/app/models.py b/backend/app/models.py index 9bead73f94d484e49f1b6e803bda34d507dea4c5..da304ed53dde54ff7d94cc6098b9f704e24272a8 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -151,6 +151,9 @@ class MessageMetadata(Base): message = Column(String) date = Column(Integer) + def raw(self): + return [self.id, self.message_id, self.message, self.date] + class MessageFeedback(Base): __tablename__ = "message_feedbacks" @@ -162,6 +165,9 @@ class MessageFeedback(Base): content = Column(String, default="") date = Column(DateTime, default=datetime_aware) + def raw(self): + return [self.id, self.message_id, self.start, self.end, self.content, self.date] + class TestTyping(Base): __tablename__ = "test_typing" diff --git a/frontend/src/lang/fr.json b/frontend/src/lang/fr.json index ee50fe12993e082decb775762e7cee5f813f2701..eee4865522a74c44068d5c2aa041240617a58b6d 100644 --- a/frontend/src/lang/fr.json +++ b/frontend/src/lang/fr.json @@ -250,7 +250,10 @@ }, "success": "Questionnaire envoyé, merci !" } - } + }, + "downloadAllMessages": "Télécharger toutes les conversations", + "downloadAllMetadata": "Télécharger toutes les métadonnées", + "downloadAllFeedbacks": "Télécharger tous les feedbacks" }, "button": { "create": "Créer", diff --git a/frontend/src/routes/admin/sessions/+page.svelte b/frontend/src/routes/admin/sessions/+page.svelte index 611dc67e31eeb0b2f95c0c7719e776107c981232..d50db59d3bd4d476d6b20ab7f92fca747d2eb3a1 100644 --- a/frontend/src/routes/admin/sessions/+page.svelte +++ b/frontend/src/routes/admin/sessions/+page.svelte @@ -14,6 +14,32 @@ }); </script> +<h1 class="text-xl font-bold m-5 text-center">{$t('header.admin.sessions')}</h1> + +<div class="my-4 mx-auto"> + <a + class="btn btn-primary btn-sm" + title="Download" + href={`${config.API_URL}/sessions/download/messages`} + > + {$t('session.downloadAllMessages')} + </a> + <a + class="btn btn-primary btn-sm" + title="Download" + href={`${config.API_URL}/sessions/download/metadata`} + > + {$t('session.downloadAllMetadata')} + </a> + <a + class="btn btn-primary btn-sm" + title="Download" + href={`${config.API_URL}/sessions/download/feedbacks`} + > + {$t('session.downloadAllFeedbacks')} + </a> +</div> + <table class="table"> <thead> <tr>