diff options
Diffstat (limited to 'backend')
-rw-r--r-- | backend/discord.py | 2 | ||||
-rw-r--r-- | backend/routes/forms/discover.py | 20 | ||||
-rw-r--r-- | backend/routes/forms/form.py | 17 | ||||
-rw-r--r-- | backend/routes/forms/submit.py | 16 |
4 files changed, 36 insertions, 19 deletions
diff --git a/backend/discord.py b/backend/discord.py index be12109..ff6c1bb 100644 --- a/backend/discord.py +++ b/backend/discord.py @@ -175,7 +175,7 @@ async def _verify_access_helper( form = models.Form(**form) - for role_id in getattr(form, attribute, []): + for role_id in getattr(form, attribute, None) or []: role = await request.state.db.roles.find_one({"id": role_id}) if not role: continue diff --git a/backend/routes/forms/discover.py b/backend/routes/forms/discover.py index b993075..75ff495 100644 --- a/backend/routes/forms/discover.py +++ b/backend/routes/forms/discover.py @@ -11,25 +11,27 @@ from backend.route import Route from backend.validation import api __FEATURES = [ - constants.FormFeatures.DISCOVERABLE.value, constants.FormFeatures.OPEN.value, constants.FormFeatures.REQUIRES_LOGIN.value ] +if not constants.PRODUCTION: + __FEATURES.append(constants.FormFeatures.DISCOVERABLE.value) __QUESTION = Question( id="description", - name="Check your cookies after pressing the button.", + name="Click the button below to log into the forms application.", type="section", - data={"text": "You can find cookies under \"Application\" in dev tools."}, + data={"text": ""}, required=False ) -EMPTY_FORM = Form( - id="empty_auth", +AUTH_FORM = Form( + id="login", features=__FEATURES, questions=[__QUESTION], - name="Auth form", - description="An empty form to help you get a token.", + name="Login", + description="Log into Python Discord Forms.", + submitted_text="This page can't be submitted." ) @@ -55,7 +57,7 @@ class DiscoverableFormsList(Route): forms = [form.dict(admin=False) for form in forms] # Return an empty form in development environments to help with authentication. - if not forms and not constants.PRODUCTION: - forms.append(EMPTY_FORM.dict(admin=False)) + if not constants.PRODUCTION: + forms.append(AUTH_FORM.dict(admin=False)) return JSONResponse(forms) diff --git a/backend/routes/forms/form.py b/backend/routes/forms/form.py index 567c197..8349d4e 100644 --- a/backend/routes/forms/form.py +++ b/backend/routes/forms/form.py @@ -13,7 +13,7 @@ from starlette.responses import JSONResponse from backend import constants, discord from backend.models import Form from backend.route import Route -from backend.routes.forms.discover import EMPTY_FORM +from backend.routes.forms.discover import AUTH_FORM from backend.routes.forms.unittesting import filter_unittests from backend.validation import ErrorMessage, OkayResponse, api @@ -35,14 +35,15 @@ class SingleForm(Route): """Returns single form information by ID.""" form_id = request.path_params["form_id"].lower() + if form_id == AUTH_FORM.id: + # Empty form for login purposes + return JSONResponse(AUTH_FORM.dict(admin=False)) + try: await discord.verify_edit_access(form_id, request) admin = True except discord.FormNotFoundError: - if not constants.PRODUCTION and form_id == EMPTY_FORM.id: - # Empty form to help with authentication in development. - return JSONResponse(EMPTY_FORM.dict(admin=False)) - raise + return JSONResponse({"error": "not_found"}, status_code=404) except discord.UnauthorizedError: admin = False @@ -53,7 +54,11 @@ class SingleForm(Route): if not admin: filters["features"] = {"$in": ["OPEN", "DISCOVERABLE"]} - form = Form(**await request.state.db.forms.find_one(filters)) + form = await request.state.db.forms.find_one(filters) + if not form: + return JSONResponse({"error": "not_found"}, status_code=404) + + form = Form(**form) if not admin: form = filter_unittests(form) diff --git a/backend/routes/forms/submit.py b/backend/routes/forms/submit.py index baf403d..5c500b5 100644 --- a/backend/routes/forms/submit.py +++ b/backend/routes/forms/submit.py @@ -22,6 +22,7 @@ from backend.authentication.user import User from backend.models import Form, FormResponse from backend.route import Route from backend.routes.auth.authorize import set_response_token +from backend.routes.forms.discover import AUTH_FORM from backend.routes.forms.unittesting import execute_unittest from backend.validation import ErrorMessage, api @@ -106,9 +107,18 @@ class SubmitForm(Route): data = await request.json() data["timestamp"] = None - if form := await request.state.db.forms.find_one( - {"_id": request.path_params["form_id"], "features": "OPEN"} - ): + form_id = request.path_params["form_id"] + + if form_id == AUTH_FORM.id: + response = FormResponse( + id="not-submitted", + form_id=AUTH_FORM.id, + response={question.id: None for question in AUTH_FORM.questions}, + timestamp=datetime.datetime.now().isoformat() + ).dict() + return JSONResponse({"form": AUTH_FORM.dict(admin=False), "response": response}) + + if form := await request.state.db.forms.find_one({"_id": form_id, "features": "OPEN"}): form = Form(**form) response = data.copy() response["id"] = str(uuid.uuid4()) |