diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index 76deade4a00..a350a99c8cc 100644 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -124,8 +124,10 @@ model user { isJsAlgoDataStructCert Boolean? // Undefined isJsAlgoDataStructCertV8 Boolean? // Undefined isMachineLearningPyCertV7 Boolean? // Undefined + isPythonCertV9 Boolean? // Undefined isQaCertV7 Boolean? // Undefined isRelationalDatabaseCertV8 Boolean? // Undefined + isRelationalDatabaseCertV9 Boolean? // Undefined isRespWebDesignCert Boolean? // Undefined isRespWebDesignCertV9 Boolean? // Undefined isSciCompPyCertV7 Boolean? // Undefined diff --git a/api/src/plugins/__fixtures__/user.ts b/api/src/plugins/__fixtures__/user.ts index b2ac60299f0..22cd4d08452 100644 --- a/api/src/plugins/__fixtures__/user.ts +++ b/api/src/plugins/__fixtures__/user.ts @@ -48,8 +48,10 @@ export const newUser = (email: string) => ({ isJsAlgoDataStructCert: false, isJsAlgoDataStructCertV8: false, isMachineLearningPyCertV7: false, + isPythonCertV9: false, isQaCertV7: false, isRelationalDatabaseCertV8: false, + isRelationalDatabaseCertV9: false, isCollegeAlgebraPyCertV8: false, isRespWebDesignCert: false, isRespWebDesignCertV9: false, diff --git a/api/src/routes/helpers/user-utils.ts b/api/src/routes/helpers/user-utils.ts index b690820a8c4..b1b76992a46 100644 --- a/api/src/routes/helpers/user-utils.ts +++ b/api/src/routes/helpers/user-utils.ts @@ -26,8 +26,10 @@ const nullableFlags = [ 'isJsAlgoDataStructCert', 'isJsAlgoDataStructCertV8', 'isMachineLearningPyCertV7', + 'isPythonCertV9', 'isQaCertV7', 'isRelationalDatabaseCertV8', + 'isRelationalDatabaseCertV9', 'isRespWebDesignCert', 'isRespWebDesignCertV9', 'isSciCompPyCertV7', diff --git a/api/src/routes/protected/certificate.test.ts b/api/src/routes/protected/certificate.test.ts index 773380bfb58..1f293c0649e 100644 --- a/api/src/routes/protected/certificate.test.ts +++ b/api/src/routes/protected/certificate.test.ts @@ -39,23 +39,25 @@ describe('certificate routes', () => { where: { email: defaultUserEmail }, data: { completedChallenges: [], - name: 'fcc', - isA2EnglishCert: false, - isRespWebDesignCert: false, - isJsAlgoDataStructCert: false, - isFrontEndLibsCert: false, is2018DataVisCert: false, - isRelationalDatabaseCertV8: false, + isA2EnglishCert: false, isApisMicroservicesCert: false, - isQaCertV7: false, - isSciCompPyCertV7: false, - isDataAnalysisPyCertV7: false, - isInfosecCertV7: false, - isMachineLearningPyCertV7: false, isCollegeAlgebraPyCertV8: false, + isDataAnalysisPyCertV7: false, isFoundationalCSharpCertV8: false, + isFrontEndLibsCert: false, + isInfosecCertV7: false, + isJsAlgoDataStructCert: false, isJavascriptCertV9: false, + isMachineLearningPyCertV7: false, + isPythonCertV9: false, + isQaCertV7: false, + isRelationalDatabaseCertV8: false, + isRelationalDatabaseCertV9: false, + isRespWebDesignCert: false, isRespWebDesignCertV9: false, + isSciCompPyCertV7: false, + name: 'fcc', username: 'fcc' } }); @@ -154,8 +156,10 @@ describe('certificate routes', () => { isInfosecQaCert: false, isJsAlgoDataStructCert: false, isMachineLearningPyCertV7: false, + isPythonCertV9: false, isQaCertV7: false, isRelationalDatabaseCertV8: false, + isRelationalDatabaseCertV9: false, isRespWebDesignCert: false, isSciCompPyCertV7: false, isJavascriptCertV9: false, @@ -234,22 +238,24 @@ describe('certificate routes', () => { { id: '587d78b0367417b2b2512b05', completedDate: 123456789 }, { id: 'bd7158d8c242eddfaeb5bd13', completedDate: 123456789 } ], - isRespWebDesignCert: false, - isJsAlgoDataStructCertV8: true, - isFrontEndLibsCert: true, is2018DataVisCert: true, - isRelationalDatabaseCertV8: true, + isA2EnglishCert: true, isApisMicroservicesCert: true, - isQaCertV7: true, - isSciCompPyCertV7: true, - isDataAnalysisPyCertV7: true, - isInfosecCertV7: true, - isMachineLearningPyCertV7: true, isCollegeAlgebraPyCertV8: true, + isDataAnalysisPyCertV7: true, isFoundationalCSharpCertV8: true, + isFrontEndLibsCert: true, + isInfosecCertV7: true, isJavascriptCertV9: true, + isJsAlgoDataStructCertV8: true, + isMachineLearningPyCertV7: true, + isPythonCertV9: true, + isQaCertV7: true, + isRelationalDatabaseCertV8: true, + isRelationalDatabaseCertV9: true, + isRespWebDesignCert: false, isRespWebDesignCertV9: true, - isA2EnglishCert: true + isSciCompPyCertV7: true } }); @@ -323,7 +329,9 @@ describe('certificate routes', () => { isMachineLearningPyCertV7: false, isRelationalDatabaseCertV8: false, isCollegeAlgebraPyCertV8: false, - isFoundationalCSharpCertV8: false + isFoundationalCSharpCertV8: false, + isPythonCertV9: false, + isRelationalDatabaseCertV9: false }, completedChallenges: [ { diff --git a/api/src/routes/protected/certificate.ts b/api/src/routes/protected/certificate.ts index 2b0383f4f46..37fdde6ca39 100644 --- a/api/src/routes/protected/certificate.ts +++ b/api/src/routes/protected/certificate.ts @@ -123,78 +123,84 @@ export function createCertLookup( interface CertI { isA2EnglishCert?: boolean; - isRespWebDesignCert?: boolean; + isApisMicroservicesCert?: boolean; + isBackEndCert?: boolean; + isCollegeAlgebraPyCertV8?: boolean; + isDataAnalysisPyCertV7?: boolean; + isDataVisCert?: boolean; + isFrontEndCert?: boolean; + isFrontEndLibsCert?: boolean; + isFoundationalCSharpCertV8?: boolean; + isFullStackCert?: boolean; + isInfosecCertV7?: boolean; + isInfosecQaCert?: boolean; + isJavascriptCertV9?: boolean; isJsAlgoDataStructCert?: boolean; isJsAlgoDataStructCertV8?: boolean; - isFrontEndLibsCert?: boolean; - is2018DataVisCert?: boolean; - isApisMicroservicesCert?: boolean; - isInfosecQaCert?: boolean; - isQaCertV7?: boolean; - isInfosecCertV7?: boolean; - isFrontEndCert?: boolean; - isBackEndCert?: boolean; - isDataVisCert?: boolean; - isFullStackCert?: boolean; - isSciCompPyCertV7?: boolean; - isDataAnalysisPyCertV7?: boolean; isMachineLearningPyCertV7?: boolean; + isPythonCertV9?: boolean; + isQaCertV7?: boolean; isRelationalDatabaseCertV8?: boolean; - isCollegeAlgebraPyCertV8?: boolean; - isFoundationalCSharpCertV8?: boolean; - isJavascriptCertV9?: boolean; + isRelationalDatabaseCertV9?: boolean; + isRespWebDesignCert?: boolean; isRespWebDesignCertV9?: boolean; + isSciCompPyCertV7?: boolean; + is2018DataVisCert?: boolean; } function getUserIsCertMap(user: CertI) { const { isA2EnglishCert = false, - isRespWebDesignCert = false, + isApisMicroservicesCert = false, + isBackEndCert = false, + isCollegeAlgebraPyCertV8 = false, + isDataAnalysisPyCertV7 = false, + isDataVisCert = false, + isFrontEndCert = false, + isFrontEndLibsCert = false, + isFoundationalCSharpCertV8 = false, + isFullStackCert = false, + isInfosecCertV7 = false, + isInfosecQaCert = false, + isJavascriptCertV9 = false, isJsAlgoDataStructCert = false, isJsAlgoDataStructCertV8 = false, - isFrontEndLibsCert = false, - is2018DataVisCert = false, - isApisMicroservicesCert = false, - isInfosecQaCert = false, - isQaCertV7 = false, - isInfosecCertV7 = false, - isFrontEndCert = false, - isBackEndCert = false, - isDataVisCert = false, - isFullStackCert = false, - isSciCompPyCertV7 = false, - isDataAnalysisPyCertV7 = false, isMachineLearningPyCertV7 = false, + isPythonCertV9 = false, + isQaCertV7 = false, isRelationalDatabaseCertV8 = false, - isCollegeAlgebraPyCertV8 = false, - isFoundationalCSharpCertV8 = false, - isJavascriptCertV9 = false, - isRespWebDesignCertV9 = false + isRelationalDatabaseCertV9 = false, + isRespWebDesignCert = false, + isRespWebDesignCertV9 = false, + isSciCompPyCertV7 = false, + is2018DataVisCert = false } = user; return { isA2EnglishCert, - isRespWebDesignCert, + isApisMicroservicesCert, + isBackEndCert, + isCollegeAlgebraPyCertV8, + isDataAnalysisPyCertV7, + isDataVisCert, + isFrontEndCert, + isFrontEndLibsCert, + isFoundationalCSharpCertV8, + isFullStackCert, + isInfosecCertV7, + isInfosecQaCert, + isJavascriptCertV9, isJsAlgoDataStructCert, isJsAlgoDataStructCertV8, - isFrontEndLibsCert, - is2018DataVisCert, - isApisMicroservicesCert, - isInfosecQaCert, - isQaCertV7, - isInfosecCertV7, - isFrontEndCert, - isBackEndCert, - isDataVisCert, - isFullStackCert, - isSciCompPyCertV7, - isDataAnalysisPyCertV7, isMachineLearningPyCertV7, + isPythonCertV9, + isQaCertV7, isRelationalDatabaseCertV8, - isCollegeAlgebraPyCertV8, - isFoundationalCSharpCertV8, - isJavascriptCertV9, - isRespWebDesignCertV9 + isRelationalDatabaseCertV9, + isRespWebDesignCert, + isRespWebDesignCertV9, + isSciCompPyCertV7, + is2018DataVisCert }; } @@ -335,33 +341,35 @@ export const protectedCertificateRoutes: FastifyPluginCallbackTypebox = ( } }, select: { - username: true, + completedChallenges: true, email: true, name: true, - completedChallenges: true, + username: true, is2018DataVisCert: true, is2018FullStackCert: true, isA2EnglishCert: true, isApisMicroservicesCert: true, isBackEndCert: true, - isDataVisCert: true, isCollegeAlgebraPyCertV8: true, isDataAnalysisPyCertV7: true, + isDataVisCert: true, isFoundationalCSharpCertV8: true, isFrontEndCert: true, isFrontEndLibsCert: true, isFullStackCert: true, isInfosecCertV7: true, isInfosecQaCert: true, + isJavascriptCertV9: true, isJsAlgoDataStructCert: true, isJsAlgoDataStructCertV8: true, isMachineLearningPyCertV7: true, + isPythonCertV9: true, isQaCertV7: true, isRelationalDatabaseCertV8: true, + isRelationalDatabaseCertV9: true, isRespWebDesignCert: true, - isSciCompPyCertV7: true, - isJavascriptCertV9: true, - isRespWebDesignCertV9: true + isRespWebDesignCertV9: true, + isSciCompPyCertV7: true } }); diff --git a/api/src/routes/protected/user.test.ts b/api/src/routes/protected/user.test.ts index 6124c88dc2f..1eb56c8d68a 100644 --- a/api/src/routes/protected/user.test.ts +++ b/api/src/routes/protected/user.test.ts @@ -293,8 +293,10 @@ const publicUserData = { isJsAlgoDataStructCert: testUserData.isJsAlgoDataStructCert, isJsAlgoDataStructCertV8: testUserData.isJsAlgoDataStructCertV8, isMachineLearningPyCertV7: testUserData.isMachineLearningPyCertV7, + isPythonCertV9: testUserData.isPythonCertV9, isQaCertV7: testUserData.isQaCertV7, isRelationalDatabaseCertV8: testUserData.isRelationalDatabaseCertV8, + isRelationalDatabaseCertV9: testUserData.isRelationalDatabaseCertV9, isRespWebDesignCert: testUserData.isRespWebDesignCert, isRespWebDesignCertV9: testUserData.isRespWebDesignCertV9, isSciCompPyCertV7: testUserData.isSciCompPyCertV7, @@ -345,7 +347,9 @@ const baseProgressData = { isSciCompPyCertV7: false, isDataAnalysisPyCertV7: false, isMachineLearningPyCertV7: false, + isPythonCertV9: false, isRelationalDatabaseCertV8: false, + isRelationalDatabaseCertV9: false, isRespWebDesignCertV9: false, isCollegeAlgebraPyCertV8: false, completedChallenges: [], @@ -1018,8 +1022,10 @@ describe('userRoutes', () => { isJsAlgoDataStructCert: false, isJsAlgoDataStructCertV8: false, isMachineLearningPyCertV7: false, + isPythonCertV9: false, isQaCertV7: false, isRelationalDatabaseCertV8: false, + isRelationalDatabaseCertV9: false, isRespWebDesignCert: false, isRespWebDesignCertV9: false, isSciCompPyCertV7: false, diff --git a/api/src/routes/protected/user.ts b/api/src/routes/protected/user.ts index f31d35b0b23..03dd79a7113 100644 --- a/api/src/routes/protected/user.ts +++ b/api/src/routes/protected/user.ts @@ -701,8 +701,10 @@ export const userGetRoutes: FastifyPluginCallbackTypebox = ( isJsAlgoDataStructCert: true, isJsAlgoDataStructCertV8: true, isMachineLearningPyCertV7: true, + isPythonCertV9: true, isQaCertV7: true, isRelationalDatabaseCertV8: true, + isRelationalDatabaseCertV9: true, isRespWebDesignCert: true, isRespWebDesignCertV9: true, isSciCompPyCertV7: true, diff --git a/api/src/routes/public/certificate.ts b/api/src/routes/public/certificate.ts index 24d5848db82..b2cb2187d53 100644 --- a/api/src/routes/public/certificate.ts +++ b/api/src/routes/public/certificate.ts @@ -74,12 +74,14 @@ export const unprotectedCertificateRoutes: FastifyPluginCallbackTypebox = ( is2018DataVisCert: true, isApisMicroservicesCert: true, isInfosecQaCert: true, + isPythonCertV9: true, isQaCertV7: true, isInfosecCertV7: true, isSciCompPyCertV7: true, isDataAnalysisPyCertV7: true, isMachineLearningPyCertV7: true, isRelationalDatabaseCertV8: true, + isRelationalDatabaseCertV9: true, isCollegeAlgebraPyCertV8: true, isFoundationalCSharpCertV8: true, isHonest: true, diff --git a/api/src/routes/public/user.test.ts b/api/src/routes/public/user.test.ts index e72b8af39f2..302c6feef79 100644 --- a/api/src/routes/public/user.test.ts +++ b/api/src/routes/public/user.test.ts @@ -206,8 +206,10 @@ const publicUserData = { isJsAlgoDataStructCert: testUserData.isJsAlgoDataStructCert, isJsAlgoDataStructCertV8: testUserData.isJsAlgoDataStructCertV8, isMachineLearningPyCertV7: testUserData.isMachineLearningPyCertV7, + isPythonCertV9: testUserData.isPythonCertV9, isQaCertV7: testUserData.isQaCertV7, isRelationalDatabaseCertV8: testUserData.isRelationalDatabaseCertV8, + isRelationalDatabaseCertV9: testUserData.isRelationalDatabaseCertV9, isRespWebDesignCert: testUserData.isRespWebDesignCert, isRespWebDesignCertV9: testUserData.isRespWebDesignCertV9, isSciCompPyCertV7: testUserData.isSciCompPyCertV7, diff --git a/api/src/schemas/types.ts b/api/src/schemas/types.ts index 6cfb806e5fc..3ef99115c7b 100644 --- a/api/src/schemas/types.ts +++ b/api/src/schemas/types.ts @@ -15,6 +15,7 @@ export const isCertMap = Type.Object({ is2018DataVisCert: Type.Boolean(), isApisMicroservicesCert: Type.Boolean(), isInfosecQaCert: Type.Boolean(), + isPythonCertV9: Type.Boolean(), isQaCertV7: Type.Boolean(), isInfosecCertV7: Type.Boolean(), isFrontEndCert: Type.Boolean(), @@ -25,6 +26,7 @@ export const isCertMap = Type.Object({ isDataAnalysisPyCertV7: Type.Boolean(), isMachineLearningPyCertV7: Type.Boolean(), isRelationalDatabaseCertV8: Type.Boolean(), + isRelationalDatabaseCertV9: Type.Boolean(), isCollegeAlgebraPyCertV8: Type.Boolean(), isFoundationalCSharpCertV8: Type.Boolean() }); diff --git a/api/src/schemas/user/get-session-user.ts b/api/src/schemas/user/get-session-user.ts index 092eacb9015..72265d5283c 100644 --- a/api/src/schemas/user/get-session-user.ts +++ b/api/src/schemas/user/get-session-user.ts @@ -86,8 +86,10 @@ export const getSessionUser = { isJsAlgoDataStructCert: Type.Boolean(), isJsAlgoDataStructCertV8: Type.Boolean(), isMachineLearningPyCertV7: Type.Boolean(), + isPythonCertV9: Type.Boolean(), isQaCertV7: Type.Boolean(), isRelationalDatabaseCertV8: Type.Boolean(), + isRelationalDatabaseCertV9: Type.Boolean(), isRespWebDesignCert: Type.Boolean(), isRespWebDesignCertV9: Type.Boolean(), isSciCompPyCertV7: Type.Boolean(), diff --git a/api/src/schemas/users/get-public-profile.ts b/api/src/schemas/users/get-public-profile.ts index 7a8ad26d5fc..2e7cd2348e6 100644 --- a/api/src/schemas/users/get-public-profile.ts +++ b/api/src/schemas/users/get-public-profile.ts @@ -72,8 +72,10 @@ export const getPublicProfile = { isJsAlgoDataStructCert: Type.Boolean(), isJsAlgoDataStructCertV8: Type.Boolean(), isMachineLearningPyCertV7: Type.Boolean(), + isPythonCertV9: Type.Boolean(), isQaCertV7: Type.Boolean(), isRelationalDatabaseCertV8: Type.Boolean(), + isRelationalDatabaseCertV9: Type.Boolean(), isRespWebDesignCert: Type.Boolean(), isRespWebDesignCertV9: Type.Boolean(), isSciCompPyCertV7: Type.Boolean(), diff --git a/api/src/utils/create-user.ts b/api/src/utils/create-user.ts index 9700ce557c6..87be5838a57 100644 --- a/api/src/utils/create-user.ts +++ b/api/src/utils/create-user.ts @@ -32,8 +32,10 @@ export const createResetProperties = () => ({ isJsAlgoDataStructCert: false, isJsAlgoDataStructCertV8: false, isMachineLearningPyCertV7: false, + isPythonCertV9: false, isQaCertV7: false, isRelationalDatabaseCertV8: false, + isRelationalDatabaseCertV9: false, isRespWebDesignCert: false, isRespWebDesignCertV9: false, isSciCompPyCertV7: false, diff --git a/client/i18n/locales/english/intro.json b/client/i18n/locales/english/intro.json index ddbe14f4f9d..404ee614266 100644 --- a/client/i18n/locales/english/intro.json +++ b/client/i18n/locales/english/intro.json @@ -5089,13 +5089,9 @@ "title": "JavaScript Certification", "intro": [ "This course teaches you core JavaScript programming concepts such as working with variables, functions, objects, arrays, and control flow. You'll also learn how to manipulate the DOM, handle events, and apply techniques like asynchronous programming, functional programming, and accessibility best practices.", - "To qualify for the exam, you must complete the following projects:", - "- Build a Markdown to HTML Converter", - "- Build a Drum Machine", - "- Build a Voting System", - "- Build a Bank Account Management Program", - "- Build a Weather App", - "Pass the exam to earn your JavaScript Certification." + "To earn your JavaScript Certification:", + "- Complete the five required projects to qualify for the certification exam.", + "- Pass the JavaScript Certification exam." ], "chapters": { "javascript": "JavaScript", @@ -6666,7 +6662,6 @@ }, "python-v9": { "title": "Python Certification", - "note": "This certification is currently in development and will be available soon. We recommend completing the available courses below to prepare for the certification exam once it is released.", "intro": [ "This course teaches you the fundamentals of Python programming.", "To earn your Python Certification:", @@ -7142,7 +7137,6 @@ }, "relational-databases-v9": { "title": "Relational Databases Certification", - "note": "This certification is currently in development and will be available soon. We recommend completing the available courses below to prepare for the certification exam once it is released.", "intro": [ "This course teaches you the fundamentals of relational databases.", "To earn your Relational Databases Certification:", @@ -7734,13 +7728,9 @@ "title": "Responsive Web Design Certification", "intro": [ "This course teaches the fundamentals of HTML and CSS, including modern layout, design, accessibility, and responsive web development. You'll build practical projects and gain the skills to create professional, user-friendly webpages.", - "To qualify for the exam, you must complete the following projects:", - "- Build a Survey Form", - "- Build a Page of Playing Cards", - "- Build a Book Inventory App", - "- Build a Technical Documentation Page", - "- Build a Product Landing Page", - "Pass the exam to earn your Responsive Web Design Certification." + "To earn your Responsive Web Design Certification:", + "- Complete the five required projects to qualify for the certification exam.", + "- Pass the Responsive Web Design Certification exam." ], "chapters": { "html": "HTML", diff --git a/client/src/client-only-routes/show-settings.tsx b/client/src/client-only-routes/show-settings.tsx index e84bd0b798d..3f9595e8182 100644 --- a/client/src/client-only-routes/show-settings.tsx +++ b/client/src/client-only-routes/show-settings.tsx @@ -154,6 +154,8 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element { isFullStackCert, isRespWebDesignCert, isRespWebDesignCertV9, + isPythonCertV9, + isRelationalDatabaseCertV9, isSciCompPyCertV7, isDataAnalysisPyCertV7, isMachineLearningPyCertV7, @@ -241,8 +243,10 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element { isInfosecQaCert={isInfosecQaCert} isJsAlgoDataStructCert={isJsAlgoDataStructCert} isMachineLearningPyCertV7={isMachineLearningPyCertV7} + isPythonCertV9={isPythonCertV9} isQaCertV7={isQaCertV7} isRelationalDatabaseCertV8={isRelationalDatabaseCertV8} + isRelationalDatabaseCertV9={isRelationalDatabaseCertV9} isRespWebDesignCert={isRespWebDesignCert} isRespWebDesignCertV9={isRespWebDesignCertV9} isSciCompPyCertV7={isSciCompPyCertV7} diff --git a/client/src/components/profile/components/utils/certification.ts b/client/src/components/profile/components/utils/certification.ts index a27bafd0103..016e619ce5d 100644 --- a/client/src/components/profile/components/utils/certification.ts +++ b/client/src/components/profile/components/utils/certification.ts @@ -12,6 +12,7 @@ export const getCertifications = (user: User) => { isJsAlgoDataStructCert, isApisMicroservicesCert, isInfosecQaCert, + isPythonCertV9, isQaCertV7, isInfosecCertV7, isFrontEndCert, @@ -22,6 +23,7 @@ export const getCertifications = (user: User) => { isDataAnalysisPyCertV7, isMachineLearningPyCertV7, isRelationalDatabaseCertV8, + isRelationalDatabaseCertV9, isCollegeAlgebraPyCertV8, isFoundationalCSharpCertV8, isJsAlgoDataStructCertV8 @@ -32,7 +34,9 @@ export const getCertifications = (user: User) => { isA2EnglishCert || isRespWebDesignCertV9 || isJavascriptCertV9 || - isFoundationalCSharpCertV8, + isFoundationalCSharpCertV8 || + isPythonCertV9 || + isRelationalDatabaseCertV9, hasLegacyCert: isFrontEndCert || isJsAlgoDataStructCert || @@ -73,6 +77,16 @@ export const getCertifications = (user: User) => { show: isFoundationalCSharpCertV8, title: 'Foundational C# with Microsoft Certification', certSlug: Certification.FoundationalCSharp + }, + { + show: isPythonCertV9, + title: 'Python Certification', + certSlug: Certification.PythonV9 + }, + { + show: isRelationalDatabaseCertV9, + title: 'Relational Database Certification', + certSlug: Certification.RelationalDbV9 } ], legacyCerts: [ diff --git a/client/src/components/profile/profile.test.tsx b/client/src/components/profile/profile.test.tsx index 2db2e01beeb..9e1b9a0c9f5 100644 --- a/client/src/components/profile/profile.test.tsx +++ b/client/src/components/profile/profile.test.tsx @@ -63,6 +63,7 @@ const userProps = { isFrontEndLibsCert: true, isFullStackCert: true, isInfosecQaCert: true, + isPythonCertV9: true, isQaCertV7: true, isInfosecCertV7: true, isJavascriptCertV9: true, @@ -73,6 +74,7 @@ const userProps = { isDataAnalysisPyCertV7: true, isMachineLearningPyCertV7: true, isRelationalDatabaseCertV8: true, + isRelationalDatabaseCertV9: true, isCollegeAlgebraPyCertV8: true, isFoundationalCSharpVertV8: true }, diff --git a/client/src/components/settings/certification.test.tsx b/client/src/components/settings/certification.test.tsx index 6ad1fcee1d9..a2e50bbc38c 100644 --- a/client/src/components/settings/certification.test.tsx +++ b/client/src/components/settings/certification.test.tsx @@ -271,6 +271,7 @@ const defaultTestProps = { isFullStackCert: false, isHonest: false, isInfosecQaCert: false, + isPythonCertV9: false, isQaCertV7: false, isInfosecCertV7: false, isJavascriptCertV9: false, @@ -282,6 +283,7 @@ const defaultTestProps = { isDataAnalysisPyCertV7: false, isMachineLearningPyCertV7: false, isRelationalDatabaseCertV8: false, + isRelationalDatabaseCertV9: false, isCollegeAlgebraPyCertV8: false, isFoundationalCSharpCertV8: false, username: 'developmentuser', diff --git a/client/src/components/settings/certification.tsx b/client/src/components/settings/certification.tsx index b0f4712b487..013ddc7297c 100644 --- a/client/src/components/settings/certification.tsx +++ b/client/src/components/settings/certification.tsx @@ -49,6 +49,7 @@ const createCertifiedMap = ({ isJavascriptCertV9, isJsAlgoDataStructCert, isInfosecQaCert, + isPythonCertV9, isQaCertV7, isInfosecCertV7, isFrontEndLibsCert, @@ -61,6 +62,7 @@ const createCertifiedMap = ({ isDataAnalysisPyCertV7, isMachineLearningPyCertV7, isRelationalDatabaseCertV8, + isRelationalDatabaseCertV9, isCollegeAlgebraPyCertV8, isFoundationalCSharpCertV8, isJsAlgoDataStructCertV8 @@ -91,8 +93,8 @@ const createCertifiedMap = ({ [Certification.RespWebDesignV9]: isRespWebDesignCertV9, [Certification.JsV9]: isJavascriptCertV9, [Certification.FrontEndDevLibsV9]: false, - [Certification.PythonV9]: false, - [Certification.RelationalDbV9]: false, + [Certification.PythonV9]: isPythonCertV9, + [Certification.RelationalDbV9]: isRelationalDatabaseCertV9, [Certification.BackEndDevApisV9]: false, [Certification.FullStackDeveloperV9]: false, [Certification.A2English]: isA2EnglishCert, diff --git a/client/src/redux/prop-types.ts b/client/src/redux/prop-types.ts index f2681450719..991a1783c69 100644 --- a/client/src/redux/prop-types.ts +++ b/client/src/redux/prop-types.ts @@ -474,10 +474,12 @@ export type ClaimedCertifications = { isFullStackCert: boolean; isInfosecQaCert: boolean; isJavascriptCertV9: boolean; + isPythonCertV9: boolean; isQaCertV7: boolean; isInfosecCertV7: boolean; isJsAlgoDataStructCert: boolean; isRelationalDatabaseCertV8: boolean; + isRelationalDatabaseCertV9: boolean; isRespWebDesignCert: boolean; isRespWebDesignCertV9: boolean; isSciCompPyCertV7: boolean; diff --git a/curriculum/structure/blocks/exam-python-certification.json b/curriculum/structure/blocks/exam-python-certification.json index 984732c0125..50ff3b314a5 100644 --- a/curriculum/structure/blocks/exam-python-certification.json +++ b/curriculum/structure/blocks/exam-python-certification.json @@ -2,7 +2,7 @@ "name": "Python Certification Exam", "blockLabel": "exam", "blockLayout": "link", - "isUpcomingChange": true, + "isUpcomingChange": false, "dashedName": "exam-python-certification", "helpCategory": "Python", "challengeOrder": [ diff --git a/curriculum/structure/blocks/exam-relational-databases-certification.json b/curriculum/structure/blocks/exam-relational-databases-certification.json index 1dfd6128230..fe67d2af24b 100644 --- a/curriculum/structure/blocks/exam-relational-databases-certification.json +++ b/curriculum/structure/blocks/exam-relational-databases-certification.json @@ -2,7 +2,7 @@ "name": "Relational Databases Certification Exam", "blockLabel": "exam", "blockLayout": "link", - "isUpcomingChange": true, + "isUpcomingChange": false, "dashedName": "exam-relational-databases-certification", "helpCategory": "Backend Development", "challengeOrder": [ diff --git a/curriculum/structure/superblocks/python-v9.json b/curriculum/structure/superblocks/python-v9.json index 3a201f4bc6e..f65cc4f293c 100644 --- a/curriculum/structure/superblocks/python-v9.json +++ b/curriculum/structure/superblocks/python-v9.json @@ -148,10 +148,10 @@ { "chapterType": "exam", "dashedName": "python-certification-exam", - "comingSoon": true, + "comingSoon": false, "modules": [ { - "comingSoon": true, + "comingSoon": false, "dashedName": "python-certification-exam", "blocks": ["exam-python-certification"] } diff --git a/curriculum/structure/superblocks/relational-databases-v9.json b/curriculum/structure/superblocks/relational-databases-v9.json index fb62920ebad..0fea0d328a7 100644 --- a/curriculum/structure/superblocks/relational-databases-v9.json +++ b/curriculum/structure/superblocks/relational-databases-v9.json @@ -93,10 +93,10 @@ { "chapterType": "exam", "dashedName": "relational-databases-certification-exam", - "comingSoon": true, + "comingSoon": false, "modules": [ { - "comingSoon": true, + "comingSoon": false, "dashedName": "relational-databases-certification-exam", "blocks": ["exam-relational-databases-certification"] } diff --git a/e2e/cert-username-case-navigation.spec.ts b/e2e/cert-username-case-navigation.spec.ts index 628cae9c691..6b597fa33d1 100644 --- a/e2e/cert-username-case-navigation.spec.ts +++ b/e2e/cert-username-case-navigation.spec.ts @@ -16,7 +16,7 @@ test.describe('Public profile certifications', () => { await expect( page.getByRole('link', { name: /View.+Certification/ }) - ).toHaveCount(22); + ).toHaveCount(24); }); test('Should show claimed certifications if the username includes uppercase characters', async ({ @@ -48,7 +48,7 @@ test.describe('Public profile certifications', () => { await page.waitForURL('/certifiedboozer'); await expect( page.getByRole('link', { name: /View.+Certification/ }) - ).toHaveCount(22); + ).toHaveCount(24); }); test.afterAll(() => { diff --git a/shared/config/certification-settings.ts b/shared/config/certification-settings.ts index 8bc99ffc331..093cea1f59e 100644 --- a/shared/config/certification-settings.ts +++ b/shared/config/certification-settings.ts @@ -25,12 +25,12 @@ export enum Certification { MachineLearningPy = 'machine-learning-with-python-v7', CollegeAlgebraPy = 'college-algebra-with-python-v8', FoundationalCSharp = 'foundational-c-sharp-with-microsoft', + PythonV9 = 'python-v9', + RelationalDbV9 = 'relational-databases-v9', // Upcoming certifications RespWebDesignV9 = 'responsive-web-design-v9', JsV9 = 'javascript-v9', FrontEndDevLibsV9 = 'front-end-development-libraries-v9', - PythonV9 = 'python-v9', - RelationalDbV9 = 'relational-databases-v9', BackEndDevApisV9 = 'back-end-development-and-apis-v9', A2English = 'a2-english-for-developers', FullStackDeveloperV9 = 'full-stack-developer-v9', @@ -54,10 +54,12 @@ export function isCertification(x: string): x is Certification { // "Current" certifications are the subset of standard certifications that are // live and not legacy. export const currentCertifications = [ - Certification.RespWebDesignV9, - Certification.JsV9, Certification.A2English, - Certification.FoundationalCSharp + Certification.FoundationalCSharp, + Certification.JsV9, + Certification.PythonV9, + Certification.RelationalDbV9, + Certification.RespWebDesignV9 ] as const; // "Legacy" certifications are another class of standard certifications. They're @@ -92,8 +94,6 @@ export const legacyFullStackCertification = [ // showUpcomingChanges is true. export const upcomingCertifications = [ Certification.FrontEndDevLibsV9, - Certification.PythonV9, - Certification.RelationalDbV9, Certification.BackEndDevApisV9, Certification.FullStackDeveloperV9, Certification.B1English, @@ -199,10 +199,11 @@ export const certSlugTypeMap = { [Certification.CollegeAlgebraPy]: 'isCollegeAlgebraPyCertV8', [Certification.FoundationalCSharp]: 'isFoundationalCSharpCertV8', [Certification.A2English]: 'isA2EnglishCert', - - // upcoming + [Certification.PythonV9]: 'isPythonCertV9', + [Certification.RelationalDbV9]: 'isRelationalDatabaseCertV9', [Certification.RespWebDesignV9]: 'isRespWebDesignCertV9', [Certification.JsV9]: 'isJavascriptCertV9' + // upcoming } as const; // TODO: use i18n keys instead of hardcoded titles diff --git a/tools/scripts/seed/user-data.js b/tools/scripts/seed/user-data.js index 4aee17693a2..9bf7c6b33f6 100644 --- a/tools/scripts/seed/user-data.js +++ b/tools/scripts/seed/user-data.js @@ -234,6 +234,7 @@ module.exports.fullyCertifiedUser = { isJsAlgoDataStructCertV8: true, isApisMicroservicesCert: true, isInfosecQaCert: true, + isPythonCertV9: true, isQaCertV7: true, isInfosecCertV7: true, is2018FullStackCert: true, @@ -241,6 +242,7 @@ module.exports.fullyCertifiedUser = { isDataAnalysisPyCertV7: true, isMachineLearningPyCertV7: true, isRelationalDatabaseCertV8: true, + isRelationalDatabaseCertV9: true, isCollegeAlgebraPyCertV8: true, isFoundationalCSharpCertV8: true, completedChallenges: [