feat: release rdbms on staging (#44576)

fix: unhide cert from settings page

fix: add cert variables where missing

fix: show token on settings page

feat: add challenges to certified user data

fix: stylize settings page a little bit

fix: only show rdbms when upcomingChanges = true

fix: relational databases -> relational database
This commit is contained in:
Tom
2022-02-18 10:29:30 -06:00
committed by GitHub
parent 395d9de8af
commit fd14608492
59 changed files with 240 additions and 124 deletions

View File

@ -200,6 +200,11 @@
"description": "Camper is machine learning with Python certified",
"default": false
},
"isRelationalDatabaseCertV8": {
"type": "boolean",
"description": "Camper is relational database certified",
"default": false
},
"completedChallenges": {
"type": [
{

View File

@ -36,7 +36,7 @@ const {
sciCompPyV7Id,
dataAnalysisPyV7Id,
machineLearningPyV7Id,
relationalDatabasesV8Id
relationalDatabaseV8Id
} = certIds;
const log = debug('fcc:certification');
@ -128,8 +128,8 @@ function createCertTypeIds(allChallenges) {
machineLearningPyV7Id,
allChallenges
),
[certTypes.relationalDatabasesV8]: getCertById(
relationalDatabasesV8Id,
[certTypes.relationalDatabaseV8]: getCertById(
relationalDatabaseV8Id,
allChallenges
)
};
@ -217,7 +217,8 @@ function getUserIsCertMap(user) {
isFullStackCert = false,
isSciCompPyCertV7 = false,
isDataAnalysisPyCertV7 = false,
isMachineLearningPyCertV7 = false
isMachineLearningPyCertV7 = false,
isRelationalDatabaseCertV8 = false
} = user;
return {
@ -235,7 +236,8 @@ function getUserIsCertMap(user) {
isFullStackCert,
isSciCompPyCertV7,
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7
isMachineLearningPyCertV7,
isRelationalDatabaseCertV8
};
}
@ -378,6 +380,7 @@ function createShowCert(app) {
isSciCompPyCertV7: true,
isDataAnalysisPyCertV7: true,
isMachineLearningPyCertV7: true,
isRelationalDatabaseCertV8: true,
isHonest: true,
username: true,
name: true,

View File

@ -394,10 +394,8 @@ function createCoderoadChallengeCompleted(app) {
if (!userWebhookToken)
return res.send(`'coderoad-user-token' not found in request headers`);
const tutorialRepoPath = tutorialId?.split(':')[0];
const tutorialSplit = tutorialRepoPath?.split('/');
const tutorialOrg = tutorialSplit?.[0];
const tutorialRepoName = tutorialSplit?.[1];
const tutorialRepo = tutorialId?.split(':')[0];
const tutorialOrg = tutorialRepo?.split('/')?.[0];
// this allows any GH account to host the repo in development or staging
// .org submissions should always be from repos hosted on the fCC GH org
@ -408,7 +406,7 @@ function createCoderoadChallengeCompleted(app) {
// validate tutorial name is in codeRoadChallenges object
const challenge = codeRoadChallenges.find(challenge =>
challenge.url?.includes(tutorialRepoName)
challenge.url?.endsWith(tutorialRepo)
);
if (!challenge) return res.send('Tutorial name is not valid');

View File

@ -250,6 +250,7 @@ function postResetProgress(req, res, next) {
isSciCompPyCertV7: false,
isDataAnalysisPyCertV7: false,
isMachineLearningPyCertV7: false,
isRelationalDatabaseCertV8: false,
completedChallenges: []
},
function (err) {

View File

@ -14,5 +14,5 @@
"dataAnalysisPyV7": "isDataAnalysisPyCertV7",
"machineLearningPyV7": "isMachineLearningPyCertV7",
"fullStack": "isFullStackCert",
"relationalDatabasesV8": "isRelationalDatabasesV8"
"relationalDatabaseV8": "isRelationalDatabaseV8"
}

View File

@ -9,7 +9,8 @@ function getCompletedCertCount(user) {
'isRespWebDesignCert',
'isSciCompPyCertV7',
'isDataAnalysisPyCertV7',
'isMachineLearningPyCertV7'
'isMachineLearningPyCertV7',
'isRelationalDatabaseCertV8'
].reduce((sum, key) => (user[key] ? sum + 1 : sum), 0);
}

View File

@ -25,6 +25,7 @@ export const publicUserProps = [
'isQaCertV7',
'isInfosecCertV7',
'isJsAlgoDataStructCert',
'isRelationalDatabaseCertV8',
'isRespWebDesignCert',
'isSciCompPyCertV7',
'isDataAnalysisPyCertV7',

View File

@ -131,7 +131,8 @@ function getCompletedCertCount(user) {
'isRespWebDesignCert',
'isSciCompPyCertV7',
'isDataAnalysisPyCertV7',
'isMachineLearningPyCertV7'
'isMachineLearningPyCertV7',
'isRelationalDatabaseCertV8'
].reduce((sum, key) => (user[key] ? sum + 1 : sum), 0);
}

View File

@ -425,7 +425,7 @@
}
}
},
"relational-databases": {
"relational-database": {
"title": "關係型數據庫",
"intro": [
"對於這些課程,你將使用真正的開發者工具和軟件,包括 VS Code、PostgreSQL 和 Linux / Unix 命令行,來完成交互式教程和構建項目。",

View File

@ -425,7 +425,7 @@
}
}
},
"relational-databases": {
"relational-database": {
"title": "关系型数据库",
"intro": [
"对于这些课程,你将使用真正的开发者工具和软件,包括 VS Code、PostgreSQL 和 Linux / Unix 命令行,来完成交互式教程和构建项目。",

View File

@ -410,12 +410,12 @@
}
}
},
"relational-databases": {
"title": "Relational Databases",
"relational-database": {
"title": "Relational Database",
"intro": [
"For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.",
"These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.",
"Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.",
"Next, you will learn how to create and use a relational database with PostgreSQL, a database management system, and SQL, the language of these databases.",
"Finally, you will learn Git, the version control system, an essential tool of every developer."
],
"blocks": {
@ -498,14 +498,14 @@
"learn-relational-databases-by-building-a-mario-database": {
"title": "Learn Relational Databases by Building a Mario Database",
"intro": [
"Relational databases organize data into tables that are linked together through relationships.",
"In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters."
"A relational database organizes data into tables that are linked together through relationships.",
"In this 165 lesson course, you will learn the basics of a relational database by creating a PostgreSQL database filled with video game characters."
]
},
"learn-sql-by-building-a-student-database-part-1": {
"title": "Learn SQL by Building a Student Database: Part 1",
"intro": [
"SQL, or Structured Query Language, is the language for communicating with relational databases.",
"SQL, or Structured Query Language, is the language for communicating with a relational database.",
"In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL."
]
},

View File

@ -26,6 +26,6 @@
"HTML-CSS": "HTML-CSS",
"JavaScript": "JavaScript",
"Python": "Python",
"Relational Databases": "Relational Databases"
"Backend Development": "Backend Development"
}
}

View File

@ -425,7 +425,7 @@
}
}
},
"relational-databases": {
"relational-database": {
"title": "Bases de Datos Relacionales",
"intro": [
"Para estos cursos, utilizarás herramientas y software de desarrollador reales, incluyendo VS Code, PostgreSQL y la línea de comandos de Linux / Unix para completar tutoriales interactivos y crear proyectos.",

View File

@ -425,7 +425,7 @@
}
}
},
"relational-databases": {
"relational-database": {
"title": "Database relazionali",
"intro": [
"Per questi corsi, utilizzerai strumenti e software per veri sviluppatori tra cui VS Code, PostgreSQL, e la riga di comando Linux / Unix per completare i tutorial interattivi e costruire progetti.",

View File

@ -425,7 +425,7 @@
}
}
},
"relational-databases": {
"relational-database": {
"title": "リレーショナルデータベース",
"intro": [
"このコースでは、VS Code、PostgreSQL、そして Linux / Unix コマンドラインを含む本格的な開発者ツールとソフトウェアを使用して、インタラクティブなチュートリアルを完了し、プロジェクトを構築します。",

View File

@ -425,7 +425,7 @@
}
}
},
"relational-databases": {
"relational-database": {
"title": "Bancos de dados relacionais",
"intro": [
"Para estes cursos, você usará ferramentas e software reais de desenvolvedor, incluindo o VS Code, PostgreSQL e a linha de comando do Linux/Unix para completar tutoriais interativos e criar projetos.",

View File

@ -425,7 +425,7 @@
}
}
},
"relational-databases": {
"relational-database": {
"title": "Реляційна база даних",
"intro": [
"Для цих курсів ви будете використовувати реальні інструменти розробника та програмне забезпечення, включаючи VS-код, PostgreSQL, і командний рядок Linux / Unix для завершення інтерактивних уроків і створення проєктів.",

View File

@ -27,7 +27,7 @@ import {
import { User } from '../redux/prop-types';
import { submitNewAbout, updateUserFlag, verifyCert } from '../redux/settings';
const { apiLocation, showUpcomingChanges } = envData;
const { apiLocation, deploymentEnv } = envData;
// TODO: update types for actions
interface ShowSettingsProps {
@ -98,6 +98,7 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element {
isSciCompPyCertV7,
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7,
isRelationalDatabaseCertV8,
isEmailVerified,
isHonest,
sendQuincyEmail,
@ -195,13 +196,14 @@ export function ShowSettings(props: ShowSettingsProps): JSX.Element {
isJsAlgoDataStructCert={isJsAlgoDataStructCert}
isMachineLearningPyCertV7={isMachineLearningPyCertV7}
isQaCertV7={isQaCertV7}
isRelationalDatabaseCertV8={isRelationalDatabaseCertV8}
isRespWebDesignCert={isRespWebDesignCert}
isSciCompPyCertV7={isSciCompPyCertV7}
username={username}
verifyCert={verifyCert}
/>
{showUpcomingChanges && <Spacer />}
{showUpcomingChanges && <WebhookToken />}
{deploymentEnv == 'staging' && <Spacer />}
{deploymentEnv == 'staging' && <WebhookToken />}
<Spacer />
<DangerZone />
</main>

View File

@ -70,7 +70,8 @@ const userProps = {
isRespWebDesignCert: true,
isSciCompPyCertV7: true,
isDataAnalysisPyCertV7: true,
isMachineLearningPyCertV7: true
isMachineLearningPyCertV7: true,
isRelationalDatabaseCertV8: true
},
// eslint-disable-next-line @typescript-eslint/no-empty-function
navigate: () => {}

View File

@ -47,6 +47,7 @@ const propTypes = {
isJsAlgoDataStructCert: PropTypes.bool,
isMachineLearningPyCertV7: PropTypes.bool,
isQaCertV7: PropTypes.bool,
isRelationalDatabaseCertV8: PropTypes.bool,
isRespWebDesignCert: PropTypes.bool,
isSciCompPyCertV7: PropTypes.bool,
t: PropTypes.func.isRequired,
@ -71,7 +72,8 @@ const isCertSelector = ({
isRespWebDesignCert,
isSciCompPyCertV7,
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7
isMachineLearningPyCertV7,
isRelationalDatabaseCertV8
}) => ({
is2018DataVisCert,
isApisMicroservicesCert,
@ -87,7 +89,8 @@ const isCertSelector = ({
isRespWebDesignCert,
isSciCompPyCertV7,
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7
isMachineLearningPyCertV7,
isRelationalDatabaseCertV8
});
const isCertMapSelector = createSelector(
@ -106,7 +109,8 @@ const isCertMapSelector = createSelector(
isBackEndCert,
isSciCompPyCertV7,
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7
isMachineLearningPyCertV7,
isRelationalDatabaseCertV8
}) => ({
'Responsive Web Design': isRespWebDesignCert,
'JavaScript Algorithms and Data Structures': isJsAlgoDataStructCert,
@ -118,6 +122,7 @@ const isCertMapSelector = createSelector(
'Scientific Computing with Python': isSciCompPyCertV7,
'Data Analysis with Python': isDataAnalysisPyCertV7,
'Machine Learning with Python': isMachineLearningPyCertV7,
'Relational Database': isRelationalDatabaseCertV8,
'Legacy Front End': isFrontEndCert,
'Legacy Data Visualization': isDataVisCert,
'Legacy Back End': isBackEndCert,
@ -164,7 +169,9 @@ export class CertificationSettings extends Component {
if (!completedProject) {
return null;
}
const { solution, challengeFiles } = completedProject;
const onClickHandler = () =>
this.setState({
solutionViewer: {

View File

@ -233,6 +233,7 @@ const defaultTestProps = {
isSciCompPyCertV7: false,
isDataAnalysisPyCertV7: false,
isMachineLearningPyCertV7: false,
isRelationalDatabaseCertV8: false,
username: 'developmentuser',
verifyCert: () => {},
errors: {},

View File

@ -1,10 +1,10 @@
---
title: Relational Databases
superBlock: relational-databases
certification: relational-databases
title: Relational Database
superBlock: relational-database
certification: relational-database
---
## Introduction to Relational Databases
## Introduction to Relational Database
This introduction is a stub

View File

@ -1,7 +1,7 @@
---
title: Introduction to Relational Databases
block: Learn Relational Databases
superBlock: Relational Databases
superBlock: Relational Database
---
## Placeholder

View File

@ -281,7 +281,7 @@ export const certificatesByNameSelector = username => state => {
isSciCompPyCertV7,
isDataAnalysisPyCertV7,
isMachineLearningPyCertV7,
isRelationalDatabasesCertV8
isRelationalDatabaseCertV8
} = userByNameSelector(username)(state);
return {
hasModernCert:
@ -296,7 +296,7 @@ export const certificatesByNameSelector = username => state => {
isSciCompPyCertV7 ||
isDataAnalysisPyCertV7 ||
isMachineLearningPyCertV7 ||
isRelationalDatabasesCertV8,
isRelationalDatabaseCertV8,
hasLegacyCert:
isFrontEndCert || isBackEndCert || isDataVisCert || isInfosecQaCert,
isFullStackCert,
@ -352,9 +352,9 @@ export const certificatesByNameSelector = username => state => {
certSlug: 'machine-learning-with-python-v7'
},
{
show: isRelationalDatabasesCertV8,
title: 'Relational Databases Certification',
certSlug: 'relational-databases-v8'
show: isRelationalDatabaseCertV8,
title: 'Relational Database Certification',
certSlug: 'relational-database-v8'
}
],
legacyCerts: [

View File

@ -31,6 +31,7 @@ export const UserPropType = PropTypes.shape({
isQaCertV7: PropTypes.bool,
isInfosecCertV7: PropTypes.bool,
isJsAlgoDataStructCert: PropTypes.bool,
isRelationalDatabaseCertV8: PropTypes.bool,
isRespWebDesignCert: PropTypes.bool,
isSciCompPyCertV7: PropTypes.bool,
isDataAnalysisPyCertV7: PropTypes.bool,
@ -302,6 +303,7 @@ export type ClaimedCertifications = {
isQaCertV7: boolean;
isInfosecCertV7: boolean;
isJsAlgoDataStructCert: boolean;
isRelationalDatabaseCertV8: boolean;
isRespWebDesignCert: boolean;
isSciCompPyCertV7: boolean;
isDataAnalysisPyCertV7: boolean;

View File

@ -1,7 +1,7 @@
import { SuperBlocks } from '../../../config/certification-settings';
import envData from '../../../config/env.json';
const { showNewCurriculum, showUpcomingChanges } = envData;
const { deploymentEnv, showNewCurriculum, showUpcomingChanges } = envData;
const responsiveWebBase =
'/learn/responsive-web-design/responsive-web-design-projects';
@ -12,8 +12,7 @@ const jsAlgoBase =
const feLibsBase =
'/learn/front-end-development-libraries/front-end-development-libraries-projects';
const dataVisBase = '/learn/data-visualization/data-visualization-projects';
const relationalDatabasesBase =
'/learn/relational-databases/learn-relational-databases';
const relationalDatabaseBase = '/learn/relational-database';
const apiMicroBase =
'/learn/back-end-development-and-apis/back-end-development-and-apis-projects';
const qaBase = '/learn/quality-assurance/quality-assurance-projects';
@ -458,39 +457,39 @@ const certMap = [
},
{
id: '606243f50267e718b1e755f4',
title: 'Relational Databases',
certSlug: SuperBlocks.RelationalDb,
flag: 'isRelationalDatabasesCert',
title: 'Relational Database',
certSlug: 'relational-database-v8',
flag: 'isRelationalDatabaseCertV8',
projects: [
{
id: '5f1a4ef5d5d6b5ab580fc6ae',
title: 'Celestial Bodies Database',
link: `${relationalDatabasesBase}/celestial-bodies-database`,
superBlock: SuperBlocks.RelationalDb
},
{
id: '5f87ac112ae598023a42df1a',
title: 'Salon Appointment Scheduler',
link: `${relationalDatabasesBase}/salon-appointment-scheduler`,
superBlock: SuperBlocks.RelationalDb
link: `${relationalDatabaseBase}/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database`,
certSlug: 'relational-database-v8'
},
{
id: '5f9771307d4d22b9d2b75a94',
title: 'World Cup Database',
link: `${relationalDatabasesBase}/world-cup-database`,
superBlock: SuperBlocks.RelationalDb
link: `${relationalDatabaseBase}/build-a-world-cup-database-project/build-a-world-cup-database`,
certSlug: 'relational-database-v8'
},
{
id: '5f87ac112ae598023a42df1a',
title: 'Salon Appointment Scheduler',
link: `${relationalDatabaseBase}/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler`,
certSlug: 'relational-database-v8'
},
{
id: '602d9ff222201c65d2a019f2',
title: 'Periodic Table Database',
link: `${relationalDatabasesBase}/periodic-table-database`,
superBlock: SuperBlocks.RelationalDb
link: `${relationalDatabaseBase}/build-a-periodic-table-database-project/build-a-periodic-table-database`,
certSlug: 'relational-database-v8'
},
{
id: '602da04c22201c65d2a019f4',
title: 'Number Guessing Game',
link: `${relationalDatabasesBase}/number-guessing-game`,
superBlock: SuperBlocks.RelationalDb
link: `${relationalDatabaseBase}/build-a-number-guessing-game-project/build-a-number-guessing-game`,
certSlug: 'relational-database-v8'
}
]
},
@ -746,8 +745,11 @@ certMap.forEach(cert => {
if (cert.title !== 'Legacy Full Stack') {
if (cert.title.startsWith('Legacy')) {
legacyProjectMap[cert.title] = cert.projects;
// temporary hiding of RDBMS cert
// should do suggestion on line 33 and use front matter to hide it
} else if (
cert.title.startsWith('Relational') &&
deploymentEnv == 'staging'
) {
projectMap[cert.title] = cert.projects;
} else if (!cert.title.startsWith('Relational')) {
projectMap[cert.title] = cert.projects;
}

View File

@ -115,16 +115,21 @@ class ShowCodeAlly extends Component<ShowCodeAllyProps, ShowCodeAllyState> {
componentDidMount(): void {
const {
updateChallengeMeta,
challengeMounted,
data: {
challengeNode: {
challenge: { challengeType, title }
challenge: { challengeType, helpCategory, title }
}
},
pageContext: { challengeMeta }
pageContext: { challengeMeta },
updateChallengeMeta
} = this.props;
updateChallengeMeta({ ...challengeMeta, title, challengeType });
updateChallengeMeta({
...challengeMeta,
title,
challengeType,
helpCategory
});
challengeMounted(challengeMeta.id);
this._container?.focus();
}

View File

@ -10,7 +10,7 @@ const {
getChallengesDirForLang
} = require('../../curriculum/getChallenges');
const { curriculumLocale } = envData;
const { curriculumLocale, deploymentEnv } = envData;
exports.localeChallengesRootDir = getChallengesDirForLang(curriculumLocale);
@ -38,6 +38,12 @@ exports.replaceChallengeNode = () => {
exports.buildChallenges = async function buildChallenges() {
const curriculum = await getChallengesForLang(curriculumLocale);
// temp removal of rdbms from production
if (deploymentEnv !== 'staging') {
delete curriculum['13-relational-databases'];
}
const superBlocks = Object.keys(curriculum);
const blocks = superBlocks
.map(superBlock => curriculum[superBlock].blocks)

View File

@ -14,7 +14,7 @@ export const certTypes = {
dataAnalysisPyV7: 'isDataAnalysisPyCertV7',
machineLearningPyV7: 'isMachineLearningPyCertV7',
fullStack: 'isFullStackCert',
relationalDatabasesV8: 'isRelationalDatabasesCertV8'
relationalDatabaseV8: 'isRelationalDatabaseCertV8'
};
export enum SuperBlocks {
@ -23,7 +23,7 @@ export enum SuperBlocks {
JsAlgoDataStruct = 'javascript-algorithms-and-data-structures',
FrontEndDevLibs = 'front-end-development-libraries',
DataVis = 'data-visualization',
RelationalDb = 'relational-databases',
RelationalDb = 'relational-database',
BackEndDevApis = 'back-end-development-and-apis',
QualityAssurance = 'quality-assurance',
SciCompPy = 'scientific-computing-with-python',
@ -49,7 +49,7 @@ export const certIds = {
sciCompPyV7Id: '5e44431b903586ffb414c951',
dataAnalysisPyV7Id: '5e46fc95ac417301a38fb934',
machineLearningPyV7Id: '5e46fc95ac417301a38fb935',
relationalDatabasesV8Id: '606243f50267e718b1e755f4'
relationalDatabaseV8Id: '606243f50267e718b1e755f4'
};
export const completionHours = {
@ -68,7 +68,7 @@ export const completionHours = {
[certTypes.sciCompPyV7]: 300,
[certTypes.dataAnalysisPyV7]: 300,
[certTypes.machineLearningPyV7]: 300,
[certTypes.relationalDatabasesV8]: 300
[certTypes.relationalDatabaseV8]: 300
};
export const certSlugTypeMap = {
@ -92,7 +92,7 @@ export const certSlugTypeMap = {
'scientific-computing-with-python-v7': certTypes.sciCompPyV7,
'data-analysis-with-python-v7': certTypes.dataAnalysisPyV7,
'machine-learning-with-python-v7': certTypes.machineLearningPyV7,
'relational-databases-v8': certTypes.relationalDatabasesV8
'relational-database-v8': certTypes.relationalDatabaseV8
};
export const superBlockCertTypeMap = {
@ -114,7 +114,7 @@ export const superBlockCertTypeMap = {
[SuperBlocks.SciCompPy]: certTypes.sciCompPyV7,
[SuperBlocks.DataAnalysisPy]: certTypes.dataAnalysisPyV7,
[SuperBlocks.MachineLearningPy]: certTypes.machineLearningPyV7,
[SuperBlocks.RelationalDb]: certTypes.relationalDatabasesV8,
[SuperBlocks.RelationalDb]: certTypes.relationalDatabaseV8,
// post-modern
// TODO: use enum
@ -137,7 +137,7 @@ export const certTypeIdMap = {
[certTypes.sciCompPyV7]: certIds.sciCompPyV7Id,
[certTypes.dataAnalysisPyV7]: certIds.dataAnalysisPyV7Id,
[certTypes.machineLearningPyV7]: certIds.machineLearningPyV7Id,
[certTypes.relationalDatabasesV8]: certIds.relationalDatabasesV8Id
[certTypes.relationalDatabaseV8]: certIds.relationalDatabaseV8Id
};
export const certTypeTitleMap = {
@ -156,7 +156,7 @@ export const certTypeTitleMap = {
[certTypes.sciCompPyV7]: 'Scientific Computing with Python',
[certTypes.dataAnalysisPyV7]: 'Data Analysis with Python',
[certTypes.machineLearningPyV7]: 'Machine Learning with Python',
[certTypes.relationalDatabasesV8]: 'Relational Databases'
[certTypes.relationalDatabaseV8]: 'Relational Database'
};
export const oldDataVizId = '561add10cb82ac38a17513b3';

View File

@ -1,11 +1,11 @@
{
"name": "Build a Celestial Bodies Database Project",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 2,
"time": "30 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5f1a4ef5d5d6b5ab580fc6ae",

View File

@ -1,11 +1,11 @@
{
"name": "Build a Number Guessing Game Project",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 13,
"time": "30 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"602da04c22201c65d2a019f4",

View File

@ -1,11 +1,11 @@
{
"name": "Build a Periodic Table Database Project",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 12,
"time": "30 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"602d9ff222201c65d2a019f2",

View File

@ -1,11 +1,11 @@
{
"name": "Build a Salon Appointment Scheduler Project",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 9,
"time": "30 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5f87ac112ae598023a42df1a",

View File

@ -1,11 +1,11 @@
{
"name": "Build a World Cup Database Project",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 6,
"time": "30 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5f9771307d4d22b9d2b75a94",

View File

@ -1,11 +1,11 @@
{
"name": "Learn Advanced Bash by Building a Kitty Ipsum Translator",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 7,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"602da0de22201c65d2a019f6",

View File

@ -1,11 +1,11 @@
{
"name": "Learn Bash and SQL by Building a Bike Rental Shop",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 8,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5f5b969a05380d2179fe6e18",

View File

@ -1,11 +1,11 @@
{
"name": "Learn Bash by Building a Boilerplate",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 0,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5ea8adfab628f68d805bfc5e",

View File

@ -1,11 +1,11 @@
{
"name": "Learn Bash Scripting by Building Five Programs",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 3,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5f5904ac738bc2fa9efecf5a",

View File

@ -1,11 +1,11 @@
{
"name": "Learn Git by Building an SQL Reference Object",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 11,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5fa323cdaf6a73463d590659",

View File

@ -1,11 +1,11 @@
{
"name": "Learn Nano by Building a Castle",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 10,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5f32db63eb37f7e17323f459",

View File

@ -1,11 +1,11 @@
{
"name": "Learn Relational Databases by Building a Mario Database",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 1,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"5f2c289f164c29556da632fd",

View File

@ -1,11 +1,11 @@
{
"name": "Learn SQL by Building a Student Database: Part 1",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 4,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"602da0c222201c65d2a019f5",

View File

@ -1,11 +1,11 @@
{
"name": "Learn SQL by Building a Student Database: Part 2",
"isUpcomingChange": true,
"isUpcomingChange": false,
"order": 5,
"time": "5 hours",
"template": "",
"required": [],
"superBlock": "relational-databases",
"superBlock": "relational-database",
"challengeOrder": [
[
"618590adb0730ca724e37672",

View File

@ -1,7 +1,7 @@
---
id: 606243f50267e718b1e755f4
title: 關係數據庫認證
certification: relational-databases
certification: relational-database
challengeType: 7
isPrivate: true
tests:

View File

@ -1,7 +1,7 @@
---
id: 606243f50267e718b1e755f4
title: 关系数据库认证
certification: relational-databases
certification: relational-database
challengeType: 7
isPrivate: true
tests:

View File

@ -1,6 +1,6 @@
id: 606243f50267e718b1e755f4
title: Relational Databases Certification
certification: relational-databases
title: Relational Database Certification
certification: relational-database
challengeType: 7
isPrivate: true
tests:

View File

@ -9,7 +9,7 @@ dashedName: build-a-mario-database
# --description--
In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters.
In this 165 lesson course, you will learn the basics of a relational database by creating a PostgreSQL database filled with video game characters.
# --instructions--

View File

@ -1,7 +1,7 @@
---
id: 606243f50267e718b1e755f4
title: Certificación en Base de Datos Relacionales
certification: relational-databases
certification: relational-database
challengeType: 7
isPrivate: true
tests:

View File

@ -1,7 +1,7 @@
---
id: 606243f50267e718b1e755f4
title: Certificazione Database Relazionali
certification: relational-databases
certification: relational-database
challengeType: 7
isPrivate: true
tests:

View File

@ -1,7 +1,7 @@
---
id: 606243f50267e718b1e755f4
title: リレーショナルデータベース認定証
certification: relational-databases
certification: relational-database
challengeType: 7
isPrivate: true
tests:

View File

@ -1,7 +1,7 @@
---
id: 606243f50267e718b1e755f4
title: Certificação de banco de dados relacional
certification: relational-databases
certification: relational-database
challengeType: 7
isPrivate: true
tests:

View File

@ -1,7 +1,7 @@
---
id: 606243f50267e718b1e755f4
title: Сертифікація реляційних баз даних
certification: relational-databases
certification: relational-database
challengeType: 7
isPrivate: true
tests:

View File

@ -25,7 +25,7 @@ const superBlockToOrder = {
'javascript-algorithms-and-data-structures': 1,
'front-end-development-libraries': 2,
'data-visualization': 3,
'relational-databases': 4,
'relational-database': 4,
'back-end-development-and-apis': 5,
'quality-assurance': 6,
'scientific-computing-with-python': 7,
@ -40,7 +40,7 @@ const superBlockToNewOrder = {
'javascript-algorithms-and-data-structures': 1,
'front-end-development-libraries': 2,
'data-visualization': 3,
'relational-databases': 4,
'relational-database': 4,
'back-end-development-and-apis': 5,
'quality-assurance': 6,
'scientific-computing-with-python': 7,

View File

@ -25,7 +25,7 @@ describe('getSuperOrder', () => {
expect(getSuperOrder('javascript-algorithms-and-data-structures')).toBe(1);
expect(getSuperOrder('front-end-development-libraries')).toBe(2);
expect(getSuperOrder('data-visualization')).toBe(3);
expect(getSuperOrder('relational-databases')).toBe(4);
expect(getSuperOrder('relational-database')).toBe(4);
expect(getSuperOrder('back-end-development-and-apis')).toBe(5);
expect(getSuperOrder('quality-assurance')).toBe(6);
expect(getSuperOrder('scientific-computing-with-python')).toBe(7);
@ -54,7 +54,7 @@ describe('getSuperOrder', () => {
getSuperOrder('data-visualization', { showNewCurriculum: true })
).toBe(3);
expect(
getSuperOrder('relational-databases', { showNewCurriculum: true })
getSuperOrder('relational-database', { showNewCurriculum: true })
).toBe(4);
expect(
getSuperOrder('back-end-development-and-apis', {

View File

@ -58,7 +58,7 @@ describe('Landing page', () => {
});
it('Has links to all the certifications', function () {
cy.get(selectors.certifications).children().its('length').should('eq', 11);
cy.get(selectors.certifications).children().its('length').should('eq', 12);
cy.wrap(certifications).each(cert => {
cy.get(selectors.certifications).contains(cert);
});

View File

@ -11,6 +11,7 @@ const superBlockNames = [
'JavaScript Algorithms and Data Structures Certification',
'Front End Development Libraries Certification',
'Data Visualization Certification',
'Relational Database Certification',
'Back End Development and APIs Certification',
'Quality Assurance Certification',
'Scientific Computing with Python Certification',
@ -42,7 +43,7 @@ describe('Learn Landing page (not logged in)', () => {
const superBlocks = document.querySelectorAll(
`${selectors.challengeMap} > li > a`
);
expect(superBlocks).to.have.length(12);
expect(superBlocks).to.have.length(13);
superBlocks.forEach((superBlock, idx) => {
expect(superBlock.innerText).to.have.string(superBlockNames[idx]);

View File

@ -10,7 +10,7 @@ describe('Settings certifications area', () => {
it('Should render the default settings page', () => {
cy.visit('/settings/');
cy.findAllByText('Claim Certification').should($btns => {
expect($btns).to.have.length(15);
expect($btns).to.have.length(16);
});
cy.findByText('Show Certification').should('not.exist');
cy.contains('Agree');

View File

@ -34,6 +34,7 @@ module.exports = {
isSciCompPyCertV7: true,
isDataAnalysisPyCertV7: true,
isMachineLearningPyCertV7: true,
isRelationalDatabaseCertV8: true,
completedChallenges: [
{ id: 'bd7123c8c441eddfaeb5bdef', completedDate: 1475094716730, files: [] },
{ id: '5895f70bf9fc0f352b528e64', completedDate: 1537207306322, files: [] },
@ -4628,6 +4629,82 @@ module.exports = {
completedDate: 1538239301985,
challengeType: 7,
files: []
},
{
completedDate: 1642566694752,
id: '602da04c22201c65d2a019f4',
files: []
},
{
completedDate: 1642566450182,
id: '602d9ff222201c65d2a019f2',
files: []
},
{
completedDate: 1642566442917,
id: '5fa323cdaf6a73463d590659',
files: []
},
{
completedDate: 1642566429622,
id: '5f32db63eb37f7e17323f459',
files: []
},
{
completedDate: 1642566416673,
id: '5f87ac112ae598023a42df1a',
files: []
},
{
completedDate: 1642566406680,
id: '5f5b969a05380d2179fe6e18',
files: []
},
{
completedDate: 1642566390464,
id: '602da0de22201c65d2a019f6',
files: []
},
{
completedDate: 1642566369992,
id: '5f9771307d4d22b9d2b75a94',
files: []
},
{
completedDate: 1642566358706,
id: '618590adb0730ca724e37672',
files: []
},
{
completedDate: 1642566353635,
id: '602da0c222201c65d2a019f5',
files: []
},
{
completedDate: 1642566336874,
id: '5f5904ac738bc2fa9efecf5a',
files: []
},
{
completedDate: 1642566305566,
id: '5f1a4ef5d5d6b5ab580fc6ae',
files: []
},
{
completedDate: 1642566297762,
id: '5f2c289f164c29556da632fd',
files: []
},
{
completedDate: 1642566255203,
id: '5ea8adfab628f68d805bfc5e',
files: []
},
{
completedDate: 1642615978255,
id: '606243f50267e718b1e755f4',
challengeType: 7,
files: []
}
],
portfolio: [],

View File

@ -59,6 +59,7 @@ const authUser = {
isSciCompPyCertV7: false,
isDataAnalysisPyCertV7: false,
isMachineLearningPyCertV7: false,
isRelationalDatabaseCertV8: false,
completedChallenges: [],
portfolio: [],
yearsTopContributor: envVariables.includes('--top-contributor')
@ -118,6 +119,7 @@ const blankUser = {
isSciCompPyCertV7: false,
isDataAnalysisPyCertV7: false,
isMachineLearningPyCertV7: false,
isRelationalDatabaseCertV8: false,
completedChallenges: [],
portfolio: [],
yearsTopContributor: [],