Source code for codegrade.models.base_error_with_code

"""The module that defines the ``BaseErrorWithCode`` model.

SPDX-License-Identifier: AGPL-3.0-only OR BSD-3-Clause-Clear
"""

from __future__ import annotations

import typing as t
from dataclasses import dataclass, field

import cg_request_args as rqa
from httpx import Response

from ..utils import to_dict
from .base_error import BaseError


[docs] @dataclass(kw_only=True) class BaseErrorWithCode(BaseError): """The base representation of a concrete `APIException` together with its error code, for an error whose class is not known statically. """ #: A unique code identifying the kind of error that occurred. code: t.Literal[ "ASSIGNMENT_GROUP_FULL", "ASSIGNMENT_HAS_STUDENT_SUBMISSIONS", "COOL_OFF_PERIOD_ACTIVE", "COURSE_USER_LIMIT_EXCEEDED", "DISABLED_SETTING", "EXAM_ENVIRONMENT_PAYMENT_REQUIRED", "EXAM_ENVIRONMENT_WRONG_STUDENT", "IGNORED_FILES_IN_ARCHIVE", "IMAGE_BEING_CREATED", "INACTIVE_USER", "INCORRECT_PERMISSION", "INVALID_ARCHIVE", "INVALID_AUTO_TEST_STEP", "INVALID_CREDENTIALS", "INVALID_GROUP", "INVALID_IO_CASES", "INVALID_JOB_STATE", "INVALID_OAUTH_REQUEST", "INVALID_PARAM", "INVALID_PLAGIARISM_OPTIONS", "INVALID_REQUEST_BODY", "INVALID_RESET_TOKEN", "INVALID_STATE", "ISOLATED_SESSION_ACTIVE", "KIOSK_VERIFICATION_FAILED", "LIMIT_REACHED", "LOCKED_UPDATE", "LOGIN_FAILURE", "LTI1_3_COOKIE_ERROR", "LTI_FIRST_PHASE_FAILED", "LTI_PROVIDER_UPGRADED", "LTI_STANDALONE_LOGIN_EXPIRED", "MAILING_FAILED", "MALFORMED_COMMUNITY_LIBRARY_ITEM", "MISSING_REQUIRED_PARAM", "NOT_LOGGED_IN", "NOT_NEWEST_SUBMISSION", "NO_FILES_SUBMITTED", "OBJECT_ALREADY_EXISTS", "OBJECT_EXPIRED", "OBJECT_ID_NOT_FOUND", "OBJECT_MODIFIED", "OBJECT_NOT_FOUND", "OBJECT_WRONG_TYPE", "PARSING_FAILED", "RATE_LIMIT_EXCEEDED", "REPO_ALREADY_CONNECTED", "REPO_CONNECTION_LIMIT_REACHED", "REQUEST_TOO_LARGE", "ROUTE_NOT_FOUND", "SKIPPED_RESULT", "TIER_RESTRICTED", "TOKEN_REVOKED", "TOO_MANY_SUBMISSIONS", "UNKNOWN_ERROR", "UNSAFE_ARCHIVE", "UNSUPPORTED", "UPLOAD_TYPE_DISABLED", "UPSTREAM_SERVICE_FAILED", "WEAK_PASSWORD", "WEBHOOK_DISABLED", "WEBHOOK_INVALID_REQUEST", "WEBHOOK_UNKNOWN_REQUEST", ] raw_data: t.Optional[t.Dict[str, t.Any]] = field(init=False, repr=False) data_parser: t.ClassVar[t.Any] = rqa.Lazy( lambda: BaseError.data_parser.parser.combine( rqa.FixedMapping( rqa.RequiredArgument( "code", rqa.StringEnum( "ASSIGNMENT_GROUP_FULL", "ASSIGNMENT_HAS_STUDENT_SUBMISSIONS", "COOL_OFF_PERIOD_ACTIVE", "COURSE_USER_LIMIT_EXCEEDED", "DISABLED_SETTING", "EXAM_ENVIRONMENT_PAYMENT_REQUIRED", "EXAM_ENVIRONMENT_WRONG_STUDENT", "IGNORED_FILES_IN_ARCHIVE", "IMAGE_BEING_CREATED", "INACTIVE_USER", "INCORRECT_PERMISSION", "INVALID_ARCHIVE", "INVALID_AUTO_TEST_STEP", "INVALID_CREDENTIALS", "INVALID_GROUP", "INVALID_IO_CASES", "INVALID_JOB_STATE", "INVALID_OAUTH_REQUEST", "INVALID_PARAM", "INVALID_PLAGIARISM_OPTIONS", "INVALID_REQUEST_BODY", "INVALID_RESET_TOKEN", "INVALID_STATE", "ISOLATED_SESSION_ACTIVE", "KIOSK_VERIFICATION_FAILED", "LIMIT_REACHED", "LOCKED_UPDATE", "LOGIN_FAILURE", "LTI1_3_COOKIE_ERROR", "LTI_FIRST_PHASE_FAILED", "LTI_PROVIDER_UPGRADED", "LTI_STANDALONE_LOGIN_EXPIRED", "MAILING_FAILED", "MALFORMED_COMMUNITY_LIBRARY_ITEM", "MISSING_REQUIRED_PARAM", "NOT_LOGGED_IN", "NOT_NEWEST_SUBMISSION", "NO_FILES_SUBMITTED", "OBJECT_ALREADY_EXISTS", "OBJECT_EXPIRED", "OBJECT_ID_NOT_FOUND", "OBJECT_MODIFIED", "OBJECT_NOT_FOUND", "OBJECT_WRONG_TYPE", "PARSING_FAILED", "RATE_LIMIT_EXCEEDED", "REPO_ALREADY_CONNECTED", "REPO_CONNECTION_LIMIT_REACHED", "REQUEST_TOO_LARGE", "ROUTE_NOT_FOUND", "SKIPPED_RESULT", "TIER_RESTRICTED", "TOKEN_REVOKED", "TOO_MANY_SUBMISSIONS", "UNKNOWN_ERROR", "UNSAFE_ARCHIVE", "UNSUPPORTED", "UPLOAD_TYPE_DISABLED", "UPSTREAM_SERVICE_FAILED", "WEAK_PASSWORD", "WEBHOOK_DISABLED", "WEBHOOK_INVALID_REQUEST", "WEBHOOK_UNKNOWN_REQUEST", ), doc="A unique code identifying the kind of error that occurred.", ), ) ) ) def to_dict(self) -> t.Dict[str, t.Any]: res: t.Dict[str, t.Any] = { "code": to_dict(self.code), "message": to_dict(self.message), "description": to_dict(self.description), "request_id": to_dict(self.request_id), } return res @classmethod def from_dict( cls: t.Type[BaseErrorWithCode], d: t.Dict[str, t.Any], response: t.Optional[Response] = None, ) -> BaseErrorWithCode: parsed = cls.data_parser.try_parse(d) res = cls( code=parsed.code, message=parsed.message, description=parsed.description, request_id=parsed.request_id, response=response, ) res.raw_data = d return res
import os if os.getenv("CG_GENERATING_DOCS", "False").lower() in ("", "true"): pass