diff --git a/backend/app/crud.py b/backend/app/crud.py index 416ec5078a9c43eae3512e2e8152b8e5aecc94de..b24620c55631646e0c8a527352ab15dbc71eb758 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 3d9710478e771b2f3bfec6b64527c4a9f4ded6d9..79b9f0f0f87f3657c1f8da1d5dca84d9c813704a 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 86f14fa7b50bce111872da0c927b9329f0bf334c..20ef39f3e9e3310fdb46ae53379e8d650d2eb744 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 e5a1a147b1e1007e5214fc07b17436b8b0d7e5b9..c9849dc450212cb2939d26046c88090dd918f87a 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 7c4a8b60eb8ee09aaa93e1ea7622ec4f2142d31c..68d60de310050c32744d219817200b83d79f17bc 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 3d4abb878f2c71ddc7a0ac998caaf19a7e2dda17..bb6692c1f90f1362b5892dbccd26737087ec4aa6 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) {