feat: release rdbms as beta (#45428)
This commit is contained in:
@ -157,7 +157,8 @@ function sendCertifiedEmail(
|
|||||||
isInfosecCertV7,
|
isInfosecCertV7,
|
||||||
isSciCompPyCertV7,
|
isSciCompPyCertV7,
|
||||||
isDataAnalysisPyCertV7,
|
isDataAnalysisPyCertV7,
|
||||||
isMachineLearningPyCertV7
|
isMachineLearningPyCertV7,
|
||||||
|
isRelationalDatabaseCertV8
|
||||||
},
|
},
|
||||||
send$
|
send$
|
||||||
) {
|
) {
|
||||||
@ -172,7 +173,8 @@ function sendCertifiedEmail(
|
|||||||
!isInfosecCertV7 ||
|
!isInfosecCertV7 ||
|
||||||
!isSciCompPyCertV7 ||
|
!isSciCompPyCertV7 ||
|
||||||
!isDataAnalysisPyCertV7 ||
|
!isDataAnalysisPyCertV7 ||
|
||||||
!isMachineLearningPyCertV7
|
!isMachineLearningPyCertV7 ||
|
||||||
|
!isRelationalDatabaseCertV8
|
||||||
) {
|
) {
|
||||||
return Observable.just(false);
|
return Observable.just(false);
|
||||||
}
|
}
|
||||||
|
@ -767,6 +767,7 @@
|
|||||||
"legacy-desc": "These courses are no longer part of the certification path, but are still available for you to further your learning.",
|
"legacy-desc": "These courses are no longer part of the certification path, but are still available for you to further your learning.",
|
||||||
"viewing-upcoming-change": "You are looking at a beta page. ",
|
"viewing-upcoming-change": "You are looking at a beta page. ",
|
||||||
"go-back-to-learn": "Go back to the stable version of the curriculum.",
|
"go-back-to-learn": "Go back to the stable version of the curriculum.",
|
||||||
"read-database-cert-article": "Please read this forum post before proceeding."
|
"read-database-cert-article": "Please read this forum post before proceeding.",
|
||||||
|
"english-only": "The courses in this section are only available in English. We are only able to translate the titles and introductions at the moment, not the lessons themselves."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { SuperBlocks } from '../../../config/certification-settings';
|
import { SuperBlocks } from '../../../config/certification-settings';
|
||||||
import envData from '../../../config/env.json';
|
import envData from '../../../config/env.json';
|
||||||
|
|
||||||
const { deploymentEnv, showNewCurriculum, showUpcomingChanges } = envData;
|
const { showNewCurriculum, showUpcomingChanges } = envData;
|
||||||
|
|
||||||
const responsiveWebBase =
|
const responsiveWebBase =
|
||||||
'/learn/responsive-web-design/responsive-web-design-projects';
|
'/learn/responsive-web-design/responsive-web-design-projects';
|
||||||
@ -455,44 +455,6 @@ const certMap = [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: '606243f50267e718b1e755f4',
|
|
||||||
title: 'Relational Database',
|
|
||||||
certSlug: 'relational-database-v8',
|
|
||||||
flag: 'isRelationalDatabaseCertV8',
|
|
||||||
projects: [
|
|
||||||
{
|
|
||||||
id: '5f1a4ef5d5d6b5ab580fc6ae',
|
|
||||||
title: 'Celestial Bodies Database',
|
|
||||||
link: `${relationalDatabaseBase}/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database`,
|
|
||||||
certSlug: 'relational-database-v8'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '5f9771307d4d22b9d2b75a94',
|
|
||||||
title: 'World Cup Database',
|
|
||||||
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: `${relationalDatabaseBase}/build-a-periodic-table-database-project/build-a-periodic-table-database`,
|
|
||||||
certSlug: 'relational-database-v8'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: '602da04c22201c65d2a019f4',
|
|
||||||
title: 'Number Guessing Game',
|
|
||||||
link: `${relationalDatabaseBase}/build-a-number-guessing-game-project/build-a-number-guessing-game`,
|
|
||||||
certSlug: 'relational-database-v8'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: '561add10cb82ac38a17523bc',
|
id: '561add10cb82ac38a17523bc',
|
||||||
title: 'Back End Development and APIs',
|
title: 'Back End Development and APIs',
|
||||||
@ -721,6 +683,44 @@ const certMap = [
|
|||||||
certSlug: 'machine-learning-with-python-v7'
|
certSlug: 'machine-learning-with-python-v7'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '606243f50267e718b1e755f4',
|
||||||
|
title: 'Relational Database',
|
||||||
|
certSlug: 'relational-database-v8',
|
||||||
|
flag: 'isRelationalDatabaseCertV8',
|
||||||
|
projects: [
|
||||||
|
{
|
||||||
|
id: '5f1a4ef5d5d6b5ab580fc6ae',
|
||||||
|
title: 'Celestial Bodies Database',
|
||||||
|
link: `${relationalDatabaseBase}/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database`,
|
||||||
|
certSlug: 'relational-database-v8'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '5f9771307d4d22b9d2b75a94',
|
||||||
|
title: 'World Cup Database',
|
||||||
|
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: `${relationalDatabaseBase}/build-a-periodic-table-database-project/build-a-periodic-table-database`,
|
||||||
|
certSlug: 'relational-database-v8'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '602da04c22201c65d2a019f4',
|
||||||
|
title: 'Number Guessing Game',
|
||||||
|
link: `${relationalDatabaseBase}/build-a-number-guessing-game-project/build-a-number-guessing-game`,
|
||||||
|
certSlug: 'relational-database-v8'
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@ -745,12 +745,7 @@ certMap.forEach(cert => {
|
|||||||
if (cert.title !== 'Legacy Full Stack') {
|
if (cert.title !== 'Legacy Full Stack') {
|
||||||
if (cert.title.startsWith('Legacy')) {
|
if (cert.title.startsWith('Legacy')) {
|
||||||
legacyProjectMap[cert.title] = cert.projects;
|
legacyProjectMap[cert.title] = cert.projects;
|
||||||
} else if (
|
} else {
|
||||||
cert.title.startsWith('Relational') &&
|
|
||||||
deploymentEnv == 'staging'
|
|
||||||
) {
|
|
||||||
projectMap[cert.title] = cert.projects;
|
|
||||||
} else if (!cert.title.startsWith('Relational')) {
|
|
||||||
projectMap[cert.title] = cert.projects;
|
projectMap[cert.title] = cert.projects;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -256,7 +256,7 @@ class ShowCodeAlly extends Component<ShowCodeAllyProps> {
|
|||||||
<div className='ca-description'>
|
<div className='ca-description'>
|
||||||
<Trans i18nKey='learn.github-required'>
|
<Trans i18nKey='learn.github-required'>
|
||||||
<a
|
<a
|
||||||
href='https://github.com'
|
href='https://github.com/join'
|
||||||
rel='noopener noreferrer'
|
rel='noopener noreferrer'
|
||||||
target='_blank'
|
target='_blank'
|
||||||
title={t('learn.github-link')}
|
title={t('learn.github-link')}
|
||||||
|
@ -5,6 +5,7 @@ import type { WithTranslation } from 'react-i18next';
|
|||||||
import {
|
import {
|
||||||
backend,
|
backend,
|
||||||
backEndProject,
|
backEndProject,
|
||||||
|
codeAllyCert,
|
||||||
frontEndProject,
|
frontEndProject,
|
||||||
pythonProject
|
pythonProject
|
||||||
} from '../../../../utils/challenge-types';
|
} from '../../../../utils/challenge-types';
|
||||||
@ -101,6 +102,12 @@ export class SolutionForm extends Component<FormProps> {
|
|||||||
: 'https://replit.com/@camperbot/hello');
|
: 'https://replit.com/@camperbot/hello');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case codeAllyCert:
|
||||||
|
formFields = solutionField;
|
||||||
|
options.isEditorLinkAllowed = true;
|
||||||
|
solutionLink = solutionLink + 'https://your-git-repo.url/files';
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
formFields = solutionField;
|
formFields = solutionField;
|
||||||
solutionLink =
|
solutionLink =
|
||||||
|
@ -4,6 +4,9 @@ import { Alert } from '@freecodecamp/react-bootstrap';
|
|||||||
import { SuperBlocks } from '../../../../../config/certification-settings';
|
import { SuperBlocks } from '../../../../../config/certification-settings';
|
||||||
import { isNewRespCert, isRelationalDbCert } from '../../../utils/is-a-cert';
|
import { isNewRespCert, isRelationalDbCert } from '../../../utils/is-a-cert';
|
||||||
import { Link } from '../../../components/helpers';
|
import { Link } from '../../../components/helpers';
|
||||||
|
import envData from '../../../../../config/env.json';
|
||||||
|
|
||||||
|
const { clientLocale } = envData;
|
||||||
|
|
||||||
interface LegacyLinksProps {
|
interface LegacyLinksProps {
|
||||||
superBlock: SuperBlocks;
|
superBlock: SuperBlocks;
|
||||||
@ -28,6 +31,11 @@ function LegacyLinks({ superBlock }: LegacyLinksProps): JSX.Element {
|
|||||||
else if (isRelationalDbCert(superBlock))
|
else if (isRelationalDbCert(superBlock))
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
{clientLocale != 'english' && (
|
||||||
|
<Alert bsStyle='info'>
|
||||||
|
<p>{t('intro:misc-text.english-only')}</p>
|
||||||
|
</Alert>
|
||||||
|
)}
|
||||||
<Alert bsStyle='info'>
|
<Alert bsStyle='info'>
|
||||||
<p>
|
<p>
|
||||||
{t('intro:misc-text.viewing-upcoming-change')}{' '}
|
{t('intro:misc-text.viewing-upcoming-change')}{' '}
|
||||||
|
@ -10,7 +10,7 @@ const {
|
|||||||
getChallengesDirForLang
|
getChallengesDirForLang
|
||||||
} = require('../../curriculum/getChallenges');
|
} = require('../../curriculum/getChallenges');
|
||||||
|
|
||||||
const { curriculumLocale, deploymentEnv } = envData;
|
const { curriculumLocale } = envData;
|
||||||
|
|
||||||
exports.localeChallengesRootDir = getChallengesDirForLang(curriculumLocale);
|
exports.localeChallengesRootDir = getChallengesDirForLang(curriculumLocale);
|
||||||
|
|
||||||
@ -38,12 +38,6 @@ exports.replaceChallengeNode = () => {
|
|||||||
|
|
||||||
exports.buildChallenges = async function buildChallenges() {
|
exports.buildChallenges = async function buildChallenges() {
|
||||||
const curriculum = await getChallengesForLang(curriculumLocale);
|
const curriculum = await getChallengesForLang(curriculumLocale);
|
||||||
|
|
||||||
// temp removal of rdbms from production
|
|
||||||
if (deploymentEnv !== 'staging') {
|
|
||||||
delete curriculum['relational-database'];
|
|
||||||
}
|
|
||||||
|
|
||||||
const superBlocks = Object.keys(curriculum);
|
const superBlocks = Object.keys(curriculum);
|
||||||
const blocks = superBlocks
|
const blocks = superBlocks
|
||||||
.map(superBlock => curriculum[superBlock].blocks)
|
.map(superBlock => curriculum[superBlock].blocks)
|
||||||
|
@ -20,6 +20,7 @@ exports.backend = backend;
|
|||||||
exports.frontEndProject = frontEndProject;
|
exports.frontEndProject = frontEndProject;
|
||||||
exports.backEndProject = backEndProject;
|
exports.backEndProject = backEndProject;
|
||||||
exports.pythonProject = pythonProject;
|
exports.pythonProject = pythonProject;
|
||||||
|
exports.codeAllyCert = codeAllyCert;
|
||||||
|
|
||||||
exports.challengeTypes = {
|
exports.challengeTypes = {
|
||||||
html,
|
html,
|
||||||
|
@ -25,19 +25,19 @@ const superBlockToOrder = {
|
|||||||
'javascript-algorithms-and-data-structures': 1,
|
'javascript-algorithms-and-data-structures': 1,
|
||||||
'front-end-development-libraries': 2,
|
'front-end-development-libraries': 2,
|
||||||
'data-visualization': 3,
|
'data-visualization': 3,
|
||||||
'relational-database': 4,
|
'back-end-development-and-apis': 4,
|
||||||
'back-end-development-and-apis': 5,
|
'quality-assurance': 5,
|
||||||
'quality-assurance': 6,
|
'scientific-computing-with-python': 6,
|
||||||
'scientific-computing-with-python': 7,
|
'data-analysis-with-python': 7,
|
||||||
'data-analysis-with-python': 8,
|
'information-security': 8,
|
||||||
'information-security': 9,
|
'machine-learning-with-python': 9,
|
||||||
'machine-learning-with-python': 10,
|
'coding-interview-prep': 10,
|
||||||
'coding-interview-prep': 11
|
'relational-database': 12
|
||||||
};
|
};
|
||||||
|
|
||||||
const superBlockToNewOrder = {
|
const superBlockToNewOrder = {
|
||||||
...superBlockToOrder,
|
...superBlockToOrder,
|
||||||
'2022/responsive-web-design': 12
|
'2022/responsive-web-design': 11
|
||||||
};
|
};
|
||||||
|
|
||||||
function getSuperOrder(
|
function getSuperOrder(
|
||||||
|
@ -31,14 +31,14 @@ describe('getSuperOrder', () => {
|
|||||||
expect(getSuperOrder('javascript-algorithms-and-data-structures')).toBe(1);
|
expect(getSuperOrder('javascript-algorithms-and-data-structures')).toBe(1);
|
||||||
expect(getSuperOrder('front-end-development-libraries')).toBe(2);
|
expect(getSuperOrder('front-end-development-libraries')).toBe(2);
|
||||||
expect(getSuperOrder('data-visualization')).toBe(3);
|
expect(getSuperOrder('data-visualization')).toBe(3);
|
||||||
expect(getSuperOrder('relational-database')).toBe(4);
|
expect(getSuperOrder('back-end-development-and-apis')).toBe(4);
|
||||||
expect(getSuperOrder('back-end-development-and-apis')).toBe(5);
|
expect(getSuperOrder('quality-assurance')).toBe(5);
|
||||||
expect(getSuperOrder('quality-assurance')).toBe(6);
|
expect(getSuperOrder('scientific-computing-with-python')).toBe(6);
|
||||||
expect(getSuperOrder('scientific-computing-with-python')).toBe(7);
|
expect(getSuperOrder('data-analysis-with-python')).toBe(7);
|
||||||
expect(getSuperOrder('data-analysis-with-python')).toBe(8);
|
expect(getSuperOrder('information-security')).toBe(8);
|
||||||
expect(getSuperOrder('information-security')).toBe(9);
|
expect(getSuperOrder('machine-learning-with-python')).toBe(9);
|
||||||
expect(getSuperOrder('machine-learning-with-python')).toBe(10);
|
expect(getSuperOrder('coding-interview-prep')).toBe(10);
|
||||||
expect(getSuperOrder('coding-interview-prep')).toBe(11);
|
expect(getSuperOrder('relational-database')).toBe(12);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns a different order if passed the option showNewCurriculum: true', () => {
|
it('returns a different order if passed the option showNewCurriculum: true', () => {
|
||||||
@ -59,36 +59,36 @@ describe('getSuperOrder', () => {
|
|||||||
expect(
|
expect(
|
||||||
getSuperOrder('data-visualization', { showNewCurriculum: true })
|
getSuperOrder('data-visualization', { showNewCurriculum: true })
|
||||||
).toBe(3);
|
).toBe(3);
|
||||||
expect(
|
|
||||||
getSuperOrder('relational-database', { showNewCurriculum: true })
|
|
||||||
).toBe(4);
|
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('back-end-development-and-apis', {
|
getSuperOrder('back-end-development-and-apis', {
|
||||||
showNewCurriculum: true
|
showNewCurriculum: true
|
||||||
})
|
})
|
||||||
).toBe(5);
|
).toBe(4);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('quality-assurance', { showNewCurriculum: true })
|
getSuperOrder('quality-assurance', { showNewCurriculum: true })
|
||||||
).toBe(6);
|
).toBe(5);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('scientific-computing-with-python', {
|
getSuperOrder('scientific-computing-with-python', {
|
||||||
showNewCurriculum: true
|
showNewCurriculum: true
|
||||||
})
|
})
|
||||||
).toBe(7);
|
).toBe(6);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('data-analysis-with-python', { showNewCurriculum: true })
|
getSuperOrder('data-analysis-with-python', { showNewCurriculum: true })
|
||||||
).toBe(8);
|
).toBe(7);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('information-security', { showNewCurriculum: true })
|
getSuperOrder('information-security', { showNewCurriculum: true })
|
||||||
).toBe(9);
|
).toBe(8);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('machine-learning-with-python', { showNewCurriculum: true })
|
getSuperOrder('machine-learning-with-python', { showNewCurriculum: true })
|
||||||
).toBe(10);
|
).toBe(9);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('coding-interview-prep', { showNewCurriculum: true })
|
getSuperOrder('coding-interview-prep', { showNewCurriculum: true })
|
||||||
).toBe(11);
|
).toBe(10);
|
||||||
expect(
|
expect(
|
||||||
getSuperOrder('2022/responsive-web-design', { showNewCurriculum: true })
|
getSuperOrder('2022/responsive-web-design', { showNewCurriculum: true })
|
||||||
|
).toBe(11);
|
||||||
|
expect(
|
||||||
|
getSuperOrder('relational-database', { showNewCurriculum: true })
|
||||||
).toBe(12);
|
).toBe(12);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -17,7 +17,8 @@ const certifications = [
|
|||||||
'Data Analysis with Python',
|
'Data Analysis with Python',
|
||||||
'Information Security',
|
'Information Security',
|
||||||
'Machine Learning with Python',
|
'Machine Learning with Python',
|
||||||
'Responsive Web Design (Beta)'
|
'Responsive Web Design (Beta)',
|
||||||
|
'Relational Database (Beta)'
|
||||||
];
|
];
|
||||||
|
|
||||||
describe('Landing page', () => {
|
describe('Landing page', () => {
|
||||||
|
35
cypress/integration/learn/challenges/codeally.js
Normal file
35
cypress/integration/learn/challenges/codeally.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
describe('CodeAlly cert challenge', function () {
|
||||||
|
describe('before completing the project', function () {
|
||||||
|
before(() => {
|
||||||
|
cy.exec('npm run seed');
|
||||||
|
cy.login();
|
||||||
|
cy.visit(
|
||||||
|
'/learn/relational-database/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not allow you to submit a URL', function () {
|
||||||
|
cy.get('input[name="solution"]')
|
||||||
|
.type('https://example.com')
|
||||||
|
.type('{enter}');
|
||||||
|
cy.contains('You must complete the project first.');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('after completing the project', function () {
|
||||||
|
before(() => {
|
||||||
|
cy.exec('npm run seed:certified-user');
|
||||||
|
cy.login();
|
||||||
|
cy.visit(
|
||||||
|
'/learn/relational-database/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should allow you to submit a URL', function () {
|
||||||
|
cy.get('input[name="solution"]')
|
||||||
|
.type('https://example.com')
|
||||||
|
.type('{enter}');
|
||||||
|
cy.get('.completion-modal-body');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -11,7 +11,6 @@ const superBlockNames = [
|
|||||||
'JavaScript Algorithms and Data Structures Certification',
|
'JavaScript Algorithms and Data Structures Certification',
|
||||||
'Front End Development Libraries Certification',
|
'Front End Development Libraries Certification',
|
||||||
'Data Visualization Certification',
|
'Data Visualization Certification',
|
||||||
'Relational Database (Beta) Certification',
|
|
||||||
'Back End Development and APIs Certification',
|
'Back End Development and APIs Certification',
|
||||||
'Quality Assurance Certification',
|
'Quality Assurance Certification',
|
||||||
'Scientific Computing with Python Certification',
|
'Scientific Computing with Python Certification',
|
||||||
@ -19,7 +18,8 @@ const superBlockNames = [
|
|||||||
'Information Security Certification',
|
'Information Security Certification',
|
||||||
'Machine Learning with Python Certification',
|
'Machine Learning with Python Certification',
|
||||||
'Coding Interview Prep (Thousands of hours of challenges)',
|
'Coding Interview Prep (Thousands of hours of challenges)',
|
||||||
'Responsive Web Design (Beta) Certification'
|
'Responsive Web Design (Beta) Certification',
|
||||||
|
'Relational Database (Beta) Certification'
|
||||||
];
|
];
|
||||||
|
|
||||||
describe('Learn Landing page (not logged in)', () => {
|
describe('Learn Landing page (not logged in)', () => {
|
||||||
|
Reference in New Issue
Block a user