From b0c1deaa77ced33868398c46c49d99df3c007a01 Mon Sep 17 00:00:00 2001 From: Brieuc Dubois <git@bhasher.com> Date: Tue, 10 Sep 2024 22:25:25 +0300 Subject: [PATCH] First implementation of studies #63 --- backend/app/crud.py | 8 ++++++++ backend/app/database.py | 3 ++- backend/app/main.py | 14 ++++++++++++- backend/app/models.py | 11 +++++++++++ backend/app/schemas.py | 20 +++++++++++++++++++ frontend/src/routes/register/+page.svelte | 24 +++++++++++------------ 6 files changed, 65 insertions(+), 15 deletions(-) diff --git a/backend/app/crud.py b/backend/app/crud.py index 416ec507..b24620c5 100644 --- a/backend/app/crud.py +++ b/backend/app/crud.py @@ -206,6 +206,14 @@ def create_message_feedback( return db_message_feedback +def create_study(db: Session, study: schemas.StudyCreate): + db_study = models.Study(**study.dict()) + db.add(db_study) + db.commit() + db.refresh(db_study) + return db_study + + def create_test_typing(db: Session, test: schemas.TestTypingCreate, user: schemas.User): db_test = models.TestTyping(user_id=user.id) db.add(db_test) diff --git a/backend/app/database.py b/backend/app/database.py index 3d971047..79b9f0f0 100644 --- a/backend/app/database.py +++ b/backend/app/database.py @@ -16,4 +16,5 @@ def get_db(): try: yield db finally: - db.close() \ No newline at end of file + db.close() + diff --git a/backend/app/main.py b/backend/app/main.py index 86f14fa7..20ef39f3 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -66,6 +66,7 @@ v1Router = APIRouter(prefix="/v1") authRouter = APIRouter(prefix="/auth", tags=["auth"]) usersRouter = APIRouter(prefix="/users", tags=["users"]) sessionsRouter = APIRouter(prefix="/sessions", tags=["sessions"]) +studyRouter = APIRouter(prefix="/studies", tags=["studies"]) websocketRouter = APIRouter(prefix="/ws", tags=["websocket"]) webhookRouter = APIRouter(prefix="/webhooks", tags=["webhook"]) surveyRouter = APIRouter(prefix="/surveys", tags=["surveys"]) @@ -715,6 +716,17 @@ def propagate_presence( return +@studyRouter.post("/", status_code=status.HTTP_201_CREATED) +def study_create( + study: schemas.StudyCreate, + 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 create a study" + ) + return crud.create_study(db, study).id @websocketRouter.websocket("/sessions/{session_id}") async def websocket_session( @@ -1066,10 +1078,10 @@ def get_survey_responses( return crud.get_survey_responses(db, survey_id) - v1Router.include_router(authRouter) v1Router.include_router(usersRouter) v1Router.include_router(sessionsRouter) +v1Router.include_router(studyRouter) v1Router.include_router(websocketRouter) v1Router.include_router(webhookRouter) v1Router.include_router(surveyRouter) diff --git a/backend/app/models.py b/backend/app/models.py index e5a1a147..c9849dc4 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -46,6 +46,7 @@ class User(Base): birthdate = Column(Integer, default=None) gender = Column(String, default=None) calcom_link = Column(String, default="") + study_id = Column(Integer, ForeignKey("studies.id"), default=None) sessions = relationship( "Session", secondary="user_sessions", back_populates="users" @@ -220,3 +221,13 @@ class SurveyResponse(Base): selected_id = Column(Integer) response_time = Column(Float) text = Column(String) + + +class Study(Base): + __tablename__ = "studies" + id = Column(Integer, primary_key=True, index=True) + title = Column(String) + description = Column(String) + start_date = Column(DateTime) + end_date = Column(DateTime) + chat_duration = Column(Integer) diff --git a/backend/app/schemas.py b/backend/app/schemas.py index 7c4a8b60..68d60de3 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -17,6 +17,7 @@ class User(BaseModel): birthdate: datetime.datetime | None gender: str | None = None calcom_link: str | None + study_id: int | None = None class Config: from_attributes = True @@ -35,6 +36,7 @@ class UserCreate(BaseModel): birthdate: datetime.datetime | None = None gender: str | None = None calcom_link: str | None = None + study_id: int | None = None class UserUpdate(BaseModel): @@ -50,6 +52,7 @@ class UserUpdate(BaseModel): birthdate: datetime.datetime | None = None gender: str | None = None calcom_link: str | None = None + study_id: int | None = None class Config: from_attributes = True @@ -263,3 +266,20 @@ class SurveyResponse(BaseModel): selected_id: int response_time: float text: str | None = None + + +class Study(BaseModel): + id: int + title: str + description: str + start_date: datetime.datetime + end_date: datetime.datetime + chat_duration: int + + +class StudyCreate(BaseModel): + title: str + description: str + start_date: datetime.datetime + end_date: datetime.datetime + chat_duration: int = 30 * 60 diff --git a/frontend/src/routes/register/+page.svelte b/frontend/src/routes/register/+page.svelte index 3d4abb87..bb6692c1 100644 --- a/frontend/src/routes/register/+page.svelte +++ b/frontend/src/routes/register/+page.svelte @@ -17,19 +17,13 @@ import { Icon, Envelope, Key, UserCircle } from 'svelte-hero-icons'; import Typingtest from '$lib/components/tests/typingtest.svelte'; import AvailableTutors from '$lib/components/users/availableTutors.svelte'; + import { browser } from '$app/environment'; let current_step = 0; $: message = ''; - //let checker: HTMLDivElement; - onMount(async () => { - /*checker.innerHTML = - '<label for="humanCheck" class="cursor-pointer label">' + - $t('register.humans') + - '<input type="checkbox" id="humanCheck" class="checkbox" required></label>';*/ - const u = get(user); if (u == null) { @@ -63,6 +57,12 @@ let target_language: string; let birthdate: string; let gender: string; + let study_id: number | null = (() => { + if (!browser) return null; + let study_id_str = new URLSearchParams(window.location.search).get('study'); + if (!study_id_str) return null; + return parseInt(study_id_str) || null; + })(); let timeslots = 0n; $: filteredUsers = $users.filter((user) => { @@ -77,10 +77,6 @@ message = $t('register.error.emptyFields'); return; } - /*if (checker.querySelector('input')?.checked === false) { - message = $t('register.error.humanity'); - return; - }*/ if (password.length < 8) { message = $t('register.error.passwordRules'); return; @@ -111,7 +107,8 @@ return; } - document.location.href = '/register'; + if (study_id === null) document.location.href = '/register'; + else document.location.href = `/register?study=${study_id}`; message = 'OK'; } @@ -134,7 +131,8 @@ home_language, target_language, birthdate, - gender + gender, + study_id }); if (!res) { -- GitLab