Skip to content
Snippets Groups Projects
Commit f4654214 authored by Aymeric Chaumont's avatar Aymeric Chaumont
Browse files

Merge branch 'improve_data_collection' into 'main'

improve data collection

See merge request !48
parents d335d892 51af8942
No related branches found
No related tags found
1 merge request!48improve data collection
Pipeline #44444 failed
...@@ -52,7 +52,6 @@ Navigate to [http://localhost:3000](http://localhost:3000) ...@@ -52,7 +52,6 @@ Navigate to [http://localhost:3000](http://localhost:3000)
- Accéder à d'autre infos telle que l'API des cours sur demande à la DISI pour intégrer ça aux prédictions (ex: cours en promo complète juste implique plus d'attente) - Accéder à d'autre infos telle que l'API des cours sur demande à la DISI pour intégrer ça aux prédictions (ex: cours en promo complète juste implique plus d'attente)
## Coté dev ## Coté dev
- Améliorer l'interface utilisateur avec le timer
- Protéger l'interface OpenAPI et mettre en place une interface admin pour les news et potentiellement modération (avec authentification) - Protéger l'interface OpenAPI et mettre en place une interface admin pour les news et potentiellement modération (avec authentification)
- Permettre de définir les masques proprement et de manière à pouvoir généraliser à d'autre RU - Permettre de définir les masques proprement et de manière à pouvoir généraliser à d'autre RU
- Accorder la charte graphique si le service est intégré à d'autres appli (bordeau/blanc service de CS, charte graphique de VR) - Accorder la charte graphique si le service est intégré à d'autres appli (bordeau/blanc service de CS, charte graphique de VR)
......
...@@ -490,7 +490,6 @@ def update_collaborative_record(user: schemas.User, db: Session): ...@@ -490,7 +490,6 @@ def update_collaborative_record(user: schemas.User, db: Session):
if last_record.date >= datetime.combine(date, time_slot.open_time) and not last_record.waiting_time: if last_record.date >= datetime.combine(date, time_slot.open_time) and not last_record.waiting_time:
last_record.waiting_time = current_date - \ last_record.waiting_time = current_date - \
pytz.timezone("Europe/Paris").localize(last_record.date) pytz.timezone("Europe/Paris").localize(last_record.date)
print(last_record.waiting_time)
db.add(last_record) db.add(last_record)
db.commit() db.commit()
db.refresh(last_record) db.refresh(last_record)
...@@ -499,6 +498,12 @@ def update_collaborative_record(user: schemas.User, db: Session): ...@@ -499,6 +498,12 @@ def update_collaborative_record(user: schemas.User, db: Session):
raise HTTPException(status_code=406, detail="Client already registered") raise HTTPException(status_code=406, detail="Client already registered")
def cancel_collaborative_record(user_id: int, db: Session):
db.query(models.CollaborativeRecords).filter(models.CollaborativeRecords.user_id == user_id).delete()
db.commit()
return
def delete_collaborative_record(id: int, db: Session): def delete_collaborative_record(id: int, db: Session):
if id == 0: if id == 0:
db.query(models.CollaborativeRecords).delete() db.query(models.CollaborativeRecords).delete()
......
...@@ -12,7 +12,7 @@ class CollaborativeRecords(Base): ...@@ -12,7 +12,7 @@ class CollaborativeRecords(Base):
__tablename__ = "collection" __tablename__ = "collection"
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id")) user_id = Column(Integer, ForeignKey("users.id", ondelete='SET NULL'))
place = Column(String(30)) place = Column(String(30))
date = Column(DateTime) date = Column(DateTime)
waiting_time = Column(Interval) waiting_time = Column(Interval)
......
...@@ -33,7 +33,7 @@ class RecordRead(BaseModel): ...@@ -33,7 +33,7 @@ class RecordRead(BaseModel):
class CollaborativeRecords(BaseModel): class CollaborativeRecords(BaseModel):
"""CollaborativeRecords schema""" """CollaborativeRecords schema"""
user_id: int = Field(..., title="Id of the user timed") user_id: Optional[int] = Field(default=None, title="Id of the user timed")
place: str = Field(..., title="Name of the RU corresponding the given record") place: str = Field(..., title="Name of the RU corresponding the given record")
date: datetime = Field(..., title="Date of the record") date: datetime = Field(..., title="Date of the record")
waiting_time: Optional[timedelta] = Field(default=None, title="Caculated waiting time for timed person") waiting_time: Optional[timedelta] = Field(default=None, title="Caculated waiting time for timed person")
......
...@@ -54,6 +54,16 @@ async def end_new_record(response: Response, connect_id: str = Cookie(...), db: ...@@ -54,6 +54,16 @@ async def end_new_record(response: Response, connect_id: str = Cookie(...), db:
return db_record return db_record
@router.post("/collection/cancel", response_model=None, tags=["data collection"])
async def cancel_new_record(response: Response, connect_id: str = Cookie(...), db: Session = Depends(get_db)):
user = crud.get_user(connect_id, db)
db_record = crud.cancel_collaborative_record(user.id, db)
if not user.username:
crud.delete_user(user.cookie, db)
response.delete_cookie(key="connect_id")
return db_record
@router.delete('/collection', response_model=None, tags=["data collection"]) @router.delete('/collection', response_model=None, tags=["data collection"])
async def delete_record(id: int, db: Session = Depends(get_db)): async def delete_record(id: int, db: Session = Depends(get_db)):
return crud.delete_collaborative_record(id, db) return crud.delete_collaborative_record(id, db)
...@@ -12,43 +12,19 @@ ...@@ -12,43 +12,19 @@
overflow: hidden; overflow: hidden;
} }
#restaurant-start-button { .restaurant-button {
width: fit-content;
border: none;
border-radius: 5px;
padding: 0.1rem;
padding-left: 0.3rem;
padding-right: 0.3rem;
margin-top: 2rem;
}
.restaurant-button-disabled {
background-color: rgb(66, 75, 83);
color: #b9b9b9;
}
.restaurant-button-active {
background-color: rgb(33, 37, 41); background-color: rgb(33, 37, 41);
color: white; color: white;
} width: 7rem;
.restaurant-button-active:hover {
box-shadow: 0px 0px 5px white;
}
#restaurant-end-button {
width: fit-content;
background-color: #83000d;
color: white;
border: none; border: none;
border-radius: 5px; border-radius: 5px;
padding: 0.1rem; padding: 0.2rem;
padding-left: 0.3rem; padding-left: 0.3rem;
padding-right: 0.3rem; padding-right: 0.3rem;
margin-top: 2rem; margin-top: 2rem;
} }
#restaurant-end-button:hover { .restaurant-button:hover {
box-shadow: 0px 0px 5px rgb(33, 37, 41); box-shadow: 0px 0px 5px rgb(33, 37, 41);
} }
......
...@@ -12,7 +12,7 @@ import "../styles/restaurant.css"; ...@@ -12,7 +12,7 @@ import "../styles/restaurant.css";
export default function RestaurantPage({ selection, lastMessage }) { export default function RestaurantPage({ selection, lastMessage }) {
// const [started, setStarted] = useState(false); // const [started, setStarted] = useState(false);
// const [disabled, setDisabled] = useState(false); // const [timed, setTimed] = useState(false);
// const Start = () => { // const Start = () => {
// instance // instance
...@@ -21,7 +21,7 @@ export default function RestaurantPage({ selection, lastMessage }) { ...@@ -21,7 +21,7 @@ export default function RestaurantPage({ selection, lastMessage }) {
// setStarted(true); // setStarted(true);
// }) // })
// .catch((e) => { // .catch((e) => {
// setDisabled(true); // setTimed(true);
// alert( // alert(
// "Il semblerait que tu aies déjà renseigné un temps d'attente sur ce créneau. Merci de ta participation, n'hésite pas à te chronométrer de nouveau la prochaine fois !", // "Il semblerait que tu aies déjà renseigné un temps d'attente sur ce créneau. Merci de ta participation, n'hésite pas à te chronométrer de nouveau la prochaine fois !",
// ); // );
...@@ -34,10 +34,10 @@ export default function RestaurantPage({ selection, lastMessage }) { ...@@ -34,10 +34,10 @@ export default function RestaurantPage({ selection, lastMessage }) {
// .post("collection/stop") // .post("collection/stop")
// .then(() => { // .then(() => {
// setStarted(false); // setStarted(false);
// setDisabled(true); // setTimed(true);
// }) // })
// .catch((e) => { // .catch((e) => {
// setDisabled(true); // setTimed(true);
// alert( // alert(
// "Il semblerait que tu aies déjà renseigné un temps d'attente sur ce créneau. Merci de ta participation, n'hésite pas à te chronométrer de nouveau la prochaine fois !", // "Il semblerait que tu aies déjà renseigné un temps d'attente sur ce créneau. Merci de ta participation, n'hésite pas à te chronométrer de nouveau la prochaine fois !",
// ); // );
...@@ -45,6 +45,20 @@ export default function RestaurantPage({ selection, lastMessage }) { ...@@ -45,6 +45,20 @@ export default function RestaurantPage({ selection, lastMessage }) {
// }); // });
// }; // };
// const Cancel = () => {
// instance
// .post("collection/cancel")
// .then(() => {
// setStarted(false);
// setTimed(false);
// })
// .catch((e) => {
// setStarted(false);
// setTimed(false);
// console.log(e);
// });
// };
return ( return (
<> <>
{selection && ( {selection && (
...@@ -52,18 +66,26 @@ export default function RestaurantPage({ selection, lastMessage }) { ...@@ -52,18 +66,26 @@ export default function RestaurantPage({ selection, lastMessage }) {
<Comments place={selection.name} lastMessage={lastMessage} infos /> <Comments place={selection.name} lastMessage={lastMessage} infos />
<div className="restaurant-container" id="restaurant-main-page"> <div className="restaurant-container" id="restaurant-main-page">
<WaitingTime place={selection.name} lastMessage={lastMessage} /> <WaitingTime place={selection.name} lastMessage={lastMessage} />
<Graph place={selection.name} type="current" lastMessage={lastMessage} /> <Graph place={selection.name} lastMessage={lastMessage} />
{/* <button {/* <div style={{ fontSize: "1.2rem", paddingLeft: "10%", paddingRight: "10%" }}>
id={`restaurant-${started ? "end" : "start"}-button`} {timed
onClick={started ? End : Start} ? "Merci de ta participation, n'hésite pas à te chronométrer de nouveau la prochaine fois !"
className={disabled ? "restaurant-button-disabled" : "restaurant-button-active"} : "Aide nous à récupérer des données en te chronométrant dans la queue du self !"}
disabled={disabled} </div>
> {!timed && (
{started ? "Fini !!" : "Départ !!"} <>
</button> */} <button onClick={started ? End : Start} className="restaurant-button">
{started ? "Fini !" : "Démarrer !"}
</button>
{started && (
<button onClick={Cancel} className="restaurant-button">
Annuler
</button>
)}
</>
)} */}
</div> </div>
<Comments place={selection.name} lastMessage={lastMessage} /> <Comments place={selection.name} lastMessage={lastMessage} />
{/*<Graph place={selection.name} type="avg" />*/}
</div> </div>
)} )}
</> </>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment